permissionGuard.ts 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. import type { Router, RouteRecordRaw } from 'vue-router';
  2. import { permissionStore } from '/@/store/modules/permission';
  3. import { PageEnum } from '/@/enums/pageEnum';
  4. import { getToken } from '/@/utils/auth';
  5. import { PAGE_NOT_FOUND_ROUTE } from '/@/router/constant';
  6. const LOGIN_PATH = PageEnum.BASE_LOGIN;
  7. const whitePathList: PageEnum[] = [LOGIN_PATH];
  8. export function createPermissionGuard(router: Router) {
  9. router.beforeEach(async (to, from, next) => {
  10. // Jump to the 404 page after processing the login
  11. if (from.path === LOGIN_PATH && to.name === PAGE_NOT_FOUND_ROUTE.name) {
  12. next(PageEnum.BASE_HOME);
  13. return;
  14. }
  15. // Whitelist can be directly entered
  16. if (whitePathList.includes(to.path as PageEnum)) {
  17. next();
  18. return;
  19. }
  20. const token = getToken();
  21. // token does not exist
  22. if (!token) {
  23. // You can access without permission. You need to set the routing meta.ignoreAuth to true
  24. if (
  25. to.meta.ignoreAuth
  26. // || to.name === FULL_PAGE_NOT_FOUND_ROUTE.name
  27. ) {
  28. next();
  29. return;
  30. }
  31. // redirect login page
  32. const redirectData: { path: string; replace: boolean; query?: Indexable<string> } = {
  33. path: LOGIN_PATH,
  34. replace: true,
  35. };
  36. if (to.path) {
  37. redirectData.query = {
  38. ...redirectData.query,
  39. redirect: to.path,
  40. };
  41. }
  42. next(redirectData);
  43. return;
  44. }
  45. if (permissionStore.getIsDynamicAddedRouteState) {
  46. next();
  47. return;
  48. }
  49. const routes = await permissionStore.buildRoutesAction();
  50. routes.forEach((route) => {
  51. router.addRoute(route as RouteRecordRaw);
  52. });
  53. const redirectPath = (from.query.redirect || to.path) as string;
  54. const redirect = decodeURIComponent(redirectPath);
  55. const nextData = to.path === redirect ? { ...to, replace: true } : { path: redirect };
  56. permissionStore.commitDynamicAddedRouteState(true);
  57. next(nextData);
  58. });
  59. }