更改校端权限

This commit is contained in:
chenxing
2026-09-07 09:32:38 +08:00
parent 9200fa2135
commit 7e37f2ada6
15 changed files with 461 additions and 120 deletions
+46 -22
View File
@@ -1,26 +1,23 @@
import type { IModule } from "@/store";
import { UserRoleEnum } from "@/types";
/**
* 左侧菜单数据(系统管理功能分组)
* 左侧菜单数据(系统管理功能分组)+ 菜单权限矩阵(管理端权限分级改造 §4.2)。
* ----------------------------------------------------------------
* 当前直接 Promise.resolve 返回写死数据;后续接入真实接口时,
* 只需把 `return Promise.resolve(menu)` 替换为
* `return alovaInstance.Request(Apis.xxx.getMenu())`
* 即可无缝对接,调用方(store.fetchModules)无需任何改动。
* 每个节点带 roles 元数据(可访问级别集合),getMenuList(userRole) 按级别过滤,
* children 过滤后为空的父目录整体隐藏。当前数据写死;后续接入真实接口时,
* 只需把 `return Promise.resolve(...)` 替换为接口调用后 filterMenuByRole 即可。
*
* 分组结构:
* 1. 组,用户管理 —— 顶层独立选项卡(单页)
* 2. 应用管理 —— 顶层独立选项卡(= 应用列表主页 /app-manage/list);
* 页内按钮跳转「应用类别管理」子页(/app-manage/category,不在菜单里,
* 由 routes.ts 的 meta.parentId=1102 关联,面包屑「应用管理>应用类别管理」)
* 3. 权限管理 —— 父目录:应用开通 / 组授权 / 权限一览
* 4. 日志管理 —— 父目录:接口日志 / 系统日志
* 1. 组,用户管理 —— S+B+C
* 2. 应用管理 —— S+C(局端不开放:局端的应用动作是「开通」,应用维护是平台级)
* 3. 权限管理 —— 父目录:应用开通(S+B) / 组授权 / 角色授权 / 权限一览(S+B+C)
* 4. 日志管理 —— 仅超管(父目录)
*
* 每个节点带唯一 id;子节点的 pid 由 layout.vue 的 flaten() 扁平化时
* 依据父节点 id 自动推导,用于「高亮自身 + 面包屑展示父级」联动。
* 菜单项不再渲染 icon。
*/
export function getMenuList(): Promise<IModule[]> {
export function getMenuList(userRole?: UserRoleEnum): Promise<IModule[]> {
const menu: IModule[] = [
// 1. 组,用户管理(顶层独立选项卡)
{
@@ -28,6 +25,7 @@ export function getMenuList(): Promise<IModule[]> {
modId: 1101,
name: "组,用户管理",
page: "/group-user",
roles: [UserRoleEnum.SuperAdmin, UserRoleEnum.Bureau, UserRoleEnum.School],
},
// 2. 应用管理(顶层独立选项卡,= 应用列表主页;页内按钮跳转应用类别管理子页)
{
@@ -35,6 +33,7 @@ export function getMenuList(): Promise<IModule[]> {
modId: 1102,
name: "应用管理",
page: "/app-manage/list",
roles: [UserRoleEnum.SuperAdmin, UserRoleEnum.School],
},
// 3. 权限管理(父目录)
{
@@ -43,11 +42,12 @@ export function getMenuList(): Promise<IModule[]> {
name: "权限管理",
page: "",
childState: true,
roles: [UserRoleEnum.SuperAdmin, UserRoleEnum.Bureau, UserRoleEnum.School],
children: [
{ id: 41, modId: 1103, name: "应用开通", page: "/app-open" },
{ id: 42, modId: 1104, name: "组授权", page: "/group-auth" },
{ id: 44, modId: 1110, name: "角色授权", page: "/role-authz/list" },
{ id: 43, modId: 1105, name: "权限一览", page: "/permission-view" },
{ id: 41, modId: 1103, name: "应用开通", page: "/app-open", roles: [UserRoleEnum.SuperAdmin, UserRoleEnum.Bureau] },
{ id: 42, modId: 1104, name: "组授权", page: "/group-auth", roles: [UserRoleEnum.SuperAdmin, UserRoleEnum.Bureau, UserRoleEnum.School] },
{ id: 44, modId: 1110, name: "角色授权", page: "/role-authz/list", roles: [UserRoleEnum.SuperAdmin, UserRoleEnum.Bureau, UserRoleEnum.School] },
{ id: 43, modId: 1105, name: "权限一览", page: "/permission-view", roles: [UserRoleEnum.SuperAdmin, UserRoleEnum.Bureau, UserRoleEnum.School] },
],
},
// 4. 日志管理(父目录)
@@ -57,13 +57,37 @@ export function getMenuList(): Promise<IModule[]> {
name: "日志管理",
page: "",
childState: true,
roles: [UserRoleEnum.SuperAdmin],
children: [
{ id: 53, modId: 1111, name: "操作日志", page: "/oplog" },
{ id: 56, modId: 1114, name: "开放接口日志", page: "/oapilog" },
{ id: 54, modId: 1112, name: "推送日志", page: "/push-log" },
{ id: 55, modId: 1113, name: "测试推送", page: "/push-test" },
{ id: 53, modId: 1111, name: "操作日志", page: "/oplog", roles: [UserRoleEnum.SuperAdmin] },
{ id: 56, modId: 1114, name: "开放接口日志", page: "/oapilog", roles: [UserRoleEnum.SuperAdmin] },
{ id: 54, modId: 1112, name: "推送日志", page: "/push-log", roles: [UserRoleEnum.SuperAdmin] },
{ id: 55, modId: 1113, name: "测试推送", page: "/push-test", roles: [UserRoleEnum.SuperAdmin] },
],
},
];
return Promise.resolve(menu);
return Promise.resolve(filterMenuByRole(menu, userRole));
}
/** 按级别过滤菜单:roles 未声明的节点视为全部级别可见;children 过滤后为空的父目录整体隐藏 */
export function filterMenuByRole(menu: IModule[], userRole?: UserRoleEnum): IModule[] {
if (userRole == null) {
return menu;
}
const result: IModule[] = [];
for (const item of menu) {
const roles = (item as any).roles as UserRoleEnum[] | undefined;
if (roles && !roles.includes(userRole)) {
continue;
}
const children = item.children
? filterMenuByRole(item.children, userRole)
: undefined;
if (item.childState && (!children || children.length === 0)) {
// 父目录:可见但全部子项被过滤 → 整体隐藏
continue;
}
result.push(children ? { ...item, children } : item);
}
return result;
}