machaoyi 1 рік тому
батько
коміт
c430c8534c

+ 21 - 5
.idea/workspace.xml

@@ -4,9 +4,16 @@
     <option name="autoReloadType" value="SELECTIVE" />
   </component>
   <component name="ChangeListManager">
-    <list default="true" id="1dc46973-e6f5-473b-a131-bf2bbc2dca15" name="更改" comment="1、long都改成string传输&#10;2、包整理">
+    <list default="true" id="1dc46973-e6f5-473b-a131-bf2bbc2dca15" name="更改" comment="1、获取用户菜单排序">
+      <change afterPath="$PROJECT_DIR$/application/src/main/java/com/ctsi/Auth/entity/UpdatePasswordVO.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/application/src/main/java/com/ctsi/Auth/web/password.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/application/src/main/java/com/ctsi/utils/PasswordUtils.java" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/application/src/main/java/com/ctsi/System/SysMenu/service/impl/SysMenuServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/application/src/main/java/com/ctsi/System/SysMenu/service/impl/SysMenuServiceImpl.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/application/src/main/java/com/ctsi/Auth/web/login.java" beforeDir="false" afterPath="$PROJECT_DIR$/application/src/main/java/com/ctsi/Auth/web/login.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/application/src/main/java/com/ctsi/System/SysUser/entity/VO/UserAddVO.java" beforeDir="false" afterPath="$PROJECT_DIR$/application/src/main/java/com/ctsi/System/SysUser/entity/VO/UserAddVO.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/application/src/main/java/com/ctsi/System/SysUser/service/SysUserService.java" beforeDir="false" afterPath="$PROJECT_DIR$/application/src/main/java/com/ctsi/System/SysUser/service/SysUserService.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/application/src/main/java/com/ctsi/System/SysUser/service/impl/SysUserServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/application/src/main/java/com/ctsi/System/SysUser/service/impl/SysUserServiceImpl.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/application/src/main/resources/application.yml" beforeDir="false" afterPath="$PROJECT_DIR$/application/src/main/resources/application.yml" afterDir="false" />
     </list>
     <option name="SHOW_DIALOG" value="false" />
     <option name="HIGHLIGHT_CONFLICTS" value="true" />
@@ -128,7 +135,7 @@
       <workItem from="1704693899463" duration="56714000" />
       <workItem from="1704875622703" duration="2299000" />
       <workItem from="1704932572547" duration="31458000" />
-      <workItem from="1705278479826" duration="742000" />
+      <workItem from="1705278479826" duration="6220000" />
     </task>
     <task id="LOCAL-00001" summary="基础框架配置">
       <option name="closed" value="true" />
@@ -282,7 +289,15 @@
       <option name="project" value="LOCAL" />
       <updated>1705047840311</updated>
     </task>
-    <option name="localTasksCounter" value="20" />
+    <task id="LOCAL-00020" summary="1、获取用户菜单排序">
+      <option name="closed" value="true" />
+      <created>1705279424446</created>
+      <option name="number" value="00020" />
+      <option name="presentableId" value="LOCAL-00020" />
+      <option name="project" value="LOCAL" />
+      <updated>1705279424446</updated>
+    </task>
+    <option name="localTasksCounter" value="21" />
     <servers />
   </component>
   <component name="TypeScriptGeneratedFilesManager">
@@ -319,7 +334,8 @@
     <MESSAGE value="1、获取用户菜单树" />
     <MESSAGE value="1、角色绑定菜单、获取角色菜单&#10;2、用户信息新增角色信息" />
     <MESSAGE value="1、long都改成string传输&#10;2、包整理" />
-    <option name="LAST_COMMIT_MESSAGE" value="1、long都改成string传输&#10;2、包整理" />
+    <MESSAGE value="1、获取用户菜单排序" />
+    <option name="LAST_COMMIT_MESSAGE" value="1、获取用户菜单排序" />
   </component>
   <component name="XSLT-Support.FileAssociations.UIState">
     <expand />

+ 28 - 0
application/src/main/java/com/ctsi/Auth/entity/UpdatePasswordVO.java

@@ -0,0 +1,28 @@
+package com.ctsi.Auth.entity;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+@ApiModel("修改密码")
+public class UpdatePasswordVO {
+    @ApiModelProperty(value = "旧密码",notes = "")
+    private String oldPassword;
+    @ApiModelProperty(value = "新密码",notes = "")
+    private String newPassword;
+
+    public String getOldPassword() {
+        return this.oldPassword;
+    }
+
+    public String getNewPassword() {
+        return this.newPassword;
+    }
+
+    public void setOldPassword(String oldPassword) {
+        this.oldPassword = oldPassword;
+    }
+
+    public void setNewPassword(String newPassword) {
+        this.newPassword = newPassword;
+    }
+}

+ 1 - 2
application/src/main/java/com/ctsi/Auth/web/login.java

@@ -52,7 +52,6 @@ public class login {
     @ApiOperation("获取当前用户菜单树")
     @GetMapping(value = "/getMenuTree",name = "获取当前用户菜单树")
     public ApiResult<List<SysMenuSearchPO>> getMenuTree(){
-         String userId = StpUtil.getLoginId().toString();
-        return ApiResult.success(sysMenuService.getMenuTree(Long.parseLong(userId)));
+        return ApiResult.success(sysMenuService.getMenuTree(StpUtil.getLoginIdAsLong()));
     }
 }

+ 30 - 0
application/src/main/java/com/ctsi/Auth/web/password.java

@@ -0,0 +1,30 @@
+package com.ctsi.Auth.web;
+
+import com.ctsi.Auth.entity.UpdatePasswordVO;
+import com.ctsi.System.SysUser.service.SysUserService;
+import com.ctsi.utils.ApiResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.parameters.RequestBody;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+@Api(tags = "密码")
+@RestController
+@RequestMapping(value = "/api/system")
+public class password {
+    @Resource
+    private SysUserService sysUserService;
+    @ApiOperation("修改密码")
+    @PostMapping(value = "/updatePassword",name = "修改密码")
+    public ApiResult updatePassword(@RequestBody UpdatePasswordVO updatePasswordVO){
+        try {
+            return sysUserService.updatePassword(updatePasswordVO);
+        } catch (Exception e) {
+            return ApiResult.failure("修改失败",null);
+        }
+    }
+}

+ 0 - 3
application/src/main/java/com/ctsi/System/SysUser/entity/VO/UserAddVO.java

@@ -12,9 +12,6 @@ public class UserAddVO {
     /** 用户名 */
     @ApiModelProperty(value = "用户名",notes = "")
     private String userName ;
-    /** 密码 */
-    @ApiModelProperty(value = "密码",notes = "")
-    private String password ;
     /** 姓名 */
     @ApiModelProperty(value = "姓名",notes = "")
     private String name ;

+ 4 - 0
application/src/main/java/com/ctsi/System/SysUser/service/SysUserService.java

@@ -1,9 +1,11 @@
 package com.ctsi.System.SysUser.service;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ctsi.Auth.entity.UpdatePasswordVO;
 import com.ctsi.System.SysUser.entity.SysUser;
 import com.ctsi.System.SysUser.entity.PO.UserDetailPO;
 import com.ctsi.System.SysUser.entity.VO.UserSearchVO;
+import com.ctsi.utils.ApiResult;
 
 /**
  * 用户表;(sys_user)表服务接口
@@ -36,6 +38,8 @@ public interface SysUserService{
      * @return 实例对象
      */
     SysUser insert(SysUser sysUser);
+
+    ApiResult updatePassword(UpdatePasswordVO updatePasswordVO);
     /** 
      * 更新数据
      *

+ 39 - 1
application/src/main/java/com/ctsi/System/SysUser/service/impl/SysUserServiceImpl.java

@@ -1,10 +1,13 @@
 package com.ctsi.System.SysUser.service.impl;
 
+import cn.dev33.satoken.stp.SaTokenInfo;
+import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ctsi.Auth.entity.UpdatePasswordVO;
 import com.ctsi.System.SysOrg.entity.SysOrg;
 import com.ctsi.System.SysUser.entity.SysUser;
 import com.ctsi.System.SysUser.entity.PO.UserDetailPO;
@@ -14,11 +17,14 @@ import com.ctsi.System.SysUser.service.SysUserService;
 import com.ctsi.System.SysUserDetail.entity.SysUserDetail;
 import com.ctsi.System.SysUserOrg.entity.SysUserOrg;
 import com.ctsi.System.SysUserRole.entity.PO.SysUserRoleAddPO;
-import com.ctsi.System.SysUserRole.entity.VO.SysUserRoleAddVO;
 import com.ctsi.System.SysUserRole.service.SysUserRoleService;
+import com.ctsi.utils.ApiResult;
 import com.ctsi.utils.PasswordEncoderUtil;
+import com.ctsi.utils.PasswordUtils;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import org.apache.logging.log4j.util.Strings;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
@@ -34,6 +40,8 @@ public class SysUserServiceImpl implements SysUserService {
     private SysUserMapper sysUserMapper;
     @Resource
     private SysUserRoleService sysUserRoleService;
+    @Value("${frame.default-password}")
+    private String defaultPassword;
     
     /** 
      * 通过ID查询单条数据 
@@ -96,10 +104,40 @@ public class SysUserServiceImpl implements SysUserService {
      * @return 实例对象
      */
     public SysUser insert(SysUser sysUser){
+        // 新增用户时如果没有特别设定密码,则使用默认密码
+        if (Strings.isBlank(sysUser.getPassword())) {
+            if (Strings.isBlank(defaultPassword)) {
+                throw new RuntimeException("密码不能为空");
+            }
+            sysUser.setPassword(defaultPassword);
+        }
         sysUser.setPassword(PasswordEncoderUtil.hashPassword(sysUser.getPassword()));
         sysUserMapper.insert(sysUser);
         return sysUser;
     }
+
+    /**
+     * 修改当前用户密码
+     *
+     * @param updatePasswordVO 实例对象
+     * @return 实例对象
+     */
+    public ApiResult updatePassword(UpdatePasswordVO updatePasswordVO){
+        SysUser sysUser = sysUserMapper.selectById(StpUtil.getLoginIdAsLong());
+        if (sysUser == null)
+            return ApiResult.failure("用户不存在",null);
+        if (!PasswordEncoderUtil.checkPassword(updatePasswordVO.getOldPassword(), sysUser.getPassword()))
+            return ApiResult.failure("原密码错误",null);
+        PasswordUtils passwordUtils = PasswordUtils.isValid(updatePasswordVO.getNewPassword(), sysUser.getUserName());
+        if (!passwordUtils.getIsValidPassword()) {
+            return ApiResult.failure(passwordUtils.getMessage(),null);
+        }
+        SysUser sysUserUpdate = new SysUser();
+        sysUserUpdate.setId(sysUser.getId());
+        sysUserUpdate.setPassword(PasswordEncoderUtil.hashPassword(updatePasswordVO.getNewPassword()));
+        sysUserMapper.updateById(sysUserUpdate);
+        return ApiResult.success("修改成功");
+    }
     
     /** 
      * 更新数据

+ 155 - 0
application/src/main/java/com/ctsi/utils/PasswordUtils.java

@@ -0,0 +1,155 @@
+package com.ctsi.utils;
+
+import org.apache.logging.log4j.util.Strings;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class PasswordUtils {
+    public static Boolean isValidPassword;
+    public static String message;
+
+    public Boolean getIsValidPassword() {
+        return isValidPassword;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    //定义横向穷举
+    private static final String[][] KEY_CODE = {
+            {"`~·", "1!!", "2@@", "3#", "4$¥", "5%", "6^……", "7&", "8*", "9((", "0))", "-_", "=+"},
+            {" ","qQ", "wW", "eE", "rR", "tT", "yY", "uU", "iI", "oO", "pP", "[{【", "]}】", "\\|、"},
+            {" ","aA", "sS", "dD", "fF", "gG", "hH", "jJ", "kK", "lL", ";:", "\'\"’“"},
+            {" ","zZ", "xX", "cC", "vV", "bB", "nN", "mM", ",《<", ".>》", "/??"}
+    };
+
+    public PasswordUtils(Boolean isValid, String message1) {
+        isValidPassword = isValid;
+        message = message1;
+    }
+
+
+    public static PasswordUtils isValid(String password,String userName) {
+        // 密码长度至少8位
+        if (password.length() < 8) {
+            return new PasswordUtils(false, "密码最少8位");
+        }
+        // 密码长度最多20位
+        if (password.length() > 20) {
+            return new PasswordUtils(false, "密码最多20位");
+        }
+        // 密码必须包含英文和数字
+        Pattern pattern = Pattern.compile("^(?=.*[a-zA-Z])(?=.*\\d).+$");
+        Matcher matcher = pattern.matcher(password);
+        if (!matcher.matches()) {
+            return new PasswordUtils(false, "密码必须包含英文和数字");
+        }
+        // 不允许使用连续的字符串密码
+        if (isSequential(password)) {
+            return new PasswordUtils(false, "密码不能使用连续字符");
+        }
+        // 不允许使用连续的键盘密码
+        if (isKeyBoardContinuousChar(password)) {
+            return new PasswordUtils(false, "密码不能使用连续键盘字符");
+        }
+        // 判断密码不能包含用户名
+        if (checkUserName(password, userName)) {
+            return new PasswordUtils(false, "密码不应包含用户名信息");
+        }
+
+        return new PasswordUtils(true, "");
+    }
+
+    private static boolean isSequential(String password) {
+        String lowercase = password.toLowerCase();
+
+        for (int i = 0; i < lowercase.length() - 2; i++) {
+            char current = lowercase.charAt(i);
+            char next1 = (char) (current + 1);
+            char next2 = (char) (current + 2);
+
+            if (lowercase.charAt(i + 1) == next1 && lowercase.charAt(i + 2) == next2) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * 是否包含3个及以上键盘连续字符
+     *
+     * @param password 待匹配的字符串
+     */
+    private static boolean isKeyBoardContinuousChar(String password) {
+        if (Strings.isBlank(password)) {
+            return false;
+        }
+        //找出给出的字符串,每个字符,在坐标系中的位置。
+        char[] c = password.toCharArray();
+        List<Integer> x = new ArrayList<Integer>();
+        List<Integer> y = new ArrayList<Integer>();
+        for (char temp : c) {
+            toHere:
+            for (int j = 0; j < KEY_CODE.length; j++) {
+                for (int k = 0; k < KEY_CODE[j].length; k++) {
+                    String jk = KEY_CODE[j][k];
+                    if (jk.contains(String.valueOf(temp))) {
+                        x.add(j);
+                        y.add(k);
+                        break toHere;
+                    }
+                }
+            }
+        }
+        boolean flag = false;
+        for (int i = 0; i < x.size() - 3; i++) {
+            // 如果X一致,那么就是在一排
+            //四者在同一行上
+            if (x.get(i) .equals(x.get(i + 1))  && x.get(i + 1).equals(x.get(i + 2))
+                    && x.get(i + 2).equals(x.get(i + 3))) {
+                if (y.get(i) > y.get(i + 3)) {
+                    if (y.get(i) - 1 == y.get(i + 1) && y.get(i) - 2 == y.get(i + 2) && y.get(i) - 3 == y.get(i + 3)) {
+                        flag = true;
+                        break;
+                    }
+                } else {
+                    if (y.get(i) + 1 == y.get(i + 1) && y.get(i) + 2 == y.get(i + 2) && y.get(i) + 3 == y.get(i + 3)) {
+                        flag = true;
+                        break;
+                    }
+                }
+
+            } else if (!x.get(i).equals(x.get(i + 1))
+                    && !x.get(i + 1).equals( x.get(i + 2))
+                    && !x.get(i).equals(x.get(i + 2))
+                    && !x.get(i).equals(x.get(i + 3))
+                    && !x.get(i + 1).equals(x.get(i + 3))
+                    && !x.get(i + 2).equals(x.get(i + 3))){
+
+
+                //四者均不在同一行上,但是如果y相同,说明是一列
+                if (y.get(i).equals(y.get(i + 1))  && y.get(i + 1).equals(y.get(i + 2))
+                        && y.get(i+ 2).equals(y.get(i + 3)) ) {
+                    flag = true;
+                    break;
+                }
+                if (y.get(i).equals(y.get(i + 1)+1)  && y.get(i + 1).equals(y.get(i + 2)+1)
+                        && y.get(i+ 2).equals(y.get(i + 3)+1) ) {
+                    flag = true;
+                    break;
+                }
+            }
+
+        }
+        return flag;
+    }
+
+    public static Boolean checkUserName(String password, String userName){
+        return password.toLowerCase().contains(userName.toLowerCase());
+    }
+}

+ 4 - 0
application/src/main/resources/application.yml

@@ -68,3 +68,7 @@ sa-token:
   token-style: uuid
   # 是否输出操作日志
   is-log: true
+
+# frame
+frame:
+  default-password: Root@0511