TRX 1 年間 前
コミット
0b7a805f0b

+ 20 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/forgotPassword/ForgotPasswordParam.java

@@ -0,0 +1,20 @@
+package com.zhongshu.card.client.model.forgotPassword;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ *
+ * @author TRX
+ * @date 2025/3/26
+ */
+@Data
+public class ForgotPasswordParam {
+
+    @Schema(description = "返回的id")
+    private String id;
+
+    @Schema(description = "密码")
+    private String password;
+
+}

+ 19 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/forgotPassword/ValidateUserModel.java

@@ -0,0 +1,19 @@
+package com.zhongshu.card.client.model.forgotPassword;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ *
+ * @author TRX
+ * @date 2025/3/26
+ */
+@Data
+public class ValidateUserModel {
+
+    @Schema(description = "数据id")
+    private String id;
+
+    @Schema(description = "")
+    private String userName;
+}

+ 22 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/forgotPassword/ValidateUserParam.java

@@ -0,0 +1,22 @@
+package com.zhongshu.card.client.model.forgotPassword;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ *
+ * @author TRX
+ * @date 2025/3/26
+ */
+@Data
+public class ValidateUserParam {
+
+    @Schema(description = "电话号码")
+    private String phone;
+
+    @Schema(description = "身份证号码")
+    private String cardNumber;
+
+    @Schema(description = "")
+    private String faceUrl;
+}

+ 52 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/user/ForgotPassWordController.java

@@ -0,0 +1,52 @@
+package com.zhongshu.card.server.core.controller.user;
+
+import com.github.microservice.auth.security.annotations.ResourceAuth;
+import com.github.microservice.auth.security.type.AuthType;
+import com.github.microservice.net.ResultContent;
+import com.zhongshu.card.client.model.forgotPassword.ForgotPasswordParam;
+import com.zhongshu.card.client.model.forgotPassword.ValidateUserModel;
+import com.zhongshu.card.client.model.forgotPassword.ValidateUserParam;
+import com.zhongshu.card.server.core.service.user.ForgotPassWordService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ *
+ * @author TRX
+ * @date 2025/3/26
+ */
+@RestController
+@RequestMapping("forgotPassWord")
+@Tag(name = "找回密码")
+public class ForgotPassWordController {
+
+    @Autowired
+    private ForgotPassWordService forgotPassWordService;
+
+    @ResourceAuth(value = "user", type = AuthType.User)
+    @Operation(summary = "验证用户(通过电话号码和身份证)", description = "验证用户")
+    @RequestMapping(value = {"verifyUserExitByPhone"}, method = {RequestMethod.POST})
+    public ResultContent<ValidateUserModel> verifyUserExitByPhone(@RequestBody ValidateUserParam param) {
+        return forgotPassWordService.verifyUserExitByPhone(param);
+    }
+
+    @ResourceAuth(value = "user", type = AuthType.User)
+    @Operation(summary = "验证用户(通过人脸验证)", description = "验证用户")
+    @RequestMapping(value = {"verifyUserExitByFace"}, method = {RequestMethod.POST})
+    public ResultContent<ValidateUserModel> verifyUserExitByFace(@RequestBody ValidateUserParam param) {
+        return forgotPassWordService.verifyUserExitByFace(param);
+    }
+
+    @ResourceAuth(value = "user", type = AuthType.User)
+    @Operation(summary = "重置密码", description = "验证用户")
+    @RequestMapping(value = {"resetPassword"}, method = {RequestMethod.POST})
+    public ResultContent resetPassword(@RequestBody ForgotPasswordParam param) {
+        return forgotPassWordService.resetPassword(param);
+    }
+
+}

+ 2 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/org/UserCountDao.java

@@ -21,6 +21,8 @@ public interface UserCountDao extends MongoDao<UserAccount>, UserCountDaoExtend
 
     UserAccount findTopByPhone(String phone);
 
+    UserAccount findTopByPhoneAndCardNumber(String phone, String cardNumber);
+
     UserAccount findTopByLoginName(String loginName);
 
     long countByIsDelete(Boolean isDeleted);

+ 153 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/user/ForgotPassWordService.java

@@ -0,0 +1,153 @@
+package com.zhongshu.card.server.core.service.user;
+
+import com.github.microservice.auth.client.service.UserFaceService;
+import com.github.microservice.auth.client.service.UserService;
+import com.github.microservice.net.ResultContent;
+import com.zhongshu.card.client.model.forgotPassword.ForgotPasswordParam;
+import com.zhongshu.card.client.model.forgotPassword.ValidateUserModel;
+import com.zhongshu.card.client.model.forgotPassword.ValidateUserParam;
+import com.zhongshu.card.server.core.dao.org.UserCountDao;
+import com.zhongshu.card.server.core.domain.org.UserAccount;
+import com.zhongshu.card.server.core.domain.projectAbout.ProjectCommonConfig;
+import com.zhongshu.card.server.core.service.base.CommonService;
+import com.zhongshu.card.server.core.service.base.RedisService;
+import com.zhongshu.card.server.core.service.base.SuperService;
+import com.zhongshu.card.server.core.service.org.OrganizationUserServiceImpl;
+import com.zhongshu.card.server.core.service.projectAbout.ProjectCommonConfigService;
+import com.zhongshu.card.server.core.util.CommonUtil;
+import com.zhongshu.card.server.core.util.ValidateResult;
+import com.zhongshu.card.server.core.util.ValidateUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ *
+ * @author TRX
+ * @date 2025/3/26
+ */
+@Service
+@Slf4j
+public class ForgotPassWordService extends SuperService {
+
+    @Autowired
+    private OrganizationUserServiceImpl organizationUserService;
+
+    @Autowired
+    private UserCountDao userCountDao;
+
+    @Autowired
+    private RedisService redisService;
+
+    @Autowired
+    private ProjectCommonConfigService projectCommonConfigService;
+
+    @Autowired
+    private UserService userService;
+
+    /**
+     * 人脸管理类
+     */
+    @Autowired
+    private UserFaceService userFaceService;
+
+    @Autowired
+    private CommonService commonService;
+
+    // 随机key存储的时间 10 分钟
+    private final Long keyTime = 60 * 10L;
+
+    public ResultContent<ValidateUserModel> verifyUserExitByPhone(ValidateUserParam param) {
+        ValidateUserModel model = new ValidateUserModel();
+        if (StringUtils.isEmpty(param.getPhone())) {
+            return ResultContent.buildFail("phone is empty");
+        }
+        if (StringUtils.isEmpty(param.getCardNumber())) {
+            return ResultContent.buildFail("cardNumber is empty");
+        }
+        UserAccount userAccount = userCountDao.findTopByPhoneAndCardNumber(param.getPhone(), param.getCardNumber());
+        if (ObjectUtils.isEmpty(userAccount)) {
+            return ResultContent.buildFail("用户不存在");
+        }
+        String uuid = CommonUtil.UUID();
+        String userId = userAccount.getUserId();
+        String name = userAccount.getName();
+        name = CommonUtil.turnNameDesen(name);
+
+        model.setId(uuid);
+        model.setUserName(name);
+        redisService.setValueSecond(uuid, userId, keyTime);
+        return ResultContent.buildSuccess(model);
+    }
+
+    public ResultContent<ValidateUserModel> verifyUserExitByFace(ValidateUserParam param) {
+        ValidateUserModel model = new ValidateUserModel();
+        if (StringUtils.isEmpty(param.getFaceUrl())) {
+            return ResultContent.buildFail("faceUrl is empty");
+        }
+        String faceBase64 = commonService.getUrlFileBase64(param.getFaceUrl());
+
+        return ResultContent.buildSuccess(model);
+    }
+
+    public ResultContent resetPassword(ForgotPasswordParam param) {
+        String id = param.getId();
+        String password = param.getPassword();
+        if (StringUtils.isEmpty(id)) {
+            return ResultContent.buildFail("id is empty");
+        }
+        if (StringUtils.isEmpty(password)) {
+            return ResultContent.buildFail("password is empty");
+        }
+        String userId = redisService.getValue(id);
+        if (StringUtils.isEmpty(userId)) {
+            return ResultContent.buildFail("操作超时,请重新再试!");
+        }
+
+        String projectOid = getCurrentProjectOid();
+        ResultContent verifyResultContent = verifyPassWordIsStandard(projectOid, password);
+        if (verifyResultContent.isFailed()) {
+            return ResultContent.buildFail(verifyResultContent.getMsg());
+        }
+
+        com.github.microservice.auth.client.content.ResultContent<Void> resultContent = userService.updateLoginPassword(
+                userId, password);
+        if (resultContent.isFailed()) {
+            return ResultContent.buildFail(resultContent.getMsg());
+        }
+        redisService.removeValue(id);
+        return ResultContent.buildSuccess();
+    }
+
+    /**
+     * 验证密码是否符合规范
+     * @param projectOid
+     * @param password
+     * @return
+     */
+
+    public ResultContent verifyPassWordIsStandard(String projectOid, String password) {
+        ProjectCommonConfig projectCommonConfig = null;
+        if (StringUtils.isNotEmpty(projectOid)) {
+            ResultContent<ProjectCommonConfig> resultContent = projectCommonConfigService.checkCommonConfig(projectOid);
+            if (resultContent.isSuccess()) {
+                projectCommonConfig = resultContent.getContent();
+            }
+        }
+        if (projectCommonConfig != null) {
+            ValidateResult passResult = ValidateUtils.validatePassWord(password, projectCommonConfig.getPassWordType());
+            if (!passResult.isSuccess()) {
+                return ResultContent.buildFail(passResult.getMsg());
+            }
+        } else {
+            // 基本的密码验证
+            ValidateResult passResult = ValidateUtils.validatePassWord(password);
+            if (!passResult.isSuccess()) {
+                return ResultContent.buildFail(passResult.getMsg());
+            }
+        }
+        return ResultContent.buildSuccess();
+    }
+}