UNPKG

system-phone

Version:

手机模块 前端组件

173 lines (158 loc) 4.26 kB
const REG_STRONG_PWD = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%^&*(),.?":{}|<>~`+=_\\-])[A-Za-z\d!@#$%^&*(),.?":{}|<>~`+=_\\-]{8,}$/; // 常见密码列表(可以根据需要扩展) const COMMON_PASSWORDS = [ "password", "password123", "123456", "12345678", "qwerty", "abc123", "Password1", "password1", "123456789", "welcome", "admin", "letmein", "monkey", "dragon", "master", "superman", "qwerty123", "admin123", "root", "pass", "test", "guest", "user", "000000", "111111", "666666", "888888", "999999", "iloveyou", "welcome123", "password!", "Passw0rd!", "Passw0rd", "Password!", "passw0rd", "P@ssw0rd", "P@ssword", "Password@123", ]; // 检查连续数字(3个或以上) const hasConsecutiveNumbers = (password) => { for (let i = 0; i <= password.length - 3; i++) { const substr = password.substring(i, i + 3); if (/^\d{3,}$/.test(substr)) { // 检查是否为连续数字 const digits = substr.split("").map(Number); let isConsecutive = true; for (let j = 1; j < digits.length; j++) { if (digits[j] !== digits[j - 1] + 1) { isConsecutive = false; break; } } if (isConsecutive) return true; } } return false; }; // 检查连续字母(3个或以上) const hasConsecutiveLetters = (password) => { const lowerPassword = password.toLowerCase(); for (let i = 0; i <= lowerPassword.length - 3; i++) { const substr = lowerPassword.substring(i, i + 3); if (/^[a-z]{3,}$/.test(substr)) { // 检查是否为连续字母 let isConsecutive = true; for (let j = 1; j < substr.length; j++) { if (substr.charCodeAt(j) !== substr.charCodeAt(j - 1) + 1) { isConsecutive = false; break; } } if (isConsecutive) return true; } } return false; }; // 检查重复字符(3个或以上相同字符) const hasRepeatedChars = (password) => { return /(.)\1{2,}/.test(password); }; // 检查键盘连续按键(如 qwerty, asdf 等) const hasKeyboardPattern = (password) => { const keyboardRows = ["qwertyuiop", "asdfghjkl", "zxcvbnm", "1234567890"]; const lowerPassword = password.toLowerCase(); for (const row of keyboardRows) { for (let i = 0; i <= row.length - 3; i++) { const pattern = row.substring(i, i + 3); if (lowerPassword.includes(pattern)) { return true; } } } return false; }; /** * 密码校验结果对象 * @typedef {Object} PasswordValidationResult * @property {boolean} isValid * @property {string[]} errors */ /** * 增强的密码校验函数 * @param {string} password * @returns {PasswordValidationResult} */ export const validateStrongPasswordPhone = (password) => { const result = { isValid: true, errors: [], }; // 1. 基本格式校验 if (!REG_STRONG_PWD.test(password)) { result.isValid = false; result.errors.push( "密码必须包含至少8个字符,包括大写字母、小写字母、数字和特殊字符" ); return result; } // 2. 检查是否为常见密码 if ( COMMON_PASSWORDS.includes(password) || COMMON_PASSWORDS.includes(password.toLowerCase()) ) { result.isValid = false; result.errors.push("不能使用常见密码"); return result; } // 3. 检查连续数字 if (hasConsecutiveNumbers(password)) { result.isValid = false; result.errors.push("不能包含连续数字"); return result; } // 4. 检查连续字母 if (hasConsecutiveLetters(password)) { result.isValid = false; result.errors.push("不能包含连续字母"); return result; } // 5. 检查重复字符 if (hasRepeatedChars(password)) { result.isValid = false; result.errors.push("不能包含3个或以上相同字符"); return result; } // 6. 检查键盘模式 if (hasKeyboardPattern(password)) { result.isValid = false; result.errors.push("不能包含键盘连续按键模式"); return result; } return result; };