task-33(会话/菜单/权限): 路由菜单权限守卫统一准入判定
新增纯函数 isRouteAllowed(无 menuKey 开放页放行/super_admin 全放行/其余按 key 命中);beforeEach 越权回退首个可见页、全无则回根路由空态。8 用例全过。
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user