From 588bbbed12eca3df074baefadca6d0bfaaaa6342 Mon Sep 17 00:00:00 2001
From: xueqingkun <xueqingkun@126.com>
Date: Thu, 13 Jun 2024 10:51:55 +0800
Subject: [PATCH] =?UTF-8?q?1:=20=E6=B7=BB=E5=8A=A0=E7=94=A8=E6=88=B7?=
 =?UTF-8?q?=E6=B3=A8=E5=86=8C=E5=92=8C=E7=94=A8=E6=88=B7=E4=BF=AE=E6=94=B9?=
 =?UTF-8?q?=E5=AF=86=E7=A0=81=E5=8A=9F=E8=83=BD=E6=8E=A5=E5=8F=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../controller/UserController.java            |  29 ++--
 .../pojo/vo/UserAccountCheckResVo.java        |  12 ++
 .../supervision/pojo/vo/UserInfoReqVo.java    |  21 ++-
 .../service/UserManageService.java            |  10 +-
 .../service/impl/UserManageServiceImpl.java   | 130 ++++++++++++++----
 5 files changed, 154 insertions(+), 48 deletions(-)
 create mode 100644 virtual-patient-web/src/main/java/com/supervision/pojo/vo/UserAccountCheckResVo.java

diff --git a/virtual-patient-web/src/main/java/com/supervision/controller/UserController.java b/virtual-patient-web/src/main/java/com/supervision/controller/UserController.java
index 32712966..e5b1969c 100644
--- a/virtual-patient-web/src/main/java/com/supervision/controller/UserController.java
+++ b/virtual-patient-web/src/main/java/com/supervision/controller/UserController.java
@@ -6,15 +6,13 @@ import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONUtil;
 import com.supervision.exception.BusinessException;
 import com.supervision.model.User;
-import com.supervision.pojo.vo.LoginReqVO;
-import com.supervision.pojo.vo.LoginResVO;
-import com.supervision.pojo.vo.UserInfoReqVo;
-import com.supervision.pojo.vo.UserInfoResVo;
+import com.supervision.pojo.vo.*;
 import com.supervision.service.UserManageService;
 import com.supervision.service.UserService;
 import com.supervision.util.TokenUtil;
 import com.supervision.util.UserUtil;
 import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.RequiredArgsConstructor;
 import org.springframework.data.redis.core.RedisTemplate;
@@ -31,8 +29,6 @@ public class UserController {
 
     private final UserService userService;
 
-    private final RedisTemplate<String, String> redisTemplate;
-
     private final UserManageService userManageService;
 
 
@@ -58,14 +54,27 @@ public class UserController {
         return loginResVO;
     }
 
+    @Operation(summary = "用户注册")
+    @PostMapping("register")
+    public boolean register(@RequestBody UserInfoReqVo userInfo) {
+
+        return userManageService.register(userInfo);
+    }
+
+    @Operation(summary = "用户账号校验")
+    @GetMapping("checkAccount")
+    public UserAccountCheckResVo checkAccount(@Parameter(name = "account", description = "账户")String account) {
 
-    @Operation(summary = "修改用户信息")
-    @PutMapping("updateUserInfo")
-    public boolean updateUserInfo(@RequestBody UserInfoReqVo userInfo) {
+        return userManageService.checkAccount(account);
+    }
+    @Operation(summary = "修改密码")
+    @PostMapping("changePassWord")
+    public boolean changePassWord(@RequestBody UserInfoReqVo userInfo) {
 
-        return userManageService.updateUserInfo(userInfo);
+        return userManageService.changePassWord(userInfo);
     }
 
+
     @Operation(summary = "查看账号信息")
     @GetMapping("getUserAccountInfo")
     public UserInfoResVo getUserAccountInfo() {
diff --git a/virtual-patient-web/src/main/java/com/supervision/pojo/vo/UserAccountCheckResVo.java b/virtual-patient-web/src/main/java/com/supervision/pojo/vo/UserAccountCheckResVo.java
new file mode 100644
index 00000000..978344e6
--- /dev/null
+++ b/virtual-patient-web/src/main/java/com/supervision/pojo/vo/UserAccountCheckResVo.java
@@ -0,0 +1,12 @@
+package com.supervision.pojo.vo;
+
+import lombok.Data;
+
+@Data
+public class UserAccountCheckResVo {
+
+    // 状态码 0:账号可用 1:账号不可用
+    private String code;
+
+    private String message;
+}
diff --git a/virtual-patient-web/src/main/java/com/supervision/pojo/vo/UserInfoReqVo.java b/virtual-patient-web/src/main/java/com/supervision/pojo/vo/UserInfoReqVo.java
index deb8e45f..2688bca2 100644
--- a/virtual-patient-web/src/main/java/com/supervision/pojo/vo/UserInfoReqVo.java
+++ b/virtual-patient-web/src/main/java/com/supervision/pojo/vo/UserInfoReqVo.java
@@ -6,15 +6,22 @@ import lombok.Data;
 
 @Data
 public class UserInfoReqVo {
+    /**
+     * 用户账户
+     */
+    @Schema(description = "用户账户")
+    private String account;
 
-    @Schema(description = "用户id")
-    private String id;
-
+    /**
+     * 用户名称
+     */
     @Schema(description = "用户名称")
     private String name;
 
-    @Schema(description = "旧密码")
-    private String oldPassword;
-    @Schema(description = "新密码")
-    private String newPassword;
+    /**
+     * 用户密码
+     */
+    @Schema(description = "用户密码")
+    private String password;
+
 }
diff --git a/virtual-patient-web/src/main/java/com/supervision/service/UserManageService.java b/virtual-patient-web/src/main/java/com/supervision/service/UserManageService.java
index 178fc7d0..65418fee 100644
--- a/virtual-patient-web/src/main/java/com/supervision/service/UserManageService.java
+++ b/virtual-patient-web/src/main/java/com/supervision/service/UserManageService.java
@@ -1,12 +1,16 @@
 package com.supervision.service;
 
-import com.supervision.model.User;
+import com.supervision.pojo.vo.UserAccountCheckResVo;
 import com.supervision.pojo.vo.UserInfoReqVo;
 import com.supervision.pojo.vo.UserInfoResVo;
 
 public interface UserManageService {
 
-    boolean updateUserInfo(UserInfoReqVo userInfo);
-
     UserInfoResVo getUserAccountInfo(String userId);
+
+    boolean changePassWord(UserInfoReqVo userInfo);
+
+    boolean register(UserInfoReqVo userInfo);
+
+    UserAccountCheckResVo checkAccount(String account);
 }
diff --git a/virtual-patient-web/src/main/java/com/supervision/service/impl/UserManageServiceImpl.java b/virtual-patient-web/src/main/java/com/supervision/service/impl/UserManageServiceImpl.java
index e68f0fef..3cf2a475 100644
--- a/virtual-patient-web/src/main/java/com/supervision/service/impl/UserManageServiceImpl.java
+++ b/virtual-patient-web/src/main/java/com/supervision/service/impl/UserManageServiceImpl.java
@@ -4,6 +4,7 @@ import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.lang.Assert;
 import cn.hutool.core.util.StrUtil;
 import com.supervision.model.User;
+import com.supervision.pojo.vo.UserAccountCheckResVo;
 import com.supervision.pojo.vo.UserInfoReqVo;
 import com.supervision.pojo.vo.UserInfoResVo;
 import com.supervision.service.UserManageService;
@@ -11,6 +12,10 @@ import com.supervision.service.UserService;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 @Slf4j
 @Service
@@ -18,36 +23,12 @@ import org.springframework.stereotype.Service;
 public class UserManageServiceImpl implements UserManageService {
 
     private final UserService userService;
-    @Override
-    public boolean updateUserInfo(UserInfoReqVo userInfo) {
-
-        Assert.notEmpty(userInfo.getId(),"用户id不能为空");
-        if (StrUtil.isNotEmpty(userInfo.getNewPassword())){
-            //todo:密码复杂度规则匹配
-            Assert.notEmpty(userInfo.getOldPassword(),"旧密码不允许为空");
-        }
-
-        User user = userService.getById(userInfo.getId());
-        Assert.notNull(user,"用户信息不存在");
 
-        boolean change = false;
-        if (StrUtil.isNotEmpty(userInfo.getName())){
-            user.setName(userInfo.getName());
-            change = true;
-        }
-        String newPassword = userInfo.getNewPassword();
-        String oldPassword = userInfo.getOldPassword();
-        if (StrUtil.isAllNotEmpty(newPassword,oldPassword)){
-            Assert.isTrue(user.getPassword().equals(oldPassword),"密码不正确");
-            user.setPassword(newPassword);
-            change = true;
-        }
+    // 密码6-18位 不包含中文特殊字符和空格
+    private static final String passwordRegex = "^(?![\\u4e00-\\u9fa5\\s])[\\x21-\\x7e]{6,18}$";
 
-        if (!change){
-            return false;
-        }
-        return userService.updateById(user);
-    }
+    // 账号校验正则 6-18位 英文或者数字
+    private static final String accountRegex = "^[a-zA-Z0-9]{6,18}$";
 
     @Override
     public UserInfoResVo getUserAccountInfo(String userId) {
@@ -58,4 +39,97 @@ public class UserManageServiceImpl implements UserManageService {
 
         return BeanUtil.toBean(user,UserInfoResVo.class);
     }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean changePassWord(UserInfoReqVo userInfo) {
+        Assert.notEmpty(userInfo.getAccount(),"账号不能为空");
+        Assert.notEmpty(userInfo.getPassword(),"密码不能为空");
+        String match = passwordRegexMatch(userInfo.getPassword());
+        Assert.isFalse(StrUtil.isNotEmpty(match),match);
+
+        Long count = userService.lambdaQuery().eq(User::getAccount, userInfo.getAccount()).count();
+        Assert.isFalse(count==0,"密码设置失败");
+        userService.lambdaUpdate().eq(User::getAccount, userInfo.getAccount()).set(User::getPassword,userInfo.getPassword()).update();
+        return true;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean register(UserInfoReqVo userInfo) {
+
+        Assert.notEmpty(userInfo.getAccount(),"账号不能为空");
+        Assert.notEmpty(userInfo.getName(),"用户名不能为空");
+
+        // 用户规则校验
+        String accountRegexMatch = accountRegexMatch(userInfo.getAccount());
+        Assert.isFalse(StrUtil.isNotEmpty(accountRegexMatch),accountRegexMatch);
+
+        // 校验账号是否已存在
+        Long count = userService.lambdaQuery().eq(User::getAccount, userInfo.getAccount()).count();
+        Assert.isTrue(count==0,"账号已存在");
+
+        // 密码强度校验
+        String passwordRegexMatch = passwordRegexMatch(userInfo.getPassword());
+        Assert.isFalse(StrUtil.isNotEmpty(passwordRegexMatch),passwordRegexMatch);
+
+        User user = new User();
+        user.setAccount(userInfo.getAccount());
+        user.setName(userInfo.getName());
+        user.setPassword(userInfo.getPassword());
+        user.setRoleCode("1");
+        user.setStatus(0);
+        userService.save(user);
+        return false;
+    }
+
+    @Override
+    public UserAccountCheckResVo checkAccount(String account) {
+
+        UserAccountCheckResVo checkResult = new UserAccountCheckResVo();
+        if (StrUtil.isEmpty(account)){
+            checkResult.setCode("1");
+            checkResult.setMessage("账号不能为空");
+        }
+
+        //复杂度校验
+        String accountRegexMatch = accountRegexMatch(account);
+        if (StrUtil.isNotEmpty(accountRegexMatch)){
+            checkResult.setCode("1");
+            checkResult.setMessage(accountRegexMatch);
+            return checkResult;
+        }
+
+        Long count = userService.lambdaQuery().eq(User::getAccount, account).count();
+        if (count > 0){
+            checkResult.setCode("1");
+            checkResult.setMessage("账号已存在");
+        }
+        checkResult.setCode("0");
+        return checkResult;
+    }
+
+    private String passwordRegexMatch(String password){
+        if (StrUtil.isEmpty(password)){
+            return "密码不能为空";
+        }
+        Pattern pattern = Pattern.compile(passwordRegex);
+        Matcher matcher = pattern.matcher(password);
+        if (!matcher.matches()){
+            return "密码强度不符合要求";
+        }
+        return null;
+    }
+
+    private String accountRegexMatch(String account){
+        if (StrUtil.isEmpty(account)){
+            return "账号不能为空";
+        }
+        Pattern pattern = Pattern.compile(accountRegex);
+        Matcher matcher = pattern.matcher(account);
+        if (!matcher.matches()){
+            return "账号格式不符合要求";
+        }
+        return null;
+    }
 }