import type { Router, RouteRecordNormalized } from 'vue-router'; import NProgress from 'nprogress'; // progress bar import usePermission from '@/hooks/permission'; import { useLoginStore, useAppStore } from '@/store'; import { fixedRoutes, demoRoutes } from '../routes'; import { WHITE_LIST, NOT_FOUND } from '../constants'; export default function setupPermissionGuard(router: Router) { router.beforeEach(async (to, from, next) => { const appStore = useAppStore(); const loginStore = useLoginStore(); const Permission = usePermission(); const permissionsAllow = Permission.accessRouter(to); if (appStore.menuFromServer) { // 针对来自服务端的菜单配置进行处理 // Handle routing configuration from the server // 根据需要自行完善来源于服务端的菜单配置的 permission 逻辑 // Refine the permission logic from the server's menu configuration as needed if ( !appStore.appAsyncMenus.length && !WHITE_LIST.find((el) => el.name === to.name) ) { await appStore.fetchServerMenuConfig(); } const serverMenuConfig = [ ...appStore.appAsyncMenus, ...WHITE_LIST, ...fixedRoutes, ...demoRoutes, ]; let exist = false; while (serverMenuConfig.length && !exist) { const element = serverMenuConfig.shift(); if (element?.name === to.name) exist = true; if (element?.children) { serverMenuConfig.push( ...(element.children as unknown as RouteRecordNormalized[]) ); } } if (exist && permissionsAllow) { next(); } else next(NOT_FOUND); } else { // eslint-disable-next-line no-lonely-if if (permissionsAllow) next(); else { const destination = Permission.findFirstPermissionRoute( [...fixedRoutes, ...demoRoutes], loginStore.roles[0] ) || NOT_FOUND; next(destination); } } NProgress.done(); }); }