task-23(会话/菜单/权限): 实现当前用户请求适配 + 真后端 live 测试
session-model.parseCurrentUser 兼容 data:{item}/{item}/直接对象信封并校验 id;
session.ts fetchCurrentUser 复用;启用 allowImportingTsExtensions;npm run test:live
用 admin 账号真实登录打 18080 验证 current-user 与菜单树(023/024 live 全绿)。
This commit is contained in:
@@ -0,0 +1,25 @@
|
||||
import { unwrap } from './envelope.ts'
|
||||
import type { AdminMenuNode, AdminUser } from '../types/admin'
|
||||
|
||||
/** 解析当前用户响应:支持 data:{item} 与 {item}/{直接对象} 信封。 */
|
||||
export function parseCurrentUser(payload: unknown): AdminUser {
|
||||
const value = unwrap<AdminUser | { item?: AdminUser }>(payload)
|
||||
const user =
|
||||
value && typeof value === 'object' && 'item' in value && value.item
|
||||
? value.item
|
||||
: (value as AdminUser)
|
||||
if (!user || typeof user.id !== 'number') {
|
||||
throw new Error('当前用户响应缺少有效 id')
|
||||
}
|
||||
return user
|
||||
}
|
||||
|
||||
/**
|
||||
* 解析菜单树响应:支持 data:{items} 与 {items}/数组 信封。
|
||||
* 返回后端树形节点;空/缺省按 [] 处理,与“接口失败”(抛错) 区分开。
|
||||
*/
|
||||
export function parseMenuTree(payload: unknown): AdminMenuNode[] {
|
||||
const value = unwrap<AdminMenuNode[] | { items?: AdminMenuNode[] }>(payload)
|
||||
if (Array.isArray(value)) return value
|
||||
return (value && Array.isArray(value.items) ? value.items : []) as AdminMenuNode[]
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
import { http } from './http'
|
||||
import { parseCurrentUser, parseMenuTree } from './session-model'
|
||||
import type { AdminMenuNode, AdminUser, ApiEnvelope } from '../types/admin'
|
||||
|
||||
export async function fetchCurrentUser(): Promise<AdminUser> {
|
||||
const { data } = await http.get<ApiEnvelope<{ item: AdminUser }> | AdminUser>('/api/admin/current-user')
|
||||
return parseCurrentUser(data)
|
||||
}
|
||||
|
||||
export async function fetchAdminMenuTree(): Promise<AdminMenuNode[]> {
|
||||
const { data } = await http.get<
|
||||
ApiEnvelope<{ items: AdminMenuNode[] }> | { items: AdminMenuNode[] } | AdminMenuNode[]
|
||||
>('/api/admin/current-user/menus')
|
||||
return parseMenuTree(data)
|
||||
}
|
||||
|
||||
export async function logout(): Promise<void> {
|
||||
await http.post('/api/admin/logout', undefined, { headers: { 'X-Requested-With': 'XMLHttpRequest' } })
|
||||
}
|
||||
Reference in New Issue
Block a user