/** * 账号名 / 姓名的唯一规则(服务端权威版本)。 * * 规则(站长第 90 轮明确): * · 账号名**必须是纯中文**(账号名即姓名,网页版与小程序都靠这个); * · **唯一的例外是 `admin`** —— 那是历史遗留的超级管理员账号, * 它的账号名不是中文。以前的校验没有这个例外,导致**连 admin 账号都改不动** * (改任何字段都会撞上「姓名和用户名只能包含汉字」)。 * * 所有会写入 `users.username` / `users.name` 的接口都必须用这里的函数, * 别各自复制正则 —— 规则一处定义,才不会出现"这里放行那里拦住"。 */ /** 超级管理员账号名(唯一允许非中文的账号) */ export const ADMIN_USERNAME = 'admin' /** 纯中文(不含标点、数字、字母;如需支持「·」等少数民族姓名写法,在这里放宽) */ export const CHINESE_NAME_RE = /^[\u4e00-\u9fa5]+$/ /** 账号名是否合法:纯中文,或恰好是 admin */ export function isValidUsername(value: unknown): boolean { const s = String(value ?? '').trim() if (!s) return false if (s === ADMIN_USERNAME) return true return CHINESE_NAME_RE.test(s) } /** * 姓名是否合法:纯中文;但 **admin 账号**的姓名不做中文限制 * (历史数据可能是 "admin"/"Admin" 之类,否则编辑该账号会直接被挡)。 */ export function isValidPersonName(value: unknown, username?: unknown): boolean { const s = String(value ?? '').trim() if (!s) return false if (String(username ?? '').trim() === ADMIN_USERNAME) return true return CHINESE_NAME_RE.test(s) } /** 统一的提示文案(接口报错、客户端校验都用同一句,别各写各的) */ export const USERNAME_RULE_MESSAGE = '账号名必须是纯中文名(唯一的例外是管理员账号 admin)' export const NAME_RULE_MESSAGE = '姓名必须是纯中文名(管理员账号 admin 除外)'