菜单与路由
XYGo Admin 2025-02-20 174 次阅读
动态菜单加载、路由权限控制与前后台双路由体系
菜单与路由
双路由体系
XYGo Admin 采用前台 + 后台双路由体系,完全隔离:
| 路由 | 前缀 | 模式 | 说明 |
|---|---|---|---|
| 前台门户 | / |
静态注册 | 首页、文档、社区、会员中心 |
| 后台管理 | /admin |
动态加载 | 根据角色权限动态注册 |
前台路由
前台路由在 router/frontend/ 中静态定义,使用独立的 FrontendLayout 布局:
typescript
复制代码
// router/frontend/index.ts
const frontendRoutes = [
{ path: '/', component: FrontendLayout, children: [
{ path: '', name: 'Home', component: () => import('@/views/frontend/index/index.vue') },
{ path: 'docs', name: 'Docs', component: () => import('@/views/frontend/docs/index.vue') },
{ path: 'community', name: 'Community', component: () => import('@/views/frontend/community/index.vue') },
{ path: 'cases', name: 'Cases', component: () => import('@/views/frontend/cases/index.vue') },
]}
]
后台动态路由
后台路由在用户首次访问 /admin/* 时从后端获取菜单数据并动态注册。
加载流程
复制代码
用户访问 /admin/dashboard
→ beforeEach 路由守卫
→ 检查是否已登录(Token 存在)
→ 检查动态路由是否已注册
→ 未注册:调用后端接口获取菜单列表
→ RouteTransformer 转换为 Vue Router 路由
→ RouteRegistry 动态注册路由
→ 跳转目标页面
菜单数据结构
后端返回的菜单数据:
json
复制代码
{
"id": 1,
"pid": 0,
"title": "系统管理",
"icon": "ri:settings-3-line",
"path": "/system",
"component": "LAYOUT",
"type": 1,
"children": [
{
"id": 2,
"pid": 1,
"title": "用户管理",
"path": "user",
"component": "/system/user/index",
"authList": ["add", "edit", "delete"]
}
]
}
路由核心工具
| 工具类 | 职责 |
|---|---|
RouteRegistry |
动态路由注册与卸载 |
ComponentLoader |
组件懒加载 |
RouteValidator |
路由合法性验证 |
RouteTransformer |
菜单数据 → Vue 路由转换 |
MenuProcessor |
菜单数据处理 |
RoutePermissionValidator |
路由权限校验 |
IframeRouteManager |
Iframe 页面路由管理 |
路由守卫
beforeEach(前置守卫)
- 白名单页面直接放行(登录、注册、前台页面)
- 未登录跳转登录页
- 已登录但未加载动态路由 → 加载菜单并注册
- 权限校验
afterEach(后置守卫)
- 更新页面标题
- 关闭加载进度条