Skip to content

菜单管理模块

概述

菜单模块用于管理系统菜单和前端路由,支持多应用隔离、系统菜单、动态路由生成、缓存管理等功能。

模块路径backend-fastapi/core/menu/

API 前缀/api/core/menus

数据模型

python
class Menu(BaseModel):
    __tablename__ = "core_menu"

    # 应用归属
    application_id: str     # 所属应用 ID
    is_system: bool         # 是否为系统菜单(所有应用可见)

    # 基础信息
    parent_id: str          # 父菜单 ID
    name: str               # 菜单名称(路由名称)
    title: str              # 菜单标题(显示名称)
    authCode: str           # 后端权限标识
    path: str               # 路由路径
    type: str               # 菜单类型

    # 路由配置
    component: str          # 组件路径
    redirect: str           # 重定向路径
    activePath: str         # 激活路径
    query: dict             # 额外路由参数
    noBasicLayout: bool     # 无需基础布局

    # 菜单展示
    icon: str               # 菜单图标
    activeIcon: str         # 激活图标
    order: int              # 菜单排序
    hideInMenu: bool        # 在菜单中隐藏
    hideChildrenInMenu: bool # 在菜单中隐藏下级
    hideInBreadcrumb: bool  # 在面包屑中隐藏

    # 标签页配置
    hideInTab: bool         # 在标签栏中隐藏
    affixTab: bool          # 固定在标签栏
    affixTabOrder: int      # 标签栏固定顺序
    keepAlive: bool         # 缓存页面
    maxNumOfOpenTab: int    # 最大打开标签数
    fullPathKey: bool       # 路由完整路径作为 key

    # 外部链接配置
    link: str               # 外链 URL
    iframeSrc: str          # 内嵌 iframe URL
    openInNewWindow: bool   # 在新窗口打开

    # 徽标配置
    badge: str              # 徽标内容
    badgeType: str          # 徽标类型(dot/normal)
    badgeVariants: str      # 徽标颜色

菜单类型 (type)

说明
catalog目录(包含子菜单)
menu菜单(页面)
external外部链接
online_form在线表单(低代码)
online_page在线页面(低代码)
agent智能体

服务层

MenuService 继承 BaseService,提供以下方法:

基础查询

方法说明
get_by_name(db, name)根据菜单名称获取
get_by_path(db, path)根据路由路径获取
check_name_exists(db, name, exclude_id, application_id)检查名称是否存在
check_path_exists(db, path, exclude_id, application_id)检查路径是否存在

树形结构

方法说明
get_children(db, parent_id)获取直接子菜单
get_child_count(db, menu_id)获取子菜单数量
get_level(db, menu)计算菜单层级
get_ancestors(db, menu)获取所有祖先菜单
get_descendants(db, menu_id)获取所有后代菜单
build_tree(db, application_id, include_system)构建菜单树

路由生成

方法说明
get_all_menus(db, application_id, include_system)获取所有菜单
build_route_tree(menus, app_code, dev_mode)构建前端路由树
get_user_routes(db, user_id, is_superuser, role_menu_ids, application_code, dev_mode)获取用户路由

缓存管理

方法说明
invalidate_cache()清除所有菜单缓存
invalidate_app_menu_cache(app_code)清除指定应用的菜单缓存

其他

方法说明
move_menu(db, menu_id, new_parent_id)移动菜单
can_delete(db, menu_id)判断是否可删除
get_menu_stats(db)获取菜单统计

缓存策略

菜单模块使用 Redis 缓存提升性能:

python
menu_cache = CacheManager(prefix="menu:")

# 缓存 key
MENU_TREE_CACHE_KEY = "tree"           # 菜单树
USER_ROUTE_CACHE_PREFIX = "user_route:" # 用户路由

缓存失效时机

  • 创建/更新/删除菜单
  • 角色菜单权限变更
  • 应用配置变更

多应用支持

菜单归属

  • 系统菜单is_system=True,所有应用可见
  • 应用菜单application_id 指向具体应用
  • 主应用菜单application_id=None,主应用可见

路由模式

模式路径前缀返回菜单
主应用/系统菜单 + 主应用菜单
子应用正常模式/app/{code}/应用专属菜单
子应用开发模式/app-dev/{code}/系统菜单(可配置)

API 接口

基础 CRUD

方法路径说明
POST/创建菜单
GET/获取菜单列表
GET/{record_id}获取菜单详情
PUT/{record_id}更新菜单
DELETE/{record_id}删除菜单

树形结构

方法路径说明
GET/tree获取菜单树
POST/{menu_id}/move移动菜单

路由

方法路径说明
GET/routes获取当前用户路由
GET/routes/app/{app_code}获取子应用路由

统计

方法路径说明
GET/stats获取菜单统计

请求/响应示例

获取用户路由

响应

json
[
  {
    "name": "Dashboard",
    "path": "/dashboard",
    "component": "BasicLayout",
    "meta": {
      "title": "仪表盘",
      "icon": "lucide:layout-dashboard",
      "order": 1
    },
    "children": [
      {
        "name": "Workspace",
        "path": "workspace",
        "component": "_core/dashboard/workspace/index",
        "meta": {
          "title": "工作台",
          "icon": "lucide:home"
        }
      }
    ]
  }
]

获取菜单统计

响应

json
{
  "totalCount": 50,
  "typeStats": {
    "目录": 10,
    "菜单": 30,
    "外部链接": 2,
    "在线表单": 5,
    "在线页面": 2,
    "智能体": 1
  },
  "maxLevel": 3
}

与其他模块的关系

  • 角色模块:角色通过 core_role_menu 关联菜单
  • 权限模块:权限通过 menu_id 关联到菜单
  • 应用模块:菜单通过 application_id 关联应用
  • 表单模块:发布表单时自动创建 online_form 类型菜单
  • 页面模块:发布页面时自动创建 online_page 类型菜单

Released under the MIT License.