task-49(账号/权限页面): 实现用户菜单授权数据加载

新增 user-menu-auth.ts 纯解析:parseMenuOptionList 归一 permission-menus 扁平项、
buildMenuOptionTree 按 parent_id 组装并按 (sort,key) 排序、parseUserGrantedColumnIds/
normalizeMenuIds 解包用户已授权 id 去重升序。user-menu-auth-api.ts 走 GET
/api/admin/permission-menus(menuType=admin) 与 /permission-users/{id}/columns 加载授权树与已勾选。
8 用例全过,355 单测 + build 绿。
This commit is contained in:
2026-09-05 15:06:58 +08:00
parent fba8e35118
commit 0fcee02189
3 changed files with 221 additions and 0 deletions
@@ -0,0 +1,37 @@
/** 用户菜单授权数据加载适配(任务 49):拉取可授权菜单树 + 用户已授权 id。 */
import { http } from '@/api/http'
import {
ADMIN_MENU_TYPE,
buildMenuOptionTree,
parseMenuOptionList,
parseUserGrantedColumnIds,
type MenuOptionNode,
} from './user-menu-auth'
export const GRANT_MENUS_ENDPOINT = '/api/admin/permission-menus'
export const USER_PERMISSION_COLUMNS_ENDPOINT = '/api/admin/permission-users'
/** 拉取后台可授权菜单树(扁平列表组装嵌套、按 sort 排序)。 */
export async function fetchGrantableMenus(): Promise<MenuOptionNode[]> {
const { data } = await http.get<unknown>(GRANT_MENUS_ENDPOINT, { params: { menuType: ADMIN_MENU_TYPE } })
return buildMenuOptionTree(parseMenuOptionList(data))
}
/** 拉取某用户当前直接授权菜单 id 列表。 */
export async function fetchUserGrantedColumnIds(userId: number): Promise<number[]> {
const { data } = await http.get<unknown>(`${USER_PERMISSION_COLUMNS_ENDPOINT}/${userId}/columns`, {
params: { menuType: ADMIN_MENU_TYPE },
})
return parseUserGrantedColumnIds(data)
}
/** 编辑用户菜单授权所需数据:可选菜单树 + 已勾选 id。 */
export interface UserMenuAuthData {
tree: MenuOptionNode[]
checkedIds: number[]
}
export async function loadUserMenuAuth(userId: number): Promise<UserMenuAuthData> {
const [tree, checkedIds] = await Promise.all([fetchGrantableMenus(), fetchUserGrantedColumnIds(userId)])
return { tree, checkedIds }
}