Skip to content

菜单管理 ​

菜单系统为管理后台提供动态的、层级化的导航功能。菜单存储在数据库中并异步加载,支持多种菜单类型和丰富的元数据。

菜单类型 ​

类型值描述
页面1(MENU)包含 Vue 组件的常规页面
目录2(CATALOG)用于分组子菜单的文件夹
内嵌页3(IFRAME)嵌入的 iframe 页面
外链4(OUTSIDE_LINK_REDIRECT)跳转到外部 URL

按钮级权限以 isButton = true 的菜单条目表示,但不会显示在侧边栏导航中。

数据模型 ​

SysMenu(sys_menu) ​

字段类型描述
menuIdLong主键
menuNameString显示名称
menuTypeInteger菜单类型(1-4,见上表)
routerNameStringVue Router 路由名称
parentIdLong父菜单 ID(0 = 根节点)
pathString路由路径
isButtonBoolean是否为按钮权限
permissionString权限字符串(如 system:user:add)
metaInfoJSON序列化的 MetaDTO(见下表)
statusInteger1 启用,0 禁用
remarkString备注

MetaDTO(以 JSON 格式存储在 metaInfo 中) ​

字段类型描述
titleString菜单标题(支持 i18n 键)
iconString菜单图标名称
showLinkBoolean是否在侧边栏显示
showParentBoolean是否显示父菜单
rolesList<String>该菜单允许的角色
authsList<String>按钮级权限
frameSrcStringiframe URL(用于 IFRAME 类型)
isFrameSrcInternalBooleaniframe URL 是否相对于后端
rankInteger排序序号(越大越靠后)
extraIconObject标题旁的额外图标
transitionObject页面过渡动画设置
keepAliveBoolean缓存页面状态
frameLoadingBooleaniframe 显示加载动画
hiddenTagBoolean从标签栏隐藏
dynamicLevelInteger动态路由的最大标签数

API 接口 ​

MenuController(server-admin)。旧的 /system/menu/* 接口已不存在。

方法接口路径权限描述
POST/admin/menusystem:menu:list全部菜单(前端组装成树)
POST/admin/menu/createsystem:menu:add创建菜单、页面或按钮
PUT/admin/menu/updatesystem:menu:edit更新菜单
POST/admin/menu/deletesystem:menu:remove删除菜单

异步路由加载 ​

前端在登录后动态加载路由:

  1. 用户登录并获得 sa-token token
  2. 前端携带令牌调用 GET /admin/auth/get-async-routes
  3. 后端根据用户的角色权限过滤后返回菜单树
  4. 前端将菜单树转换为 Vue Router 路由对象
  5. 通过 router.addRoute() 动态添加路由

这确保了用户只能看到其有权限访问的导航项。

创建新菜单 ​

页面菜单示例 ​

在"系统管理"下创建新页面:

  1. 设置菜单类型为"页面"(1)
  2. 设置父菜单为"系统管理"目录
  3. 设置路由名称为 SystemNewPage
  4. 设置路径为 /system/new-page
  5. 在元数据中设置 title、icon,可选设置 rank 排序

内嵌页示例 ​

嵌入 Swagger UI:

  1. 设置菜单类型为"内嵌页"(3)
  2. 在元数据中设置 frameSrc 为 /swagger-ui/index.html
  3. 设置 isFrameSrcInternal 为 true(前端会自动拼接后端 URL)

相关页面 ​

Released under the MIT License.