123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- 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);
- }
- });
- }
|