mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-10-31 10:18:42 +08:00 
			
		
		
		
	【代码优化】注册的逻辑实现
This commit is contained in:
		| @@ -15,6 +15,7 @@ public interface ErrorCodeConstants { | ||||
|     ErrorCode AUTH_LOGIN_CAPTCHA_CODE_ERROR = new ErrorCode(1_002_000_004, "验证码不正确,原因:{}"); | ||||
|     ErrorCode AUTH_THIRD_LOGIN_NOT_BIND = new ErrorCode(1_002_000_005, "未绑定账号,需要进行绑定"); | ||||
|     ErrorCode AUTH_MOBILE_NOT_EXISTS = new ErrorCode(1_002_000_007, "手机号不存在"); | ||||
|     ErrorCode AUTH_REGISTER_CAPTCHA_CODE_ERROR = new ErrorCode(1_002_000_008, "验证码不正确,原因:{}"); | ||||
|  | ||||
|     // ========== 菜单模块 1-002-001-000 ========== | ||||
|     ErrorCode MENU_NAME_DUPLICATE = new ErrorCode(1_002_001_000, "已经存在该名字的菜单"); | ||||
|   | ||||
| @@ -115,6 +115,13 @@ public class AuthController { | ||||
|         return success(AuthConvert.INSTANCE.convert(user, roles, menuList)); | ||||
|     } | ||||
|  | ||||
|     @PostMapping("/register") | ||||
|     @PermitAll | ||||
|     @Operation(summary = "注册用户") | ||||
|     public CommonResult<AuthLoginRespVO> register(@RequestBody @Valid AuthRegisterReqVO registerReqVO) { | ||||
|         return success(authService.register(registerReqVO)); | ||||
|     } | ||||
|  | ||||
|     // ========== 短信登录相关 ========== | ||||
|  | ||||
|     @PostMapping("/sms-login") | ||||
| @@ -154,10 +161,4 @@ public class AuthController { | ||||
|         return success(authService.socialLogin(reqVO)); | ||||
|     } | ||||
|  | ||||
|     @PostMapping("/register") | ||||
|     @PermitAll | ||||
|     @Operation(summary = "注册用户") | ||||
|     public CommonResult<AuthLoginRespVO> register(@RequestBody @Valid AuthRegisterReqVO registerReqVO) { | ||||
|         return success(authService.register(registerReqVO)); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -18,16 +18,20 @@ public class AuthRegisterReqVO { | ||||
|     private String username; | ||||
|  | ||||
|     @Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") | ||||
|     @Size(max = 30, message = "用户昵称长度不能超过30个字符") | ||||
|     @NotBlank(message = "用户昵称不能为空") | ||||
|     @Size(max = 30, message = "用户昵称长度不能超过 30 个字符") | ||||
|     private String nickname; | ||||
|  | ||||
|     @Schema(description = "密码", requiredMode = Schema.RequiredMode.REQUIRED, example = "123456") | ||||
|     @NotEmpty(message = "密码不能为空") | ||||
|     @Length(min = 4, max = 16, message = "密码长度为 4-16 位") | ||||
|     private String password; | ||||
|  | ||||
|     // ========== 图片验证码相关 ========== | ||||
|  | ||||
|     @Schema(description = "验证码,验证码开启时,需要传递", requiredMode = Schema.RequiredMode.REQUIRED, | ||||
|             example = "PfcH6mgr8tpXuMWFjvW6YVaqrswIuwmWI5dsVZSg7sGpWtDCUbHuDEXl3cFB1+VvCC/rAkSwK8Fad52FSuncVg==") | ||||
|     @NotEmpty(message = "验证码不能为空", groups = AuthLoginReqVO.CodeEnableGroup.class) | ||||
|     private String captchaVerification; | ||||
|  | ||||
| } | ||||
| @@ -77,4 +77,5 @@ public interface AdminAuthService { | ||||
|      * @return 注册结果 | ||||
|      */ | ||||
|     AuthLoginRespVO register(AuthRegisterReqVO createReqVO); | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -4,7 +4,6 @@ import cn.hutool.core.util.ObjectUtil; | ||||
| import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; | ||||
| import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; | ||||
| import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils; | ||||
| import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | ||||
| import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils; | ||||
| import cn.iocoder.yudao.framework.common.util.validation.ValidationUtils; | ||||
| import cn.iocoder.yudao.module.system.api.logger.dto.LoginLogCreateReqDTO; | ||||
| @@ -15,7 +14,6 @@ import cn.iocoder.yudao.module.system.controller.admin.auth.vo.*; | ||||
| import cn.iocoder.yudao.module.system.convert.auth.AuthConvert; | ||||
| import cn.iocoder.yudao.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; | ||||
| import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; | ||||
| import cn.iocoder.yudao.module.system.dal.mysql.user.AdminUserMapper; | ||||
| import cn.iocoder.yudao.module.system.enums.logger.LoginLogTypeEnum; | ||||
| import cn.iocoder.yudao.module.system.enums.logger.LoginResultEnum; | ||||
| import cn.iocoder.yudao.module.system.enums.oauth2.OAuth2ClientConstants; | ||||
| @@ -24,20 +22,17 @@ import cn.iocoder.yudao.module.system.service.logger.LoginLogService; | ||||
| import cn.iocoder.yudao.module.system.service.member.MemberService; | ||||
| import cn.iocoder.yudao.module.system.service.oauth2.OAuth2TokenService; | ||||
| import cn.iocoder.yudao.module.system.service.social.SocialUserService; | ||||
| import cn.iocoder.yudao.module.system.service.tenant.TenantService; | ||||
| import cn.iocoder.yudao.module.system.service.user.AdminUserService; | ||||
| import com.google.common.annotations.VisibleForTesting; | ||||
| import com.xingyuv.captcha.model.common.ResponseModel; | ||||
| import com.xingyuv.captcha.model.vo.CaptchaVO; | ||||
| import com.xingyuv.captcha.service.CaptchaService; | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| import org.springframework.beans.factory.annotation.Value; | ||||
| import org.springframework.context.annotation.Lazy; | ||||
| import org.springframework.security.crypto.password.PasswordEncoder; | ||||
| import org.springframework.stereotype.Service; | ||||
|  | ||||
| import jakarta.annotation.Resource; | ||||
| import jakarta.validation.Validator; | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| import org.springframework.beans.factory.annotation.Value; | ||||
| import org.springframework.stereotype.Service; | ||||
|  | ||||
| import java.util.Objects; | ||||
|  | ||||
| import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | ||||
| @@ -69,13 +64,7 @@ public class AdminAuthServiceImpl implements AdminAuthService { | ||||
|     private CaptchaService captchaService; | ||||
|     @Resource | ||||
|     private SmsCodeApi smsCodeApi; | ||||
|     @Resource | ||||
|     @Lazy // 延迟,避免循环依赖报错 | ||||
|     private TenantService tenantService; | ||||
|     @Resource | ||||
|     private AdminUserMapper userMapper; | ||||
|     @Resource | ||||
|     private PasswordEncoder passwordEncoder; | ||||
|  | ||||
|     /** | ||||
|      * 验证码的开关,默认为 true | ||||
|      */ | ||||
| @@ -258,38 +247,33 @@ public class AdminAuthServiceImpl implements AdminAuthService { | ||||
|         return UserTypeEnum.ADMIN; | ||||
|     } | ||||
|  | ||||
|  | ||||
|     @Override | ||||
|     public AuthLoginRespVO register(AuthRegisterReqVO registerReqVO) { | ||||
|         // 校验验证码 | ||||
|         AuthLoginReqVO loginReqVO = BeanUtils.toBean(registerReqVO, AuthLoginReqVO.class); | ||||
|         validateCaptcha(loginReqVO); | ||||
|         // 校验账户配合 | ||||
|         tenantService.handleTenantInfo(tenant -> { | ||||
|             long count = userMapper.selectCount(); | ||||
|             if (count >= tenant.getAccountCount()) { | ||||
|                 throw exception(USER_COUNT_MAX, tenant.getAccountCount()); | ||||
|             } | ||||
|         }); | ||||
|         // 校验用户名是否已存在 | ||||
|         if (userMapper.selectByUsername(registerReqVO.getUsername()) != null) { | ||||
|             throw exception(USER_USERNAME_EXISTS); | ||||
|         // 1. 校验验证码 | ||||
|         validateCaptcha(registerReqVO); | ||||
|  | ||||
|         // 2. 校验用户名是否已存在 | ||||
|         Long userId = userService.registerUser(registerReqVO); | ||||
|  | ||||
|         // 3. 创建 Token 令牌,记录登录日志 | ||||
|         return createTokenAfterLoginSuccess(userId, registerReqVO.getUsername(), LoginLogTypeEnum.LOGIN_USERNAME); | ||||
|     } | ||||
|  | ||||
|     @VisibleForTesting | ||||
|     void validateCaptcha(AuthRegisterReqVO reqVO) { | ||||
|         // 如果验证码关闭,则不进行校验 | ||||
|         if (!captchaEnable) { | ||||
|             return; | ||||
|         } | ||||
|         // 校验验证码 | ||||
|         ValidationUtils.validate(validator, reqVO, AuthLoginReqVO.CodeEnableGroup.class); | ||||
|         CaptchaVO captchaVO = new CaptchaVO(); | ||||
|         captchaVO.setCaptchaVerification(reqVO.getCaptchaVerification()); | ||||
|         ResponseModel response = captchaService.verification(captchaVO); | ||||
|         // 验证不通过 | ||||
|         if (!response.isSuccess()) { | ||||
|             throw exception(AUTH_REGISTER_CAPTCHA_CODE_ERROR, response.getRepMsg()); | ||||
|         } | ||||
|         // 插入用户 | ||||
|         AdminUserDO user = BeanUtils.toBean(registerReqVO, AdminUserDO.class); | ||||
|         user.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 默认开启 | ||||
|         user.setPassword(encodePassword(registerReqVO.getPassword())); // 加密密码 | ||||
|         userMapper.insert(user); | ||||
|  | ||||
|         return createTokenAfterLoginSuccess(user.getId(), registerReqVO.getUsername(), LoginLogTypeEnum.LOGIN_USERNAME); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 对密码进行加密 | ||||
|      * | ||||
|      * @param password 密码 | ||||
|      * @return 加密后的密码 | ||||
|      */ | ||||
|     private String encodePassword(String password) { | ||||
|         return passwordEncoder.encode(password); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -1,16 +1,23 @@ | ||||
| package cn.iocoder.yudao.module.system.service.user; | ||||
|  | ||||
| import cn.hutool.core.collection.CollUtil; | ||||
| import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||||
| import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; | ||||
| import cn.iocoder.yudao.module.system.controller.admin.auth.vo.AuthRegisterReqVO; | ||||
| import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdatePasswordReqVO; | ||||
| import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO; | ||||
| import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.*; | ||||
| import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||||
| import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserImportExcelVO; | ||||
| import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserImportRespVO; | ||||
| import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserPageReqVO; | ||||
| import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserSaveReqVO; | ||||
| import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; | ||||
|  | ||||
| import jakarta.validation.Valid; | ||||
|  | ||||
| import java.io.InputStream; | ||||
| import java.util.*; | ||||
| import java.util.Collection; | ||||
| import java.util.HashMap; | ||||
| import java.util.List; | ||||
| import java.util.Map; | ||||
|  | ||||
| /** | ||||
|  * 后台用户 Service 接口 | ||||
| @@ -27,6 +34,14 @@ public interface AdminUserService { | ||||
|      */ | ||||
|     Long createUser(@Valid UserSaveReqVO createReqVO); | ||||
|  | ||||
|     /** | ||||
|      * 注册用户 | ||||
|      * | ||||
|      * @param registerReqVO 用户信息 | ||||
|      * @return 用户编号 | ||||
|      */ | ||||
|     Long registerUser(@Valid AuthRegisterReqVO registerReqVO); | ||||
|  | ||||
|     /** | ||||
|      * 修改用户 | ||||
|      * | ||||
|   | ||||
| @@ -13,6 +13,7 @@ import cn.iocoder.yudao.framework.common.util.validation.ValidationUtils; | ||||
| import cn.iocoder.yudao.framework.datapermission.core.util.DataPermissionUtils; | ||||
| import cn.iocoder.yudao.module.infra.api.config.ConfigApi; | ||||
| import cn.iocoder.yudao.module.infra.api.file.FileApi; | ||||
| import cn.iocoder.yudao.module.system.controller.admin.auth.vo.AuthRegisterReqVO; | ||||
| import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdatePasswordReqVO; | ||||
| import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO; | ||||
| import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserImportExcelVO; | ||||
| @@ -115,6 +116,26 @@ public class AdminUserServiceImpl implements AdminUserService { | ||||
|         return user.getId(); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public Long registerUser(AuthRegisterReqVO registerReqVO) { | ||||
|         // 1.1 校验账户配合 | ||||
|         tenantService.handleTenantInfo(tenant -> { | ||||
|             long count = userMapper.selectCount(); | ||||
|             if (count >= tenant.getAccountCount()) { | ||||
|                 throw exception(USER_COUNT_MAX, tenant.getAccountCount()); | ||||
|             } | ||||
|         }); | ||||
|         // 1.2 校验正确性 | ||||
|         validateUserForCreateOrUpdate(null, registerReqVO.getUsername(), null, null, null, null); | ||||
|  | ||||
|         // 2. 插入用户 | ||||
|         AdminUserDO user = BeanUtils.toBean(registerReqVO, AdminUserDO.class); | ||||
|         user.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 默认开启 | ||||
|         user.setPassword(encodePassword(registerReqVO.getPassword())); // 加密密码 | ||||
|         userMapper.insert(user); | ||||
|         return user.getId(); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     @Transactional(rollbackFor = Exception.class) | ||||
|     @LogRecord(type = SYSTEM_USER_TYPE, subType = SYSTEM_USER_UPDATE_SUB_TYPE, bizNo = "{{#updateReqVO.id}}", | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 YunaiV
					YunaiV