From ebb2c8d515ef3756fb6634814f824f5dd5dd22c4 Mon Sep 17 00:00:00 2001
From: jiangping <jp@doumee.com>
Date: 星期一, 21 四月 2025 17:04:46 +0800
Subject: [PATCH] 代码初始化

---
 server/src/main/java/com/doumee/core/utils/PwdCheckUtil.java           |   78 ++++++++++++++++++++++++++
 admin/src/components/system/user/OperaUserWindow.vue                   |   23 +++++++
 admin/src/components/common/Header.vue                                 |   23 +++++++
 admin/src/components/system/user/ResetPwdWindow.vue                    |   23 +++++++
 server/src/main/java/com/doumee/biz/system/impl/SystemUserBizImpl.java |   20 ++++++
 admin/lianhelihua_admin/index.html                                     |    2 
 6 files changed, 165 insertions(+), 4 deletions(-)

diff --git a/admin/lianhelihua_admin/index.html b/admin/lianhelihua_admin/index.html
index fba6e9f..1cd2c52 100644
--- a/admin/lianhelihua_admin/index.html
+++ b/admin/lianhelihua_admin/index.html
@@ -1 +1 @@
-<!DOCTYPE html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="/lianhelihua_admin/icon.png"><title>鑱斿悎鍒╁崕浜嬩欢涓婃姤绯荤粺</title><link href="/lianhelihua_admin/static/css/app.b20beb91.css" rel="preload" as="style"><link href="/lianhelihua_admin/static/css/chunk-vendors.d9e68312.css" rel="preload" as="style"><link href="/lianhelihua_admin/static/js/app.17e4dc64.js" rel="preload" as="script"><link href="/lianhelihua_admin/static/js/chunk-vendors.40d691b2.js" rel="preload" as="script"><link href="/lianhelihua_admin/static/css/chunk-vendors.d9e68312.css" rel="stylesheet"><link href="/lianhelihua_admin/static/css/app.b20beb91.css" rel="stylesheet"></head><body><div id="app"></div><script src="/lianhelihua_admin/static/js/chunk-vendors.40d691b2.js"></script><script src="/lianhelihua_admin/static/js/app.17e4dc64.js"></script></body></html>
\ No newline at end of file
+<!DOCTYPE html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="/lianhelihua_admin/icon.png"><title>鑱斿悎鍒╁崕浜嬩欢涓婃姤绯荤粺</title><link href="/lianhelihua_admin/static/css/app.c56f0a7d.css" rel="preload" as="style"><link href="/lianhelihua_admin/static/css/chunk-vendors.d9e68312.css" rel="preload" as="style"><link href="/lianhelihua_admin/static/js/app.f5e3eac0.js" rel="preload" as="script"><link href="/lianhelihua_admin/static/js/chunk-vendors.174acd1e.js" rel="preload" as="script"><link href="/lianhelihua_admin/static/css/chunk-vendors.d9e68312.css" rel="stylesheet"><link href="/lianhelihua_admin/static/css/app.c56f0a7d.css" rel="stylesheet"></head><body><div id="app"></div><script src="/lianhelihua_admin/static/js/chunk-vendors.174acd1e.js"></script><script src="/lianhelihua_admin/static/js/app.f5e3eac0.js"></script></body></html>
\ No newline at end of file
diff --git a/admin/src/components/common/Header.vue b/admin/src/components/common/Header.vue
index 6e95bc1..b8d5c98 100644
--- a/admin/src/components/common/Header.vue
+++ b/admin/src/components/common/Header.vue
@@ -72,7 +72,8 @@
             { required: true, message: '璇疯緭鍏ュ師濮嬪瘑鐮�' }
           ],
           newPwd: [
-            { required: true, message: '璇疯緭鍏ユ柊瀵嗙爜' }
+            { required: true, message: '璇疯緭鍏ュ瘑鐮�', trigger: 'blur' },
+            { validator: this.validatePassword, trigger: 'blur' },
           ],
           confirmPwd: [
             { required: true, message: '璇峰啀娆¤緭鍏ユ柊瀵嗙爜' }
@@ -110,6 +111,26 @@
         this.$refs.changePwdDataForm.resetFields()
       })
     },
+    validatePassword(rule, value, callback) {
+      if (!value) {
+        callback(new Error('璇疯緭鍏ュ瘑鐮�'))
+      } else {
+        const lengthValid = /^.{6,20}$/.test(value)
+        const hasLetter = /[a-zA-Z]/.test(value)
+        const hasNumber = /[0-9]/.test(value)
+        const hasSpecial = /[!@#$%^&*(),.?":{}|<>]/.test(value)
+
+        const typesCount = [hasLetter, hasNumber, hasSpecial].filter(Boolean).length
+
+        if (!lengthValid) {
+          callback(new Error('瀵嗙爜闀垮害闇�涓�6鍒�20涓瓧绗�'))
+        } else if (typesCount < 2) {
+          callback(new Error('瀵嗙爜闇�鍖呭惈瀛楁瘝銆佹暟瀛楀強鐗规畩瀛楃涓殑鑷冲皯涓ょ'))
+        } else {
+          callback() // 楠岃瘉閫氳繃
+        }
+      }
+    },
     /**
      * 纭畾淇敼瀵嗙爜
      */
diff --git a/admin/src/components/system/user/OperaUserWindow.vue b/admin/src/components/system/user/OperaUserWindow.vue
index b00a4a0..c5da65d 100644
--- a/admin/src/components/system/user/OperaUserWindow.vue
+++ b/admin/src/components/system/user/OperaUserWindow.vue
@@ -77,7 +77,8 @@
           { required: true, message: '璇疯緭鍏ュ鍚�' }
         ],
         password: [
-          { required: true, message: '璇疯緭鍏ュ瘑鐮�' }
+          { required: true, message: '璇疯緭鍏ュ瘑鐮�', trigger: 'blur' },
+          { validator: this.validatePassword, trigger: 'blur' }
         ],
         avatar: [
           { required: true, message: '璇烽�夋嫨鐢ㄦ埛澶村儚' }
@@ -95,6 +96,26 @@
     }
   },
   methods: {
+    validatePassword (rule, value, callback) {
+      if (!value) {
+        callback(new Error('璇疯緭鍏ュ瘑鐮�'))
+      } else {
+        const lengthValid = /^.{6,20}$/.test(value)
+        const hasLetter = /[a-zA-Z]/.test(value)
+        const hasNumber = /[0-9]/.test(value)
+        const hasSpecial = /[!@#$%^&*(),.?":{}|<>]/.test(value)
+
+        const typesCount = [hasLetter, hasNumber, hasSpecial].filter(Boolean).length
+
+        if (!lengthValid) {
+          callback(new Error('瀵嗙爜闀垮害闇�涓�6鍒�20涓瓧绗�'))
+        } else if (typesCount < 2) {
+          callback(new Error('瀵嗙爜闇�鍖呭惈瀛楁瘝銆佹暟瀛楀強鐗规畩瀛楃涓殑鑷冲皯涓ょ'))
+        } else {
+          callback() // 楠岃瘉閫氳繃
+        }
+      }
+    },
     /**
      * 鎵撳紑绐楀彛
      *
diff --git a/admin/src/components/system/user/ResetPwdWindow.vue b/admin/src/components/system/user/ResetPwdWindow.vue
index 276405a..48c7080 100644
--- a/admin/src/components/system/user/ResetPwdWindow.vue
+++ b/admin/src/components/system/user/ResetPwdWindow.vue
@@ -31,12 +31,33 @@
       },
       rules: {
         password: [
-          { required: true, message: '璇疯緭鍏ュ瘑鐮�' }
+          { required: true, message: '璇疯緭鍏ュ瘑鐮�', trigger: 'blur' },
+          { validator: this.validatePassword, trigger: 'blur' }
         ]
       }
     }
   },
   methods: {
+    validatePassword (rule, value, callback) {
+      if (!value) {
+        callback(new Error('璇疯緭鍏ュ瘑鐮�'))
+      } else {
+        const lengthValid = /^.{6,20}$/.test(value)
+        const hasLetter = /[a-zA-Z]/.test(value)
+        const hasNumber = /[0-9]/.test(value)
+        const hasSpecial = /[!@#$%^&*(),.?":{}|<>]/.test(value)
+
+        const typesCount = [hasLetter, hasNumber, hasSpecial].filter(Boolean).length
+
+        if (!lengthValid) {
+          callback(new Error('瀵嗙爜闀垮害闇�涓�6鍒�20涓瓧绗�'))
+        } else if (typesCount < 2) {
+          callback(new Error('瀵嗙爜闇�鍖呭惈瀛楁瘝銆佹暟瀛楀強鐗规畩瀛楃涓殑鑷冲皯涓ょ'))
+        } else {
+          callback() // 楠岃瘉閫氳繃
+        }
+      }
+    },
     /**
      * 鎵撳紑绐楀彛
      *
diff --git a/server/src/main/java/com/doumee/biz/system/impl/SystemUserBizImpl.java b/server/src/main/java/com/doumee/biz/system/impl/SystemUserBizImpl.java
index 79a0711..5a9c7a0 100644
--- a/server/src/main/java/com/doumee/biz/system/impl/SystemUserBizImpl.java
+++ b/server/src/main/java/com/doumee/biz/system/impl/SystemUserBizImpl.java
@@ -3,6 +3,7 @@
 import com.doumee.biz.system.SystemUserBiz;
 import com.doumee.core.exception.BusinessException;
 import com.doumee.core.constants.ResponseStatus;
+import com.doumee.core.utils.PwdCheckUtil;
 import com.doumee.core.utils.Utils;
 import com.doumee.dao.system.dto.CreateSystemUserDTO;
 import com.doumee.dao.system.dto.CreateUserRoleDTO;
@@ -56,6 +57,12 @@
 
     @Override
     public void updatePwd(UpdatePwdDto dto) {
+        if(StringUtils.isBlank(dto.getNewPwd())
+                ||dto.getNewPwd().length()>20
+                ||dto.getNewPwd().length()<6
+                ||!PwdCheckUtil.checkPassword(dto.getNewPwd())){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "瀵逛笉璧凤紝瀵嗙爜澶嶆潅搴︿笉婊¤冻瑕佹眰锛�6-20涓瓧绗︼紝鑷冲皯鍖呭惈瀛楁瘝銆佹暟瀛楀強鐗规畩瀛楃2绉�");
+        }
         SystemUser user = systemUserService.findById(dto.getUserId());
         if (user.getDeleted()) {
             throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "鐢ㄦ埛涓嶅瓨鍦ㄦ垨宸茶鍒犻櫎");
@@ -73,6 +80,12 @@
 
     @Override
     public void resetPwd(ResetSystemUserPwdDTO dto) {
+        if(StringUtils.isBlank(dto.getPassword())
+                ||dto.getPassword().length()>20
+                ||dto.getPassword().length()<6
+                ||!PwdCheckUtil.checkPassword(dto.getPassword())){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "瀵逛笉璧凤紝瀵嗙爜澶嶆潅搴︿笉婊¤冻瑕佹眰锛�6-20涓瓧绗︼紝鑷冲皯鍖呭惈瀛楁瘝銆佹暟瀛楀強鐗规畩瀛楃2绉�");
+        }
         // 鏌ヨ鐢ㄦ埛
         SystemUser systemUser = systemUserService.findById(dto.getId());
         if (systemUser == null || systemUser.getDeleted()) {
@@ -88,6 +101,12 @@
     @Override
     @Transactional
     public void create(CreateSystemUserDTO systemUser) {
+        if(StringUtils.isBlank(systemUser.getPassword())
+                ||systemUser.getPassword().length()>20
+                ||systemUser.getPassword().length()<6
+                ||!PwdCheckUtil.checkPassword(systemUser.getPassword())){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "瀵逛笉璧凤紝瀵嗙爜澶嶆潅搴︿笉婊¤冻瑕佹眰锛�6-20涓瓧绗︼紝鑷冲皯鍖呭惈瀛楁瘝銆佹暟瀛楀強鐗规畩瀛楃2绉�");
+        }
         // 楠岃瘉鐢ㄦ埛鍚�
         SystemUser queryUserDto = new SystemUser();
         queryUserDto.setUsername(systemUser.getUsername());
@@ -106,6 +125,7 @@
                 throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "宸ュ彿宸插瓨鍦�");
             }
         }
+
         // 鐢熸垚瀵嗙爜鐩�
         String salt = RandomStringUtils.randomAlphabetic(6);
         // 鐢熸垚瀵嗙爜
diff --git a/server/src/main/java/com/doumee/core/utils/PwdCheckUtil.java b/server/src/main/java/com/doumee/core/utils/PwdCheckUtil.java
new file mode 100644
index 0000000..e71f277
--- /dev/null
+++ b/server/src/main/java/com/doumee/core/utils/PwdCheckUtil.java
@@ -0,0 +1,78 @@
+package com.doumee.core.utils;
+
+import java.util.regex.Pattern;
+
+/**
+ * Java姝e垯鏍¢獙瀵嗙爜鑷冲皯鍖呭惈锛氬瓧姣嶆暟瀛楃壒娈婄鍙蜂腑鐨�2绉�
+ */
+public class PwdCheckUtil {
+
+    /**
+     * 鍋囧畾璁剧疆瀵嗙爜鏃讹紝瀵嗙爜瑙勫垯涓猴細  瀛楁瘝銆佹暟瀛椼�佺壒娈婄鍙凤紝鑷冲皯鍖归厤2绉�
+     * 鍒欏瘑鐮佸彲鑳藉嚭鐜扮殑鎯呭喌鏈夛細
+     * 1銆佹暟瀛�+鐗规畩绗﹀彿
+     * 2銆佸瓧姣�+鐗规畩绗﹀彿
+     * 3銆佸瓧姣�+鏁板瓧
+     * 4銆佸瓧姣�+鏁板瓧+鐗规畩绗﹀彿
+     * (缁勫悎涓庨『搴忔棤鍏�)
+     * 瑙e喅鎬濊矾锛�
+     * 1銆侀亶鍘嗗瓧绗︿覆鐨勫瓧绗︽暟缁勶紝鏌ョ湅鏄惁鍖呭惈鐩爣鐗规畩瀛楃锛岃嫢鍖呭惈锛屽垯鏍囪瀛楃涓�
+     * 鍖呭惈鐗规畩瀛楃锛屽苟鏇挎崲褰撳墠鐗规畩瀛楃涓�''銆�
+     * 2銆佸垽鏂墿涓嬬殑瀛楃缁勬垚鐨勫瓧绗︿覆锛屾槸鍚﹀尮閰嶄互涓嬫儏鍐�
+     * - 绾瓧姣�
+     * - 绾暟瀛�
+     * - 瀛楁瘝+鏁板瓧
+     * 3銆佸瓧绗︿覆鍖归厤瑙勫垯
+     * 绾瓧姣�+鍖呭惈鐗规畩瀛楃  ---- 鍖归厤閫氳繃
+     * 绾暟瀛�+鍖呭惈鐗规畩瀛楃 ---- 鍖归厤閫氳繃
+     * 瀛楁瘝+鏁板瓧+鍖呭惈涓暟瀛楃 ---- 鍖归厤閫氳繃
+     */
+    //鐗规畩瀛楃
+    public static final String SPEC_CHARACTERS = " !\"#$%&'()*+,-./:;<=>?@\\]\\[^_`{|}~";
+    // 绾瓧姣�
+    public static final String character = "[a-zA-Z]{1,}$";
+    // 绾暟瀛�
+    public static final String numberic = "[0-9]{1,}$";
+    // 瀛楁瘝鍜屾暟瀛�
+    public static final String number_and_character = "((^[a-zA-Z]{1,}[0-9]{1,}[a-zA-Z0-9]*)+)" +
+            "|((^[0-9]{1,}[a-zA-Z]{1,}[a-zA-Z0-9]*)+)$";
+    // 瀛楁瘝鎴栨暟瀛�
+    public static final String number_or_character = "[a-zA-Z0-9]+$";
+    // 瀛楁瘝鏁板瓧涓嬪垝绾�
+    public static final String ncw = "\\w+$";
+
+    public static boolean checkPassword(String targetString) {
+        String opStr = targetString;
+        boolean isLegal = false;
+        boolean hasSpecChar = false;
+        char[] charArray = opStr.toCharArray();
+        for (char c : charArray) {
+            if (SPEC_CHARACTERS.contains(String.valueOf(c))) {
+                hasSpecChar = true;
+                // 鏇挎崲姝ゅ瓧绗︿覆
+                opStr = opStr.replace(c, ' ');
+            }
+        }
+        String excSpecCharStr = opStr.replace(" ", "");
+        boolean isPureNum = Pattern.compile(numberic).matcher(excSpecCharStr).matches();
+        boolean isPureChar = Pattern.compile(character).matcher(excSpecCharStr).matches();
+        boolean isNumAndChar = Pattern.compile(number_and_character).matcher(excSpecCharStr).matches();
+        isLegal = ((isPureNum && hasSpecChar)
+                || (isPureChar && hasSpecChar) || isNumAndChar && hasSpecChar) || isNumAndChar;
+        System.out.println("瀛楃涓诧細" + targetString + ",鏄惁绗﹀悎瑙勫垯锛�" + isLegal);
+        System.out.println("---------------");
+        return isLegal;
+    }
+
+    public static void main(String[] args) {
+        checkPassword("123456a");
+//        checkPassword("41234123");
+//        checkPassword("#$%^&&*(");
+//        checkPassword("fasd$$");
+//        checkPassword("41234%%%");
+//        checkPassword("fasd41^(324");
+//        checkPassword("fa413%^&*");
+//        checkPassword("&%fa413%^&*");
+    }
+
+}
\ No newline at end of file

--
Gitblit v1.9.3