handleRoutes.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. import { templatePreviewKeepalive, querySqlPreviewKeepalive } from '@/config'
  2. const ignoreField = [
  3. 'activeTab',
  4. 'alias',
  5. 'id',
  6. 'menuIcon',
  7. 'pkVal',
  8. 'sn',
  9. 'sysMethods',
  10. 'tabsStyle',
  11. 'tenantId',
  12. 'parentId',
  13. ]
  14. // 需要实现keepalive的路由列表
  15. const keepaliveRoutes = [
  16. {
  17. alias: 'myTask',
  18. name: 'MyTask',
  19. },
  20. {
  21. alias: 'startProcess',
  22. name: 'StartProcess',
  23. },
  24. ]
  25. if (templatePreviewKeepalive) {
  26. keepaliveRoutes.push({
  27. alias: 'templatePreview',
  28. name: 'TemplatePreview',
  29. })
  30. }
  31. if (querySqlPreviewKeepalive) {
  32. keepaliveRoutes.push({
  33. alias: 'querySqlPreview',
  34. name: 'QuerySqlPreview',
  35. })
  36. }
  37. // 注册的路由name可能与组件的Name不一致,需要修改route的name与组件的name保持一致才能让keepalive生效
  38. const keepaliveTransfer = (route) => {
  39. if (!route.alias) {
  40. return
  41. }
  42. const matchRoute = keepaliveRoutes.find((r) => r.alias == route.alias)
  43. if (matchRoute && matchRoute.name) {
  44. route.name = matchRoute.name
  45. }
  46. }
  47. // 路由对应的Component转换处理
  48. const componentTransfer = (route) => {
  49. if (!route.component) {
  50. return
  51. }
  52. if (route.component === 'Layout') {
  53. route.component = (resolve) => require(['@/components/layouts'], resolve)
  54. } else if (route.component === 'EmptyLayout') {
  55. route.component = (resolve) =>
  56. require(['@/components/layouts/EmptyLayout'], resolve)
  57. } else if (route.component === 'DatavLayout') {
  58. route.component = (resolve) =>
  59. require(['@/components/datav/DatavDesignPreview.vue'], resolve)
  60. } else if (route.component === 'TemplateLayout') {
  61. // 注册为keepalive的路由
  62. templatePreviewKeepalive && registerKeepaliveRoute(route, 'TemplatePreview')
  63. route.component = (resolve) =>
  64. require(['@/components/dataTemplate/TemplatePreview.vue'], resolve)
  65. } else if (route.component === 'QuerySqlLayout') {
  66. // 注册为keepalive的路由
  67. querySqlPreviewKeepalive && registerKeepaliveRoute(route, 'QuerySqlPreview')
  68. route.component = (resolve) =>
  69. require(['@/components/querySql/QuerySqlPreview.vue'], resolve)
  70. } else if (route.component === 'indexLayout') {
  71. route.component = (resolve) => require(['@/views/home/index'], resolve)
  72. } else if (route.component === 'OnlineMenu') {
  73. route.component = (resolve) => require(['@/views/OnlineMenu'], resolve)
  74. } else if (route.component === 'MultilevelMenuLayout') {
  75. route.component = (resolve) =>
  76. require(['@/components/layouts/MultilevelMenuLayout'], resolve)
  77. } else {
  78. const index = route.component.indexOf('views')
  79. const path =
  80. index > 0 ? route.component.slice(index) : `views/${route.component}`
  81. route.component = (resolve) => require([`@/${path}`], resolve)
  82. }
  83. }
  84. /**
  85. * 注册需要keepalive的路由
  86. */
  87. const registerKeepaliveRoute = (route, name) => {
  88. if (!route || !route.path) {
  89. return
  90. }
  91. route.name = name
  92. }
  93. /**
  94. * 后台传过来的路由需要转换
  95. * @param {*} asyncRoutes
  96. * @returns
  97. */
  98. export function convertRouter(asyncRoutes) {
  99. let r = asyncRoutes
  100. let routePaths = []
  101. for (let i = r.length - 1; i >= 0; i--) {
  102. let route = r[i]
  103. // keepalive的路由处理
  104. keepaliveTransfer(route)
  105. let extend = (route.routeExtend && JSON.parse(route.routeExtend)) || {
  106. ...route,
  107. meta: { title: route.name, href: route.href, isChildren: true },
  108. component: 'OnlineMenu',
  109. path: `/onlineMenu/${getCurrentPath(route.path)}`,
  110. }
  111. !route.href && delete route.href
  112. delete route.routeExtend
  113. Object.keys(extend).forEach((key) => {
  114. route[key] = extend[key]
  115. })
  116. ignoreField.forEach((field) => {
  117. delete route[field]
  118. })
  119. //处理路由中的参数
  120. let path = route.path
  121. if (path.indexOf('?') !== -1) {
  122. const paths = path.split('?')
  123. if (paths.length > 1) {
  124. let routerParams = {}
  125. const params = paths[1].split('&')
  126. if (params.length > 0) {
  127. params.forEach((param) => {
  128. const paraValues = param.split('=')
  129. routerParams[paraValues[0]] = paraValues[1]
  130. })
  131. }
  132. route.path = paths[0]
  133. route.meta = { ...route.meta, ...routerParams }
  134. }
  135. }
  136. if (routePaths.includes(route.path)) {
  137. console.error(`存在相同的路由路径[${route.path}]`)
  138. r.splice(i, 1)
  139. } else {
  140. routePaths.push(route.path)
  141. }
  142. // 路由对应的Component的转换处理
  143. componentTransfer(route)
  144. if (route.children && route.children.length) {
  145. route.children = convertRouter(route.children)
  146. }
  147. if (route.children && route.children.length === 0) delete route.children
  148. }
  149. return r
  150. }
  151. function getCurrentPath(path) {
  152. const onlineMenuPath = path.split('.')
  153. return onlineMenuPath[onlineMenuPath.length - 2]
  154. }
  155. export const keepaliveIncludes = keepaliveRoutes.reduce((ary, cur) => {
  156. ary.push(cur.name)
  157. return ary
  158. }, [])