import type { Router, RouteRecordRaw } from 'vue-router'; import { usePermissionStoreWithOut } from '@jeesite/core/store/modules/permission'; import { RootRoute } from '@jeesite/core/router/routes'; import { PageEnum } from '@jeesite/core/enums/pageEnum'; import { PAGE_NOT_FOUND_ROUTE } from '@jeesite/core/router/routes/basic'; const ROOT_PATH = RootRoute.path; const HOME_PATH = PageEnum.BASE_HOME; function ensurePageNotFoundRoute(router: Router) { if (!router.hasRoute(PAGE_NOT_FOUND_ROUTE.name as string)) { router.addRoute(PAGE_NOT_FOUND_ROUTE as unknown as RouteRecordRaw); } } export function createPermissionGuard(router: Router) { const permissionStore = usePermissionStoreWithOut(); router.beforeEach(async (to, from, next) => { // 授权页面在 basicRoutes 中始终存在,不需要权限检查 if (to.path === PageEnum.BASE_AUTHORIZATION) { next(); return; } // 如果路由已经动态添加过,直接放行 if (permissionStore.getIsDynamicAddedRoute) { if (to.name === PAGE_NOT_FOUND_ROUTE.name) { next({ path: PageEnum.BASE_HOME, replace: true }); return; } next(); return; } if (from.path === ROOT_PATH && to.path === HOME_PATH) { // 首次导航,需要生成路由和菜单数据 const routes = await permissionStore.buildRoutesAction(); routes.forEach((route) => { router.addRoute(route as unknown as RouteRecordRaw); }); ensurePageNotFoundRoute(router); permissionStore.setDynamicAddedRoute(true); // 已经是目标路径,直接放行 next(); return; } const routes = await permissionStore.buildRoutesAction(); routes.forEach((route) => { router.addRoute(route as unknown as RouteRecordRaw); }); ensurePageNotFoundRoute(router); permissionStore.setDynamicAddedRoute(true); if (to.name === PAGE_NOT_FOUND_ROUTE.name) { // 动态添加路由后,此处应当重定向到fullPath,否则会加载404页面内容 next({ path: to.fullPath, replace: true, query: to.query }); } else { const redirectPath = (from.query.redirect || to.path) as string; const redirect = decodeURIComponent(redirectPath); const nextData = to.path === redirect ? { ...to, replace: true } : { path: redirect }; next(nextData); } }); }