高并发项目-用户登录基本功能
文章目录
- 1.数据库表设计
- 1.IDEA连接数据库
- 2.修改application.yml中数据库的名称为seckill
- 3.IDEA创建数据库seckill
- 4.创建数据表 seckill_user
- 5.密码加密分析
- 1.传统方式(不安全)
- 2.改进方式(两次加密加盐)
- 2.密码加密功能实现
- 1.pom.xml添加md5加密的依赖,刷新maven
- 2.编写工具类MD5Util.java,完成加密
- 3.测试
- 1.引入jupiter 5.7.2依赖
- 2.测试方法
- 3.编写实体类映射表
- 1.创建pojo目录
- 2.User.java
- 4.创建Mapper接口和Mapper.xml
- 1.创建UserMapper.java
- 2.创建UserMapper.xml
- 5.响应信息类
- 1.创建vo目录
- 2.RespBeanEnum.java 响应信息枚举类
- 3.RespBean.java 响应信息的Bean
- 6.编写接受登录信息的vo以及手机号校验工具类
- 1.LoginVo.java
- 2.ValidatorUtil.java
- 7.编写service层
- 1.UserService.java
- 2.UserServiceImpl.java
- 8.编写controller层
- 1.引入校验的依赖
- 2.LoginController.java
- 3.引入静态资源和模板页
- 4.解析前端登录
- 1.点击登录,调用login
- 2.将密码加密加盐之后向后端 /login/doLogin 发送请求
- 5.测试访问首页
- 1.首先检查资源是否到了target目录,如果没到需要maven重新编译
- 2.测试访问 http://localhost:9092/seckill/login/toLogin
- 6.前端区分多环境
- 1.可以看到前端请求时使用的`/`其实只是本机的服务发现,也就是http://localhost:9092/,所以需要区分多环境
- 2.首先新增一个配置类 GlobalControllerAdvice.java 全局控制器通知,用于向前端传递全局变量
- 3.在application.yml和application-prod.yml编写baseUrl,区分多环境
- 4.login.html 读取baseUrl
- 1.在script标签内添加一行代码使其能够解析Thymeleaf
- 2.修改请求,格式为 baseUrl + 资源路径
- 7.在数据库添加一条记录,可以模拟用户登录
- 1.假设密码是admin,在前端输出一下第一次加密加盐的结果
- 2.使用后端的工具类也来加密一下,比对结果,发现结果一致
- 3.在第二次加密的时候重新设置一个不同的盐为niubi666,模拟不同用户
- 4.将结果放到数据库中
- 5.此时的用户名和密码
- 8.编写登录的controller并测试
- 1.LoginController.java
- 2.测试,登录成功
1.数据库表设计
1.IDEA连接数据库
2.修改application.yml中数据库的名称为seckill
3.IDEA创建数据库seckill

4.创建数据表 seckill_user
DROP TABLE IF EXISTS `seckill_user`;
CREATE TABLE `seckill_user`
(`id` BIGINT(20) NOT NULL COMMENT '用户 ID, 设为主键, 唯一 手机号',`nickname` VARCHAR(255) NOT NULL DEFAULT '',`password` VARCHAR(32) NOT NULL DEFAULT '' COMMENT 'MD5(MD5(pass 明文+固定salt)+salt)',`slat` VARCHAR(10) NOT NULL DEFAULT '',`head` VARCHAR(128) NOT NULL DEFAULT '' COMMENT '头像',`register_date` DATETIME DEFAULT NULL COMMENT '注册时间',`last_login_date` DATETIME DEFAULT NULL COMMENT '最后一次登录时间',`login_count` INT(11) DEFAULT '0' COMMENT '登录次数',PRIMARY KEY (`id`)
) ENGINE = INNODB DEFAULT CHARSET = utf8mb4;
select * from seckill_user;
5.密码加密分析
1.传统方式(不安全)

2.改进方式(两次加密加盐)

2.密码加密功能实现
1.pom.xml添加md5加密的依赖,刷新maven
<!--md5 依赖--><dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.15</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.11</version></dependency>
2.编写工具类MD5Util.java,完成加密
package com.sxs.seckill.utils;import org.apache.commons.codec.digest.DigestUtils;/*** Description: MD5加密工具类** @Author sun* @Create 2024/5/5 14:23* @Version 1.0*/
public class MD5Util {/*** 将一个字符串转换为MD5* @param src* @return*/public static String md5(String src) {return DigestUtils.md5Hex(src);}// 固定的saltpublic static final String SALT = "dgeb2g4t";// 第一次加密加盐public static String inputPassToMidPass(String inputPass) {// 加盐String str = SALT.charAt(0) + inputPass + SALT.charAt(6);return md5(str);}/*** 第二次加密加盐* @param midPass* @param salt* @return*/public static String midPassToDBPass(String midPass, String salt) {String str = salt.charAt(0) + midPass + salt.charAt(5);return md5(str);}/*** 两次加密* @param input* @param saltDB* @return*/public static String inputPassToDBPass(String input, String saltDB) {String midPass = inputPassToMidPass(input);String dbPass = midPassToDBPass(midPass, saltDB);return dbPass;}
}
3.测试
1.引入jupiter 5.7.2依赖
<!-- jupiter测试 --><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>5.7.2</version><scope>compile</scope></dependency>
2.测试方法
package com.sxs.seckill.utils;/*** Description: 测试MD5加密方法** @Author sun* @Create 2024/5/5 14:47* @Version 1.0*/
public class MD5UtilTest {public static void main(String[] args) {String input = "123456";System.out.println("第一次加密:" + MD5Util.inputPassToMidPass(input));System.out.println("第二次加密:" + MD5Util.midPassToDBPass(MD5Util.inputPassToMidPass(input), MD5Util.SALT));System.out.println("两次加密:" + MD5Util.inputPassToDBPass(input, MD5Util.SALT));}
}

3.编写实体类映射表
1.创建pojo目录

2.User.java
package com.sxs.seckill.pojo;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;import java.io.Serializable;
import java.util.Date;/*** Description:** @Author sun* @Create 2024/5/5 14:59* @Version 1.0*/
@Data
@TableName("seckill_user") // 指定表名
public class User implements Serializable { // 实现序列化接口private static final long serialVersionUID = 1L;/*** 用户 ID是手机号码*/@TableId(value = "id", type = IdType.ASSIGN_ID) // 指定主键,IdType.ASSIGN_ID表示自己指定ID,不自增private Long id;private String nickname;/*** MD5(MD5(pass 明文+固定 salt)+salt)*/private String password;private String slat;/*** 头像*/private String head;/*** 注册时间*/private Date registerDate;/*** 最后一次登录时间*/private Date lastLoginDate;/*** 登录次数*/private Integer loginCount;
}
4.创建Mapper接口和Mapper.xml
1.创建UserMapper.java
package com.sxs.seckill.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.sxs.seckill.pojo.User;/*** Description:** @Author sun* @Create 2024/5/5 15:04* @Version 1.0*/
public interface UserMapper extends BaseMapper<User> {
}
2.创建UserMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.sxs.seckill.mapper.UserMapper"><!-- 通用查询映射结果 --><resultMap id="BaseResultMap" type="com.sxs.seckill.pojo.User"><id column="id" property="id"/><result column="nickname" property="nickname"/><result column="password" property="password"/><result column="slat" property="slat"/><result column="head" property="head"/><result column="register_date" property="registerDate"/><result column="last_login_date" property="lastLoginDate"/><result column="login_count" property="loginCount"/></resultMap>
</mapper>
5.响应信息类
1.创建vo目录

2.RespBeanEnum.java 响应信息枚举类
package com.sxs.seckill.vo;import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.ToString;/*** Description: 响应枚举类** @Author sun* @Create 2024/5/5 15:15* @Version 1.0*/@Getter
@AllArgsConstructor
@ToString
public enum RespBeanEnum {// 通用SUCCESS(200, "SUCCESS"),ERROR(500, "服务端异常"),//登录模块LOGIN_ERROR(500210, "用户名或者密码错误"),MOBILE_ERROR(500211, "手机号码格式不正确"), BING_ERROR(500212, "参数绑定异常"), MOBILE_NOT_EXIST(500213, "手机号码不存在"), PASSWORD_UPDATE_FAIL(500214, "更新密码失败");// 响应码和响应信息private final Integer code;private final String message;}
3.RespBean.java 响应信息的Bean
package com.sxs.seckill.vo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;/*** Description:** @Author sun* @Create 2024/5/5 15:32* @Version 1.0*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class RespBean {private long code;private String message;private Object obj;// 成功后public static RespBean success(Object obj) {return new RespBean(RespBeanEnum.SUCCESS.getCode(), RespBeanEnum.SUCCESS.getMessage(), obj);}public static RespBean success() {return new RespBean(RespBeanEnum.SUCCESS.getCode(), RespBeanEnum.SUCCESS.getMessage(), null);}// 失败各有不同public static RespBean error(RespBeanEnum respBeanEnum) {return new RespBean(respBeanEnum.getCode(), respBeanEnum.getMessage(), null);}public static RespBean error(RespBeanEnum respBeanEnum, Object obj) {return new RespBean(respBeanEnum.getCode(), respBeanEnum.getMessage(), obj);}
}
6.编写接受登录信息的vo以及手机号校验工具类
1.LoginVo.java
package com.sxs.seckill.vo;/*** Description: 登录实体类** @Author sun* @Create 2024/5/5 15:43* @Version 1.0*/
public class LoginVo {private String mobile;private String password;
}
2.ValidatorUtil.java
package com.sxs.seckill.utils;import org.junit.jupiter.api.Test;/*** Description: 校验工具类** @Author sun* @Create 2024/5/5 15:45* @Version 1.0*/
public class ValidatorUtil {/*** 校验手机号是否有效* @param phoneNumber 手机号* @return 如果手机号有效返回 true,否则返回 false*/public static boolean isMobile(String phoneNumber) {// 中国大陆的手机号码正则表达式,要求是11位数字,以1开头,第二位是3-9,后面是任意数字共11位String regex = "^1[3-9]\\d{9}$";return phoneNumber.matches(regex);}// 测试@Testpublic void t1() {System.out.println(isMobile("12345678901"));System.out.println(isMobile("1234567890"));// 正确的System.out.println(isMobile("13604969873"));}
}

7.编写service层
1.UserService.java
package com.sxs.seckill.service;import com.baomidou.mybatisplus.extension.service.IService;
import com.sxs.seckill.pojo.User;
import com.sxs.seckill.vo.LoginVo;
import com.sxs.seckill.vo.RespBean;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*** Description:** @Author sun* @Create 2024/5/5 15:58* @Version 1.0*/
public interface UserService extends IService<User> {/*** 用户登录校验* @param loginVo* @param request* @param response* @return*/RespBean doLogin(LoginVo loginVo, HttpServletRequest request, HttpServletResponse response);
}
2.UserServiceImpl.java
package com.sxs.seckill.service.impl;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.sxs.seckill.mapper.UserMapper;
import com.sxs.seckill.pojo.User;
import com.sxs.seckill.service.UserService;
import com.sxs.seckill.utils.MD5Util;
import com.sxs.seckill.utils.ValidatorUtil;
import com.sxs.seckill.vo.LoginVo;
import com.sxs.seckill.vo.RespBean;
import com.sxs.seckill.vo.RespBeanEnum;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*** Description:** @Author sun* @Create 2024/5/5 15:59* @Version 1.0*/
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {@Resourceprivate UserMapper userMapper;@Overridepublic RespBean doLogin(LoginVo loginVo, HttpServletRequest request, HttpServletResponse response) {// 获取用户输入的手机号和密码,此时的密码已经是midPassString mobile = loginVo.getMobile();String password = loginVo.getPassword();// 判断手机号和密码是否为空if (StringUtils.isBlank(mobile) || StringUtils.isBlank(password)) {return RespBean.error(RespBeanEnum.LOGIN_ERROR);}// 校验手机号是否正确if (!ValidatorUtil.isMobile(mobile)) {return RespBean.error(RespBeanEnum.MOBILE_ERROR);}// 根据手机号查询用户User user = userMapper.selectById(mobile);// 判断用户是否为空if (null == user) {return RespBean.error(RespBeanEnum.LOGIN_ERROR);}// 判断密码是否正确if (!MD5Util.midPassToDBPass(password, user.getSlat()).equals(user.getPassword())) {return RespBean.error(RespBeanEnum.LOGIN_ERROR);}// 返回成功return RespBean.success();}
}
8.编写controller层
1.引入校验的依赖
<!--validation 参数校验--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId><version>2.4.5</version></dependency>
2.LoginController.java
package com.sxs.seckill.controller;import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;/*** Description:** @Author sun* @Create 2024/5/5 16:41* @Version 1.0*/
@Slf4j
@Controller
@RequestMapping("/login")
public class LoginController {/*** 访问/login/toLogin会跳转到templates/login.html* @return*/@RequestMapping("/toLogin")public String toLogin() {return "login";}}
3.引入静态资源和模板页

4.解析前端登录
1.点击登录,调用login

2.将密码加密加盐之后向后端 /login/doLogin 发送请求

5.测试访问首页
1.首先检查资源是否到了target目录,如果没到需要maven重新编译

2.测试访问 http://localhost:9092/seckill/login/toLogin

6.前端区分多环境
1.可以看到前端请求时使用的/其实只是本机的服务发现,也就是http://localhost:9092/,所以需要区分多环境

2.首先新增一个配置类 GlobalControllerAdvice.java 全局控制器通知,用于向前端传递全局变量
package com.sxs.seckill.config;import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ModelAttribute;/*** Description: 全局控制器通知,用于向前端传递全局变量** @Author sun* @Create 2024/5/5 17:08* @Version 1.0*/
@ControllerAdvice
public class GlobalControllerAdvice {// 从配置文件中读取baseUrl,从而使前端可以区分多环境@Value("${baseurl}")private String baseurl;@ModelAttribute("baseUrl")public String baseUrl() {// 这里可以根据环境变量或其他逻辑来动态确定 URLreturn baseurl;}
}
3.在application.yml和application-prod.yml编写baseUrl,区分多环境

4.login.html 读取baseUrl
1.在script标签内添加一行代码使其能够解析Thymeleaf
th:inline="javascript"
2.修改请求,格式为 baseUrl + 资源路径

7.在数据库添加一条记录,可以模拟用户登录
1.假设密码是admin,在前端输出一下第一次加密加盐的结果


2.使用后端的工具类也来加密一下,比对结果,发现结果一致


3.在第二次加密的时候重新设置一个不同的盐为niubi666,模拟不同用户

4.将结果放到数据库中

5.此时的用户名和密码
- 19588888888:195+八个八
- admin
8.编写登录的controller并测试
1.LoginController.java
@ResponseBody@RequestMapping("/doLogin")public RespBean doLogin(LoginVo loginVo, HttpServletRequest request, HttpServletResponse response) {RespBean respBean = userService.doLogin(loginVo, request, response);// 返回return respBean;}
2.测试,登录成功

相关文章:
高并发项目-用户登录基本功能
文章目录 1.数据库表设计1.IDEA连接数据库2.修改application.yml中数据库的名称为seckill3.IDEA创建数据库seckill4.创建数据表 seckill_user5.密码加密分析1.传统方式(不安全)2.改进方式(两次加密加盐) 2.密码加密功能实现1.pom.…...
kotlin基础之泛型和委托
Kotlin泛型的概念及使用 泛型概念 在Kotlin中,泛型(Generics)是一种允许在类、接口和方法中使用类型参数的技术。这些类型参数在实例化类、实现接口或调用方法时会被具体的类型所替代。泛型的主要目的是提高代码的复用性、类型安全性和可读…...
awtk踩坑记录二:移植jerryscript到awtk design项目
工作要求,想尝试看看在awtk-designer设计界面的同时能不能用javascript开发逻辑层,以此和前端技术联动,本文是一种项目建构的思路。 从github下载并编译awtk, awtk-mmvm和awtk-jerryscript(如果没有) 用awtk-designer…...
正邦科技(day2)
自动校准 问题:电量不准都可以直接去校准 校准方式:可程式变频电压 问题分析:他是通过软件去自动自动校准的,flash 清空的时候有缓存没有清空,或者互感器没有读取到问题 互感器:电流互感器的作用包括电流测…...
技术架构设计指南:从需求到实现
技术架构是软件系统的骨架,它决定了系统的性能、可靠性、扩展性等关键特性。本文将介绍技术架构设计的一般步骤和方法。 第一步:需求分析 在设计技术架构之前,首先要对系统需求进行全面深入的分析。这包括功能需求、非功能需求(如…...
【数据结构:排序算法】堆排序(图文详解)
🎁个人主页:我们的五年 🔍系列专栏:数据结构课程学习 🎉欢迎大家点赞👍评论📝收藏⭐文章 目录 🍩1.大堆和小堆 🍩2.向上调整算法建堆和向下调整算法建堆:…...
git 派生仓库怎么同步主仓库的新分支
一、git 派生仓库怎么同步主仓库的新分支 要使你的Git派生仓库同步主仓库的新分支,请遵循以下步骤: 1、添加上游仓库(如果尚未添加): 如之前所述,确保上游仓库已经被添加到你的本地仓库。如果没有,使用命…...
对比方案:5款知识中台工具的优缺点详解
知识中台工具为企业和组织高效地组织、存储和分享知识,还能提升团队协作的效率。在选择搭建知识中台的工具时,了解工具的优缺点,有助于企业做出最佳决策。本文LookLook同学将对五款搭建知识中台的工具进行优缺点的简单介绍,帮助企…...
第16章-超声波跟随功能 基于STM32的三路超声波自动跟随小车 毕业设计 课程设计
第16章-超声波跟随功能 无PID跟随功能 //超声波跟随if(HC_SR04_Read() > 25){motorForward();//前进HAL_Delay(100);}if(HC_SR04_Read() < 20){motorBackward();//后退HAL_Delay(100);}PID跟随功能 在pid.c中定义一组PID参数 tPid pidFollow; //定距离跟随PIDpidFol…...
创新案例 | 持续增长,好孩子集团的全球化品牌矩阵战略与客户中心设计哲学
探索好孩子集团如何通过创新设计的全球化品牌矩阵和以客户为中心的产品策略,在竞争激烈的母婴市场中实现持续增长。深入了解其品牌价值观、市场定位策略以及如何满足新一代父母的需求。本文旨在为中高级职场人士、创业家及创新精英提供深度见解,帮助他们…...
ResNet 原理剖析以及代码复现
原理 ResNet 解决了什么问题? 一言以蔽之:解决了深度的神经网络难以训练的问题。 具体的说,理论上神经网络的深度越深,其训练效果应该越好,但实际上并非如此,层数越深会导致越差的结果并且容易产生梯度爆炸…...
数据结构(十)图
文章目录 图的简介图的定义图的结构图的分类无向图有向图带权图(Wighted Graph) 图的存储邻接矩阵(Adjacency Matrix)邻接表代码实现 图的遍历深度优先搜索(DFS,Depth Fisrt Search)遍历抖索过程…...
四数之和-力扣
本题在三数之和的基础上,再增加一重循环进行解答 首先注意的点是,一级剪枝处理,target > 0 && nums[i] > target 此处只有整数才可剪枝处理,如果target为负数,nums[i] < target,也不能代…...
JS 中怎么删除数组元素?有哪几种方法?
正文开始之前推荐一位宝藏博主免费分享的学习教程,学起来! 编号学习链接1Cesium: 保姆级教程+源码示例2openlayers: 保姆级教程+源码示例3Leaflet: 保姆级教程+源码示例4MapboxGL: 保姆级教程+源码示例splice() JavaScript中的splice()方法是一个内置的数组对象函数, 用于…...
Git如何将pre-commit也提交到仓库
我一开始准备将pre-commit提交到仓库进行备份的,但是却发现提交不了,即使我使用强制提交都不行。 (main) $ git add ./.git/hooks/pre-commit(main) $ git status On branch main nothing to commit, working tree clean# 强制提交(main) $ git add -f .…...
vmware中Ubuntu虚拟机和本地电脑Win10互相ping通
初始状态 使用vmware17版本安装的Ubuntu的20版本,安装之后什么配置都要不懂,然后进行下述配置。 初始的时候是NAT,没动的. 设置 点击右键编辑“属性” 常规选择“启用”: 高级选择全部: 打开网络配置,右键属…...
比较含退格的字符串-力扣
做这道题时出现了许多问题 第一次做题思路是使用双指针去解决,快慢指针遇到字母则前进,遇到 # 则慢指针退1,最开始并未考虑到 slowindex < 0 ,从而导致越界。第二个问题在于,在最后判断两个字符串是否相同时,最初使…...
NSSCTF-Web题目4
[SWPUCTF 2021 新生赛]hardrce 1、题目 2、知识点 rce:远程代码执行、url取反编码 3、解题思路 打开题目 出现一段代码,审计源代码 题目需要我们通过get方式输入变量wllm的值 但是变量的值被过滤了,不能输入字母和\t、\n等值 所以我们需…...
7. CSS 网格布局
CSS3引入了强大的网格布局(Grid Layout),它提供了一种二维的布局方式,使得创建复杂的网页布局变得更加简单和直观。通过定义行和列,我们可以精确控制网页元素的排列和对齐。本章将详细介绍网格布局的基本概念和属性&am…...
如何配置才能连接远程服务器上的 redis server ?
文章目录 Intro修改点 Intro 以阿里云服为例。 首先,我在我买的阿里云服务器中以下载源码、手动编译的方式安装了 redis-server,操作流程见:Ubuntu redis 下载解压配置使用及密码管理 && 包管理工具联网安装。 接着,我…...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
Unity UGUI Button事件流程
场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...
