瀏覽代碼

add 默认看护

18339543638 3 年之前
父節點
當前提交
1e8a9e238e

+ 1 - 0
nb-auth/src/main/java/com/nb/auth/sa/SaTokenConfig.java

@@ -66,6 +66,7 @@ public class SaTokenConfig {
         IGNORE_URL.add("/system/curl/**");
         IGNORE_URL.add("/system/sysConfig/getTime");
         IGNORE_URL.add("/system/sysDept/**");
+        IGNORE_URL.add("/assist/phone/**");
     }
 
 }

+ 0 - 1
nb-common/crud-common/src/main/java/com/nb/common/crud/BaseService.java

@@ -325,5 +325,4 @@ public abstract class BaseService<M extends BaseMapper<E>, E,PK extends Serializ
      **/
 
     public  abstract void validateBeforeDelete(PK id) ;
-
 }

+ 51 - 0
nb-service/app-assistant/src/main/java/com/nb/app/assistant/controller/AssistUserController.java

@@ -0,0 +1,51 @@
+package com.nb.app.assistant.controller;
+
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.nb.app.assistant.controller.vo.ResetPswVo;
+import com.nb.app.assistant.service.LocalAssistantUserService;
+import com.nb.app.assistant.utils.ResetPswUtil;
+import com.nb.core.annotation.IgnoreToken;
+import com.nb.core.exception.CustomException;
+import com.nb.core.result.R;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName UserController.java
+ * @Description TODO
+ * @createTime 2022年09月14日 15:16:00
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("/assist/phone")
+@Api(tags = "忘记密码")
+@Slf4j
+public class AssistUserController {
+    private final LocalAssistantUserService userService;
+    private final ResetPswUtil resetPswUtil;
+
+
+
+    @PostMapping("/psw/reset")
+    @ApiOperation(value = "重置密码",notes = "请先调用【验证码】相关接口/api/assist/captcha/reset/validate进行密码校验并获取token")
+    public R<Boolean> reset(@RequestBody@Validated ResetPswVo resource){
+        String token = resetPswUtil.getToken(resource.getPhone(), resource.getCaptcha());
+        if (StrUtil.isEmpty(token)) {
+            throw new CustomException("该请求已失效,请刷新后重试");
+        }
+        if(ObjectUtil.equal(token,resource.getResetToken())){
+            throw new CustomException("token错误,请刷新后重试");
+        }
+        return R.success(userService.resetPsw(resource.getPhone(),resource.getNewPsw()));
+    }
+}

+ 12 - 0
nb-service/app-assistant/src/main/java/com/nb/app/assistant/controller/CaptchaController.java

@@ -1,7 +1,11 @@
 package com.nb.app.assistant.controller;
 
 import com.nb.app.assistant.controller.vo.CaptureVo;
+import com.nb.app.assistant.controller.vo.ResetCaptchaVo;
+import com.nb.app.assistant.controller.vo.ResetPswVo;
+import com.nb.app.assistant.enums.CaptchaEnum;
 import com.nb.app.assistant.utils.CaptchaUtil;
+import com.nb.app.assistant.utils.ResetPswUtil;
 import com.nb.core.result.R;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -26,9 +30,17 @@ import org.springframework.web.bind.annotation.RestController;
 public class CaptchaController {
     private final CaptchaUtil captchaUtil;
 
+    private final ResetPswUtil resetPswUtil;
     @PostMapping("/create")
     @ApiOperation("获取短信验证码")
     public R<String> capture(@RequestBody @Validated CaptureVo vo){
         return R.success(captchaUtil.getCode(vo.getType(),vo.getPhone()));
     }
+
+    @PostMapping("/reset/validate")
+    @ApiOperation(value = "验证码校验",notes = "校验验证码并获取校验token,过期时间24h")
+    public R<String> validateCaptcha(@RequestBody@Validated ResetCaptchaVo resource){
+        captchaUtil.verifyCode(CaptchaEnum.FORGET_PSW,resource.getPhone(),resource.getCaptcha());
+        return R.success(resetPswUtil.createToken(resource.getPhone(),resource.getCaptcha()));
+    }
 }

+ 27 - 0
nb-service/app-assistant/src/main/java/com/nb/app/assistant/controller/vo/ResetCaptchaVo.java

@@ -0,0 +1,27 @@
+package com.nb.app.assistant.controller.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName ResetPwsVo.java
+ * @Description TODO
+ * @createTime 2022年09月14日 15:27:00
+ */
+@Data
+@ApiModel("忘记密码验证码校验")
+public class ResetCaptchaVo {
+
+    @ApiModelProperty("手机号")
+    @NotNull(message = "手机号不能为空")
+    private String phone;
+
+    @ApiModelProperty("验证码")
+    @NotNull(message = "验证码不能为空")
+    private String captcha;
+}

+ 34 - 0
nb-service/app-assistant/src/main/java/com/nb/app/assistant/controller/vo/ResetPswVo.java

@@ -0,0 +1,34 @@
+package com.nb.app.assistant.controller.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName ResetPwsVo.java
+ * @Description TODO
+ * @createTime 2022年09月14日 15:27:00
+ */
+@Data
+@ApiModel("忘记密码验证码")
+public class ResetPswVo {
+    @ApiModelProperty("重置密码token,由校验验证码接口获取")
+    @NotNull(message = "resetToken不能为空")
+    private String resetToken;
+
+    @ApiModelProperty("验证码")
+    @NotNull(message = "验证码不能为空")
+    private String captcha;
+
+    @ApiModelProperty("手机号")
+    @NotNull(message = "手机号不能为空")
+    private String phone;
+
+    @ApiModelProperty("新密码")
+    @NotNull(message = "新密码不能为空")
+    private String newPsw;
+}

+ 2 - 1
nb-service/app-assistant/src/main/java/com/nb/app/assistant/enums/CaptchaEnum.java

@@ -16,7 +16,8 @@ import lombok.Getter;
 @AllArgsConstructor
 @JsonFormat(shape = JsonFormat.Shape.OBJECT)
 public enum  CaptchaEnum  implements IEnum<Integer> {
-    PHONE_LOGIN(0,"短信登录")
+    PHONE_LOGIN(0,"短信登录"),
+    FORGET_PSW(1,"忘记密码")
     ;
     /**
      * 与枚举ordinal保持一致

+ 10 - 0
nb-service/app-assistant/src/main/java/com/nb/app/assistant/service/LocalAssistantUserService.java

@@ -2,6 +2,7 @@ package com.nb.app.assistant.service;
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.extra.spring.SpringUtil;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.nb.app.assistant.api.feign.IAssistantUserClient;
 import com.nb.app.assistant.api.feign.result.AssistantUserResult;
 import com.nb.app.assistant.entity.AssistantUserEntity;
@@ -9,6 +10,7 @@ import com.nb.app.assistant.mapper.AssistantUserMapper;
 import com.nb.app.msg.bean.MsgBean;
 import com.nb.app.msg.enums.MsgEnum;
 import com.nb.app.msg.event.SaveMsgEvent;
+import com.nb.auth.utils.SecurityUtil;
 import com.nb.common.crud.BaseService;
 import org.springframework.stereotype.Component;
 
@@ -47,4 +49,12 @@ public class LocalAssistantUserService extends BaseService<AssistantUserMapper,
     public AssistantUserResult getById(String id) {
         return BeanUtil.copyProperties(super.getById(id),AssistantUserResult.class);
     }
+
+    public Boolean resetPsw(String phone, String newPsw) {
+        String encryptPassword = SecurityUtil.encryptPassword(newPsw);
+        return this
+                .update(new UpdateWrapper<AssistantUserEntity>()
+                        .lambda().eq(AssistantUserEntity::getPhone,phone)
+                        .set(AssistantUserEntity::getPassword,encryptPassword));
+    }
 }

+ 2 - 1
nb-service/app-assistant/src/main/java/com/nb/app/assistant/utils/CaptchaUtil.java

@@ -37,13 +37,14 @@ public class CaptchaUtil {
 
     public boolean verifyCode(CaptchaEnum type,String codeKey,String code){
         String key = getKey(type.name(),codeKey);
-        String result = codeCache.getWithTTLOnly(key);
+        String result = codeCache.remove(key);
         if (StrUtil.isNullOrUndefined(result)) {
             throw new CustomException("验证码已失效");
         }
         if(!result.equals(code)){
             throw new CustomException("验证码错误");
         }
+
         return true;
     }
 

+ 46 - 0
nb-service/app-assistant/src/main/java/com/nb/app/assistant/utils/ResetPswUtil.java

@@ -0,0 +1,46 @@
+package com.nb.app.assistant.utils;
+
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
+import com.nb.core.cache.ConfigStorage;
+import com.nb.core.cache.manager.ConfigStorageManager;
+import org.redisson.api.RMapCache;
+import org.redisson.api.RedissonClient;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.stereotype.Component;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName ResetPswUtil.java
+ * @Description TODO
+ * @createTime 2022年09月14日 15:37:00
+ */
+@Configuration
+public class ResetPswUtil {
+    private final RMapCache<String, String> tokenCache;
+
+    public ResetPswUtil(RedissonClient redissonClient) {
+        tokenCache = redissonClient.getMapCache("assist:phone:reset");
+    }
+
+    public String createToken(String phone,String code){
+        String token = getToken(phone, code);
+        if(StrUtil.isEmpty(token)){
+            token=IdWorker.get32UUID();
+            tokenCache.put(getKey(phone, code), IdWorker.getIdStr(), 24, TimeUnit.HOURS);
+        }
+        return token;
+    }
+
+    public String getToken(String phone,String code){
+        return tokenCache.remove(getKey(phone, code));
+    }
+
+
+    private String getKey(String phone,String code){
+        return phone+"-"+code;
+    }
+}