/** * 员工账号密码策略。 * * 组织架构的「新增员工」与「重置密码」共用同一套规则, * 避免两处各写一份导致口径分叉:长度不少于 12 位,且同时包含大写字母、小写字母、特殊字符。 */ /** 密码最小长度 */ export const PASSWORD_MIN_LENGTH = 12 /** * 特殊字符:常见 ASCII 可见符号。 * 用显式符号集而不是 `[^A-Za-z0-9]`,避免把中文、emoji、空白也算成「特殊字符」。 */ const SPECIAL_CHAR_PATTERN = /[!@#$%^&*()_+\-=[\]{};':"\\|,.<>/?~`]/ export interface PasswordPolicyChecks { /** 长度是否达到最小值 */ minLength: boolean /** 是否包含大写字母 */ hasUppercase: boolean /** 是否包含小写字母 */ hasLowercase: boolean /** 是否包含特殊字符 */ hasSpecialChar: boolean } export interface PasswordPolicyRule { key: keyof PasswordPolicyChecks label: string } /** 规则清单,供表单实时展示校验进度(顺序即提示顺序;文案取短版,保证半列宽也能横排一行) */ export const PASSWORD_POLICY_RULES: PasswordPolicyRule[] = [ { key: 'minLength', label: `≥ ${PASSWORD_MIN_LENGTH} 位` }, { key: 'hasUppercase', label: '含大写' }, { key: 'hasLowercase', label: '含小写' }, { key: 'hasSpecialChar', label: '含符号' }, ] /** 逐条计算密码是否满足策略,返回每个规则的通过情况 */ export function checkPasswordPolicy(password: string): PasswordPolicyChecks { return { minLength: password.length >= PASSWORD_MIN_LENGTH, hasUppercase: /[A-Z]/.test(password), hasLowercase: /[a-z]/.test(password), hasSpecialChar: SPECIAL_CHAR_PATTERN.test(password), } } /** 密码是否完全满足策略 */ export function isPasswordPolicySatisfied(password: string): boolean { const checks = checkPasswordPolicy(password) return checks.minLength && checks.hasUppercase && checks.hasLowercase && checks.hasSpecialChar } /** 返回第一条未满足的规则提示,全部满足时返回 null */ export function firstPasswordPolicyIssue(password: string): string | null { if (!password) return '请输入密码' const checks = checkPasswordPolicy(password) if (!checks.minLength) return `密码长度不少于 ${PASSWORD_MIN_LENGTH} 位` if (!checks.hasUppercase || !checks.hasLowercase) return '密码必须同时包含大写和小写字母' if (!checks.hasSpecialChar) return '密码必须包含特殊字符' return null }