【wiki知识库】07.用户管理后端SpringBoot部分

devtools/2025/2/7 22:17:56/

目录

一、今日目标

二、🎈SpringBoot部分类的添加

2.1 使用逆向工程新增User模块

2.2 UserQueryParam添加

2.3 UserSaveParam添加

2.4 UserResetPasswordParam添加

2.5 UserQueryVo添加

2.6 SnowFlake工具类

三、🚆后端新增接口 

3.1 /user/list接口添加

3.2 /user/save接口添加

3.3 /user/delete接口添加

3.4 /user/reset-password接口添加


一、今日目标

上一篇文章我把前端部分的代码给大家了,这篇文章就来实现上一篇文章没有完成的接口。

二、🎈SpringBoot部分类的添加

2.1 使用逆向工程新增User模块

这一块的代码和之前的相同,我们找到逆向工程的工具类后,把类的部分改为user即可。

2.2 UserQueryParam添加

这个类看名字也知道是用来用户查询的,要继承之前的分页类。

java">@Data
public class UserQueryParam extends PageParam {private String loginName;
}

2.3 UserSaveParam添加

这个类是用来作为用户新增参数接收用的。这个类作为用户信息保存的参数类,在这个类中对于属性的值做了一些限制。用户名、昵称和密码不能为空,同时密码要匹配正则表达式,这个正则表达式限制了密码由数字和字母组成,并且长度在6-32位,如果上边有条件不满足,那么就会抛出message中的错误。

java">@Data
public class UserSaveParam {private Long id;@NotNull(message = "【用户名】不能为空")private String loginName;@NotNull(message = "【昵称】不能为空")private String name;@NotNull(message = "【密码】不能为空")@Pattern(regexp = "^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,32}$", message = "【密码】至少包含 数字和英文,长度6-32")private String password;}

2.4 UserResetPasswordParam添加

这个类用于重置用户密码,传入账号的id还有用户的新密码。同样也做了密码的安全性校验。

java">@Data
public class UserResetPasswordParam {private Long id;@NotNull(message = "【密码】不能为空")@Pattern(regexp = "^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,32}$", message = "【密码】至少包含 数字和英文,长度6-32")private String password;
}

2.5 UserQueryVo添加

这个类作为用户查询结果返回。

java">@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserQueryVo {private Long id;private String loginName;private String name;private String password;}

2.6 SnowFlake工具类

这个工具类的作用就是生成一个不会重复的id值,想要了解具体内容的小伙伴可以搜索一下雪花算法。现在我先不过多介绍,可能之后会补上这一部分。现在只要记住这个类可以帮你生成一个不会重复的id值就可以了。

java">
/*** Twitter的分布式自增ID雪花算法**/
@Component
public class SnowFlake {/*** 起始的时间戳*/private final static long START_STMP = 1609459200000L; // 2021-01-01 00:00:00/*** 每一部分占用的位数*/private final static long SEQUENCE_BIT = 12; //序列号占用的位数private final static long MACHINE_BIT = 5;   //机器标识占用的位数private final static long DATACENTER_BIT = 5;//数据中心占用的位数/*** 每一部分的最大值*/private final static long MAX_DATACENTER_NUM = -1L ^ (-1L << DATACENTER_BIT);private final static long MAX_MACHINE_NUM = -1L ^ (-1L << MACHINE_BIT);private final static long MAX_SEQUENCE = -1L ^ (-1L << SEQUENCE_BIT);/*** 每一部分向左的位移*/private final static long MACHINE_LEFT = SEQUENCE_BIT;private final static long DATACENTER_LEFT = SEQUENCE_BIT + MACHINE_BIT;private final static long TIMESTMP_LEFT = DATACENTER_LEFT + DATACENTER_BIT;private long datacenterId = 1;  //数据中心private long machineId = 1;     //机器标识private long sequence = 0L; //序列号private long lastStmp = -1L;//上一次时间戳public SnowFlake() {}public SnowFlake(long datacenterId, long machineId) {if (datacenterId > MAX_DATACENTER_NUM || datacenterId < 0) {throw new IllegalArgumentException("datacenterId can't be greater than MAX_DATACENTER_NUM or less than 0");}if (machineId > MAX_MACHINE_NUM || machineId < 0) {throw new IllegalArgumentException("machineId can't be greater than MAX_MACHINE_NUM or less than 0");}this.datacenterId = datacenterId;this.machineId = machineId;}/*** 产生下一个ID** @return*/public synchronized long nextId() {long currStmp = getNewstmp();if (currStmp < lastStmp) {throw new RuntimeException("Clock moved backwards.  Refusing to generate id");}if (currStmp == lastStmp) {//相同毫秒内,序列号自增sequence = (sequence + 1) & MAX_SEQUENCE;//同一毫秒的序列数已经达到最大if (sequence == 0L) {currStmp = getNextMill();}} else {//不同毫秒内,序列号置为0sequence = 0L;}lastStmp = currStmp;return (currStmp - START_STMP) << TIMESTMP_LEFT //时间戳部分| datacenterId << DATACENTER_LEFT       //数据中心部分| machineId << MACHINE_LEFT             //机器标识部分| sequence;                             //序列号部分}private long getNextMill() {long mill = getNewstmp();while (mill <= lastStmp) {mill = getNewstmp();}return mill;}private long getNewstmp() {return System.currentTimeMillis();}
}

上边的代码都没有什么难度,下面就开始实现用户管理的逻辑部分。

三、🚆后端新增接口 

在UserController类中需要小小的修改一下。

java">@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate UserService userService;
}

3.1 /user/list接口添加

其实这样的代码已经写了不少了,这样的list查询并没有什么难度,

java">@RequestMapping("/list")public CommonResp list(@Validated UserQueryParam userQueryParam){PageVo<UserQueryVo> list = userService.list(userQueryParam);return new CommonResp(true,"查找成功", list);}

UserServiceImpl中的list接口。

java"> public PageVo<UserQueryVo> list(UserQueryParam userQueryParam) {// 构建一个表达式来筛选用户LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.eq(StringUtils.isNotBlank(userQueryParam.getLoginName()),User::getLoginName,userQueryParam.getLoginName());// 创建分页查询的对象Page<User> page = new Page<>(userQueryParam.getPage(),userQueryParam.getSize());// 接收分页查询的结果Page<User> resultPage = userMapper.selectPage(page, queryWrapper);// 这个对象用于返回给前端PageVo<UserQueryVo> pageVo = new PageVo<>();// 将分页查询的结果转换一下 User-》UserQueryVoList<UserQueryVo> users = CopyUtil.copyList(resultPage.getRecords(),UserQueryVo.class);pageVo.setList(users);pageVo.setTotal(resultPage.getTotal());return pageVo;}

3.2 /user/save接口添加

值得注意的是,在数据库当中,用户的密码我们不在进行明文存储了,我们存储的都是加密后的代码,这里仅仅使用了简单的md5加密算法,实际的加密码算法有很多种类型。

java">@PostMapping("/save")public CommonResp save(@Valid @RequestBody UserSaveParam userSaveParam) {userSaveParam.setPassword(DigestUtils.md5DigestAsHex(userSaveParam.getPassword().getBytes()));boolean save = userService.save(userSaveParam);String message = Boolean.TRUE.equals(save) ? "添加成功":"添加失败";return new CommonResp<>(save,message,null);}

UserServiceImpl中的save接口。

java"> public boolean save(UserSaveParam userSaveParam) {User user = CopyUtil.copy(userSaveParam, User.class);if (ObjectUtils.isEmpty(userSaveParam.getId())) {User userDB = selectByLoginName(userSaveParam.getLoginName());if (ObjectUtils.isEmpty(userDB)) {// 新增user.setId(snowFlake.nextId());userMapper.insert(user);} else {// 用户名已存在throw new RuntimeException("用户存在");}} else {// 更新user.setLoginName(null);user.setPassword(null);userMapper.updateById(user);}return true;}private User selectByLoginName(String loginName) {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.eq("login_name", loginName);return userMapper.selectOne(queryWrapper);}

3.3 /user/delete接口添加

这一部分就更简单了。

java">  @DeleteMapping("/delete/{id}")public CommonResp delete(@PathVariable Long id) {boolean res = userService.removeById(id);String message = Boolean.TRUE.equals(res) ? "删除成功":"删除失败";return new CommonResp<>(res,message,null);}

3.4 /user/reset-password接口添加

java">  @PostMapping("/reset-password")public CommonResp resetPassword(@Valid @RequestBody UserResetPasswordParam req) {req.setPassword(DigestUtils.md5DigestAsHex(req.getPassword().getBytes()));userService.resetPassword(req);return new CommonResp(true,"密码重置成功",null);}

UserServiceImpl中的resetPassword接口。 

java">    public void resetPassword(UserResetPasswordParam req) {User user = CopyUtil.copy(req, User.class);userMapper.updateById(user);}

http://www.ppmy.cn/devtools/156942.html

相关文章

某音小程序反编译签名加密静态分析

文章目录 1. 写在前面2. 抓包分析3. 逆向分析 【&#x1f3e0;作者主页】&#xff1a;吴秋霖 【&#x1f4bc;作者介绍】&#xff1a;擅长爬虫与JS加密逆向分析&#xff01;Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python…

Jetbrains 官方微信小程序插件已上线!

就在昨天&#xff0c;Jetbrains官方发布了一篇文章&#xff0c;宣布它们发布了一款专用于微信小程序开发的插件&#xff08;插件名称&#xff1a;WeChat Mini Program&#xff09;&#xff0c;至此&#xff0c;大家可以使用Jetbrains家的IDE&#xff08;例如IDEA、WebStorm&…

OpenAI发布最新推理模型o3-mini

OpenAI于周五推出了新的AI"推理"模型o3-mini&#xff0c;这是该公司o系列推理模型家族的最新成员。 OpenAI此前在12月份就预告过这个模型&#xff0c;同时还展示了一个能力更强的系统o3。此次发布恰逢OpenAI面临诸多机遇与挑战的关键时刻。 目前&#xff0c;OpenAI…

[LeetCode]全排列I,II

全排列I 给定一个不含重复数字的整数数组 nums &#xff0c;返回其 所有可能的全排列 。可以 按任意顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2&#xff1a; 输入&#xff1…

【SQL技术】不同数据库引擎 SQL 优化方案剖析

一、引言 在数据处理和分析的世界里&#xff0c;SQL 是不可或缺的工具。不同的数据库系统&#xff0c;如 MySQL、PostgreSQL&#xff08;PG&#xff09;、Doris 和 Hive&#xff0c;在架构和性能特点上存在差异&#xff0c;因此针对它们的 SQL 优化策略也各有不同。这些数据库中…

安装和卸载RabbitMQ

我的飞书:https://rvg7rs2jk1g.feishu.cn/docx/SUWXdDb0UoCV86xP6b3c7qtMn6b 使用Ubuntu环境进行安装 一、安装Erlang 在安装RabbitMQ之前,我们需要先安装Erlang,RabbitMQ需要Erlang的语言支持 #安装Erlang sudo apt-get install erlang 在安装的过程中,会弹出一段信息,此…

GitHub Copilot 越狱漏洞

研究人员发现了两种操控 GitHub 的人工智能&#xff08;AI&#xff09;编码助手 Copilot 的新方法&#xff0c;这使得人们能够绕过安全限制和订阅费用、训练恶意模型等。 第一种技巧是将聊天交互嵌入 Copilot 代码中&#xff0c;利用 AI 的问答能力&#xff0c;使其产生恶意输…

upload-labs通关

前言 我们下面进行下一个漏洞——文件上传的学习。文件上传是常见漏洞之一&#xff0c;是Web安全入门必学漏洞。为探讨清楚文件上传漏洞的诸多细节&#xff0c;我们特以经典的upload-labs进行从入门到进阶的专项训练。 在做题过程中&#xff0c;作者把用到的知识进行了全面、…