You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

206 lines
9.5 KiB

1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
  1. /**
  2. * 全站路由配置
  3. *
  4. * 建议:
  5. * 1. 代码中路由统一使用name属性跳转(不使用path属性)
  6. */
  7. import Vue from 'vue'
  8. import Router from 'vue-router'
  9. import http from '@/utils/httpRequest'
  10. import { isURL } from '@/utils/validate'
  11. import { clearLoginInfo } from '@/utils'
  12. import i18n from '@/i18n/i18n'
  13. Vue.use(Router)
  14. // 拦截重复导航
  15. // 开发环境不使用懒加载, 因为懒加载页面太多的话会造成webpack热更新太慢, 所以只有生产环境使用懒加载
  16. const _import = require('./import-' + process.env.NODE_ENV)
  17. // 全局路由(无需嵌套上左右整体布局)
  18. const globalRoutes = [
  19. { path: '/404', component: _import('common/404'), name: '404', meta: { title: '404未找到' } },
  20. { path: '/login', component: _import('common/login'), name: 'login', meta: { title: '登录' } },
  21. // 采购入库
  22. { path: "/purchaseInbound", name: "porecv", component: resolve => require(["@/views/modules/purchase-inbound/purchase-inbound.vue"], resolve), meta: { transition: 'instant', preload: true, keepAlive: true } },
  23. { path: "/recv", name: "recv", component: resolve => require(["@/views/modules/purchase-inbound/purchase-inbound.vue"], resolve), meta: { transition: 'instant', preload: true, keepAlive: true } },
  24. { path: "/qualifiedStorage", name: "qualifiedStorage", component: resolve => require(["@/views/modules/purchase-inbound/qualifiedStorage.vue"], resolve), meta: { transition: 'instant', preload: true, keepAlive: true } },
  25. // 入库上架页面
  26. {
  27. path: "/inboundStorage/:buNo/:inboundNo", name: "inboundStorage",
  28. component: resolve => require(["@/views/modules/purchase-inbound/inboundStorage.vue"], resolve), meta: { transition: 'instant', preload: true, keepAlive: true }
  29. },
  30. // 销售退货
  31. { path: "/salesReturn", name: "salesReturn", component: resolve => require(["@/views/modules/sales-return/sales-return.vue"], resolve), meta: { transition: 'instant', preload: true, keepAlive: true } },
  32. { path: "/salesReturnList", name: "salesReturnList", component: resolve => require(["@/views/modules/sales-return/salesReturnList.vue"], resolve), meta: { transition: 'instant', preload: true, keepAlive: true } },
  33. {
  34. path: "/salesReturnStorage/:returnNo/:partNo/:buNo", name: "SalesReturnStorage",
  35. component: resolve => require(["@/views/modules/sales-return/salesReturnStorage.vue"], resolve), meta: { transition: 'instant', preload: true, keepAlive: true }
  36. },
  37. // 生产发料
  38. { path: "/productionissue", name: "productionissue", component: resolve => require(["@/views/modules/production-issue/productionIssuePda.vue"], resolve), meta: { transition: 'instant', preload: true, keepAlive: true } },
  39. // 生产领料
  40. { path: "/production", name: "salesReturn", component: resolve => require(["@/views/modules/production-pick/production.vue"], resolve), meta: { transition: 'instant', preload: true, keepAlive: true } },
  41. { path: "/productionPicking", name: "productionPicking", component: resolve => require(["@/views/modules/production-pick/productionPicking.vue"], resolve), meta: { transition: 'instant', preload: true, keepAlive: true } },
  42. { path: "/productionPickingDetail/:buNo/:outboundNo", name: "productionPickingDetail", component: resolve => require(["@/views/modules/production-pick/productionPickingDetail.vue"], resolve), meta: { transition: 'instant', preload: true, keepAlive: true } },
  43. // 生产入库
  44. {
  45. path: "/productionInbound", name: "productionInbound",
  46. component: resolve => require(["@/views/modules/production/production-inbound.vue"], resolve), meta: { transition: 'instant', preload: true, keepAlive: true }
  47. },
  48. {
  49. path: "/productionQualifiedStorage", name: "productionQualifiedStorage",
  50. component: resolve => require(["@/views/modules/production/productionQualifiedStorage.vue"], resolve), meta: { transition: 'instant', preload: true, keepAlive: true }
  51. },
  52. {
  53. path: "/productionInboundStorage/:buNo/:inboundNo", name: "productionInboundStorage",
  54. component: resolve => require(["@/views/modules/production/productionInboundStorage.vue"], resolve), meta: { transition: 'instant', preload: true, keepAlive: true }
  55. },
  56. // 销售出库
  57. {
  58. path: "/salesOutbound", name: "salesOutbound",
  59. component: resolve => require(["@/views/modules/sales/sales-outbound.vue"], resolve), meta: { transition: 'instant', preload: true, keepAlive: true }
  60. },
  61. {
  62. path: "/salesOutboundList", name: "salesOutboundList",
  63. component: resolve => require(["@/views/modules/sales/salesOutboundList.vue"], resolve), meta: { transition: 'instant', preload: true, keepAlive: true }
  64. },
  65. {
  66. path: "/salesOutboundDetail/:buNo/:outboundNo", name: "salesOutboundDetail",
  67. component: resolve => require(["@/views/modules/sales/salesOutboundDetail.vue"], resolve), meta: { transition: 'instant', preload: true, keepAlive: true }
  68. },
  69. // 采购退货
  70. {
  71. path: "/purchaseReturn", name: "purchaseReturn",
  72. component: resolve => require(["@/views/modules/purchase-return/purchase-return.vue"], resolve), meta: { transition: 'instant', preload: true, keepAlive: true }
  73. },
  74. {
  75. path: "/purchaseReturnList", name: "purchaseReturnList",
  76. component: resolve => require(["@/views/modules/purchase-return/purchaseReturnList.vue"], resolve), meta: { transition: 'instant', preload: true, keepAlive: true }
  77. },
  78. {
  79. path: "/purchaseReturnDetail/:buNo/:returnNo", name: "purchaseReturnDetail",
  80. component: resolve => require(["@/views/modules/purchase-return/purchaseReturnDetail.vue"], resolve), meta: { transition: 'instant', preload: true, keepAlive: true }
  81. },
  82. // 其他出入库
  83. {
  84. path: "/otherInout", name: "otherInout",
  85. component: resolve => require(["@/views/modules/other-inout/other-inout.vue"], resolve), meta: { transition: 'instant', preload: true, keepAlive: true }
  86. },
  87. // 其他出库
  88. {
  89. path: "/otherOutboundList", name: "otherOutboundList",
  90. component: resolve => require(["@/views/modules/other-inout/otherOutboundList.vue"], resolve), meta: { transition: 'instant', preload: true, keepAlive: true }
  91. },
  92. {
  93. path: "/otherOutboundDetail/:buNo/:outboundNo", name: "otherOutboundDetail",
  94. component: resolve => require(["@/views/modules/other-inout/otherOutboundDetail.vue"], resolve), meta: { transition: 'instant', preload: true, keepAlive: true }
  95. },
  96. // 其他入库
  97. {
  98. path: "/otherInboundList", name: "otherInboundList",
  99. component: resolve => require(["@/views/modules/other-inout/otherInboundList.vue"], resolve), meta: { transition: 'instant', preload: true, keepAlive: true }
  100. },
  101. {
  102. path: "/otherInboundDetail/:inboundNo/:buNo", name: "otherInboundDetail",
  103. component: resolve => require(["@/views/modules/other-inout/otherInboundDetail.vue"], resolve), meta: { transition: 'instant', preload: true, keepAlive: true }
  104. },
  105. // 属性变动
  106. {
  107. path: "/propertyChange", name: "propertyChange",
  108. component: resolve => require(["@/views/modules/property-change/propertyChange.vue"], resolve), meta: { transition: 'instant', preload: true, keepAlive: true }
  109. },
  110. // 拆合组托
  111. {
  112. path: "/labelSplitMerge", name: "labelSplitMerge",
  113. component: resolve => require(["@/views/modules/label-split-merge/labelSplitMerge.vue"], resolve), meta: { transition: 'instant', preload: true, keepAlive: true }
  114. },
  115. ]
  116. // 主入口路由(需嵌套上左右整体布局)
  117. const mainRoutes = {
  118. path: '/',
  119. component: _import('main'),
  120. name: 'main',
  121. redirect: { name: 'home' },
  122. meta: { title: '主入口整体布局' },
  123. children: [
  124. { path: '/home', component: _import('common/home'), name: 'home', meta: { title: '首页' } },
  125. ],
  126. beforeEnter(to, from, next) {
  127. let token = Vue.cookie.get('token')
  128. if (!token || !/\S/.test(token)) {
  129. clearLoginInfo()
  130. next({ name: 'login' })
  131. }
  132. next()
  133. }
  134. }
  135. const router = new Router({
  136. mode: 'history',
  137. scrollBehavior() {
  138. return { x: 0, y: 0 }
  139. },
  140. isAddDynamicMenuRoutes: false, // 是否已经添加动态(菜单)路由
  141. routes: globalRoutes.concat(mainRoutes)
  142. })
  143. router.beforeEach((to, from, next) => {
  144. // 添加动态(菜单)路由
  145. // 1. 已经添加 or 全局路由, 直接访问
  146. // 2. 获取菜单列表, 添加并保存本地存储
  147. if (router.options.isAddDynamicMenuRoutes || fnCurrentRouteType(to, globalRoutes) === 'global') {
  148. next()
  149. } else {
  150. http({
  151. url: http.adornUrl('/sys/menu/nav'),
  152. method: 'get',
  153. params: { 'l': i18n.locale, menuType: "pc" }
  154. }).then(({ data }) => {
  155. if (data && data.code === 0) {
  156. //fnAddDynamicMenuRoutes(data.menuList)
  157. //router.options.isAddDynamicMenuRoutes = true
  158. sessionStorage.setItem('menuList', JSON.stringify(data.menuList || '[]'))
  159. sessionStorage.setItem('permissions', JSON.stringify(data.permissions || '[]'))
  160. //next({ ...to, replace: true })
  161. }
  162. }).catch((e) => {
  163. console.log(`%c${e} 请求菜单列表和权限失败,跳转至登录页!!`, 'color:blue')
  164. router.push({ name: 'login' })
  165. })
  166. router.options.isAddDynamicMenuRoutes = true
  167. next({ ...to, replace: true })
  168. }
  169. })
  170. /**
  171. * 判断当前路由类型, global: 全局路由, main: 主入口路由
  172. * @param {*} route 当前路由
  173. */
  174. function fnCurrentRouteType(route, globalRoutes = []) {
  175. var temp = []
  176. for (var i = 0; i < globalRoutes.length; i++) {
  177. if (route.path === globalRoutes[i].path) {
  178. return 'global'
  179. } else if (globalRoutes[i].children && globalRoutes[i].children.length >= 1) {
  180. temp = temp.concat(globalRoutes[i].children)
  181. }
  182. }
  183. return temp.length >= 1 ? fnCurrentRouteType(route, temp) : 'main'
  184. }
  185. export default router