123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- import type { RouteRecordRaw } from 'vue-router';
- import { isNavigationFailure, Router } from 'vue-router';
- import { useUserStoreWidthOut } from '@/store/modules/user';
- import { useAsyncRouteStoreWidthOut } from '@/store/modules/asyncRoute';
- // import { downloadJsonStoreWidthOut } from '@/store/modules/downloadJson';
- import { ACCESS_TOKEN } from '@/store/mutation-types';
- import { storage } from '@/utils/Storage';
- import { PageEnum } from '@/enums/pageEnum';
- import { ErrorPageRoute } from '@/router/base';
- import { getBaseLoginUrl } from '@/utils/env';
- // const LOGIN_PATH = PageEnum.BASE_LOGIN;
- // const FEISHU_LOGIN_PATH = PageEnum.BASE_FEISHU_LOGIN;
- // const SYSTEM_SELECT_PATH = PageEnum.SYSTEM_SELECT_PAGE;
- const whitePathList = [
- // LOGIN_PATH,
- // FEISHU_LOGIN_PATH,
- // SYSTEM_SELECT_PATH
- ]; // no redirect whitelist
- export function createRouterGuards(router: Router) {
- const userStore = useUserStoreWidthOut();
- const asyncRouteStore = useAsyncRouteStoreWidthOut();
- // const downloadJsonStore = downloadJsonStoreWidthOut();
- router.beforeEach(async (to, from, next) => {
- const Loading = window['$loading'] || null;
- Loading && Loading.start();
- // if (from.path === LOGIN_PATH && to.name === 'errorPage') {
- // next(PageEnum.BASE_HOME);
- // return;
- // }
- console.log('to.path:', to.path);
- // Whitelist can be directly entered
- if (whitePathList.includes(to.path as PageEnum)) {
- next();
- return;
- }
- const token = storage.get(ACCESS_TOKEN);
- if (!token) {
- window.open(getBaseLoginUrl(), '_self');
- next(PageEnum.BASE_LOGIN);
- return;
- // You can access without permissions. You need to set the routing meta.ignoreAuth to true
- if (to.meta.ignoreAuth) {
- next();
- return;
- }
- // redirect login page
- const redirectData: { path: string; replace: boolean; query?: Recordable<string> } = {
- // path: LOGIN_PATH,
- path: PageEnum.BASE_HOME,
- replace: true,
- };
- if (to.path) {
- redirectData.query = {
- ...redirectData.query,
- redirect: to.path,
- };
- }
- next(redirectData);
- return;
- }
- if (asyncRouteStore.getIsDynamicAddedRoute) {
- next();
- return;
- }
- const userInfo = await userStore.GetInfo();
- await userStore.GetConfig();
- const routes = await asyncRouteStore.generateRoutes(userInfo);
- // @ts-ignore
- // downloadJsonStore.downloadALL(config.json_version);
- routes.forEach((item) => {
- router.addRoute(item as unknown as RouteRecordRaw);
- });
- const isErrorPage = router.getRoutes().findIndex((item) => item.name === ErrorPageRoute.name);
- if (isErrorPage === -1) {
- router.addRoute(ErrorPageRoute as unknown as RouteRecordRaw);
- }
- const redirectPath = (from.query.redirect || to.path) as string;
- const redirect = decodeURIComponent(redirectPath);
- const nextData = to.path === redirect ? { ...to, replace: true } : { path: redirect };
- asyncRouteStore.setDynamicAddedRoute(true);
- next(nextData);
- Loading && Loading.finish();
- });
- router.afterEach((to, _, failure) => {
- document.title = (to?.meta?.title as string) || document.title;
- if (isNavigationFailure(failure)) {
- //console.log('failed navigation', failure)
- }
- const asyncRouteStore = useAsyncRouteStoreWidthOut();
- // 在这里设置需要缓存的组件名称
- const keepAliveComponents = asyncRouteStore.keepAliveComponents;
- const currentComName: any = to.matched.find((item) => item.name == to.name)?.name;
- if (currentComName && !keepAliveComponents.includes(currentComName) && to.meta?.keepAlive) {
- // 需要缓存的组件
- keepAliveComponents.push(currentComName);
- } else if (!to.meta?.keepAlive || to.name == 'Redirect') {
- // 不需要缓存的组件
- const index = asyncRouteStore.keepAliveComponents.findIndex((name) => name == currentComName);
- if (index != -1) {
- keepAliveComponents.splice(index, 1);
- }
- }
- asyncRouteStore.setKeepAliveComponents(keepAliveComponents);
- const Loading = window['$loading'] || null;
- Loading && Loading.finish();
- });
- router.onError((error) => {
- console.log(error, '路由错误');
- });
- }
|