/** 表单校验工具。 */ /** * 密码校验:按 **UTF-8 字节数** 而非字符数。 * * 后端 bcrypt 对超过 72 字节的密码直接拒绝;中文一个字符占 3 字节, * 24 个汉字即到顶 —— 按字符数校验(如 maxlength=20)根本拦不住, * 会出现"前端放行、后端 400"的错位体验。与后端 `PASSWORD_*_BYTES` 对齐。 */ export const PASSWORD_MIN_BYTES = 8 export const PASSWORD_MAX_BYTES = 72 const BYTE_HINT = '(中文一个字符约 3 字节)' /** 计算 UTF-8 字节数 */ export function passwordByteLength(value: string): number { return new TextEncoder().encode(value).length } /** Element Plus 表单校验器(用于 el-form 的 rules.validator) */ export function passwordRule( _rule: unknown, value: string, callback: (error?: Error) => void, ): void { if (!value) { callback(new Error('请输入密码')) return } const length = passwordByteLength(value) if (length < PASSWORD_MIN_BYTES) { callback(new Error(`密码不足 ${PASSWORD_MIN_BYTES} 字节${BYTE_HINT}`)) } else if (length > PASSWORD_MAX_BYTES) { callback(new Error(`密码超过 ${PASSWORD_MAX_BYTES} 字节上限${BYTE_HINT}`)) } else { callback() } }