task-47(账号/权限页面): 实现编辑用户表单回填

新增 user-edit-model.ts 纯模型:fillEditUserForm 从用户行回填(用户名只读/密码留空/
角色归 normal|admin/columnIds 待授权加载)、isEditableUser 拒绝超管、密码留空不修改、
toEditUserUpdateRequest 序列化镜像 Java AdminUserUpdateRequest(空密码不下发、超管拒绝)。
8 用例全过,339 单测 + build 绿。
This commit is contained in:
2026-09-05 15:03:02 +08:00
parent 0e8c5c7223
commit 311df66231
2 changed files with 156 additions and 0 deletions
@@ -0,0 +1,79 @@
/** 编辑用户表单回填模型(任务 47):从用户行回填可编辑表单,镜像 Java AdminUserUpdateRequest。 */
import type { AdminUser } from '../../types/admin'
import { CREATE_PASSWORD_MIN_LEN } from './user-create-model.ts'
/** 编辑可选角色:超管不可改,未知归 normal;后端只收 admin|normal。 */
export type EditUserRole = 'normal' | 'admin'
export interface EditUserForm {
uid: number
/** 仅展示用,后端不支持改用户名。 */
username: string
/** 空串 = 不修改密码。 */
password: string
role: EditUserRole
/** 授权菜单 id;由授权数据加载后填充。 */
columnIds: number[]
/** 后端原角色字符串,用于超管禁止编辑判定。 */
originalRole: string
}
export interface EditUserFormErrors {
password?: string
}
/** 序列化到 PUT /api/admin/user/{uid} 的请求体(Java AdminUserUpdateRequest,空密码不下发)。 */
export interface EditUserUpdateRequest {
role: EditUserRole
columnIds: number[]
password?: string
}
/** 行角色 → 可编辑角色:仅 admin 映射 admin,其余(含 unknown)归 normal。 */
export function editRoleOf(role: string | null | undefined): EditUserRole {
return (role || '').trim().toLowerCase() === 'admin' ? 'admin' : 'normal'
}
/** 该角色是否允许被编辑:超级管理员不可编辑(镜像后端“不能修改超级管理员”)。 */
export function isEditableUser(role: string | null | undefined): boolean {
return (role || '').trim().toLowerCase() !== 'super_admin'
}
/** 从用户行回填编辑表单:用户名只读、密码留空、columnIds 待授权加载填充。 */
export function fillEditUserForm(user: AdminUser): EditUserForm {
const role = typeof user.role === 'string' ? user.role.trim() : ''
return {
uid: user.id,
username: user.username || '',
password: '',
role: editRoleOf(role),
columnIds: [],
originalRole: role,
}
}
/** 编辑表单校验:密码可留空(不改),非空时须达到最小长度。 */
export function validateEditUserForm(form: EditUserForm): { valid: boolean; errors: EditUserFormErrors } {
const errors: EditUserFormErrors = {}
const password = form.password || ''
if (password && password.length < CREATE_PASSWORD_MIN_LEN) {
errors.password = `密码至少${CREATE_PASSWORD_MIN_LEN}个字符,留空则不修改`
}
return { valid: Object.keys(errors).length === 0, errors }
}
/** 编辑表单 → 更新请求体:超管拒绝、空密码不下发、columnIds 拷贝不共享引用。 */
export function toEditUserUpdateRequest(form: EditUserForm): EditUserUpdateRequest {
const originalRole = (form.originalRole || '').trim().toLowerCase()
if (originalRole === 'super_admin') {
throw new Error('不能修改超级管理员')
}
const role: EditUserRole = form.role === 'admin' ? 'admin' : 'normal'
const request: EditUserUpdateRequest = {
role,
columnIds: Array.isArray(form.columnIds) ? form.columnIds.slice() : [],
}
const password = form.password || ''
if (password) request.password = password
return request
}