import Vue from 'vue'; import Router from 'vue-router'; import { routers } from './routers'; import cookie from '@/lib/cookie'; import { ROUTER_PERMISSION_TYPE } from './router-const'; import NProgress from 'nprogress'; import 'nprogress/nprogress.css'; const projectConfig = require('@/config/index.js'); Vue.use(Router); const router = new Router({ routes: routers }); // 解决路由跳转相同的地址报错 const originalPush = Router.prototype.push; Router.prototype.push = function(location) { try { return originalPush.call(this, location).catch(err => err); } catch (error) { // TODO zhuoda sentry console.error(error); } }; const LOGIN_PAGE_NAME = 'Login'; router.beforeEach((to, from, next) => { // 加载进度条 NProgress.start(); // 权限 const permissionType = to.meta.permissionType; // 不需要验证,直接放行 if (permissionType === ROUTER_PERMISSION_TYPE.NO_VALID.value) { next(); return; } const token = cookie.getToken(); // 需要登录 if (permissionType === ROUTER_PERMISSION_TYPE.NEED_LOGIN.value) { if (token) { next(); } else { next({ name: LOGIN_PAGE_NAME }); } return; } // 需要登录,且验证权限 if (permissionType === ROUTER_PERMISSION_TYPE.VALIDATE_PERMISSION.value) { if (!token) { // TODO 验证权限 next({ name: LOGIN_PAGE_NAME }); return; } } next({ name: 'Error404' }); }); router.afterEach(to => { NProgress.done(); window.scrollTo(0, 0); if (to.meta.title) { console.log(to.meta); document.title = to.meta.title + ' ' + projectConfig.title; } }); const tempCheckObj = { checkRouterNameMap: new Map(), checkRouterPathMap: new Map() }; function recursionCheckRouter(routerArray) { for (const routerItem of routerArray) { if (!routerItem.name) { console.error('没有配置router name', routerItem); } else { const existNameRouter = tempCheckObj.checkRouterNameMap.get( routerItem.name ); if (typeof existNameRouter !== 'undefined') { console.error('存在相同的router name', routerItem, existNameRouter); } else { tempCheckObj.checkRouterNameMap.set(routerItem.name, routerItem); } } if (!routerItem.path) { console.error('没有配置router path', routerItem); } else { // path必须以 / 开头 if (routerItem.path !== '*' && routerItem.path.indexOf('/') !== 0) { console.error('path 没有以/开头 ', routerItem); } const existPathRouter = tempCheckObj.checkRouterPathMap.get( routerItem.path ); if (typeof existPathRouter !== 'undefined') { console.error('存在相同的router path', routerItem, existPathRouter); } else { tempCheckObj.checkRouterPathMap.set(routerItem.path, routerItem); } } if (routerItem.children) { recursionCheckRouter(routerItem.children); } } } // 如果是开发环境,需要检测router的规范性 if (process.env.NODE_ENV === 'development') { recursionCheckRouter(routers); delete tempCheckObj.checkRouterNameMap; delete tempCheckObj.checkRouterPathMap; } export default router;