utils.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. import layoutHeaderAside from '@/layout/header-aside'
  2. import menuUtil from '@/utils/menu'
  3. // 由于懒加载页面太多的话会造成webpack热更新太慢,所以开发环境不使用懒加载,只有生产环境使用懒加载
  4. const _import = require('@/utils/util.import.' + process.env.NODE_ENV)
  5. const meta = { auth: true }
  6. /**
  7. * 动态布局
  8. */
  9. function getLayout() {
  10. return layoutHeaderAside
  11. }
  12. /**
  13. * 错误页面
  14. */
  15. const errorPage = {
  16. path: '*',
  17. redirect: '/404',
  18. hidden: true
  19. }
  20. const errorUrl = '/system/error/404'
  21. const idKey = menuUtil.ID_KEY
  22. const labelKey = menuUtil.LABEL_KEY
  23. const nameKey = menuUtil.NAME_KEY
  24. const iconKey = menuUtil.ICON_KEY
  25. const parentIdKey = menuUtil.PARENT_KEY
  26. const childrenKey = menuUtil.CHILD_KEY
  27. const urlKey = menuUtil.URL_KEY
  28. const layoutKey = 'layout'
  29. const defaultRouterAlias = '/router-alias/'
  30. // 异步挂载的路由
  31. // 动态需要根据权限加载的路由表 该路由表通过后台获取
  32. export function generateRoutes(menus) {
  33. const asyncRouterMap = []
  34. for (const menu of menus) {
  35. asyncRouterMap.push(generateTopRoute(menu))
  36. }
  37. asyncRouterMap.push(errorPage)
  38. return asyncRouterMap
  39. }
  40. /**
  41. * 构建第一级路由
  42. * @param {*} menu
  43. */
  44. function generateTopRoute(menu) {
  45. const router = {
  46. id: menu[idKey],
  47. parentId: menu[parentIdKey],
  48. path: '/' + menu[nameKey],
  49. alias: defaultRouterAlias + menu[nameKey],
  50. name: menu[nameKey],
  51. component: getLayout(menu[layoutKey]),
  52. meta: {
  53. title: menu[labelKey],
  54. icon: menu[iconKey] || 'file-o',
  55. name: menu[nameKey],
  56. defaultUrl: menu[urlKey],
  57. ...meta
  58. }
  59. }
  60. if (menu[childrenKey] && menu[childrenKey].length > 0) {
  61. router.children = generateSubRoutes(menu[childrenKey])
  62. } else {
  63. // 添加顶部默认节点
  64. router.children = [
  65. {
  66. id: menu[idKey],
  67. parentId: menu[parentIdKey],
  68. path: 'index',
  69. name: menu[nameKey] + 'index',
  70. alias: defaultRouterAlias + menu[nameKey],
  71. component: getComputedUrl(menu[urlKey]),
  72. meta: {
  73. title: menu[labelKey],
  74. icon: menu[iconKey] || 'file-o',
  75. name: menu[nameKey],
  76. defaultUrl: menu[urlKey],
  77. ...meta
  78. }
  79. }
  80. ]
  81. }
  82. return router
  83. }
  84. /**
  85. * 构建子路由
  86. * @param {*} menus
  87. */
  88. function generateSubRoutes(menus) {
  89. const pool = []
  90. const push = function (menus, namePrefix = []) {
  91. menus.forEach((menu) => {
  92. const router = {
  93. id: menu[idKey],
  94. parentId: menu[parentIdKey],
  95. path: [...namePrefix, menu[nameKey]].join('/'),
  96. name: [...namePrefix, menu[nameKey]].join('-'),
  97. alias: defaultRouterAlias + menu[nameKey],
  98. component: getComputedUrl(menu[urlKey]),
  99. meta: {
  100. title: menu[labelKey],
  101. icon: menu[iconKey] || 'file-o',
  102. name: menu[nameKey],
  103. defaultUrl: menu[urlKey],
  104. ...meta
  105. }
  106. }
  107. if (menu[childrenKey] && menu[childrenKey].length > 0) {
  108. push(menu[childrenKey], [...namePrefix, menu[nameKey]])
  109. } else {
  110. pool.push({
  111. ...router
  112. })
  113. }
  114. })
  115. }
  116. push(menus)
  117. return pool
  118. }
  119. /**
  120. * 是否是iframe
  121. * @param {*} url
  122. */
  123. function isHttp(url) {
  124. if (url === null || url === undefined || url === '') return false
  125. return !!(url.indexOf('http') !== -1 || url.indexOf('https') !== -1)
  126. }
  127. /**
  128. * 获取 组件url
  129. * @param {*} menu
  130. */
  131. function getComputedUrl(url) {
  132. if (!url) return _import(errorUrl)
  133. try {
  134. if (isHttp(url)) {
  135. return _import('/system/iframe/index')
  136. } else if (url.indexOf('/d/') > -1) {
  137. // 数据模版
  138. return _import('/platform/data/dataTemplate/template-list')
  139. } else {
  140. return _import(convertUrl(url)) || _import(errorUrl)
  141. }
  142. } catch (error) {
  143. // console.warn(error)
  144. return _import(errorUrl)
  145. }
  146. }
  147. /**
  148. * 转换url 避免多余‘/’
  149. * @param {*} url
  150. */
  151. function convertUrl(url) {
  152. const newUrl = '/' + url
  153. return newUrl === '/' ? '/' : newUrl.replace(/\/\//g, '/').replace(/\/$/, '')
  154. }