From e9676ea924a8520c152a4720a2ee6fcc8faccfe9 Mon Sep 17 00:00:00 2001 From: aid Date: Thu, 2 Apr 2026 16:31:22 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=8F=9C=E5=8D=95=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E8=A7=84=E8=8C=83=E6=96=87=E6=A1=A3=20+=20=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3=E8=B6=85=E7=AE=A1=E7=AB=AF=E7=A7=BB=E9=99=A4=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E7=BB=9F=E8=AE=A1=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 docs/design/menu-config.md:各端菜单完整配置规范 - 超管端 5个一级21条(活动监管/内容管理/机构管理/用户中心/系统设置) - 租户端 4个一级18条(工作台/数据统计/活动管理/系统设置) - 评委端 1个一级3条(我的评审) - 含排除清单、技术实现要点、权威来源说明 - 修正超管端 tenant_menus:移除数据统计(52/53/54),数据统计是租户端专属 Co-Authored-By: Claude Opus 4.6 (1M context) --- docs/design/menu-config.md | 168 +++++++++++++++++++++++++++++++++++++ 1 file changed, 168 insertions(+) create mode 100644 docs/design/menu-config.md diff --git a/docs/design/menu-config.md b/docs/design/menu-config.md new file mode 100644 index 0000000..76b8359 --- /dev/null +++ b/docs/design/menu-config.md @@ -0,0 +1,168 @@ +# 各端菜单配置规范 + +> 最后更新:2026-04-02 +> 维护人:开发团队 + +本文档记录各端的正确菜单配置,是菜单分配的**唯一权威来源**。修改菜单时必须对照此文档。 + +--- + +## 一、超管端(tenant_id=1, code='super') + +**定位**:只读监管,不含操作类功能。 + +**一级菜单**:5 个(活动监管、内容管理、机构管理、用户中心、系统设置) + +**不包含**:数据统计(租户端专属)、活动管理(租户端专属)、我的评审(评委端专属) + +``` +活动监管 (id=37) ← 只读监管视角 +├── 全部活动 (38) +├── 报名数据 (39) +├── 作品数据 (40) +├── 评审进度 (41) +└── 活动成果 (44) + +内容管理 (id=46) +├── 作品审核 (47) +├── 作品管理 (48) +└── 标签管理 (49) + +机构管理 (id=28) +└── 机构管理 (30) + +用户中心 (id=29) +├── 用户管理 (32) +└── 角色管理 (33) + +系统设置 (id=14) +├── 菜单管理 (17) +├── 数据字典 (18) +├── 系统配置 (19) +├── 日志记录 (20) +└── 权限管理 (21) +``` + +**tenant_menus ID 列表**(21条): +`14, 17, 18, 19, 20, 21, 28, 29, 30, 32, 33, 37, 38, 39, 40, 41, 44, 46, 47, 48, 49` + +### 超管端不包含的菜单及原因 + +| 菜单 | ID | 原因 | +|------|-----|------| +| 评委管理 | 42 | 操作类功能,属于租户端活动管理 | +| 评审规则 | 43 | 操作类功能,属于租户端活动管理 | +| 通知管理 | 45 | 操作类功能,属于租户端活动管理 | +| 数据统计 | 52,53,54 | 设计文档明确标注"所属端:租户端" | +| 活动管理 | 9 及子菜单 | 租户端操作菜单,超管用活动监管代替 | +| 我的评审 | 34,35,36 | 评委端专属 | +| 工作台 | 50 | 租户端工作台(TenantDashboard),超管端不需要 | +| 学校管理 | 2 及子菜单 | 已剥离 | + +--- + +## 二、租户端(以 gdlib id=9 为例) + +**定位**:机构管理员操作端,含全部业务操作功能。 + +**一级菜单**:4 个(工作台、数据统计、活动管理、系统设置) + +``` +工作台 (id=50) ← TenantDashboard(欢迎信息+统计卡片+快捷操作+待办+最近活动) + +数据统计 (id=52) ← 租户端专属 +├── 运营概览 (53) +└── 评审分析 (54) + +活动管理 (id=9) ← 含全部操作功能 +├── 活动列表 (10) +├── 评委管理 (23) +├── 报名管理 (11) +├── 作品管理 (12) +├── 评审进度 (25) +├── 评审规则 (26) +├── 成果发布 (24) +└── 活动公告 (27) + +系统设置 (id=14) ← 精简版,不含菜单管理/字典/配置/权限/租户管理 +├── 机构信息 (51) +├── 用户管理 (15) +├── 角色管理 (16) +└── 日志记录 (20) +``` + +**tenant_menus ID 列表**(18条): +`9, 10, 11, 12, 14, 15, 16, 20, 23, 24, 25, 26, 27, 50, 51, 52, 53, 54` + +### 租户端系统设置不包含的子菜单 + +| 菜单 | ID | 原因 | +|------|-----|------| +| 菜单管理 | 17 | 平台级功能,超管专属 | +| 数据字典 | 18 | 平台级功能,超管专属 | +| 系统配置 | 19 | 平台级功能,超管专属 | +| 权限管理 | 21 | 平台级功能,超管专属 | +| 租户管理 | 22 | 平台级功能,超管专属 | + +--- + +## 三、评委端(tenant_id=7, code='judge') + +**定位**:评委评审工作台。 + +**一级菜单**:1 个(我的评审) + +``` +我的评审 (id=34) +├── 评审任务 (35) +└── 预设评语 (36) +``` + +**tenant_menus ID 列表**(3条):`34, 35, 36` + +--- + +## 四、公众端 + +公众端不使用动态菜单系统,路由固定在前端 `router/index.ts` 中: +- `/p/gallery` — 作品广场 +- `/p/activities` — 活动大厅 +- `/p/mine` — 个人中心 +- `/p/create` — 绘本创作 +- `/p/works` — 我的作品库 + +--- + +## 五、技术实现要点 + +### 菜单加载逻辑(SysMenuServiceImpl.getUserMenus) + +``` +1. 查询所有 valid_state=1 的菜单 +2. 查询当前用户 tenant_id 对应的 tenant_menus +3. 按 tenant_menus 过滤菜单 +4. 如果是超管(isSuperAdmin):不做权限码过滤 +5. 如果是普通用户:按用户权限码过滤(菜单.permission 字段) +6. 补全父菜单(确保树结构完整) +7. 构建树形结构返回 +``` + +**注意**:超管也必须按 tenant_menus 过滤,不能返回全部菜单。 + +### 登录时租户识别 + +前端通过 URL 提取 tenantCode(如 `/gdlib/login` → `tenantCode=gdlib`),登录时发送: +```json +{"username": "admin", "password": "xxx", "tenantCode": "gdlib"} +``` + +Java 后端 AuthService.login 支持两种方式: +1. `X-Tenant-Id` header(数字ID) +2. body 中的 `tenantCode`(编码),后端通过编码查找租户ID + +### 权威来源 + +- 菜单定义:`backend/data/menus.json` +- 超管端菜单列表:`backend/scripts/init-menus.ts` 中 `SUPER_TENANT_MENUS` +- 租户端菜单列表:`backend/scripts/init-menus.ts` 中 `NORMAL_TENANT_MENUS` +- 本文档:`docs/design/menu-config.md`