From 2741e11078ccedd9ac925c7efd3ab053001f632c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=89=91=E9=9B=A8?= <2375294554@qq.com> Date: Fri, 16 May 2025 00:16:20 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=8F=91=E9=80=81=E7=9F=AD?= =?UTF-8?q?=E4=BF=A1=E9=AA=8C=E8=AF=81=E7=A0=81=E6=8E=A5=E5=8F=A3=EF=BC=8C?= =?UTF-8?q?=E6=89=BE=E5=9B=9E=E5=AF=86=E7=A0=81=E6=8E=A5=E5=8F=A3=EF=BC=8C?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=B3=A8=E5=86=8C=E6=8E=A5=E5=8F=A3=EF=BC=8C?= =?UTF-8?q?=E5=A6=82=E6=9E=9C=E5=BC=80=E5=90=AF=E6=89=8B=E6=9C=BA=E6=B3=A8?= =?UTF-8?q?=E5=86=8C=E6=A8=A1=E5=BC=8F=EF=BC=8C=E5=BC=80=E5=90=AF=E7=9F=AD?= =?UTF-8?q?=E4=BF=A1=E9=AA=8C=E8=AF=81=E6=A8=A1=E5=BC=8F=20--LoginControll?= =?UTF-8?q?er.java=20=E6=B7=BB=E5=8A=A0=E5=92=8C=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E6=96=B9=E6=B3=95=20--RetrievePasswordDTO.java=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E6=89=BE=E5=9B=9E=E5=AF=86=E7=A0=81dto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../security/controller/LoginController.java | 69 +++++++++++++++++-- .../modules/sys/dto/RetrievePasswordDTO.java | 30 ++++++++ 2 files changed, 95 insertions(+), 4 deletions(-) create mode 100644 main/manager-api/src/main/java/xiaozhi/modules/sys/dto/RetrievePasswordDTO.java diff --git a/main/manager-api/src/main/java/xiaozhi/modules/security/controller/LoginController.java b/main/manager-api/src/main/java/xiaozhi/modules/security/controller/LoginController.java index 7cbaa8af..7731caa0 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/security/controller/LoginController.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/security/controller/LoginController.java @@ -29,7 +29,9 @@ import xiaozhi.modules.security.service.CaptchaService; import xiaozhi.modules.security.service.SysUserTokenService; import xiaozhi.modules.security.user.SecurityUser; import xiaozhi.modules.sys.dto.PasswordDTO; +import xiaozhi.modules.sys.dto.RetrievePasswordDTO; import xiaozhi.modules.sys.dto.SysUserDTO; +import xiaozhi.modules.sys.service.SysParamsService; import xiaozhi.modules.sys.service.SysUserService; /** @@ -43,17 +45,26 @@ public class LoginController { private final SysUserService sysUserService; private final SysUserTokenService sysUserTokenService; private final CaptchaService captchaService; + private final SysParamsService sysParamsService; @GetMapping("/captcha") @Operation(summary = "验证码") public void captcha(HttpServletResponse response, String uuid) throws IOException { // uuid不能为空 AssertUtils.isBlank(uuid, ErrorCode.IDENTIFIER_NOT_NULL); - // 生成验证码 captchaService.create(response, uuid); } + @GetMapping("/smsVerification") + @Operation(summary = "短信验证码") + public void smsVerification(String phone) throws IOException { + // uuid不能为空 + AssertUtils.isBlank(phone, ErrorCode.IDENTIFIER_NOT_NULL); + // 发送短信验证码 + captchaService.sendSMSValidateCode(phone); + } + @PostMapping("/login") @Operation(summary = "登录") public Result login(@RequestBody LoginDTO login) { @@ -81,8 +92,23 @@ public class LoginController { if (!sysUserService.getAllowUserRegister()) { throw new RenException("当前不允许普通用户注册"); } - // 验证是否正确输入验证码 - boolean validate = captchaService.validate(login.getCaptchaId(), login.getCaptcha()); + // 是否开启手机注册 + Boolean isMobileRegister = sysParamsService.getValueObject(Constant.SysMSMParam + .SYSTEM_ENABLE_MOBILE_REGISTER.getValue(), Boolean.class); + boolean validate; + if (isMobileRegister) { + // 验证用户是否是手机号码 + boolean validPhone = ValidatorUtils.isValidPhone(login.getUsername()); + if (validPhone) { + throw new RenException("用户名不是手机号码,请重新输入"); + } + // 验证短信验证码是否正常 + validate = captchaService.validateSMSValidateCode(login.getUsername(),login.getCaptcha()); + } else { + // 验证是否正确输入验证码 + validate = captchaService.validate(login.getCaptchaId(), login.getCaptcha()); + } + // 判断是否通过验证 if (!validate) { throw new RenException("验证码错误,请重新获取"); } @@ -96,7 +122,6 @@ public class LoginController { userDTO.setPassword(login.getPassword()); sysUserService.save(userDTO); return new Result<>(); - } @GetMapping("/info") @@ -118,6 +143,42 @@ public class LoginController { return new Result<>(); } + @PutMapping("/retrieve-password") + @Operation(summary = "找回密码") + public Result retrievePassword(@RequestBody RetrievePasswordDTO dto) { + // 是否开启手机注册 + Boolean isMobileRegister = sysParamsService.getValueObject(Constant.SysMSMParam + .SYSTEM_ENABLE_MOBILE_REGISTER.getValue(), Boolean.class); + if (!isMobileRegister) { + throw new RenException("没有开启手机注册,没法使用找回密码功能"); + } + // 判断非空 + ValidatorUtils.validateEntity(dto); + // 验证用户是否是手机号码 + boolean validPhone = ValidatorUtils.isValidPhone(dto.getPhone()); + if (validPhone) { + throw new RenException("用户名不是手机号码,请重新输入"); + }; + + // 按照用户名获取用户 + SysUserDTO userDTO = sysUserService.getByUsername(dto.getPhone()); + if (userDTO == null) { + throw new RenException("用户名或验证码错误"); + } + // 验证用户是否是手机号码 + ValidatorUtils.isValidPhone(dto.getPhone()); + // 验证短信验证码是否正常 + boolean validate = captchaService.validateSMSValidateCode(dto.getPhone(),dto.getCode()); + // 判断是否通过验证 + if (!validate) { + throw new RenException("用户名或验证码错误"); + } + + Long userId = SecurityUser.getUserId(); + sysUserService.changePasswordDirectly(userId, dto.getPassword()); + return new Result<>(); + } + @GetMapping("/pub-config") @Operation(summary = "公共配置") public Result> pubConfig() { diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/RetrievePasswordDTO.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/RetrievePasswordDTO.java new file mode 100644 index 00000000..efac8099 --- /dev/null +++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/RetrievePasswordDTO.java @@ -0,0 +1,30 @@ +package xiaozhi.modules.sys.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import lombok.Data; + +import java.io.Serializable; + +/** + * 找回密码DTO + */ +@Data +@Schema(description = "找回密码") +public class RetrievePasswordDTO implements Serializable { + + @Schema(description = "手机号码") + @NotBlank(message = "{sysuser.password.require}") + private String phone; + + @Schema(description = "验证码") + @NotBlank(message = "{sysuser.password.require}") + private String code; + + @Schema(description = "新密码") + @NotBlank(message = "{sysuser.password.require}") + private String password; + + + +} \ No newline at end of file