Update UserRegisterController.java

cyj
pbvfus8to 2 months ago
parent 004421575a
commit fe68f8adb7

@ -1,6 +1,5 @@
package com.yami.shop.api.controller;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@ -24,7 +23,9 @@ import jakarta.validation.Valid;
import java.util.Date;
/**
*
*
*
* 使
*
* @author SJL
*/
@ -34,68 +35,118 @@ import java.util.Date;
@AllArgsConstructor
public class UserRegisterController {
// 通过构造函数注入的方式引入用户服务层接口,用于调用与用户相关的业务逻辑方法,比如保存用户信息、根据条件查询用户等操作。
private final UserService userService;
// 通过构造函数注入的方式引入密码编码器,用于对用户密码进行加密处理,保证密码在存储和传输过程中的安全性。
private final PasswordEncoder passwordEncoder;
// 通过构造函数注入的方式引入令牌存储相关的类,用于处理用户登录后令牌的生成、存储以及获取相关信息等操作,实现用户身份认证和授权相关功能。
private final TokenStore tokenStore;
// 通过构造函数注入的方式引入密码管理相关的类,可能用于对用户输入的密码进行解密(如果有加密传输等情况)或者其他密码相关的管理操作。
private final PasswordManager passwordManager;
/**
* 使
*
* 访
*
* @param userRegisterParam @Valid
* @return ServerResponseEntity TokenInfoVO
*/
@PostMapping("/register")
@Operation(summary = "注册" , description = "用户注册或绑定手机号接口")
@Operation(summary = "注册", description = "用户注册或绑定手机号接口")
public ServerResponseEntity<TokenInfoVO> register(@Valid @RequestBody UserRegisterParam userRegisterParam) {
// 如果用户注册参数中的昵称nickName为空字符串则将用户名userName作为昵称使用保证昵称有值。
if (StrUtil.isBlank(userRegisterParam.getNickName())) {
userRegisterParam.setNickName(userRegisterParam.getUserName());
}
// 正在进行申请注册
// 通过用户服务层的方法,使用 MyBatis Plus 的 LambdaQueryWrapper 构建查询条件,统计数据库中昵称与传入的昵称相同的用户数量,
// 如果数量大于 0则表示该用户名昵称已被注册抛出异常提示用户无法重新注册。
if (userService.count(new LambdaQueryWrapper<User>().eq(User::getNickName, userRegisterParam.getNickName())) > 0) {
// 该用户名已注册,无法重新注册
throw new YamiShopBindException("该用户名已注册,无法重新注册");
}
// 创建当前时间对象,用于设置用户的修改时间、注册时间等属性,确保记录的时间信息准确。
Date now = new Date();
// 创建一个新的用户对象,用于填充用户注册信息并保存到数据库中。
User user = new User();
// 设置用户的修改时间为当前时间,表示该用户信息的最近一次修改时间。
user.setModifyTime(now);
// 设置用户的注册时间为当前时间,记录用户注册的具体时间点。
user.setUserRegtime(now);
// 设置用户状态为有效(这里假设状态值为 1 表示有效,可根据实际业务定义调整)。
user.setStatus(1);
// 设置用户的昵称,使用经过前面逻辑处理后的昵称值(可能是原昵称或者用户名)。
user.setNickName(userRegisterParam.getNickName());
// 设置用户的邮箱信息,从注册参数中获取并赋值给用户对象。
user.setUserMail(userRegisterParam.getUserMail());
// 通过密码管理类的方法,对用户注册参数中传入的密码进行解密操作(可能是之前加密传输过来的情况),获取解密后的密码字符串。
String decryptPassword = passwordManager.decryptPassword(userRegisterParam.getPassWord());
// 使用密码编码器对解密后的密码进行加密处理,将加密后的密码设置到用户对象中,保证密码在数据库中以加密形式存储,提高安全性。
user.setLoginPassword(passwordEncoder.encode(decryptPassword));
// 使用 Hutool 工具类生成一个简单的唯一用户 ID这里采用 UUID 的简化形式,可根据实际需求调整生成方式),作为用户的标识。
String userId = IdUtil.simpleUUID();
// 将生成的用户 ID 设置到用户对象中,确保每个用户在系统中有唯一的标识。
user.setUserId(userId);
// 调用用户服务层的保存方法,将填充好信息的用户对象保存到数据库中,完成用户注册操作。
userService.save(user);
// 2. 登录
// 模拟用户登录操作,创建一个用于存储在令牌中的用户信息对象,填充用户 ID、用户类型这里设置为普通用户通过枚举值获取、是否为管理员这里设置为否以及是否启用等信息。
UserInfoInTokenBO userInfoInTokenBO = new UserInfoInTokenBO();
userInfoInTokenBO.setUserId(user.getUserId());
userInfoInTokenBO.setSysType(SysTypeEnum.ORDINARY.value());
userInfoInTokenBO.setIsAdmin(0);
userInfoInTokenBO.setEnabled(true);
// 通过令牌存储类的方法,将用户信息存储并生成对应的令牌信息对象,然后返回包含令牌信息的响应结果给前端,方便后续用户进行身份认证和授权访问。
return ServerResponseEntity.success(tokenStore.storeAndGetVo(userInfoInTokenBO));
}
/**
*
*
*
*
* @param userPwdUpdateParam @Valid
* @return ServerResponseEntity
*/
@PutMapping("/updatePwd")
@Operation(summary = "修改密码" , description = "修改密码")
@Operation(summary = "修改密码", description = "修改密码")
public ServerResponseEntity<Void> updatePwd(@Valid @RequestBody UserRegisterParam userPwdUpdateParam) {
// 通过用户服务层的方法,使用 MyBatis Plus 的 LambdaQueryWrapper 构建查询条件,根据用户名(昵称)从数据库中查询对应的用户信息,若查询不到则抛出异常提示无法获取用户信息。
User user = userService.getOne(new LambdaQueryWrapper<User>().eq(User::getNickName, userPwdUpdateParam.getNickName()));
if (user == null) {
// 无法获取用户信息
throw new YamiShopBindException("无法获取用户信息");
}
// 通过密码管理类的方法,对用户修改密码参数中传入的新密码进行解密操作(可能是之前加密传输过来的情况),获取解密后的密码字符串。
String decryptPassword = passwordManager.decryptPassword(userPwdUpdateParam.getPassWord());
// 如果解密后的新密码为空字符串,则抛出异常提示新密码不能为空。
if (StrUtil.isBlank(decryptPassword)) {
// 新密码不能为空
throw new YamiShopBindException("新密码不能为空");
}
// 使用密码编码器对解密后的新密码进行加密处理,得到加密后的密码字符串。
String password = passwordEncoder.encode(decryptPassword);
// 如果加密后的新密码与用户原密码相同,则抛出异常提示新密码不能与原密码相同,保证密码修改的合理性。
if (StrUtil.equals(password, user.getLoginPassword())) {
// 新密码不能与原密码相同
throw new YamiShopBindException("新密码不能与原密码相同");
}
// 设置用户的修改时间为当前时间,表示此次密码修改操作的时间。
user.setModifyTime(new Date());
// 将加密后的新密码设置到用户对象中,更新用户的密码信息到数据库中,完成密码修改操作。
user.setLoginPassword(password);
// 调用用户服务层的更新方法,将更新后的用户对象信息保存到数据库中,确保密码修改生效。
userService.updateById(user);
return ServerResponseEntity.success();
}
}
Loading…
Cancel
Save