mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-11-01 02:38:43 +08:00 
			
		
		
		
	| @@ -154,4 +154,10 @@ 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)); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -0,0 +1,33 @@ | ||||
| package cn.iocoder.yudao.module.system.controller.admin.auth.vo; | ||||
|  | ||||
|  | ||||
| import io.swagger.v3.oas.annotations.media.Schema; | ||||
| import lombok.Data; | ||||
| import org.hibernate.validator.constraints.Length; | ||||
|  | ||||
| import jakarta.validation.constraints.*; | ||||
|  | ||||
| @Schema(description = "管理后台 - Register Request VO") | ||||
| @Data | ||||
| public class AuthRegisterReqVO { | ||||
|  | ||||
|     @Schema(description = "用户账号", requiredMode = Schema.RequiredMode.REQUIRED, example = "yudao") | ||||
|     @NotBlank(message = "用户账号不能为空") | ||||
|     @Pattern(regexp = "^[a-zA-Z0-9]{4,30}$", message = "用户账号由 数字、字母 组成") | ||||
|     @Size(min = 4, max = 30, message = "用户账号长度为 4-30 个字符") | ||||
|     private String username; | ||||
|  | ||||
|     @Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") | ||||
|     @Size(max = 30, message = "用户昵称长度不能超过30个字符") | ||||
|     private String nickname; | ||||
|  | ||||
|     @Schema(description = "密码", requiredMode = Schema.RequiredMode.REQUIRED, example = "123456") | ||||
|     @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; | ||||
| } | ||||
| @@ -70,4 +70,11 @@ public interface AdminAuthService { | ||||
|      */ | ||||
|     AuthLoginRespVO refreshToken(String refreshToken); | ||||
|  | ||||
|     /** | ||||
|      * 用户注册 | ||||
|      * | ||||
|      * @param createReqVO 注册用户 | ||||
|      * @return 注册结果 | ||||
|      */ | ||||
|     AuthLoginRespVO register(AuthRegisterReqVO createReqVO); | ||||
| } | ||||
|   | ||||
| @@ -4,6 +4,7 @@ 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; | ||||
| @@ -14,6 +15,7 @@ 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; | ||||
| @@ -22,6 +24,7 @@ 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; | ||||
| @@ -29,6 +32,8 @@ 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; | ||||
| @@ -64,7 +69,13 @@ 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 | ||||
|      */ | ||||
| @@ -247,4 +258,38 @@ public class AdminAuthServiceImpl implements AdminAuthService { | ||||
|         return UserTypeEnum.ADMIN; | ||||
|     } | ||||
|  | ||||
|  | ||||
|     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); | ||||
|         } | ||||
|         // 插入用户 | ||||
|         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); | ||||
|     } | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 芋道源码
					芋道源码