task-21(会话/菜单/权限): 定义 AdminUser/AdminMenuNode 类型契约并对齐后端字段

admin.ts 增加 AdminRole 域与 roleKind/isSuperAdminRole/isAdminRole/roleLabel/
isSuperUser,AdminUser 补齐 isAdmin/creatorUsername/createdAt 等真实字段;
契约覆盖“分组可无 route、页面必有 route”。
This commit is contained in:
2026-09-05 13:47:06 +08:00
parent 1cfdcb5fb3
commit 9f73af5911
2 changed files with 146 additions and 0 deletions
+78
View File
@@ -0,0 +1,78 @@
/** 后台前端类型契约(任务 21):与 Java Admin 接口返回字段对齐。 */
/** 管理角色域(与后端 current-user / users 返回一致)。 */
export type AdminRole = 'super_admin' | 'admin' | 'normal'
export interface AdminUser {
id: number
username: string
role: string
/** 1 为管理员标志位;role 为空时可据此推断角色。 */
isAdmin?: boolean
createdById?: number | null
creatorUsername?: string
createdAt?: string
pinyinAbbr?: string
}
export interface AdminMenuNode {
/** columns.column_key,稳定权限标识。 */
key: string
name: string
/** 相对 /admin-vue/ 的页面路径;分组节点可能没有。 */
route?: string
/** 分组/页面层级;后端按 sort_order 排好后原样下发,前端不二次重排。 */
children?: AdminMenuNode[]
sort?: number
icon?: string
}
export type AdminRoleKind = 'super_admin' | 'admin' | 'normal' | null
/** 把任意角色字符串归一为角色域;未知/空返回 null。 */
export function roleKind(role: string | null | undefined): AdminRoleKind {
const value = (role || '').trim().toLowerCase()
if (value === 'super_admin') return 'super_admin'
if (value === 'admin') return 'admin'
if (value === 'normal') return 'normal'
return null
}
/** 是否超级管理员(可进入全部菜单)。 */
export function isSuperAdminRole(role: string | null | undefined): boolean {
return roleKind(role) === 'super_admin'
}
/** 是否管理员级(super_admin 或 admin,可进后台菜单管理类)。 */
export function isAdminRole(role: string | null | undefined): boolean {
const kind = roleKind(role)
return kind === 'super_admin' || kind === 'admin'
}
/** 顶部栏角色展示文案。 */
export function roleLabel(role: string | null | undefined): string {
switch (roleKind(role)) {
case 'super_admin':
return '超级管理员'
case 'admin':
return '管理员'
case 'normal':
return '普通用户'
default:
return ''
}
}
/** 前端是否应把该用户视为超级管理员(可进入全部菜单)。 */
export function isSuperUser(user: Pick<AdminUser, 'role'> | null | undefined): boolean {
return isSuperAdminRole(user?.role)
}
export type ApiEnvelope<T> = {
success?: boolean
message?: string
error?: string
data?: T
item?: T
items?: T
}