feat(users): 员工表单对齐原型并优化密码策略与错误文案
- 新增胶囊开关组件,账号状态与强制改密改用开关 - 角色由多选改为互斥单选,编辑态多角色给出收敛提示 - 密码策略增加特殊字符要求,规则提示改为短标签横排 - 移除邮箱字段及相关脱敏、清除逻辑 - 接口错误经 toUserMessage 中文化,透传后端校验原因
This commit is contained in:
@@ -2,12 +2,18 @@
|
||||
* 员工账号密码策略。
|
||||
*
|
||||
* 组织架构的「新增员工」与「重置密码」共用同一套规则,
|
||||
* 避免两处各写一份导致口径分叉:长度不少于 12 位,且同时包含大写和小写字母。
|
||||
* 避免两处各写一份导致口径分叉:长度不少于 12 位,且同时包含大写字母、小写字母、特殊字符。
|
||||
*/
|
||||
|
||||
/** 密码最小长度 */
|
||||
export const PASSWORD_MIN_LENGTH = 12
|
||||
|
||||
/**
|
||||
* 特殊字符:常见 ASCII 可见符号。
|
||||
* 用显式符号集而不是 `[^A-Za-z0-9]`,避免把中文、emoji、空白也算成「特殊字符」。
|
||||
*/
|
||||
const SPECIAL_CHAR_PATTERN = /[!@#$%^&*()_+\-=[\]{};':"\\|,.<>/?~`]/
|
||||
|
||||
export interface PasswordPolicyChecks {
|
||||
/** 长度是否达到最小值 */
|
||||
minLength: boolean
|
||||
@@ -15,6 +21,8 @@ export interface PasswordPolicyChecks {
|
||||
hasUppercase: boolean
|
||||
/** 是否包含小写字母 */
|
||||
hasLowercase: boolean
|
||||
/** 是否包含特殊字符 */
|
||||
hasSpecialChar: boolean
|
||||
}
|
||||
|
||||
export interface PasswordPolicyRule {
|
||||
@@ -22,11 +30,12 @@ export interface PasswordPolicyRule {
|
||||
label: string
|
||||
}
|
||||
|
||||
/** 规则清单,供表单实时展示校验进度(顺序即提示顺序) */
|
||||
/** 规则清单,供表单实时展示校验进度(顺序即提示顺序;文案取短版,保证半列宽也能横排一行) */
|
||||
export const PASSWORD_POLICY_RULES: PasswordPolicyRule[] = [
|
||||
{ key: 'minLength', label: `长度不少于 ${PASSWORD_MIN_LENGTH} 位` },
|
||||
{ key: 'hasUppercase', label: '包含大写字母 A-Z' },
|
||||
{ key: 'hasLowercase', label: '包含小写字母 a-z' },
|
||||
{ key: 'minLength', label: `≥ ${PASSWORD_MIN_LENGTH} 位` },
|
||||
{ key: 'hasUppercase', label: '含大写' },
|
||||
{ key: 'hasLowercase', label: '含小写' },
|
||||
{ key: 'hasSpecialChar', label: '含符号' },
|
||||
]
|
||||
|
||||
/** 逐条计算密码是否满足策略,返回每个规则的通过情况 */
|
||||
@@ -35,13 +44,14 @@ export function checkPasswordPolicy(password: string): PasswordPolicyChecks {
|
||||
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
|
||||
return checks.minLength && checks.hasUppercase && checks.hasLowercase && checks.hasSpecialChar
|
||||
}
|
||||
|
||||
/** 返回第一条未满足的规则提示,全部满足时返回 null */
|
||||
@@ -50,5 +60,6 @@ export function firstPasswordPolicyIssue(password: string): string | null {
|
||||
const checks = checkPasswordPolicy(password)
|
||||
if (!checks.minLength) return `密码长度不少于 ${PASSWORD_MIN_LENGTH} 位`
|
||||
if (!checks.hasUppercase || !checks.hasLowercase) return '密码必须同时包含大写和小写字母'
|
||||
if (!checks.hasSpecialChar) return '密码必须包含特殊字符'
|
||||
return null
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user