mirror of
https://gitee.com/lab1024/smart-admin.git
synced 2025-09-17 10:56:39 +08:00
132 lines
3.2 KiB
JavaScript
132 lines
3.2 KiB
JavaScript
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;
|