/** * 路由配置 */ 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, getCurrentUser } from '@/utils/token-util'; import { routes, getMenuRoutes } from './routes'; import { changeRole } from '@/api/layout/index'; Vue.use(VueRouter); const router = new VueRouter({ base: window.__POWERED_BY_QIANKUN__ ? '/page-wms/' : '/wms/', routes, mode: 'history', scrollBehavior () { return { y: 0 }; } }); /** * 路由守卫 */ router.beforeEach((to, from, next) => { if (!from.path.includes(REDIRECT_PATH)) { NProgress.start(); } // 判断是否登录 if (getToken()) { // 还未注册动态路由则先获取 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 { // 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 = getCurrentUser() 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(() => { window.location.reload() }, 100); } // next({ ...to, replace: true }); }; export default router;