/** * 路由配置 */ import Vue from 'vue'; import NProgress from 'nprogress'; import VueRouter from 'vue-router'; import { WHITE_LIST, REDIRECT_PATH, LAYOUT_PATH } from '@/config/setting'; import store from '@/store'; import { getToken, setToken } from '@/utils/token-util'; import { routes, getMenuRoutes } from './routes'; import { getLoginUser } from '@/api/login'; import { changeRole } from '@/api/layout/index'; Vue.use(VueRouter); const router = new VueRouter({ routes, mode: 'history', scrollBehavior() { return { y: 0 }; } }); /** * 路由守卫 */ router.beforeEach((to, from, next) => { console.log(to, 'beforeEach-to'); console.log(from, 'beforeEach-from'); if (!from.path.includes(REDIRECT_PATH)) { NProgress.start(); } // 判断是否登录 if (getToken()) { if (!store.state.user.info?.userId) { getLoginUser().then((res) => { store.commit('user/setUserInfo', res); }); } // 还未注册动态路由则先获取 if (!store.state.user.menus) { store .dispatch('user/fetchUserInfo') .then(({ menus, homePath, authoritiesRouter }) => { if (menus) { router.addRoute( getMenuRoutes([...menus, ...authoritiesRouter], homePath) ); next({ ...to, replace: true }); } }) .catch((e) => { console.error(e); next(); }); } else { // 判断外链并跳转 if (to.meta) { if (to.meta.source && to.meta.source == 2) { next({ path: `/sourceLink`, query: { link: to.meta.path } }); return; } } // console.log(router.getRoutes(), 'router', routes); if (routes.length >= router.getRoutes()?.length) { router.addRoute( getMenuRoutes([ ...store.state.user.menus, ...store.state.user.authoritiesRouter, to.fullPath ]) ); next({ ...to }); } else { next(); } } } else if (WHITE_LIST.includes(to.path)) { next(); } else { next({ path: '/login', query: to.path === LAYOUT_PATH ? {} : { from: to.path } }); } }); router.afterEach((to) => { if (!to.path.includes(REDIRECT_PATH) && NProgress.isStarted()) { setTimeout(() => { NProgress.done(true); }, 200); } }); router.roleChange = async ({ menus, homePath, authoritiesRouter }) => { const currentUser = JSON.parse(sessionStorage['currentUser']); if (menus && menus.length > 0) { router.addRoute(getMenuRoutes([...menus, ...authoritiesRouter], homePath)); if (router.currentRoute.path != (menus[0].redirect || menus[0].path)) { await router.replace({ path: menus[0].redirect || menus[0].path }); } const newToken = await changeRole({ groupId: currentUser.currentGroupId, roleId: currentUser.currentRoleId }); setToken(newToken); setTimeout(() => { [ 'vuex-eos', 'vuex-wt', 'vuex-aps', 'vuex-mes', 'vuex-eam', 'vuex-pro', 'vuex-fm', 'vuex-main-data', 'vuex-wms', 'vuex-qms', 'vuex-vis' ].forEach((key) => { sessionStorage.removeItem(key); }); window.location.reload(); }, 100); } // next({ ...to, replace: true }); }; export default router;