utils.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  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. router.children = [{
  64. id: menu[idKey],
  65. parentId: menu[parentIdKey],
  66. path: 'index',
  67. name: menu[nameKey] + 'index',
  68. alias: defaultRouterAlias + menu[nameKey],
  69. component: getComputedUrl(menu[urlKey]),
  70. meta: {
  71. title: menu[labelKey],
  72. icon: menu[iconKey] || 'file-o',
  73. name: menu[nameKey],
  74. defaultUrl: menu[urlKey],
  75. ...meta
  76. }
  77. }]
  78. }
  79. return router
  80. }
  81. /**
  82. * 构建子路由
  83. * @param {*} menus
  84. */
  85. function generateSubRoutes(menus) {
  86. const pool = []
  87. const push = function(menus, namePrefix = []) {
  88. menus.forEach(menu => {
  89. const router = {
  90. id: menu[idKey],
  91. parentId: menu[parentIdKey],
  92. path: [...namePrefix, menu[nameKey]].join('/'),
  93. name: [...namePrefix, menu[nameKey]].join('-'),
  94. alias: defaultRouterAlias + menu[nameKey],
  95. component: getComputedUrl(menu[urlKey]),
  96. meta: {
  97. title: menu[labelKey],
  98. icon: menu[iconKey] || 'file-o',
  99. name: menu[nameKey],
  100. defaultUrl: menu[urlKey],
  101. ...meta
  102. }
  103. }
  104. if (menu[childrenKey] && menu[childrenKey].length > 0) {
  105. push(menu[childrenKey], [...namePrefix, menu[nameKey]])
  106. } else {
  107. pool.push({
  108. ...router
  109. })
  110. }
  111. })
  112. }
  113. push(menus)
  114. return pool
  115. }
  116. /**
  117. * 是否是iframe
  118. * @param {*} url
  119. */
  120. function isHttp(url) {
  121. if (url === null || url === undefined || url === '') return false
  122. return !!(url.indexOf('http') !== -1 || url.indexOf('https') !== -1)
  123. }
  124. /**
  125. * 获取 组件url
  126. * @param {*} menu
  127. */
  128. function getComputedUrl(url) {
  129. if (!url) return _import(errorUrl)
  130. try {
  131. if (isHttp(url)) {
  132. return _import('/system/iframe/index')
  133. } else if (url.indexOf('/d/') > -1) { // 数据模版
  134. return _import('/platform/data/dataTemplate/template-list')
  135. } else {
  136. return _import(convertUrl(url)) || _import(errorUrl)
  137. }
  138. } catch (error) {
  139. // console.warn(error)
  140. return _import(errorUrl)
  141. }
  142. }
  143. /**
  144. * 转换url 避免多余‘/’
  145. * @param {*} url
  146. */
  147. function convertUrl(url) {
  148. const newUrl = '/' + url
  149. return newUrl === '/' ? '/' : newUrl.replace(/\/\//g, '/').replace(/\/$/, '')
  150. }