898fae4cb3
用户管理菜单权限此前只含后台 admin(单类型):前端授权树/回显仅拉 menuType=admin, 后端 replaceDirectPermissions 也固定用 ADMIN 作用域写。现改为同时覆盖 后台(admin)+前端客户端(app): - 前端 user-menu-auth 节点携带 type,api 并行拉取 admin/app 两类可授权树与已授权 id 合并去重,树内两类根并存(账号与权限/视频/前端工具/运营工具/后勤工具等) - 后端 PermissionMenuService 新增 resolveMenuTypes(按 id 解析类型);AdminUserService create/update 把勾选 id 拆 admin/app 分区整树替换(internal 不纳入) - 前端 1556 测试全绿 + build 通过;后端单测(AdminUserServiceTest/PermissionMenuServiceTest/Controller/PermissionMenuResolveTypeTest) EXIT 0 - 本地 E2E:创建用户写入 admin=7+app=3 → 按类型回读 admin[7]/app[3],删除正常
66 lines
2.5 KiB
TypeScript
66 lines
2.5 KiB
TypeScript
/** 用户菜单授权数据加载适配(任务 49):拉取可授权菜单树 + 用户已授权 id。 */
|
|
import { http } from '@/api/http'
|
|
import { unwrap } from '@/api/envelope'
|
|
import {
|
|
ADMIN_MENU_TYPE,
|
|
APP_MENU_TYPE,
|
|
buildMenuOptionTree,
|
|
buildUserColumnPermissionPayload,
|
|
normalizeMenuIds,
|
|
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'
|
|
|
|
/** 拉取可授权菜单树(后台 admin + 前端客户端 app 两类合并,按 sort 排序)。 */
|
|
export async function fetchGrantableMenus(): Promise<MenuOptionNode[]> {
|
|
const [adminRes, appRes] = await Promise.all([
|
|
http.get<unknown>(GRANT_MENUS_ENDPOINT, { params: { menuType: ADMIN_MENU_TYPE } }),
|
|
http.get<unknown>(GRANT_MENUS_ENDPOINT, { params: { menuType: APP_MENU_TYPE } }),
|
|
])
|
|
const nodes = [
|
|
...parseMenuOptionList(adminRes.data, ADMIN_MENU_TYPE),
|
|
...parseMenuOptionList(appRes.data, APP_MENU_TYPE),
|
|
]
|
|
return buildMenuOptionTree(nodes)
|
|
}
|
|
|
|
/** 拉取某用户当前直接授权菜单 id 列表(admin + app 合并去重)。 */
|
|
export async function fetchUserGrantedColumnIds(userId: number): Promise<number[]> {
|
|
const [adminRes, appRes] = await Promise.all([
|
|
http.get<unknown>(`${USER_PERMISSION_COLUMNS_ENDPOINT}/${userId}/columns`, {
|
|
params: { menuType: ADMIN_MENU_TYPE },
|
|
}),
|
|
http.get<unknown>(`${USER_PERMISSION_COLUMNS_ENDPOINT}/${userId}/columns`, {
|
|
params: { menuType: APP_MENU_TYPE },
|
|
}),
|
|
])
|
|
return normalizeMenuIds([
|
|
...parseUserGrantedColumnIds(adminRes.data),
|
|
...parseUserGrantedColumnIds(appRes.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 }
|
|
}
|
|
|
|
/** 提交某用户的直接授权菜单 id(整树替换);success=false 由 unwrap 抛后端 message。 */
|
|
export async function submitUserMenuAuth(userId: number, columnIds: unknown): Promise<void> {
|
|
const payload = buildUserColumnPermissionPayload(columnIds)
|
|
const { data } = await http.put<unknown>(`${USER_PERMISSION_COLUMNS_ENDPOINT}/${userId}/columns`, payload, {
|
|
params: { menuType: ADMIN_MENU_TYPE },
|
|
})
|
|
unwrap<unknown>(data)
|
|
}
|