router-guards.ts 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. import type { RouteRecordRaw } from 'vue-router';
  2. import { isNavigationFailure, Router } from 'vue-router';
  3. import { useUserStoreWidthOut } from '@/store/modules/user';
  4. import { useAsyncRouteStoreWidthOut } from '@/store/modules/asyncRoute';
  5. import { ACCESS_TOKEN } from '@/store/mutation-types';
  6. import { storage } from '@/utils/Storage';
  7. import { PageEnum } from '@/enums/pageEnum';
  8. import { ErrorPageRoute } from '@/router/base';
  9. import NProgress from 'nprogress';
  10. const LOGIN_PATH = PageEnum.BASE_LOGIN;
  11. const whitePathList = [LOGIN_PATH]; // no redirect whitelist
  12. export function createRouterGuards(router: Router) {
  13. const userStore = useUserStoreWidthOut();
  14. const asyncRouteStore = useAsyncRouteStoreWidthOut();
  15. router.beforeEach(async (to, from, next) => {
  16. NProgress.start();
  17. if (from.path === LOGIN_PATH && to.name === 'errorPage') {
  18. next(PageEnum.BASE_HOME);
  19. return;
  20. }
  21. // Whitelist can be directly entered
  22. if (whitePathList.includes(to.path as PageEnum)) {
  23. next();
  24. return;
  25. }
  26. const token = storage.get(ACCESS_TOKEN);
  27. if (!token) {
  28. // You can access without permissions. You need to set the routing meta.ignoreAuth to true
  29. if (to.meta.ignoreAuth) {
  30. next();
  31. return;
  32. }
  33. // redirect login page
  34. const redirectData: { path: string; replace: boolean; query?: Recordable<string> } = {
  35. path: LOGIN_PATH,
  36. replace: true,
  37. };
  38. if (to.path) {
  39. redirectData.query = {
  40. ...redirectData.query,
  41. redirect: to.path,
  42. };
  43. }
  44. next(redirectData);
  45. return;
  46. }
  47. if (asyncRouteStore.getIsDynamicAddedRoute) {
  48. next();
  49. return;
  50. }
  51. const userInfo = await userStore.GetInfo();
  52. const routes = await asyncRouteStore.generateRoutes(userInfo);
  53. // 动态添加可访问路由表
  54. routes.forEach((item) => {
  55. router.addRoute(item as unknown as RouteRecordRaw);
  56. });
  57. //添加404
  58. const isErrorPage = router.getRoutes().findIndex((item) => item.name === ErrorPageRoute.name);
  59. if (isErrorPage === -1) {
  60. router.addRoute(ErrorPageRoute as unknown as RouteRecordRaw);
  61. }
  62. const redirectPath = (from.query.redirect || to.path) as string;
  63. const redirect = decodeURIComponent(redirectPath);
  64. const nextData = to.path === redirect ? { ...to, replace: true } : { path: redirect };
  65. asyncRouteStore.setDynamicAddedRoute(true);
  66. NProgress.done();
  67. next(nextData);
  68. });
  69. router.afterEach((to, _, failure) => {
  70. //handleKeepAlive(to);
  71. document.title =
  72. (to?.meta?.documentTitle ? to?.meta?.documentTitle : (to?.meta?.title as string)) ||
  73. document.title;
  74. if (isNavigationFailure(failure)) {
  75. //console.log('failed navigation', failure)
  76. }
  77. const asyncRouteStore = useAsyncRouteStoreWidthOut();
  78. // 在这里设置需要缓存的组件名称
  79. const keepAliveComponents = asyncRouteStore.keepAliveComponents;
  80. const currentComName: any = to.matched.find((item) => item.name == to.name)?.name;
  81. if (currentComName && !keepAliveComponents.includes(currentComName) && to.meta?.keepAlive) {
  82. // 需要缓存的组件
  83. keepAliveComponents.push(currentComName);
  84. } else if (!to.meta?.keepAlive || to.name == 'Redirect') {
  85. // 不需要缓存的组件
  86. const index = asyncRouteStore.keepAliveComponents.findIndex((name) => name == currentComName);
  87. if (index != -1) {
  88. keepAliveComponents.splice(index, 1);
  89. }
  90. }
  91. asyncRouteStore.setKeepAliveComponents(keepAliveComponents);
  92. NProgress.done();
  93. });
  94. }