/** * 密码复杂度校验工具 * * 规则(企业级高档位): * 1. 长度为 8-20 个字符 * 2. 不能包含空格 * 3. 必须同时包含:大写字母、小写字母、数字、特殊字符 四类 * * 注册与修改密码共用,保证两处复杂度判断一致。 */ // 密码长度范围 export const PASSWORD_MIN_LENGTH = 8 export const PASSWORD_MAX_LENGTH = 20 // 四类字符检测 const REG_UPPER = /[A-Z]/ const REG_LOWER = /[a-z]/ const REG_NUMBER = /[0-9]/ // 特殊字符:常见符号集合(! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~) const REG_SPECIAL = /[!-/:-@\[-`{-~]/ /** * 校验密码复杂度 * @param {string} password 待校验的密码 * @returns {{ valid: boolean, message: string }} 校验结果与错误提示 */ export function validatePassword(password) { if (password === undefined || password === null || password === '') { return { valid: false, message: '密码不能为空' } } const value = String(password) if (value.length < PASSWORD_MIN_LENGTH || value.length > PASSWORD_MAX_LENGTH) { return { valid: false, message: `密码长度在 ${PASSWORD_MIN_LENGTH} 到 ${PASSWORD_MAX_LENGTH} 个字符` } } if (/\s/.test(value)) { return { valid: false, message: '密码不能包含空格' } } // 必须同时包含大写字母、小写字母、数字、特殊字符 if (!REG_UPPER.test(value)) { return { valid: false, message: '密码必须包含大写字母' } } if (!REG_LOWER.test(value)) { return { valid: false, message: '密码必须包含小写字母' } } if (!REG_NUMBER.test(value)) { return { valid: false, message: '密码必须包含数字' } } if (!REG_SPECIAL.test(value)) { return { valid: false, message: '密码必须包含特殊字符' } } return { valid: true, message: '' } } /** * uni-forms 自定义校验函数:校验密码复杂度 * 用法: * { validateFunction: passwordComplexityValidator, errorMessage: '...' } * 注意:errorMessage 仅在 validateFunction 返回 false 时展示, * 因此这里直接返回 validatePassword 的布尔结果,配合一个通用提示文案。 * * @param {object} rule 规则对象(未使用) * @param {string} value 当前输入值 * @returns {boolean} 是否通过校验 */ export function passwordComplexityValidator(rule, value) { return validatePassword(value).valid }