/** * 全站路由配置 * * 建议: * 1. 代码中路由统一使用name属性跳转(不使用path属性) */ import Vue from 'vue' import Router from 'vue-router' import http from '@/utils/httpRequest' import { isURL } from '@/utils/validate' import { clearLoginInfo } from '@/utils' import i18n from '@/i18n/i18n' Vue.use(Router) // 拦截重复导航 // 开发环境不使用懒加载, 因为懒加载页面太多的话会造成webpack热更新太慢, 所以只有生产环境使用懒加载 const _import = require('./import-' + process.env.NODE_ENV) // 全局路由(无需嵌套上左右整体布局) const globalRoutes = [ { path: '/404', component: _import('common/404'), name: '404', meta: { title: '404未找到' } }, { path: '/login', component: _import('common/login'), name: 'login', meta: { title: '登录' } }, // 采购入库 { path: "/purchaseInbound", name: "porecv", component: resolve => require(["@/views/modules/purchase-inbound/purchase-inbound.vue"], resolve), meta: { transition: 'instant', preload: true, keepAlive: true } }, { path: "/recv", name: "recv", component: resolve => require(["@/views/modules/purchase-inbound/purchase-inbound.vue"], resolve), meta: { transition: 'instant', preload: true, keepAlive: true } }, { path: "/qualifiedStorage", name: "qualifiedStorage", component: resolve => require(["@/views/modules/purchase-inbound/qualifiedStorage.vue"], resolve), meta: { transition: 'instant', preload: true, keepAlive: true } }, // 入库上架页面 { path: "/inboundStorage/:buNo/:inboundNo", name: "inboundStorage", component: resolve => require(["@/views/modules/purchase-inbound/inboundStorage.vue"], resolve), meta: { transition: 'instant', preload: true, keepAlive: true } }, // 销售退货 { path: "/salesReturn", name: "salesReturn", component: resolve => require(["@/views/modules/sales-return/sales-return.vue"], resolve), meta: { transition: 'instant', preload: true, keepAlive: true } }, { path: "/salesReturnList", name: "salesReturnList", component: resolve => require(["@/views/modules/sales-return/salesReturnList.vue"], resolve), meta: { transition: 'instant', preload: true, keepAlive: true } }, { path: "/salesReturnStorage/:returnNo/:partNo/:buNo", name: "SalesReturnStorage", component: resolve => require(["@/views/modules/sales-return/salesReturnStorage.vue"], resolve), meta: { transition: 'instant', preload: true, keepAlive: true } }, // 生产发料 { path: "/productionissue", name: "productionissue", component: resolve => require(["@/views/modules/production-issue/productionIssuePda.vue"], resolve), meta: { transition: 'instant', preload: true, keepAlive: true } }, // 生产领料 { path: "/production", name: "salesReturn", component: resolve => require(["@/views/modules/production-pick/production.vue"], resolve), meta: { transition: 'instant', preload: true, keepAlive: true } }, { path: "/productionPicking", name: "productionPicking", component: resolve => require(["@/views/modules/production-pick/productionPicking.vue"], resolve), meta: { transition: 'instant', preload: true, keepAlive: true } }, { path: "/productionPickingDetail/:buNo/:outboundNo", name: "productionPickingDetail", component: resolve => require(["@/views/modules/production-pick/productionPickingDetail.vue"], resolve), meta: { transition: 'instant', preload: true, keepAlive: true } }, // 生产入库 { path: "/productionInbound", name: "productionInbound", component: resolve => require(["@/views/modules/production/production-inbound.vue"], resolve), meta: { transition: 'instant', preload: true, keepAlive: true } }, { path: "/productionQualifiedStorage", name: "productionQualifiedStorage", component: resolve => require(["@/views/modules/production/productionQualifiedStorage.vue"], resolve), meta: { transition: 'instant', preload: true, keepAlive: true } }, { path: "/productionInboundStorage/:buNo/:inboundNo", name: "productionInboundStorage", component: resolve => require(["@/views/modules/production/productionInboundStorage.vue"], resolve), meta: { transition: 'instant', preload: true, keepAlive: true } }, // 销售出库 { path: "/salesOutbound", name: "salesOutbound", component: resolve => require(["@/views/modules/sales/sales-outbound.vue"], resolve), meta: { transition: 'instant', preload: true, keepAlive: true } }, { path: "/salesOutboundList", name: "salesOutboundList", component: resolve => require(["@/views/modules/sales/salesOutboundList.vue"], resolve), meta: { transition: 'instant', preload: true, keepAlive: true } }, { path: "/salesOutboundDetail/:buNo/:outboundNo", name: "salesOutboundDetail", component: resolve => require(["@/views/modules/sales/salesOutboundDetail.vue"], resolve), meta: { transition: 'instant', preload: true, keepAlive: true } }, // 采购退货 { path: "/purchaseReturn", name: "purchaseReturn", component: resolve => require(["@/views/modules/purchase-return/purchase-return.vue"], resolve), meta: { transition: 'instant', preload: true, keepAlive: true } }, { path: "/purchaseReturnList", name: "purchaseReturnList", component: resolve => require(["@/views/modules/purchase-return/purchaseReturnList.vue"], resolve), meta: { transition: 'instant', preload: true, keepAlive: true } }, { path: "/purchaseReturnDetail/:buNo/:returnNo", name: "purchaseReturnDetail", component: resolve => require(["@/views/modules/purchase-return/purchaseReturnDetail.vue"], resolve), meta: { transition: 'instant', preload: true, keepAlive: true } }, // 其他出入库 { path: "/otherInout", name: "otherInout", component: resolve => require(["@/views/modules/other-inout/other-inout.vue"], resolve), meta: { transition: 'instant', preload: true, keepAlive: true } }, // 其他出库 { path: "/otherOutboundList", name: "otherOutboundList", component: resolve => require(["@/views/modules/other-inout/otherOutboundList.vue"], resolve), meta: { transition: 'instant', preload: true, keepAlive: true } }, { path: "/otherOutboundDetail/:buNo/:outboundNo", name: "otherOutboundDetail", component: resolve => require(["@/views/modules/other-inout/otherOutboundDetail.vue"], resolve), meta: { transition: 'instant', preload: true, keepAlive: true } }, // 其他入库 { path: "/otherInboundList", name: "otherInboundList", component: resolve => require(["@/views/modules/other-inout/otherInboundList.vue"], resolve), meta: { transition: 'instant', preload: true, keepAlive: true } }, { path: "/otherInboundDetail/:inboundNo/:buNo", name: "otherInboundDetail", component: resolve => require(["@/views/modules/other-inout/otherInboundDetail.vue"], resolve), meta: { transition: 'instant', preload: true, keepAlive: true } }, // 属性变动 { path: "/propertyChange", name: "propertyChange", component: resolve => require(["@/views/modules/property-change/propertyChange.vue"], resolve), meta: { transition: 'instant', preload: true, keepAlive: true } }, // 拆合组托 { path: "/labelSplitMerge", name: "labelSplitMerge", component: resolve => require(["@/views/modules/label-split-merge/labelSplitMerge.vue"], resolve), meta: { transition: 'instant', preload: true, keepAlive: true } }, ] // 主入口路由(需嵌套上左右整体布局) const mainRoutes = { path: '/', component: _import('main'), name: 'main', redirect: { name: 'home' }, meta: { title: '主入口整体布局' }, children: [ { path: '/home', component: _import('common/home'), name: 'home', meta: { title: '首页' } }, ], beforeEnter(to, from, next) { let token = Vue.cookie.get('token') if (!token || !/\S/.test(token)) { clearLoginInfo() next({ name: 'login' }) } next() } } const router = new Router({ mode: 'history', scrollBehavior() { return { x: 0, y: 0 } }, isAddDynamicMenuRoutes: false, // 是否已经添加动态(菜单)路由 routes: globalRoutes.concat(mainRoutes) }) router.beforeEach((to, from, next) => { // 添加动态(菜单)路由 // 1. 已经添加 or 全局路由, 直接访问 // 2. 获取菜单列表, 添加并保存本地存储 if (router.options.isAddDynamicMenuRoutes || fnCurrentRouteType(to, globalRoutes) === 'global') { next() } else { http({ url: http.adornUrl('/sys/menu/nav'), method: 'get', params: { 'l': i18n.locale, menuType: "pc" } }).then(({ data }) => { if (data && data.code === 0) { //fnAddDynamicMenuRoutes(data.menuList) //router.options.isAddDynamicMenuRoutes = true sessionStorage.setItem('menuList', JSON.stringify(data.menuList || '[]')) sessionStorage.setItem('permissions', JSON.stringify(data.permissions || '[]')) //next({ ...to, replace: true }) } }).catch((e) => { console.log(`%c${e} 请求菜单列表和权限失败,跳转至登录页!!`, 'color:blue') router.push({ name: 'login' }) }) router.options.isAddDynamicMenuRoutes = true next({ ...to, replace: true }) } }) /** * 判断当前路由类型, global: 全局路由, main: 主入口路由 * @param {*} route 当前路由 */ function fnCurrentRouteType(route, globalRoutes = []) { var temp = [] for (var i = 0; i < globalRoutes.length; i++) { if (route.path === globalRoutes[i].path) { return 'global' } else if (globalRoutes[i].children && globalRoutes[i].children.length >= 1) { temp = temp.concat(globalRoutes[i].children) } } return temp.length >= 1 ? fnCurrentRouteType(route, temp) : 'main' } export default router