import router from './router' import NProgress from 'nprogress' import 'nprogress/nprogress.css' import { Message } from 'element-ui' import { Route } from 'vue-router' import { UserModule } from '@/store/modules/user' import { PermissionModule } from '@/store/modules/permission' import i18n from '@/lang' // Internationalization import settings from './settings' NProgress.configure({ showSpinner: false }) const whiteList = ['/login', '/auth-redirect'] const getPageTitle = (key: string) => { const hasKey = i18n.te(`route.${key}`) if (hasKey) { const pageName = i18n.t(`route.${key}`) return `${pageName} - ${settings.title}` } return `${settings.title}` } router.beforeEach(async(to: Route, _: Route, next: any) => { // Start progress bar NProgress.start() // Determine whether the user has logged in if (UserModule.token) { if (to.path === '/login') { // If is logged in, redirect to the home page next({ path: '/' }) NProgress.done() } else { // Check whether the user has obtained his permission roles if (PermissionModule.authorizedPermissions.length === 0) { try { const { sub } = await UserModule.GetUserInfo() // Generate accessible routes map based on role await PermissionModule.GenerateRoutes(sub) // Dynamically add accessible routes router.addRoutes(PermissionModule.dynamicRoutes) // Hack: ensure addRoutes is complete // Set the replace: true, so the navigation will not leave a history record next({ ...to, replace: true }) } catch (err) { // Remove token and redirect to login page UserModule.ResetToken() PermissionModule.ResetPermissions() Message.error(err || 'Has Error') next(`/login?redirect=${to.path}`) NProgress.done() } } else { next() } } } else { // Has no token if (whiteList.indexOf(to.path) !== -1) { // In the free login whitelist, go directly next() } else { // Other pages that do not have permission to access are redirected to the login page. next(`/login?redirect=${to.path}`) NProgress.done() } } }) router.afterEach((to: Route) => { // Finish progress bar NProgress.done() // set page title document.title = getPageTitle(to.meta.title) })