跳到主要内容

菜单字典管理

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 依赖关系分析
  7. 性能考量
  8. 故障排查指南
  9. 结论
  10. 附录

简介

本文件围绕“菜单字典管理”主题,系统化梳理菜单配置管理、字典数据维护与国际化支持等核心能力。内容覆盖:

  • 菜单数据模型设计:层级、路由、权限、图标、缓存等字段
  • 字典管理机制:类型、数据、状态、排序、缓存与前端联动
  • 完整API接口清单:菜单树获取、字典查询、字典类型管理等
  • 前端渲染与国际化:菜单树渲染、字典缓存策略、国际化切换要点
  • 最佳实践与排障建议

项目结构

菜单与字典管理主要分布在系统模块的业务层与API层,配合通用框架实现缓存与国际化支撑。

Mermaid Diagram Code:

graph TB
subgraph "系统模块"
A["菜单控制器<br/>MenuController"]
B["字典数据控制器<br/>DictDataController"]
C["App字典控制器<br/>AppDictDataController"]
D["菜单DO<br/>MenuDO"]
E["字典数据DO<br/>DictDataDO"]
F["字典类型DO<br/>DictTypeDO"]
end
subgraph "系统API"
G["字典数据DTO<br/>DictDataRespDTO"]
end
subgraph "框架"
H["字典工具缓存<br/>DictFrameworkUtils"]
end
subgraph "数据库脚本"
I["MySQL 菜单表结构"]
J["Oracle 菜单表结构"]
K["DM8 字典表结构"]
end
A --> D
B --> E
C --> E
B --> F
D --> I
E --> K
F --> K
H --> G

图表来源

章节来源

核心组件

  • 菜单数据模型:菜单树结构、路由配置、权限标识、图标、可见性、缓存与显示策略
  • 字典数据模型:标签、键值、类型、状态、排序、颜色与样式
  • 控制器层:菜单与字典的增删改查、分页、导出、按类型查询等接口
  • 框架层:字典缓存工具,支持按类型批量加载与解析

章节来源

架构总览

菜单与字典管理遵循“控制器-服务-数据对象-数据库”的分层架构,前端通过HTTP接口消费后端能力;字典数据通过框架层缓存提升读取性能。

Mermaid Diagram Code:

sequenceDiagram
participant FE as "前端"
participant MC as "菜单控制器"
participant DC as "字典数据控制器"
participant APPC as "App字典控制器"
participant S as "服务层"
participant DB as "数据库"
FE->>MC : GET /system/menu/list
MC->>S : 查询菜单列表
S->>DB : SELECT system_menu
DB-->>S : 菜单集合
S-->>MC : 菜单DO集合
MC-->>FE : 菜单响应VO
FE->>DC : GET /system/dict-data/page
DC->>S : 分页查询字典数据
S->>DB : SELECT system_dict_data
DB-->>S : 字典分页结果
S-->>DC : 分页结果
DC-->>FE : 字典响应VO
FE->>APPC : GET /system/dict-data/type?type=...
APPC->>S : 按类型查询启用字典
S->>DB : SELECT system_dict_data WHERE status=ENABLE AND type=...
DB-->>S : 字典集合
S-->>APPC : 字典DO集合
APPC-->>FE : 字典响应VO

图表来源

详细组件分析

菜单数据模型与字段说明

  • 菜单层级:通过父ID形成树形结构,支持多级目录与页面菜单
  • 路由配置:path为外链时以http(s)开头;component与componentName用于前端组件映射
  • 权限标识:用于后端接口鉴权与前端按钮级权限控制
  • 显示与缓存:visible控制侧边栏可见性;keepAlive控制Vue路由缓存;alwaysShow控制单子菜单时是否折叠
  • 状态与排序:status启用/禁用;sort用于排序

Mermaid Diagram Code:

classDiagram
class MenuDO {
+Long id
+String name
+String permission
+Integer type
+Integer sort
+Long parentId
+String path
+String icon
+String component
+String componentName
+Integer status
+Boolean visible
+Boolean keepAlive
+Boolean alwaysShow
}

图表来源

章节来源

字典数据模型与字段说明

  • 字典类型:name/type/remark/status构成类型维度
  • 字典数据:label/value/dictType/sort/status/colorType/cssClass/remark构成数据维度
  • 字典缓存:框架层提供基于LoadingCache的异步重载缓存,提升高频读取性能

Mermaid Diagram Code:

classDiagram
class DictTypeDO {
+Long id
+String name
+String type
+Integer status
+String remark
+LocalDateTime deletedTime
}
class DictDataDO {
+Long id
+Integer sort
+String label
+String value
+String dictType
+Integer status
+String colorType
+String cssClass
+String remark
}
DictDataDO --> DictTypeDO : "冗余类型字段"

图表来源

章节来源

菜单API接口清单

  • 创建菜单:POST /system/menu/create
  • 修改菜单:PUT /system/menu/update
  • 删除菜单:DELETE /system/menu/delete?id={id}
  • 获取菜单列表:GET /system/menu/list
  • 获取菜单精简列表:GET /system/menu/simple-list
  • 获取菜单详情:GET /system/menu/get?id={id}

章节来源

字典API接口清单

  • 新增字典数据:POST /system/dict-data/create
  • 修改字典数据:PUT /system/dict-data/update
  • 删除字典数据:DELETE /system/dict-data/delete?id={id}
  • 获取全部字典数据(精简):GET /system/dict-data/simple-list
  • 分页查询字典数据:GET /system/dict-data/page
  • 查询字典数据详情:GET /system/dict-data/get?id={id}
  • 导出字典数据:GET /system/dict-data/export
  • App按类型查询字典数据:GET /system/dict-data/type?type={type}

章节来源

字典缓存与解析流程

  • 缓存策略:针对按键值查询、按类型查询、值解析三类场景分别建立缓存,过期时间1分钟
  • 使用场景:后端服务通过DictFrameworkUtils便捷获取标签或解析值,避免重复远程调用
  • 缓存失效:采用异步重载策略,保障一致性与性能

Mermaid Diagram Code:

flowchart TD
Start(["请求进入"]) --> CheckType["按类型查询缓存"]
CheckType --> HitType{"命中?"}
HitType --> |是| ReturnList["返回缓存列表"]
HitType --> |否| LoadList["从API加载字典列表"]
LoadList --> PutList["写入缓存"]
PutList --> ReturnList
ReturnList --> GetValue["按键值查询缓存"]
GetValue --> HitValue{"命中?"}
HitValue --> |是| ReturnItem["返回字典项"]
HitValue --> |否| LoadItem["从API加载字典项"]
LoadItem --> PutItem["写入缓存"]
PutItem --> ReturnItem
ReturnItem --> Parse["按类型+值解析"]
Parse --> HitParse{"命中?"}
HitParse --> |是| ReturnParsed["返回解析结果"]
HitParse --> |否| LoadParsed["从API解析"]
LoadParsed --> PutParse["写入解析缓存"]
PutParse --> ReturnParsed

图表来源

章节来源

前端菜单渲染与字典缓存

  • 菜单树渲染:后端提供完整菜单树(含children),前端按树形结构渲染侧边栏与面包屑
  • 字典缓存:后端提供“全部字典数据(精简)”接口,前端可在应用启动时拉取并缓存,后续按需使用
  • 国际化切换:字典标签作为UI文案来源,结合前端国际化方案实现动态切换

章节来源

依赖关系分析

  • 控制器依赖服务层,服务层依赖数据对象与持久层
  • 字典工具依赖系统API接口,实现跨模块的数据共享
  • 数据对象与数据库脚本保持字段一致,确保迁移与兼容

Mermaid Diagram Code:

graph LR
MC["MenuController"] --> MS["MenuService"]
DC["DictDataController"] --> DS["DictDataService"]
APPC["AppDictDataController"] --> DS
MS --> MD["MenuDO"]
DS --> DD["DictDataDO"]
DS --> DT["DictTypeDO"]
DFU["DictFrameworkUtils"] --> DAPI["DictDataApi(DTO)"]
MD --> SQL["system_menu 脚本"]
DD --> SQD["system_dict_data 脚本"]
DT --> SQD

图表来源

章节来源

性能考量

  • 字典缓存:通过异步重载缓存降低远程调用频率,建议结合业务峰值评估过期时间
  • 菜单树构建:后端按sort排序后返回,前端避免重复排序;复杂树建议懒加载
  • 数据库索引:建议在dict_type、status、parent_id等常用过滤字段建立索引
  • 导出与分页:导出接口使用无分页上限参数,注意大表导出的内存与超时控制

故障排查指南

  • 菜单权限无效:确认权限标识格式与角色绑定;菜单变更需重新登录或刷新页面
  • 字典不显示:检查状态是否启用;前端缓存未更新时可强制刷新或清空缓存
  • 路由缓存异常:开启keepAlive时需正确填写componentName;否则无法缓存
  • 字典解析为空:确认类型与键值正确;检查缓存是否命中或过期

章节来源

结论

菜单与字典管理通过清晰的数据模型、完善的API接口与缓存机制,实现了系统界面配置与业务数据的解耦。建议在生产环境中:

  • 统一权限标识命名规范
  • 建立字典类型版本化管理
  • 优化字典缓存过期策略
  • 加强菜单树与字典数据变更后的灰度发布

附录

用户文档
AI 助手
Agent 列表
请选择一个 Agent 开始对话
AI 问答