import Vue from "vue"; import VueRouter from "vue-router"; import { formatRoutes } from "@/utils/routerUtil"; import { i18n } from "@/utils/i18n"; import store from "@/store"; import { mergeI18nFromRoutes } from "@/utils/i18n"; Vue.use(VueRouter); //解决重复路由报错 const originalPush = VueRouter.prototype.push; // 修改原型对象中的push方法 VueRouter.prototype.push = function push(location) { return originalPush.call(this, location).catch((err) => err); }; const routes = [ { path: "/jump", name: "跳转页面", component: () => import("@/pages/basicset/jump/jump"), }, { path: "*", name: "404", component: () => import("@/pages/exception/404"), }, { path: "/403", name: "403", component: () => import("@/pages/exception/403"), }, ]; formatRoutes(routes); const router = new VueRouter({ routes, }); // 不需要登录拦截的路由配置 const loginIgnore = { names: ["404", "403"], //根据路由名称匹配 paths: ["/login", "/jump"], //根据路由fullPath匹配 /** * 判断路由是否包含在该配置中 * @param route vue-router 的 route 对象 * @returns {boolean} */ includes(route) { return this.names.includes(route.name) || this.paths.includes(route.path); }, }; /** * 初始化路由实例 * @returns {VueRouter} */ function initRouter() { // 是否异步路由模式 const options = store.state.setting.asyncRoutes ? require("./async/config.async").default : require("./config").default; formatRoutes(options.routes); return options; } // 判断权限 function permission(router, role) { if (router.meta && router.meta.roles) { return router.meta.roles.includes(role); } else { return true; } } // 计算动态路由 function calcRouters(dynamicRouter, role) { // 过滤 let res = dynamicRouter.filter((v) => { // 判断是否有权限访问此路由 if (permission(v, role)) { // 判断有没有子路由 if (v.children) { // 递归 v.children = calcRouters(v.children, role); } return true; } else { return false; } }); return res; } // 动态菜单 function createMenus() { let role = store.getters["site/userInfo"].name; if (!role) return; let options = initRouter(); let routesArr = calcRouters(options.routes, role); const rootRoute = routesArr.find((item) => item.path === "/"); const menuRoutes = rootRoute && rootRoute.children; mergeI18nFromRoutes(i18n, menuRoutes); if (menuRoutes) { routesArr.forEach((v) => { router.addRoute(v); }); store.commit("setting/setMenuData", menuRoutes); } } createMenus(); export { loginIgnore, initRouter, createMenus, router };