菜单管理模块
概述
菜单模块用于管理系统菜单和前端路由,支持多应用隔离、系统菜单、动态路由生成、缓存管理等功能。
模块路径: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类型菜单