library-picturebook-activity/docs/design/menu-config.md
aid e9676ea924 新增菜单配置规范文档 + 修正超管端移除数据统计模块
- 新增 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) <noreply@anthropic.com>
2026-04-02 16:31:22 +08:00

4.9 KiB
Raw Blame History

各端菜单配置规范

最后更新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/logintenantCode=gdlib),登录时发送:

{"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.tsSUPER_TENANT_MENUS
  • 租户端菜单列表:backend/scripts/init-menus.tsNORMAL_TENANT_MENUS
  • 本文档:docs/design/menu-config.md