54 lines
1.8 KiB
TypeScript
54 lines
1.8 KiB
TypeScript
import NProgress from 'nprogress'; // progress bar
|
|
import type { RouteRecordNormalized, Router } from 'vue-router';
|
|
|
|
import usePermission from '@/hooks/permission';
|
|
import { useAppStore, useUserStore } from '@/store';
|
|
import { NOT_FOUND, WHITE_LIST } from '../constants';
|
|
import { appRoutes } from '../routes';
|
|
|
|
export default function setupPermissionGuard(router: Router) {
|
|
router.beforeEach(async (to, from, next) => {
|
|
const appStore = useAppStore();
|
|
const userStore = useUserStore();
|
|
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];
|
|
|
|
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 if (permissionsAllow) {
|
|
next();
|
|
} else {
|
|
const destination =
|
|
Permission.findFirstPermissionRoute(appRoutes, userStore.role) ||
|
|
NOT_FOUND;
|
|
next(destination);
|
|
}
|
|
NProgress.done();
|
|
});
|
|
}
|