Selaa lähdekoodia

用户模块:重置密码接口

tangxiangan 2 vuotta sitten
vanhempi
commit
eae2569733

+ 16 - 0
pdf-office-account/src/main/java/cn/kdan/cloud/pdf/office/account/controller/UserController.java

@@ -1,5 +1,6 @@
 package cn.kdan.cloud.pdf.office.account.controller;
 
+import cn.kdan.cloud.pdf.office.account.model.User;
 import cn.kdan.cloud.pdf.office.api.account.vo.UserDetailVO;
 import cn.kdan.cloud.pdf.office.api.account.vo.UserPageVO;
 import cn.kdan.cloud.pdf.office.api.account.dto.*;
@@ -12,6 +13,7 @@ import cn.kdan.cloud.pdf.office.account.constant.UserConstant;
 import cn.kdan.cloud.pdf.office.account.service.UserService;
 
 import com.github.pagehelper.PageInfo;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
@@ -161,6 +163,20 @@ public class UserController {
         return new ResultMap<>(CommonConstant.SUCCESS, CommonConstant.RESULT_SUCCESS,Boolean.TRUE);
     }
 
+
+    /**
+     * 更新
+     *
+     * @param userInfoVO
+     */
+    @PostMapping("/updateUser")
+    public ResultMap<Boolean> updateUser(@RequestBody UserInfoVO userInfoVO) {
+        User user = new User();
+        BeanUtils.copyProperties(userInfoVO,user);
+        userService.updateUser(user);
+        return new ResultMap<>(CommonConstant.SUCCESS, CommonConstant.RESULT_SUCCESS,Boolean.TRUE);
+    }
+
     /**
      * 用户自己手动注销
      *

+ 7 - 0
pdf-office-account/src/main/java/cn/kdan/cloud/pdf/office/account/service/UserService.java

@@ -118,6 +118,13 @@ public interface UserService {
      */
     void logOff(LogOffUserDTO logOffUserDTO);
 
+    /**
+     * 更新
+     *
+     * @param user 用户
+     */
+    void updateUser(User user);
+
     /**
      * 用户手动注销
      *

+ 8 - 0
pdf-office-account/src/main/java/cn/kdan/cloud/pdf/office/account/service/impl/UserServiceImpl.java

@@ -198,6 +198,11 @@ public class UserServiceImpl implements UserService {
         handleLogOff(user,logOffUserDTO.getRemark());
     }
 
+    @Override
+    public void updateUser(User user) {
+      userMapper.updateByPrimaryKeySelective(user);
+    }
+
     @Override
     public void logOffForUser(String code, String userId) {
         User user = getUser(userId);
@@ -254,4 +259,7 @@ public class UserServiceImpl implements UserService {
         }
     }
 
+
+
+
 }

+ 4 - 0
pdf-office-api/pdf-office-api-account/src/main/java/cn/kdan/cloud/pdf/office/api/account/dto/UpdateUserForPaySuccessDTO.java

@@ -17,5 +17,9 @@ public class UpdateUserForPaySuccessDTO {
      * MemberTypeEnum  mac会员 1 windows会员 2 mac+window会员3
      */
     private Integer memberType;
+    /**
+     * 0已注销(1订阅中2订阅过期3试用中4试用过期)PDFOfficeUserStatusEnum
+     */
+    private Integer userStatus;;
 
 }

+ 8 - 0
pdf-office-api/pdf-office-api-account/src/main/java/cn/kdan/cloud/pdf/office/api/account/feign/UserApi.java

@@ -41,6 +41,14 @@ public interface UserApi {
     @PostMapping(value = "register")
     ResultMap<Boolean> register(@RequestBody UserRegisterDTO userRegisterDTO);
 
+    /**
+     * 更新
+     *
+     * @param userInfoVO
+     */
+    @PostMapping("/updateUser")
+    ResultMap<Boolean> updateUser(@RequestBody UserInfoVO userInfoVO);
+
     /**
      * 支付成功之后修改用户状态
      *

+ 5 - 0
pdf-office-api/pdf-office-api-account/src/main/java/cn/kdan/cloud/pdf/office/api/account/feign/hystrix/UserHystrix.java

@@ -37,6 +37,11 @@ public class UserHystrix implements UserApi {
         return new ResultMap<>(CommonConstant.ERROR, CommonConstant.RESULT_ERROR_SERVICE_NOT_AVAILABLE);
     }
 
+    @Override
+    public ResultMap<Boolean> updateUser(UserInfoVO userInfoVO) {
+        return new ResultMap<>(CommonConstant.ERROR, CommonConstant.RESULT_ERROR_SERVICE_NOT_AVAILABLE);
+    }
+
     @Override
     public ResultMap<Boolean> updateUserForPaySuccess(UpdateUserForPaySuccessDTO updateUserForPaySuccessDTO) {
         return new ResultMap<>(CommonConstant.ERROR, CommonConstant.RESULT_ERROR_SERVICE_NOT_AVAILABLE);

+ 39 - 0
pdf-office-common/src/main/java/cn/kdan/cloud/pdf/office/common/dto/UserResetPasswordDTO.java

@@ -0,0 +1,39 @@
+package cn.kdan.cloud.pdf.office.common.dto;
+
+import lombok.Data;
+
+/**
+ * @author tangxiangan
+ */
+@Data
+public class UserResetPasswordDTO {
+
+    /**
+     * 用户名(邮箱)
+     */
+    private String account;
+
+    /**
+     * 邮箱验证码
+     */
+    private String verifyCode;
+
+    /**
+     * 密码
+     */
+    private String firstPassword;
+
+    private String secondPassword;
+
+    /**
+     * platformType  平台类型 0官网 1后台
+     */
+    private String platformType;
+
+    /**
+     * appId 例如 pdf office 16
+     */
+    private String appId;
+
+
+}

+ 4 - 0
pdf-office-common/src/main/java/cn/kdan/cloud/pdf/office/common/enums/EmailCodeTypeEnum.java

@@ -9,6 +9,10 @@ public enum EmailCodeTypeEnum {
      * 注册
      */
     USER_REGISTER("user_register","注册验证码","注册验证码",""),
+    /**
+     * 重置密码验证码
+     */
+    USER_RESET_PASSWORD("user_reset_password","重置密码验证码","重置密码验证码",""),
     /**
      * 用户注销
      */

+ 16 - 1
pdf-office-sso/src/main/java/cn/kdan/cloud/pdf/office/sso/constant/AuthConstant.java

@@ -18,7 +18,7 @@ public class AuthConstant {
     public final static String EXCEPTION_MSG_TOKEN_IS_INVALID = "无效的token或者token已过期";
     public final static String EXCEPTION_MSG_PLEASE_ADD_AUTH_CONFIG = "please add auth config";
 
-    public final static String EXCEPTION_MSG_DEVICE_NUM_MAX = "login device is max num 2";
+    public final static String EXCEPTION_MSG_DEVICE_NUM_MAX = "您的登录设备已达上限,请退出其他设备重新登录";
 
     public final static int EXCEPTION_CODE_USER_NOT_LOGIN = 313;
     public final static String EXCEPTION_MSG_USER_NOT_LOGIN = "用户没有登录,请登录后再访问";
@@ -67,6 +67,7 @@ public class AuthConstant {
 
     public static final String EMAIL_REGISTER_ERROR = "Register error!";
 
+    public static final String EXCEPTION_MSG_PASSWORD_ERROR = "密码错误,请重新输入";
 
     public static final String EXCEPTION_MSG_CODE_ACTION_ERROR = "operation action error";
 
@@ -90,5 +91,19 @@ public class AuthConstant {
     public static final String VERIFY_CODE_SEND_TOO_QUICKLY = "code send too quickly";
 
 
+    public static final String EXCEPTION_MSG_EMAIL_EXIST = "该邮箱已有账号,请前往登录";
+
+    public static final String EXCEPTION_MSG_EMAIL_NOT_REGISTER = "当前账号未注册,点击下一步我们将为您注册账号";
+
+
+    public static final String EXCEPTION_MSG_USER_NOT_EXIST = "User is not exist";
+
+    public static final String EXCEPTION_MSG_EMAIL_INVALID = "请输入正确的邮箱格式";
+
+    public static final String EXCEPTION_MSG_PASSWORD_NOT_INCONSISTENT = "密码不一致,请重新输入";
+
+    public static final String EXCEPTION_MSG_PASSWORD_SIZE_MIN = "包含至少6个字符";
+
+    public static final String EXCEPTION_MSG_PASSWORD_SIZE_MAX = "包含最多24个字符";
 
 }

+ 30 - 11
pdf-office-sso/src/main/java/cn/kdan/cloud/pdf/office/sso/controller/AuthController.java

@@ -2,6 +2,7 @@ package cn.kdan.cloud.pdf.office.sso.controller;
 
 import cn.kdan.cloud.pdf.office.api.email.bo.EmailSendBO;
 import cn.kdan.cloud.pdf.office.api.email.feign.EmailApi;
+import cn.kdan.cloud.pdf.office.common.dto.UserResetPasswordDTO;
 import cn.kdan.cloud.pdf.office.sso.constant.AuthConstant;
 import cn.kdan.cloud.pdf.office.common.enums.EmailCodeTypeEnum;
 import cn.kdan.cloud.pdf.office.common.dto.UserRegisterDTO;
@@ -118,19 +119,37 @@ public class AuthController {
         return new ResultMap<>(CommonConstant.SUCCESS, CommonConstant.RESULT_SUCCESS, authService.emailRegister(userRegisterDTO));
     }
 
-    @PostMapping("/sendVerifyCode")
-    public ResultMap<Boolean> sendCode(@RequestParam String email, @RequestParam String appId) {
-        EmailSendBO bo = new EmailSendBO();
-//        bo.setEmailTitle("test");
-//        bo.setToEmail("316531990@qq.com");
-//        bo.setTemplateId("1");
-        Map<String,String> map = new HashMap<>();
-        map.put("@username@","wph");
-        bo.setSendContent(map);
-        emailApi.sendEmail(bo);
-        return new ResultMap<>(CommonConstant.SUCCESS, CommonConstant.RESULT_SUCCESS, Boolean.TRUE);
+    @PostMapping("/resetPassword")
+    public ResultMap<Boolean> resetPassword(@RequestBody UserResetPasswordDTO userResetPasswordDTO) {
+        authService.resetPassword(userResetPasswordDTO);
+        return new ResultMap<>(CommonConstant.SUCCESS, CommonConstant.RESULT_SUCCESS,Boolean.TRUE );
+    }
+
+    /**
+     * 验证用户是否存在,邮箱格式是否正确
+     *
+     * @param userRegisterDTO userRegisterDTO
+     * @return
+     */
+    @PostMapping("/validUserRegisterParam")
+    public ResultMap<Boolean> validUserRegisterParam(@RequestBody UserRegisterDTO userRegisterDTO) {
+        authService.validUserRegisterParam(userRegisterDTO);
+        return new ResultMap<>(CommonConstant.SUCCESS, CommonConstant.RESULT_SUCCESS,Boolean.TRUE);
     }
 
+    /**
+     * 验证登录用户是否存在,邮箱格式是否正确
+     *
+     * @param userRegisterDTO userRegisterDTO
+     * @return
+     */
+    @PostMapping("/validUserLoginParam")
+    public ResultMap<Boolean> validUserLoginParam(@RequestBody UserRegisterDTO userRegisterDTO) {
+        authService.validUserLoginParam(userRegisterDTO);
+        return new ResultMap<>(CommonConstant.SUCCESS, CommonConstant.RESULT_SUCCESS,Boolean.TRUE);
+    }
+
+
     @GetMapping("/getVerifyCode")
     public ResultMap<Boolean> getVerifyCode(@RequestParam String action,@RequestParam Integer type,@NotBlank(message = "接收者不能为空") @RequestParam String receiver,@RequestParam String appId) {
         EmailCodeTypeEnum actionEnum = EmailCodeTypeEnum.getEnumByValue(action);

+ 16 - 0
pdf-office-sso/src/main/java/cn/kdan/cloud/pdf/office/sso/service/AuthService.java

@@ -2,6 +2,7 @@ package cn.kdan.cloud.pdf.office.sso.service;
 
 
 import cn.kdan.cloud.pdf.office.common.dto.UserRegisterDTO;
+import cn.kdan.cloud.pdf.office.common.dto.UserResetPasswordDTO;
 import cn.kdan.cloud.pdf.office.common.enums.EmailCodeTypeEnum;
 import cn.kdan.cloud.pdf.office.common.vo.TokenVO;
 import cn.kdan.cloud.pdf.office.sso.enums.VerifyTypeEnum;
@@ -29,6 +30,15 @@ public interface AuthService {
     TokenVO emailLogin(String email, String password, String appId, String platformType, String deviceSign, HttpServletRequest request);
 
 
+    /**
+     * param
+     *
+     * @param param param
+     */
+    void validUserRegisterParam(UserRegisterDTO param);
+
+    void validUserLoginParam(UserRegisterDTO param);
+
     /**
      * 发送验证码
      *
@@ -66,4 +76,10 @@ public interface AuthService {
      */
     TokenVO emailRegister(UserRegisterDTO userRegisterDTO);
 
+    /**
+     * 重置密码
+     *
+     * @param userResetPasswordDTO userResetPasswordDTO
+     */
+    void resetPassword(UserResetPasswordDTO userResetPasswordDTO);
 }

+ 63 - 4
pdf-office-sso/src/main/java/cn/kdan/cloud/pdf/office/sso/service/impl/AuthServiceImpl.java

@@ -9,6 +9,7 @@ import cn.kdan.cloud.pdf.office.api.email.bo.EmailSendBO;
 import cn.kdan.cloud.pdf.office.api.email.feign.EmailApi;
 import cn.kdan.cloud.pdf.office.common.constant.CommonConstant;
 import cn.kdan.cloud.pdf.office.common.dto.UserRegisterDTO;
+import cn.kdan.cloud.pdf.office.common.dto.UserResetPasswordDTO;
 import cn.kdan.cloud.pdf.office.common.enums.EmailCodeTypeEnum;
 import cn.kdan.cloud.pdf.office.common.exception.BackendRuntimeException;
 import cn.kdan.cloud.pdf.office.common.pojo.CustomUserDetails;
@@ -20,6 +21,7 @@ import cn.kdan.cloud.pdf.office.common.vo.UserInfoVO;
 import cn.kdan.cloud.pdf.office.sso.constant.AuthConstant;
 import cn.kdan.cloud.pdf.office.sso.enums.VerifyTypeEnum;
 import cn.kdan.cloud.pdf.office.sso.service.AuthService;
+import cn.kdan.cloud.pdf.office.sso.utils.RSAUtils;
 import cn.kdan.cloud.pdf.office.sso.utils.TokenUtils;
 import com.alibaba.nacos.common.utils.CollectionUtils;
 import org.apache.commons.lang.StringUtils;
@@ -135,6 +137,7 @@ public class AuthServiceImpl implements AuthService {
         UserInfoVO userInfoVO = userApi.getByAppAccount(email,appId,platformType).getResult();
         //检查用户存在
         checkUser(userInfoVO);
+        checkPassword(password,userInfoVO.getDigestPassword());
         //检查邮件验证码
         // checkEmailCodeValid(EmailCodeTypeEnum.LOGIN,email,code);
         // 检查设备是否达到上限
@@ -145,9 +148,16 @@ public class AuthServiceImpl implements AuthService {
         return vo;
     }
 
+    private void checkPassword (String userPassword,String realPassword){
+        realPassword =  new RSAUtils().decrypt(realPassword);
+        if(!userPassword.equals(realPassword)){
+            throw new BackendRuntimeException(AuthConstant.EXCEPTION_MSG_PASSWORD_ERROR);
+        }
+    }
 
     @Override
     public TokenVO emailRegister(UserRegisterDTO userRegisterDTO) {
+        validUserRegisterParam(userRegisterDTO);
         ResultMap<Boolean> resultMap = userApi.register(userRegisterDTO);
         if(resultMap.getCode() == CommonConstant.SUCCESS){
             //如果是管理平台就去查管理平台的用户表
@@ -162,6 +172,55 @@ public class AuthServiceImpl implements AuthService {
         throw new BackendRuntimeException(AuthConstant.EMAIL_REGISTER_ERROR);
     }
 
+    @Override
+    public void resetPassword(UserResetPasswordDTO userResetPasswordDTO) {
+        //检查验证码
+        checkEmailCodeValid(EmailCodeTypeEnum.USER_RESET_PASSWORD,userResetPasswordDTO.getAccount(),userResetPasswordDTO.getVerifyCode(), userResetPasswordDTO.getAppId());
+        if(!userResetPasswordDTO.getFirstPassword().equals(userResetPasswordDTO.getSecondPassword())){
+            throw new BackendRuntimeException(AuthConstant.EXCEPTION_MSG_PASSWORD_NOT_INCONSISTENT);
+        }
+        //检查密码长度
+        if(userResetPasswordDTO.getFirstPassword().length()>6&&userResetPasswordDTO.getFirstPassword().length()<6){
+            throw new BackendRuntimeException(AuthConstant.EXCEPTION_MSG_PASSWORD_SIZE_MIN);
+        }
+        if(userResetPasswordDTO.getFirstPassword().length()>6&&userResetPasswordDTO.getFirstPassword().length()>24){
+            throw new BackendRuntimeException(AuthConstant.EXCEPTION_MSG_PASSWORD_SIZE_MAX);
+        }
+        UserInfoVO userInfoVO = userApi.getByAppAccount(userResetPasswordDTO.getAccount(),userResetPasswordDTO.getAppId(),userResetPasswordDTO.getPlatformType()).getResult();
+        //修改密码
+        userInfoVO.setUpdatedAt(new Date());
+        userInfoVO.setDigestPassword(new RSAUtils().encrypt(userResetPasswordDTO.getFirstPassword()));
+        userApi.updateUser(userInfoVO);
+    }
+
+
+
+    @Override
+    public void validUserRegisterParam(UserRegisterDTO param) {
+        //邮箱是否被注册
+        if (!ObjectUtils.isEmpty(userApi.getByAppAccount(param.getUsername(),param.getAppId(),param.getPlatformType()).getResult())) {
+            throw new BackendRuntimeException(AuthConstant.EXCEPTION_MSG_EMAIL_EXIST);
+        }
+        //验证邮箱格式
+        String emailRegex = CommonConstant.emailRegex;
+        if (!param.getUsername().matches(emailRegex)) {
+            throw new BackendRuntimeException(AuthConstant.EXCEPTION_MSG_EMAIL_INVALID);
+        }
+    }
+
+    @Override
+    public void validUserLoginParam(UserRegisterDTO param) {
+        //邮箱是否被注册
+        if (ObjectUtils.isEmpty(userApi.getByAppAccount(param.getUsername(),param.getAppId(),param.getPlatformType()).getResult())) {
+            throw new BackendRuntimeException(AuthConstant.EXCEPTION_MSG_EMAIL_NOT_REGISTER);
+        }
+        //验证邮箱格式
+        String emailRegex = CommonConstant.emailRegex;
+        if (!param.getUsername().matches(emailRegex)) {
+            throw new BackendRuntimeException(AuthConstant.EXCEPTION_MSG_EMAIL_INVALID);
+        }
+    }
+
     @Override
     public boolean getVerifyCode(EmailCodeTypeEnum action, VerifyTypeEnum type, String receiver, String appId) {
         boolean flag = false;
@@ -236,7 +295,7 @@ public class AuthServiceImpl implements AuthService {
      */
     private void checkUser(UserInfoVO userInfoVO) {
         if (ObjectUtils.isEmpty(userInfoVO)) {
-            throw new BackendRuntimeException(AuthConstant.EXCEPTION_MSG_USER_NOT_FOUND);
+            throw new BackendRuntimeException(AuthConstant.EXCEPTION_MSG_EMAIL_EXIST);
         }
     }
 
@@ -261,12 +320,12 @@ public class AuthServiceImpl implements AuthService {
      * @param account 用户
      * @param code    验证码
      */
-    private void checkEmailCodeValid(EmailCodeTypeEnum type, String account, String code) {
+    private void checkEmailCodeValid(EmailCodeTypeEnum type, String account, String code, String appId) {
         //获取用户存在redis中的登录邮箱验证码
-        String captchaCode = redisUtils.hget(CommonConstant.EMAIL_VERIFY_CODE_KEY + type.value(), account);
+        String captchaCode = redisUtils.hget(CommonConstant.EMAIL_VERIFY_CODE_KEY + type.value() + CommonConstant.STRIKE_THROUGH + appId, account);
         if(StringUtils.isNotEmpty(code) && code.equals(captchaCode)){
             //验证通过删除
-            redisUtils.hdel(CommonConstant.EMAIL_VERIFY_CODE_KEY + type.value(), account);
+            redisUtils.hdel(CommonConstant.EMAIL_VERIFY_CODE_KEY + type.value() + CommonConstant.STRIKE_THROUGH + appId, account);
         }else{
             throw new BackendRuntimeException(CommonConstant.EMAIL_VERIFY_CODE_KEY_ERROR);
         }