cool-admin-vue/cool/core/set/router.js
2021-02-28 01:55:04 +08:00

117 lines
2.4 KiB
JavaScript

import VueRouter from 'vue-router'
import { Message } from "element-ui";
import store from "@/store";
import router, { ignore } from '@/router'
import storage from '../utils/storage'
// Remove Navigating to current location (XXX) is not allowed
const routerPush = VueRouter.prototype.push;
VueRouter.prototype.push = function push(location) {
return routerPush.call(this, location).catch((error) => error);
};
export default function () {
router.$plugin = {
addViews: (list, options) => {
if (!options) {
options = {};
}
// Parse route config
list.map((e) => {
if (!e.component) {
let url = e.viewPath;
if (url) {
if (
/^(http[s]?:\/\/)([0-9a-z.]+)(:[0-9]+)?([/0-9a-z.]+)?(\?[0-9a-z&=]+)?(#[0-9-a-z]+)?/i.test(
url
)
) {
e.meta.iframeUrl = url;
e.component = () => import(`cool/components/base/pages/iframe/index.vue`);
} else {
if (url.indexOf("views/") === 0) {
e.component = () => import(`@/${url}`);
} else {
console.error(url, "异常");
}
}
} else {
e.redirect = "/404";
}
}
});
// Batch add route
list.forEach((e) => {
router.addRoute("index", e);
});
// Add 404 rule
if (!options.ignore404) {
router.addRoute({
path: "*",
redirect: "/404"
});
}
},
to: (url) => {
if (router.path != url) {
router.push(url);
}
}
};
router.beforeEach((to, from, next) => {
const { token, browser } = store.getters
if (token) {
if (to.path.indexOf('/login') === 0) {
// 登录成功且 token 未过期,回到首页
if (!storage.isExpired('token')) {
return next('/')
}
} else {
// 添加路由进程
store.commit("ADD_PROCESS", {
label: (to.meta && to.meta.label) || to.name,
value: to.fullPath
});
}
} else {
if (!ignore.token.some((e) => to.path.indexOf(e) === 0)) {
return next("/login");
}
}
// H5 下关闭左侧菜单
if (browser.isMobile) {
store.commit("COLLAPSE_MENU", true);
}
next()
})
let lock = false;
router.onError((err) => {
if (!lock) {
lock = true;
if (err.code == "MODULE_NOT_FOUND") {
console.error(err.message.replace("Cannot find module ", ""), "路由组件不存在");
Message.error(`路由组件路径错误`);
} else {
console.error(err);
}
setTimeout(() => {
lock = false;
}, 0);
}
});
}