diff --git a/server/api/admin/users/[id].put.ts b/server/api/admin/users/[id].put.ts index 2f5884c..9825c1b 100644 --- a/server/api/admin/users/[id].put.ts +++ b/server/api/admin/users/[id].put.ts @@ -29,14 +29,6 @@ export default defineEventHandler(async (event) => { }) } - // 账号名必须是纯中文;**admin 账号例外**(以前没有例外,连它自己都编辑不了) - if (!isValidPersonName(name, username) || !isValidUsername(username)) { - throw createError({ - statusCode: 400, - statusMessage: NAME_RULE_MESSAGE + ';' + USERNAME_RULE_MESSAGE - }) - } - // 检查用户是否存在 const existingUser = await db .select() @@ -55,6 +47,35 @@ export default defineEventHandler(async (event) => { const currentLevel = getRoleLevel(user.role) const targetLevel = getRoleLevel(targetUser.role) + /* + * 姓名 / 账号名的中文规则:**只校验"这次真的改了"的字段**。 + * + * 站长反馈「管理员无法编辑其他用户信息了」——根因就在这里: + * 原来(以及我上一版照搬的写法)是"每次编辑都重新校验姓名和账号名", + * 于是**历史账号**(早期用拼音/英文建的、或者名字里带「·」「空格」的) + * 连"改个年级"都会撞「必须纯中文」而被拦死,管理员等于没法维护这些账号。 + * 现在的口径: + * · 没改动 → 不校验(历史数据**原样保留**,不强迫改名); + * · 改了 → 必须满足规则(纯中文;admin 账号例外)。 + */ + const nextUsername = String(username || '').trim() + const nextName = String(name || '').trim() + const usernameChanged = nextUsername !== String(targetUser.username || '') + const nameChanged = nextName !== String(targetUser.name || '') + + if (usernameChanged && !isValidUsername(nextUsername)) { + throw createError({ + statusCode: 400, + statusMessage: USERNAME_RULE_MESSAGE + }) + } + if (nameChanged && !isValidPersonName(nextName, nextUsername)) { + throw createError({ + statusCode: 400, + statusMessage: NAME_RULE_MESSAGE + }) + } + /* * 系统初始超级管理员(ID=1,登录名 admin)的处理 —— 第 90 轮按站长要求放宽。 * @@ -67,8 +88,8 @@ export default defineEventHandler(async (event) => { * · 锁死:密码不在这里改(避免被其它管理员顺手重置)。 */ if (targetUser.id === 1) { - const nextUsername = String(username || '').trim() - if (nextUsername && nextUsername !== targetUser.username) { + // 登录名必须还是 admin(usernameChanged 已在上面的中文规则里判过"有没有改") + if (usernameChanged) { throw createError({ statusCode: 400, statusMessage: '初始超级管理员的登录名必须保持 admin(应急登录通道,改了就无法用它登录)'