task-33(会话/菜单/权限): 路由菜单权限守卫统一准入判定

新增纯函数 isRouteAllowed(无 menuKey 开放页放行/super_admin 全放行/其余按
key 命中);beforeEach 越权回退首个可见页、全无则回根路由空态。8 用例全过。
This commit is contained in:
2026-09-05 14:16:13 +08:00
parent a7b184fbd7
commit 37d021500a
2 changed files with 61 additions and 8 deletions
+3 -8
View File
@@ -1,11 +1,11 @@
import { createRouter, createWebHistory, type RouteRecordRaw } from 'vue-router'
import type { AdminMenuNode } from '@/types/admin'
import AdminLayout from '@/layout/AdminLayout.vue'
import NotFoundPage from '@/pages/error/NotFoundPage.vue'
import { useAdminSessionStore } from '@/stores/admin-session'
import { APP_BASE_PATH } from '@/config/app'
import { adminRouteRecords } from './routes'
import { defineLazyPage } from './lazy-page'
import { isRouteAllowed } from './helpers'
const router = createRouter({
history: createWebHistory(APP_BASE_PATH),
@@ -37,16 +37,11 @@ router.beforeEach(async (to) => {
if (to.path === '/') {
return session.firstVisible || true
}
const menuKey = to.meta.menuKey
if (menuKey && !session.isSuperAdmin && !hasMenu(session.menuTree, menuKey)) {
// 无权限页面:回退到首个可见页面;一个都没有则回根路由空态。
// 页面级权限:无 menuKey 开放页放行;越权页回退首个可见页,全无则回根空态。
if (!isRouteAllowed(session.isSuperAdmin, to.meta.menuKey, session.menuTree)) {
return session.firstVisible || '/'
}
return true
})
function hasMenu(nodes: AdminMenuNode[], key: string): boolean {
return nodes.some((node) => node.key === key || hasMenu(node.children || [], key))
}
export default router