فهرست منبع

修改密码前后端强密码校验

xusl 2 سال پیش
والد
کامیت
6e2238833d
67فایلهای تغییر یافته به همراه565 افزوده شده و 153 حذف شده
  1. 121 28
      backend/src/main/java/com/jiayue/ssi/controller/SysUserController.java
  2. 21 0
      backend/src/main/java/com/jiayue/ssi/controller/Test.java
  3. 1 1
      backend/src/main/java/com/jiayue/ssi/filter/VerifySmFilter.java
  4. 130 0
      backend/src/main/java/com/jiayue/ssi/util/RegexUtil.java
  5. 88 0
      backend/target/classes/application.yml
  6. 11 0
      backend/target/classes/banner.txt
  7. BIN
      backend/target/classes/com/jiayue/ssi/SsiApplication.class
  8. BIN
      backend/target/classes/com/jiayue/ssi/annotation/InterfaceLimit.class
  9. BIN
      backend/target/classes/com/jiayue/ssi/aspectj/InterfaceLimitAspect.class
  10. BIN
      backend/target/classes/com/jiayue/ssi/backenum/ResponseEnum.class
  11. BIN
      backend/target/classes/com/jiayue/ssi/config/CaptchaConfig.class
  12. BIN
      backend/target/classes/com/jiayue/ssi/config/MyAuthenticationProvider.class
  13. BIN
      backend/target/classes/com/jiayue/ssi/config/MybatisPlusConfig.class
  14. BIN
      backend/target/classes/com/jiayue/ssi/config/ResponseAdvice.class
  15. BIN
      backend/target/classes/com/jiayue/ssi/config/SendMailUtil.class
  16. BIN
      backend/target/classes/com/jiayue/ssi/config/WebConfig.class
  17. BIN
      backend/target/classes/com/jiayue/ssi/config/WebSecurityConfig.class
  18. BIN
      backend/target/classes/com/jiayue/ssi/constant/CacheConstants.class
  19. BIN
      backend/target/classes/com/jiayue/ssi/constant/SecretKeyConstants.class
  20. BIN
      backend/target/classes/com/jiayue/ssi/controller/SysUserController.class
  21. BIN
      backend/target/classes/com/jiayue/ssi/controller/Test.class
  22. BIN
      backend/target/classes/com/jiayue/ssi/controller/UserLoginController.class
  23. BIN
      backend/target/classes/com/jiayue/ssi/entity/BaseEntity.class
  24. BIN
      backend/target/classes/com/jiayue/ssi/entity/SysUser.class
  25. BIN
      backend/target/classes/com/jiayue/ssi/filter/InterfaceLimitFilter.class
  26. BIN
      backend/target/classes/com/jiayue/ssi/filter/JwtAuthenticationTokenFilter.class
  27. BIN
      backend/target/classes/com/jiayue/ssi/filter/MailCodeFilter.class
  28. BIN
      backend/target/classes/com/jiayue/ssi/filter/VerifyCodeFilter.class
  29. BIN
      backend/target/classes/com/jiayue/ssi/filter/VerifySmFilter.class
  30. BIN
      backend/target/classes/com/jiayue/ssi/handler/CustomAuthenticationFailureHandler.class
  31. BIN
      backend/target/classes/com/jiayue/ssi/handler/CustomAuthenticationSuccessHandler.class
  32. BIN
      backend/target/classes/com/jiayue/ssi/handler/EntryPointUnauthorizedHandler.class
  33. BIN
      backend/target/classes/com/jiayue/ssi/handler/MyMetaObjectHandler.class
  34. BIN
      backend/target/classes/com/jiayue/ssi/handler/RestAccessDeniedHandler.class
  35. BIN
      backend/target/classes/com/jiayue/ssi/interceptor/TokenStatusInterceptor.class
  36. BIN
      backend/target/classes/com/jiayue/ssi/mapper/SysUserMapper.class
  37. BIN
      backend/target/classes/com/jiayue/ssi/service/SysUserService.class
  38. BIN
      backend/target/classes/com/jiayue/ssi/service/impl/SysUserServiceImpl.class
  39. BIN
      backend/target/classes/com/jiayue/ssi/service/impl/UserServiceImpl.class
  40. BIN
      backend/target/classes/com/jiayue/ssi/servlet/ParameterRequestWrapper$1.class
  41. BIN
      backend/target/classes/com/jiayue/ssi/servlet/ParameterRequestWrapper.class
  42. BIN
      backend/target/classes/com/jiayue/ssi/util/IPUtils.class
  43. BIN
      backend/target/classes/com/jiayue/ssi/util/IdUtils.class
  44. BIN
      backend/target/classes/com/jiayue/ssi/util/InterfaceLimitUtil.class
  45. BIN
      backend/target/classes/com/jiayue/ssi/util/JwtTokenUtil.class
  46. BIN
      backend/target/classes/com/jiayue/ssi/util/LocalCache$Constants.class
  47. BIN
      backend/target/classes/com/jiayue/ssi/util/LocalCache.class
  48. BIN
      backend/target/classes/com/jiayue/ssi/util/RandomPwd.class
  49. BIN
      backend/target/classes/com/jiayue/ssi/util/RandomUtil.class
  50. BIN
      backend/target/classes/com/jiayue/ssi/util/RegexUtil.class
  51. BIN
      backend/target/classes/com/jiayue/ssi/util/ResponseInfo.class
  52. BIN
      backend/target/classes/com/jiayue/ssi/util/ResponseVO.class
  53. BIN
      backend/target/classes/com/jiayue/ssi/util/SM2CryptUtils.class
  54. BIN
      backend/target/classes/com/jiayue/ssi/util/SecurityContextUtil.class
  55. BIN
      backend/target/classes/com/jiayue/ssi/util/UUID$Holder.class
  56. BIN
      backend/target/classes/com/jiayue/ssi/util/UUID.class
  57. BIN
      backend/target/classes/com/jiayue/ssi/util/UtilException.class
  58. BIN
      backend/target/test-classes/com/jiayue/ssi/BaseTest.class
  59. BIN
      backend/target/test-classes/com/jiayue/ssi/service/CreateSm2Key.class
  60. BIN
      backend/target/test-classes/com/jiayue/ssi/service/DataHandleServiceTest.class
  61. BIN
      backend/target/test-classes/com/jiayue/ssi/service/Sm2UiTest.class
  62. BIN
      backend/target/test-classes/com/jiayue/ssi/service/Test.class
  63. 0 1
      ui/src/main.js
  64. 1 1
      ui/src/permission.js
  65. 1 1
      ui/src/views/dashboard/index.vue
  66. 135 120
      ui/src/views/sysManager/userManager/index.vue
  67. 56 1
      ui/src/views/sysManager/userManager/profile/resetPwd.vue

+ 121 - 28
backend/src/main/java/com/jiayue/ssi/controller/SysUserController.java

@@ -1,5 +1,7 @@
 package com.jiayue.ssi.controller;
 
+import cn.hutool.core.lang.Validator;
+import cn.hutool.core.text.PasswdStrength;
 import cn.hutool.crypto.SmUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
@@ -88,17 +90,33 @@ public class SysUserController {
         else if (sysUserService.queryUserName(user.getUsername())!=null){
             return ResponseVO.fail(user.getUsername() + "账号已存在!");
         }
+        else if (user.getUsername().length()<5 || user.getUsername().length()>20){
+            return ResponseVO.fail(user.getUsername() + "用户账号长度必须介于5和20之间!");
+        }
 
         if (StringUtils.isEmpty(user.getPhonenumber())) {
             return ResponseVO.fail("手机号码不能为空!");
         }
+        else if (!Validator.isMobile(user.getPhonenumber())){
+            return ResponseVO.fail("请输入正确的手机号码!");
+        }
+
         if (StringUtils.isEmpty(user.getNickname())) {
             return ResponseVO.fail("姓名不能为空!");
         }
+        else if (user.getNickname().length()>30){
+            return ResponseVO.fail("姓名长度不能超过30个字符!");
+        }
 
         if (StringUtils.isEmpty(user.getMailbox())){
             return ResponseVO.fail("邮箱不能为空!");
         }
+        else if (!Validator.isEmail(user.getMailbox())){
+            return ResponseVO.fail("请输入正确的邮箱地址!");
+        }
+        else if (user.getMailbox().length()>50){
+            return ResponseVO.fail("邮箱长度不能超过50个字符!");
+        }
         else if (sysUserService.queryMailBox(user.getMailbox())!=null){
             return ResponseVO.fail(user.getMailbox() + "邮箱已存在!");
         }
@@ -106,7 +124,91 @@ public class SysUserController {
         // 生成8位初始密码
         String randomPwd = RandomPwd.getRandomPwd(8);
         user.setPassword(SmUtil.sm3(randomPwd).toUpperCase());
-        return ResponseVO.success(sysUserService.save(user));
+
+        try {
+            boolean bo = sysUserService.save(user);
+            if (bo){
+                return ResponseVO.success("添加用户信息成功");
+            }
+            else{
+                log.error("添加用户信息失败");
+                return ResponseVO.fail("添加用户信息失败");
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error("添加用户信息异常");
+            return ResponseVO.error(e);
+        }
+    }
+
+    /**
+     * 更新用户
+     *
+     * @param user 参数
+     * @return 执行结果
+     */
+    @PutMapping
+    public ResponseVO update(@RequestBody SysUser user) {
+        SysUser existUser = sysUserService.getById(user.getId());
+        if (existUser==null){
+            return ResponseVO.fail("非法访问不能修改!");
+        }
+
+        if (StringUtils.isEmpty(user.getUsername())){
+            return ResponseVO.fail("用户账号不能为空!");
+        }
+        else if (user.getUsername().length()<5 || user.getUsername().length()>20){
+            return ResponseVO.fail(user.getUsername() + "用户账号长度必须介于5和20之间!");
+        }
+        else if (!existUser.getUsername().equals(user.getUsername())){
+            if (sysUserService.queryUserName(user.getUsername())!=null){
+                return ResponseVO.fail(user.getUsername() + "账号已存在!");
+            }
+        }
+
+        if (StringUtils.isEmpty(user.getMailbox())){
+            return ResponseVO.fail("邮箱不能为空!");
+        }
+        else if (!Validator.isEmail(user.getMailbox())){
+            return ResponseVO.fail("请输入正确的邮箱地址!");
+        }
+        else if (user.getMailbox().length()>50){
+            return ResponseVO.fail("邮箱长度不能超过50个字符!");
+        }
+        else if (!existUser.getMailbox().equals(user.getMailbox())){
+            if (sysUserService.queryMailBox(user.getMailbox())!=null){
+                return ResponseVO.fail(user.getMailbox() + "邮箱已存在!");
+            }
+        }
+
+        if (StringUtils.isEmpty(user.getPhonenumber())) {
+            return ResponseVO.fail("手机号码不能为空!");
+        }
+        else if (!Validator.isMobile(user.getPhonenumber())){
+            return ResponseVO.fail("请输入正确的手机号码!");
+        }
+
+        if (StringUtils.isEmpty(user.getNickname())) {
+            return ResponseVO.fail("姓名不能为空!");
+        }
+        else if (user.getNickname().length()>30){
+            return ResponseVO.fail("姓名长度不能超过30个字符!");
+        }
+
+        try {
+            boolean bo = sysUserService.updateUser(user);
+            if (bo){
+                return ResponseVO.success("修改用户信息成功");
+            }
+            else{
+                log.error("修改用户信息失败");
+                return ResponseVO.fail("修改用户信息失败");
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error("修改用户信息异常");
+            return ResponseVO.error(e);
+        }
     }
 
     /**
@@ -194,7 +296,24 @@ public class SysUserController {
             return ResponseVO.fail("新密码两次输入的密码不一致!");
         }
         // 对新密码规则验证
-
+        if (newPassword.contains(sysUser.getUsername())){
+            return ResponseVO.fail("密码不能含有账号!");
+        }
+        if (SmUtil.sm3(newPassword).toUpperCase().equals(sysUser.getPassword())){
+            return ResponseVO.fail("新密码不能与上次密码相同!");
+        }
+        if (RegexUtil.sameReg(newPassword)){
+            return ResponseVO.fail("新密码不能含有连续4位相同的数字或字母!");
+        }
+        else if (RegexUtil.keyboardSlopeArr(newPassword)){
+            return ResponseVO.fail("新密码不能含有4位斜方向连续的字符!");
+        }
+        else if (RegexUtil.keyboardHorizontalReg(newPassword)){
+            return ResponseVO.fail("新密码不能含有4位连续的字符!");
+        }
+        else if (!RegexUtil.checkPwd(newPassword)){
+            return ResponseVO.fail("新密码不满足8~20位大写字母、小写字母、数字、特殊字符三种以上的组合!");
+        }
 
         sysUser.setPassword(SmUtil.sm3(newPassword).toUpperCase());
         sysUser.setLastUpdatePwdTime(new Date());
@@ -204,30 +323,4 @@ public class SysUserController {
         }
         return ResponseVO.success();
     }
-
-    /**
-     * 更新用户信息
-     *
-     * @param sysUser 参数
-     * @return 执行结果
-     */
-    @PutMapping(value = "sysUser/")
-    public ResponseVO update(@RequestBody SysUser sysUser) {
-        try {
-            boolean bo = sysUserService.updateUser(sysUser);
-            if (bo){
-                return ResponseVO.success("修改用户信息成功");
-            }
-            else{
-                log.error("更新用户信息失败");
-                return ResponseVO.fail();
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-            log.error("更新用户信息异常");
-            return ResponseVO.fail();
-        }
-    }
-
-
 }

+ 21 - 0
backend/src/main/java/com/jiayue/ssi/controller/Test.java

@@ -0,0 +1,21 @@
+package com.jiayue.ssi.controller;
+
+import cn.hutool.core.lang.Validator;
+import org.apache.commons.lang3.RegExUtils;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+*
+*
+* @author xsl
+* @since 2023/03/16
+*/
+public class Test {
+    public static void main(String args[]) {
+        String str = "18698814578";
+        String pattern = "^1[3|4|5|6|7|8|9][0-9]\\d{8}$";
+        System.out.println(str.matches(pattern));
+    }
+}

+ 1 - 1
backend/src/main/java/com/jiayue/ssi/filter/VerifySmFilter.java

@@ -65,7 +65,7 @@ public class VerifySmFilter extends OncePerRequestFilter {
             }
             // 解密后的参数字符串
             String decryptStr = "";
-            if ("POST".equalsIgnoreCase(request.getMethod())) {
+            if ("POST".equalsIgnoreCase(request.getMethod())||"PUT".equalsIgnoreCase(request.getMethod())) {
                 byte[] bytes = null;
                 try {
                     bytes = initWrapper.getBodyContent(request).getBytes(StandardCharsets.UTF_8);

+ 130 - 0
backend/src/main/java/com/jiayue/ssi/util/RegexUtil.java

@@ -0,0 +1,130 @@
+package com.jiayue.ssi.util;
+
+import cn.hutool.crypto.SmUtil;
+
+/**
+* 自定义正则验证
+*
+* @author xsl
+* @since 2023/03/16
+*/
+public class RegexUtil {
+
+    private static String[] KEYBOARD_SLOPE_ARR={"1qaz", "2wsx", "3edc", "4rfv", "5tgb", "6yhn", "7ujm", "8ik,", "9ol.", "0p;/",
+            "/;p0", ".lo9", ",ki8", "mju7", "nhy6", "bgt5", "vfr4", "cde3", "xsw2", "zaq1", "4esz", "5rdx", "6tfc",
+            "7ygv", "8uhb", "9ijn", "0okm", "-pl,", "=[;.", ".;[=", ",lp-", "mko0", "nji9", "bhu8", "vgy7", "cft6",
+            "xdr5", "zse4","!qaz", "@wsx", "#edc","$rfv", "%tgb", "^yhn", "&ujm", "*ik<", "(ol>", ")p:?", "?:p)",
+            ">lo(", "<ki*", "mju&", "nhy^", "bgt%", "vfr$", "cde#", "xsw@", "zaq!", "$esz", "%rdx", "^tfc", "&ygv",
+            "*uhb", "(ijn", ")okm", "_pl<", "+{:>", ">:{+", "<lp_", "mko)", "nji(", "bhu*", "vgy&", "cft^", "xdr%", "zse$"};
+
+
+    private static String KEYBOARD_METADATA[] = {"qwertyuiopasdfghjklzxcvbnm",
+            "1234567890-=",
+            "=-0987654321",
+            "qwertyuiop[]\\asdfghjkl;'zxcvbnm,./",
+            "abcdefghijklmnopqrstuvwxyz",
+            "zyxwvutsrqponmlkjihgfedcba",
+    };
+    /**
+     * 含有连续4位相同的数字或字母
+     * @param str
+     * @return
+     */
+    public static boolean sameReg(String str){
+        String regStr = "([0-9a-zA-Z])\1{3}";
+        return str.matches(regStr);
+    }
+
+    /**
+     * 含有4位键盘斜向方向连续的字符
+     * @return
+     */
+    public static boolean keyboardSlopeArr(String password){
+        //将所有输入字符转为小写
+        String t_password = password.toLowerCase();
+        int n = t_password.length();
+
+        boolean flag = false;
+        int arrLen = KEYBOARD_SLOPE_ARR.length;
+        int limit_num = 4;
+
+        for(int i=0; i+limit_num<=n; i++) {
+            String str = t_password.substring(i, i+limit_num);
+            String distinguishStr = password.substring(i, i+limit_num);
+            for(int j=0; j<arrLen; j++) {
+                String configStr = KEYBOARD_SLOPE_ARR[j];
+                String revOrderStr = new StringBuffer(KEYBOARD_SLOPE_ARR[j]).reverse().toString();
+                //检测包含字母(区分大小写)
+                if (false) {
+                    //考虑 大写键盘匹配的情况
+                    String UpperStr = KEYBOARD_SLOPE_ARR[j].toUpperCase();
+                    if((configStr.indexOf(distinguishStr) != -1) || (UpperStr.indexOf(distinguishStr) != -1)) {
+                        flag = true;
+                        return flag;
+                    }
+                    //考虑逆序输入情况下 连续输入
+                    String revUpperStr = new StringBuffer(UpperStr).reverse().toString();
+                    if((revOrderStr.indexOf(distinguishStr) != -1) || (revUpperStr.indexOf(distinguishStr) != -1)) {
+                        flag = true;
+                        return flag;
+                    }
+                }else {
+                    if(configStr.indexOf(str) != -1) {
+                        flag = true;
+                        return flag;
+                    }
+                    //考虑逆序输入情况下 连续输入
+                    if(revOrderStr.indexOf(str) != -1) {
+                        flag = true;
+                        return flag;
+                    }
+                }
+            }
+        }
+        return flag;
+    }
+    /**
+     * 含有4位横向连续的字母
+     * @param str
+     * @return
+     */
+    public static boolean keyboardHorizontalReg(String str){
+        int size = str.length();
+        String temp = "";
+        int offet=0;
+        for(String s : KEYBOARD_METADATA) {//提前定义的连续字符串
+            offet=0;
+            for(int i=4;i<=size;i++) {//直接从最大允许的字符开始截取字符
+                temp = str.toLowerCase().substring(offet++,i);
+                if(s.contains(temp)) {//出现连续字符,直接返回true了
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+    /**
+     * 大写字母、小写字母、数字、特殊字符三种以上的组合,长度8-20位
+     * @param str
+     * @return
+     */
+    public static boolean checkPwd(String str){
+        String regStr = "^(?![a-zA-Z]+$)(?![a-z\\d]+$)(?![a-z!@#\\$%]+$)(?![A-Z\\d]+$)(?![A-Z!@#\\$%]+$)(?![\\d!@#\\$%]+$)[a-zA-Z\\d!@#\\$%]{8,20}$";
+        return str.matches(regStr);
+    }
+
+    public static void main(String[] args) {
+        // 不能含有连续4位相同的数字或字母
+//        System.out.println(RegexUtil.sameReg("444"));
+        // 不能含有4位连续的字母
+//        System.out.println(RegexUtil.strResverReg("efgh"));
+        // 不能含有4位键盘横向方向连续的字符
+//        System.out.println(RegexUtil.keyboardSlopeArr());
+
+//        System.out.println(keyboardSlopeArr(")P:?"));
+//        System.out.println(keyboardHorizontalReg("abcde"));
+        System.out.println(SmUtil.sm3("admin").toUpperCase());
+
+//        System.out.println(RegexUtil.checkPwd("@xk12111rrrrrrrrrrrr"));
+    }
+}

+ 88 - 0
backend/target/classes/application.yml

@@ -0,0 +1,88 @@
+server:
+  port: 8888
+
+#设置提供的服务名
+spring:
+  application:
+    name: ssq-mybatis-plus
+  #配置数据库
+  datasource:
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    type: com.alibaba.druid.pool.DruidDataSource
+    url: jdbc:mysql://192.168.1.205:3306/ssi?useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8&autoReconnect=true&rewriteBatchedStatements=true&serverTimezone=Asia/Shanghai
+    username: root
+    password: "!QAZ2root"
+
+  #邮箱基本配置
+  mail:
+    #配置smtp服务主机地址
+    # qq邮箱为smtp.qq.com          端口号465或587
+    # sina    smtp.sina.cn
+    # aliyun  smtp.aliyun.com
+    # 163     smtp.163.com       端口号465或994
+    host: smtp.263.net
+    #发送者邮箱
+    username: xushilong@jiayuepowertech.com
+    #配置密码,注意不是真正的密码,而是刚刚申请到的授权码
+    password: jiayue123456
+    #端口号465或587
+    port: 465
+    #默认的邮件编码为UTF-8
+    default-encoding: UTF-8
+    #其他参数
+    properties:
+      mail:
+        #配置SSL 加密工厂
+        smtp:
+          ssl:
+            #本地测试,先放开ssl
+            enable: true
+            required: true
+          #开启debug模式,这样邮件发送过程的日志会在控制台打印出来,方便排查错误
+        debug: true
+
+
+#mybatis plus
+#mybatis-plus:
+#  #指明mapper.xml扫描位置(classpath* 代表编译后类文件根目录)
+#  mapper-locations: classpath*:/mapper/**Mapper.xml
+#  #指明实体扫描(多个package用逗号或者分号分隔)
+#  typeAliasesPackage: com.ssqmybatis.entity;
+#  global-config:
+#    #主键类型 0:数据库ID自增, 1:用户输入ID,2:全局唯一ID (数字类型唯一ID), 3:全局唯一ID UUID
+#    id-type: 0
+#    #字段策略(拼接sql时用于判断属性值是否拼接) 0:忽略判断,1:非NULL判断,2:非空判断
+#    field-strategy: 2
+#    #驼峰下划线转换含查询column及返回column(column下划线命名create_time,返回java实体是驼峰命名createTime,开启后自动转换否则保留原样)
+#    db-column-underline: true
+#    #是否动态刷新mapper
+#    refresh-mapper: false
+#    #数据库大写命名下划线转换
+#    #capital-mode: true
+
+mybatis:
+  table:
+    auto: update
+    #create	    系统启动后,会将所有的表删除掉,然后根据model中配置的结构重新建表,该操作会破坏原有数据。
+    #update	    系统会自动判断哪些表是新建的,哪些字段要修改类型等,哪些字段要删除,哪些字段要新增,该操作不会破坏原有数据。
+    #none 		系统不做任何处理。
+    #add		新增表/新增字段/新增索引/新增唯一约束的功能,不做做修改和删除 (只在版本1.0.9.RELEASE及以上支持)。
+  model:
+    pack: com.ssqmybatis.entity #扫描用于创建表的对象的包名,多个包用“,”隔开
+  database:
+    type: mysql #数据库类型 目前只支持mysql
+mybatis-plus:
+  configuration:
+    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+  mapper-locations: classpath:/mapper/*Mapper.xml
+  global-config:
+    db-column-underline: true
+    logic-delete-field: del_flag
+    logic-delete-value: 1
+    logic-not-delete-value: 0
+# 服务端密钥
+# 客户端公钥:MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEz9IxRa8TDtsQABm/zl1VCFGVjyklybVfoVKupC759hevR7R9R8sS4flOFJbk8z++Pp/YSb9aHNDMR+S6SpuAXg==
+# 自己私钥:MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQgm/zcWRJO89xIxOT1PtowqYZHQFBhik3pccpEY1y1+UmgCgYIKoEcz1UBgi2hRANCAAQdHjJPTUumQK2kkouvR7m9J61iACpPA5c7eLqFB1g85j12X90YAcF6ma30bXXarlULzEPhLTWBbEDIk8wgWy6T
+# 客户端密钥
+# 服务端公钥:MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEHR4yT01LpkCtpJKLr0e5vSetYgAqTwOXO3i6hQdYPOY9dl/dGAHBepmt9G112q5VC8xD4S01gWxAyJPMIFsukw==
+# 自己私钥:MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQgHFgMNlizvBSLrq0DBio/cGEy1WwKj5Y8CmZUnTSdr8OgCgYIKoEcz1UBgi2hRANCAATP0jFFrxMO2xAAGb/OXVUIUZWPKSXJtV+hUq6kLvn2F69HtH1HyxLh+U4UluTzP74+n9hJv1oc0MxH5LpKm4Be

+ 11 - 0
backend/target/classes/banner.txt

@@ -0,0 +1,11 @@
+    ___      ___    ___
+   |\  \    |\  \  /  /|
+   \ \  \   \ \  \/  / /
+ __ \ \  \   \ \    / /
+|\  \\_\  \   \/  /  /
+\ \________\__/  / /
+ \|________|\___/ /
+           \|___|/
+
+
+Spring Boot版本:${spring-boot.version}

BIN
backend/target/classes/com/jiayue/ssi/SsiApplication.class


BIN
backend/target/classes/com/jiayue/ssi/annotation/InterfaceLimit.class


BIN
backend/target/classes/com/jiayue/ssi/aspectj/InterfaceLimitAspect.class


BIN
backend/target/classes/com/jiayue/ssi/backenum/ResponseEnum.class


BIN
backend/target/classes/com/jiayue/ssi/config/CaptchaConfig.class


BIN
backend/target/classes/com/jiayue/ssi/config/MyAuthenticationProvider.class


BIN
backend/target/classes/com/jiayue/ssi/config/MybatisPlusConfig.class


BIN
backend/target/classes/com/jiayue/ssi/config/ResponseAdvice.class


BIN
backend/target/classes/com/jiayue/ssi/config/SendMailUtil.class


BIN
backend/target/classes/com/jiayue/ssi/config/WebConfig.class


BIN
backend/target/classes/com/jiayue/ssi/config/WebSecurityConfig.class


BIN
backend/target/classes/com/jiayue/ssi/constant/CacheConstants.class


BIN
backend/target/classes/com/jiayue/ssi/constant/SecretKeyConstants.class


BIN
backend/target/classes/com/jiayue/ssi/controller/SysUserController.class


BIN
backend/target/classes/com/jiayue/ssi/controller/Test.class


BIN
backend/target/classes/com/jiayue/ssi/controller/UserLoginController.class


BIN
backend/target/classes/com/jiayue/ssi/entity/BaseEntity.class


BIN
backend/target/classes/com/jiayue/ssi/entity/SysUser.class


BIN
backend/target/classes/com/jiayue/ssi/filter/InterfaceLimitFilter.class


BIN
backend/target/classes/com/jiayue/ssi/filter/JwtAuthenticationTokenFilter.class


BIN
backend/target/classes/com/jiayue/ssi/filter/MailCodeFilter.class


BIN
backend/target/classes/com/jiayue/ssi/filter/VerifyCodeFilter.class


BIN
backend/target/classes/com/jiayue/ssi/filter/VerifySmFilter.class


BIN
backend/target/classes/com/jiayue/ssi/handler/CustomAuthenticationFailureHandler.class


BIN
backend/target/classes/com/jiayue/ssi/handler/CustomAuthenticationSuccessHandler.class


BIN
backend/target/classes/com/jiayue/ssi/handler/EntryPointUnauthorizedHandler.class


BIN
backend/target/classes/com/jiayue/ssi/handler/MyMetaObjectHandler.class


BIN
backend/target/classes/com/jiayue/ssi/handler/RestAccessDeniedHandler.class


BIN
backend/target/classes/com/jiayue/ssi/interceptor/TokenStatusInterceptor.class


BIN
backend/target/classes/com/jiayue/ssi/mapper/SysUserMapper.class


BIN
backend/target/classes/com/jiayue/ssi/service/SysUserService.class


BIN
backend/target/classes/com/jiayue/ssi/service/impl/SysUserServiceImpl.class


BIN
backend/target/classes/com/jiayue/ssi/service/impl/UserServiceImpl.class


BIN
backend/target/classes/com/jiayue/ssi/servlet/ParameterRequestWrapper$1.class


BIN
backend/target/classes/com/jiayue/ssi/servlet/ParameterRequestWrapper.class


BIN
backend/target/classes/com/jiayue/ssi/util/IPUtils.class


BIN
backend/target/classes/com/jiayue/ssi/util/IdUtils.class


BIN
backend/target/classes/com/jiayue/ssi/util/InterfaceLimitUtil.class


BIN
backend/target/classes/com/jiayue/ssi/util/JwtTokenUtil.class


BIN
backend/target/classes/com/jiayue/ssi/util/LocalCache$Constants.class


BIN
backend/target/classes/com/jiayue/ssi/util/LocalCache.class


BIN
backend/target/classes/com/jiayue/ssi/util/RandomPwd.class


BIN
backend/target/classes/com/jiayue/ssi/util/RandomUtil.class


BIN
backend/target/classes/com/jiayue/ssi/util/RegexUtil.class


BIN
backend/target/classes/com/jiayue/ssi/util/ResponseInfo.class


BIN
backend/target/classes/com/jiayue/ssi/util/ResponseVO.class


BIN
backend/target/classes/com/jiayue/ssi/util/SM2CryptUtils.class


BIN
backend/target/classes/com/jiayue/ssi/util/SecurityContextUtil.class


BIN
backend/target/classes/com/jiayue/ssi/util/UUID$Holder.class


BIN
backend/target/classes/com/jiayue/ssi/util/UUID.class


BIN
backend/target/classes/com/jiayue/ssi/util/UtilException.class


BIN
backend/target/test-classes/com/jiayue/ssi/BaseTest.class


BIN
backend/target/test-classes/com/jiayue/ssi/service/CreateSm2Key.class


BIN
backend/target/test-classes/com/jiayue/ssi/service/DataHandleServiceTest.class


BIN
backend/target/test-classes/com/jiayue/ssi/service/Sm2UiTest.class


BIN
backend/target/test-classes/com/jiayue/ssi/service/Test.class


+ 0 - 1
ui/src/main.js

@@ -78,7 +78,6 @@ Vue.prototype.$axios.interceptors.request.use(
     if (config.method === 'post' || config.method === 'put') {
       if (config.url != '/getMailCode') {
         if (config.data !== undefined) {
-          console.log(JSON.stringify(config.data))
           // 参数加密
           let encryptParam = doEncrypt(JSON.stringify(config.data))
           // 参数签名

+ 1 - 1
ui/src/permission.js

@@ -41,7 +41,7 @@ router.beforeEach(async(to, from, next) => {
           var dateEnd = new Date();
           var dateDiff = dateEnd.getTime() - dateBegin.getTime(); //时间差的毫秒数
           var dayDiff = Math.floor(dateDiff / (24 * 3600 * 1000)); //计算出相差天数
-          if (dayDiff>=1){
+          if (dayDiff>=30){
             Message({
               type: 'warning',
               message: '密码超过30天需要修改!'

+ 1 - 1
ui/src/views/dashboard/index.vue

@@ -43,7 +43,7 @@ export default {
           var dateEnd = new Date();
           var dateDiff = dateEnd.getTime() - dateBegin.getTime(); //时间差的毫秒数
           var dayDiff = Math.floor(dateDiff / (24 * 3600 * 1000)); //计算出相差天数
-          if (dayDiff>=1){
+          if (dayDiff>=30){
             this.$message({
               type: 'warning',
               message: '密码超过30天需要修改!'

+ 135 - 120
ui/src/views/sysManager/userManager/index.vue

@@ -51,7 +51,8 @@
               icon="el-icon-plus"
               size="mini"
               @click="handleAdd"
-            >新增</el-button>
+            >新增
+            </el-button>
           </el-col>
           <el-col :span="1.5">
             <el-button
@@ -60,7 +61,8 @@
               icon="el-icon-edit"
               size="mini"
               @click="handleUpdate"
-            >修改</el-button>
+            >修改
+            </el-button>
           </el-col>
           <el-col :span="1.5">
             <el-button
@@ -69,59 +71,62 @@
               icon="el-icon-delete"
               size="mini"
               @click="handleDelete"
-            >删除</el-button>
+            >删除
+            </el-button>
           </el-col>
         </el-row>
         <div style="padding-top: 10px">
-        <vxe-table
-          ref="userTable"
-          align="center"
-          :loading="loading"
-          class="mytable-style"
-          auto-resize
-          border
-          resizable
-          export-config
-          highlight-current-row
-          show-overflow
-          max-height="700"
-          :data="userList"
-          :radio-config="{trigger: 'row'}"
-        >
-          <vxe-column type="radio" width="60"/>
-          <vxe-table-column field="username" title="用户账号" />
-          <vxe-table-column field="nickname" title="用户姓名" />
-          <vxe-table-column field="mailbox" title="邮箱" />
-          <vxe-table-column field="phonenumber" title="手机号码"/>
-          <vxe-table-column field="status" title="状态" :formatter="statusFormat"/>
-          <vxe-table-column title="操作" width="320">
-            <template slot-scope="scope" v-if="scope.row.userId !== 1">
-                            <el-button
-                              size="mini"
-                              type="text"
-                              icon="el-icon-edit"
-                              @click="handleResetPwd(scope.row)"
-                            >初始/重置密码</el-button>
-                            <el-button
-                              size="mini"
-                              type="text"
-                              icon="el-icon-delete"
-                              @click="handleAuthRole(scope.row)"
-                            >分配角色</el-button>
-                          </template>
-          </vxe-table-column>
-        </vxe-table>
-        <vxe-pager
-          v-show="showTable"
-          perfect
-          :current-page.sync="currentPage"
-          :page-size.sync="pageSize"
-          :total="total"
-          :page-sizes="[10,50,100]"
-          :layouts="['PrevJump', 'PrevPage','JumpNumber', 'NextPage', 'NextJump', 'Sizes', 'FullJump', 'Total']"
-          @page-change="handlePageChange"
-        >
-        </vxe-pager>
+          <vxe-table
+            ref="userTable"
+            align="center"
+            :loading="loading"
+            class="mytable-style"
+            auto-resize
+            border
+            resizable
+            export-config
+            highlight-current-row
+            show-overflow
+            max-height="700"
+            :data="userList"
+            :radio-config="{trigger: 'row'}"
+          >
+            <vxe-column type="radio" width="60"/>
+            <vxe-table-column field="username" title="用户账号"/>
+            <vxe-table-column field="nickname" title="用户姓名"/>
+            <vxe-table-column field="mailbox" title="邮箱"/>
+            <vxe-table-column field="phonenumber" title="手机号码"/>
+            <vxe-table-column field="status" title="状态" :formatter="statusFormat"/>
+            <vxe-table-column title="操作" width="320">
+              <template slot-scope="scope" v-if="scope.row.userId !== 1">
+                <el-button
+                  size="mini"
+                  type="text"
+                  icon="el-icon-edit"
+                  @click="handleResetPwd(scope.row)"
+                >初始/重置密码
+                </el-button>
+                <el-button
+                  size="mini"
+                  type="text"
+                  icon="el-icon-delete"
+                  @click="handleAuthRole(scope.row)"
+                >分配角色
+                </el-button>
+              </template>
+            </vxe-table-column>
+          </vxe-table>
+          <vxe-pager
+            v-show="showTable"
+            perfect
+            :current-page.sync="currentPage"
+            :page-size.sync="pageSize"
+            :total="total"
+            :page-sizes="[10,50,100]"
+            :layouts="['PrevJump', 'PrevPage','JumpNumber', 'NextPage', 'NextJump', 'Sizes', 'FullJump', 'Total']"
+            @page-change="handlePageChange"
+          >
+          </vxe-pager>
         </div>
       </el-col>
     </el-row>
@@ -132,24 +137,25 @@
         <el-row>
           <el-col :span="12">
             <el-form-item label="用户账号" prop="username">
-              <el-input style="width: 220px" v-model="form.username" placeholder="请输入用户账号" maxlength="20" />
+              <el-input id="un" ref="un" style="width: 220px" v-model="form.username" placeholder="请输入用户账号"
+                        maxlength="20" :disabled="edit"/>
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="用户姓名" prop="nickname">
-              <el-input style="width: 220px" v-model="form.nickname" placeholder="请输入用户姓名" maxlength="30" />
+              <el-input style="width: 220px" v-model="form.nickname" placeholder="请输入用户姓名" maxlength="30"/>
             </el-form-item>
           </el-col>
         </el-row>
         <el-row>
           <el-col :span="12">
             <el-form-item label="邮箱" prop="mailbox">
-              <el-input style="width: 220px" v-model="form.mailbox" placeholder="请输入邮箱" maxlength="50" />
+              <el-input style="width: 220px" v-model="form.mailbox" placeholder="请输入邮箱" maxlength="50"/>
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="手机号码" prop="phonenumber">
-              <el-input style="width: 220px" v-model="form.phonenumber" placeholder="请输入手机号码" maxlength="11" />
+              <el-input style="width: 220px" v-model="form.phonenumber" placeholder="请输入手机号码" maxlength="11"/>
             </el-form-item>
           </el-col>
         </el-row>
@@ -197,9 +203,9 @@ export default {
   data() {
     return {
       statusOptions: [
-        { value: '0', label: '激活' },
-        { value: '1', label: '休眠' },
-        { value: '2', label: '注销' }
+        {value: '0', label: '激活'},
+        {value: '1', label: '休眠'},
+        {value: '2', label: '注销'}
       ],
       // 遮罩层
       loading: true,
@@ -232,29 +238,29 @@ export default {
         phonenumber: undefined,
         status: undefined
       },
+      edit:false,
       // 表单校验
       rules: {
         username: [
-          { required: true, message: "用户账号不能为空", trigger: "blur" },
-          { min: 5, max: 20, message: '用户名称长度必须介于 5 和 20 之间', trigger: 'blur' }
+          {required: true, message: "用户账号不能为空", trigger: "blur"},
+          {min: 5, max: 20, message: '用户账号长度必须介于 5 和 20 之间', trigger: 'blur'}
         ],
         nickname: [
-          { required: true, message: "用户姓名不能为空", trigger: "blur" },
-          { min: 2, max: 20, message: '用户姓名长度必须介于 2 和 20 之间', trigger: 'blur' }
+          {required: true, message: "用户姓名不能为空", trigger: "blur"},
+          {min: 2, max: 20, message: '用户姓名长度必须介于 2 和 20 之间', trigger: 'blur'}
         ],
         mailbox: [
-          { required: true, message: "邮箱不能为空", trigger: "blur" },
-          { type: "email", message: "请输入正确的邮箱地址", trigger: ["blur", "change"]}
+          {required: true, message: "邮箱不能为空", trigger: "blur"},
+          {type: "email", message: "请输入正确的邮箱地址", trigger: ["blur", "change"]}
         ],
         phonenumber: [
-          { required: true, message: "手机号码不能为空", trigger: "blur" },
-          { pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: "请输入正确的手机号码", trigger: "blur"}
+          {required: true, message: "手机号码不能为空", trigger: "blur"},
+          {pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: "请输入正确的手机号码", trigger: "blur"}
         ]
       }
     };
   },
-  watch: {
-  },
+  watch: {},
   created() {
     this.getList()
   },
@@ -268,14 +274,12 @@ export default {
     statusFormat({cellValue}) {
       let belongTo = '未知的类型'
       for (let i = 0; i < this.statusOptions.length; i++) {
-        if (cellValue =="0") {
-          belongTo ="激活"
-        }
-        else if (cellValue =="1") {
-          belongTo ="休眠"
-        }
-        else if (cellValue =="2") {
-          belongTo ="注销"
+        if (cellValue == "0") {
+          belongTo = "激活"
+        } else if (cellValue == "1") {
+          belongTo = "休眠"
+        } else if (cellValue == "2") {
+          belongTo = "注销"
         }
       }
       return belongTo
@@ -283,15 +287,15 @@ export default {
     /** 查询用户列表 */
     getList() {
       this.loading = true;
-      var searchParams={
-        currentPage:this.currentPage,
-        pageSize:this.pageSize,
-        username:this.queryParams.username,
-        phonenumber:this.queryParams.phonenumber,
-        status:this.queryParams.status
+      var searchParams = {
+        currentPage: this.currentPage,
+        pageSize: this.pageSize,
+        username: this.queryParams.username,
+        phonenumber: this.queryParams.phonenumber,
+        status: this.queryParams.status
       }
       this.$axios.get('/sysUserController/getAll',
-        {params:searchParams}).then((res) => {
+        {params: searchParams}).then((res) => {
         this.userList = res.data.records
         this.total = res.data.total
 
@@ -308,11 +312,11 @@ export default {
     // 用户状态修改
     handleStatusChange(row) {
       let text = row.status === "0" ? "启用" : "停用";
-      this.$modal.confirm('确认要"' + text + '""' + row.userName + '"用户吗?').then(function() {
+      this.$modal.confirm('确认要"' + text + '""' + row.userName + '"用户吗?').then(function () {
         return changeUserStatus(row.userId, row.status);
       }).then(() => {
         this.$modal.msgSuccess(text + "成功");
-      }).catch(function() {
+      }).catch(function () {
         row.status = row.status === "0" ? "1" : "0";
       });
     },
@@ -323,6 +327,7 @@ export default {
     },
     // 表单重置
     reset() {
+      this.edit = false;
       this.form = {
         id: undefined,
         username: undefined,
@@ -345,21 +350,32 @@ export default {
     /** 新增按钮操作 */
     handleAdd() {
       this.reset();
-        this.open = true;
-        this.title = "添加用户";
-        this.form.password = this.initPassword;
+      this.edit=false;
+      this.open = true;
+      this.title = "添加用户";
+      this.form.password = this.initPassword;
     },
     /** 提交按钮 */
-    submitForm: function() {
+    submitForm: function () {
       this.$refs["form"].validate(valid => {
         if (valid) {
-          if (this.form.userId != undefined) {
+          if (this.form.id != undefined) {
             // 更新操作
-            updateUser(this.form).then(response => {
-              this.$modal.msgSuccess("修改成功");
-              this.open = false;
-              this.getList();
-            });
+            this.$axios.put('/sysUserController', this.form).then((res) => {
+              if (res.code == 0) {
+                this.$message.success('修改成功')
+                this.open = false;
+                this.reset();
+                this.getList();
+              }
+              if (res.code == 1) {
+                this.$message.error(res.data)
+              }
+              this.loading = false
+            }).catch((error) => {
+              this.$message.error(error)
+              this.loading = false
+            })
           } else {
             // const param = {
             //   username: this.form.username,
@@ -368,13 +384,13 @@ export default {
             //   mailbox: this.form.mailbox
             // }
             this.$axios.post('/sysUserController', this.form).then((res) => {
-              if (res.code==0){
+              if (res.code == 0) {
                 this.$message.success('新增成功')
                 this.open = false;
                 this.reset();
                 this.getList();
               }
-              if (res.code==1){
+              if (res.code == 1) {
                 this.$message.error(res.data)
               }
               this.loading = false
@@ -388,22 +404,21 @@ export default {
     },
     /** 重置密码按钮操作 */
     handleResetPwd(row) {
-      this.$confirm('创建密码并发送到邮箱:'+row.mailbox, '提示', {
+      this.$confirm('创建密码并发送到邮箱:' + row.mailbox, '提示', {
         confirmButtonText: '确定',
         cancelButtonText: '取消',
         type: 'warning'
       }).then(() => {
         const param = {
-            id: row.id
+          id: row.id
         }
         this.$axios.post('/sysUserController/resetPassword', param).then((res) => {
-          if (res.code==0){
+          if (res.code == 0) {
             this.$message({
               type: 'success',
               message: '创建并发送成功!'
             });
-          }
-          else{
+          } else {
             this.$message({
               type: 'error',
               message: '创建密码失败!'
@@ -419,7 +434,7 @@ export default {
     /** 删除按钮操作 */
     handleDelete() {
       const _selectData = this.$refs.userTable.getRadioRecord(true)
-      if (_selectData == null){
+      if (_selectData == null) {
         this.$message({
           type: 'warning',
           message: '请选择记录!'
@@ -435,14 +450,13 @@ export default {
           id: _selectData.id
         }
         this.$axios.post('/sysUserController/delUser', param).then((res) => {
-          if (res.code==0){
+          if (res.code == 0) {
             this.$message({
               type: 'success',
               message: '删除成功!'
             });
             this.getList();
-          }
-          else{
+          } else {
             this.$message({
               type: 'error',
               message: '删除失败!'
@@ -456,22 +470,23 @@ export default {
       });
     },
     /** 修改按钮操作 */
-    handleUpdate(row) {
+    handleUpdate() {
       this.reset();
-      const userId = row.userId || this.ids;
-      getUser(userId).then(response => {
-        this.form = response.data;
-        this.postOptions = response.posts;
-        this.roleOptions = response.roles;
-        this.$set(this.form, "postIds", response.postIds);
-        this.$set(this.form, "roleIds", response.roleIds);
-        this.open = true;
-        this.title = "修改用户";
-        this.form.password = "";
-      });
+      const _selectData = this.$refs.userTable.getRadioRecord(true)
+      if (_selectData == null) {
+        this.$message({
+          type: 'warning',
+          message: '请选择记录!'
+        });
+        return
+      }
+      this.form = _selectData;
+      this.open = true;
+      this.title = "修改用户";
+      this.edit=true;
     },
     /** 分配角色操作 */
-    handleAuthRole: function(row) {
+    handleAuthRole: function (row) {
       const userId = row.userId;
       this.$router.push("/system/user-auth/role/" + userId);
     }

+ 56 - 1
ui/src/views/sysManager/userManager/profile/resetPwd.vue

@@ -53,13 +53,67 @@ export default {
           { required: true, message: "确认密码不能为空", trigger: "blur" },
           { required: true, validator: equalToPassword, trigger: "blur" }
         ]
-      }
+      },
+      //字母连续规则
+      strReg : /(a(?=b)|b(?=c)|c(?=d)|d(?=e)|e(?=f)|f(?=g)|g(?=h)|h(?=i)|i(?=j)|j(?=k)|k(?=l)|l(?=m)|m(?=n)|n(?=o)|o(?=p)|p(?=q)|q(?=r)|r(?=s)|s(?=t)|t(?=u)|u(?=v)|v(?=w)|w(?=x)|x(?=y)|y(?=z)|z(?=a)){3}[a-z]/i,
+      strResverReg : /(a(?=z)|z(?=y)|y(?=x)|x(?=w)|w(?=v)|v(?=u)|u(?=t)|t(?=s)|s(?=r)|r(?=q)|q(?=p)|p(?=o)|o(?=n)|n(?=m)|m(?=l)|l(?=k)|k(?=j)|j(?=i)|i(?=h)|h(?=g)|g(?=f)|f(?=e)|e(?=d)|d(?=c)|c(?=b)|b(?=a)){3}[a-z]/i,
+      //数字连续规则
+      numReg : /(0(?=1)|1(?=2)|2(?=3)|3(?=4)|4(?=5)|5(?=6)|6(?=7)|7(?=8)|8(?=9)|9(?=0)){3}\d/,
+      numResverReg : /(0(?=9)|9(?=8)|8(?=7)|7(?=6)|6(?=5)|5(?=4)|4(?=3)|3(?=2)|2(?=1)|1(?=0)){3}\d/,
+      //键盘字母横向连续规则
+      keyboardHorizontalReg : /(q(?=w)|w(?=e)|e(?=r)|r(?=t)|t(?=y)|y(?=u)|u(?=i)|i(?=o)|o(?=p)|p(?=q)|a(?=s)|s(?=d)|d(?=f)|f(?=g)|g(?=h)|h(?=j)|j(?=k)|k(?=l)|l(?=a)|z(?=x)|x(?=c)|c(?=v)|v(?=b)|b(?=n)|n(?=m)|m(?=z)){3}[a-z]/i,
+      keyboardHorizontalResverReg : /(p(?=o)|o(?=i)|i(?=u)|u(?=y)|y(?=t)|t(?=r)|r(?=e)|e(?=w)|w(?=q)|q(?=p)|l(?=k)|k(?=j)|j(?=h)|h(?=g)|g(?=f)|f(?=d)|d(?=s)|s(?=a)|a(?=l)|m(?=n)|n(?=b)|b(?=v)|v(?=c)|c(?=x)|x(?=z)|z(?=m)){3}[a-z]/i,
+      //多个相同字母、数字规则
+      sameReg : /([0-9a-zA-Z])\1{3}/,
+      keyboardSlopeArr : ["1qaz", "2wsx", "3edc", "4rfv", "5tgb", "6yhn", "7ujm", "8ik,", "9ol.", "0p;/", "/;p0", ".lo9", ",ki8", "mju7", "nhy6", "bgt5", "vfr4", "cde3", "xsw2", "zaq1", "4esz", "5rdx", "6tfc", "7ygv", "8uhb", "9ijn", "0okm", "-pl,", "=[;.", ".;[=", ",lp-", "mko0", "nji9", "bhu8", "vgy7", "cft6", "xdr5", "zse4"],
+      keyboardSlopeShiftArr : ["!qaz", "@wsx", "#edc","$rfv", "%tgb", "^yhn", "&ujm", "*ik<", "(ol>", ")p:?", "?:p)", ">lo(", "<ki*", "mju&", "nhy^", "bgt%", "vfr$", "cde#", "xsw@", "zaq!", "$esz", "%rdx", "^tfc", "&ygv", "*uhb", "(ijn", ")okm", "_pl<", "+{:>", ">:{+", "<lp_", "mko)", "nji(", "bhu*", "vgy&", "cft^", "xdr%", "zse$"],
+      lastReg: /^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![A-Z\W_!@#$%^&*`~()-+=]+$)(?![a-z0-9]+$)(?![a-z\W_!@#$%^&*`~()-+=]+$)(?![0-9\W_!@#$%^&*`~()-+=]+$)[a-zA-Z0-9\W_!@#$%^&*`~()-+=]{8,20}$/
     };
   },
   methods: {
+    // 表单重置
+    pwdReset() {
+      this.pwd={
+        oldPassword: undefined,
+          newPassword: undefined,
+          confirmPassword: undefined
+      }
+    },
     submit() {
       this.$refs["form"].validate(valid => {
         if (valid) {
+          // 密码验证规则
+          if (this.sameReg.test(this.pwd.newPassword)) {
+            this.$message.error('密码不能含有连续4位相同的数字或字母')
+            return
+          } else if (this.strResverReg.test(this.pwd.newPassword.toLowerCase())) {
+            this.$message.error('密码不能含有4位连续的字母')
+            return
+          } else if (this.strReg.test(this.pwd.newPassword.toLowerCase())) {
+            this.$message.error('密码不能含有4位连续的字母')
+            return
+          } else if (this.numReg.test(this.pwd.newPassword)) {
+            this.$message.error('密码不能含有4位连续的数字')
+            return
+          } else if (this.numResverReg.test(this.pwd.newPassword)) {
+            this.$message.error('密码不能含有4位连续的数字')
+            return
+          } else if (this.keyboardHorizontalReg.test(this.pwd.newPassword)) {
+            this.$message.error('密码不能含有4位横向连续的字母')
+            return
+          } else if (this.keyboardHorizontalResverReg.test(this.pwd.newPassword)) {
+            this.$message.error('密码不能含有4位横向连续的字母')
+            return
+          } else if (this.keyboardSlopeArr.some(v => this.pwd.newPassword.toLowerCase().indexOf(v) > -1)) {
+            this.$message.error('密码不能含有4位键盘斜向连续的字符')
+            return
+          } else if (this.keyboardSlopeShiftArr.some(v => this.pwd.newPassword.toLowerCase().indexOf(v) > -1)) {
+            this.$message.error('密码不能含有4位键盘斜向连续的字符')
+            return
+          } else if (!this.lastReg.test(this.pwd.newPassword)) {
+            this.$message.error('密码不满足8~20位大写字母、小写字母、数字、特殊字符三种以上的组合')
+            return
+          }
           // 用户信息解密
           let decryptUserInfo = userinfoDecrypt(this.userinfo)
           this.user = JSON.parse(decryptUserInfo)
@@ -72,6 +126,7 @@ export default {
           this.$axios.post('/sysUserController/updatePassword', param).then((res) => {
             if (res.code==0){
               this.$message.success('密码修改成功')
+              this.pwdReset()
             }
             if (res.code==1){
               this.$message.error(res.data)