menu.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. /**
  2. * 菜单处理帮助类
  3. * <pre>
  4. * 作者:hugh zhuang
  5. * 邮箱:3378340995@qq.com
  6. * 日期:2018-07-02-下午3:29:34
  7. * 版权:广州流辰信息技术有限公司
  8. * </pre>
  9. */
  10. // 常量
  11. const menuUtil = {
  12. ID_KEY: 'id',
  13. PARENT_KEY: 'parentId',
  14. CHILD_KEY: 'children',
  15. LEVEL_KEY: 'level',
  16. NAME_KEY: 'alias',
  17. LABEL_KEY: 'name',
  18. PATH_KEY: 'path',
  19. OPEN_KEY: 'open', // 打开新窗口
  20. ICON_KEY: 'icon',
  21. URL_KEY: 'defaultUrl',
  22. /**
  23. * 转换成树结构
  24. * @param {*} sNodes
  25. */
  26. transformToTreeAndLevelFormat: function(sNodes) {
  27. if (sNodes == null || sNodes === undefined || sNodes.length === 0) {
  28. return []
  29. }
  30. const node = menuUtil.transformToTreeFormat(sNodes)
  31. // 设置层级
  32. for (let i = 0; i < node.length; i++) {
  33. menuUtil.setSonNodeLevel(null, node[i])
  34. }
  35. return node
  36. },
  37. /**
  38. * 转换成数组结构
  39. * @param {*} sNodes
  40. */
  41. transformToTreeFormat: function(sNodes) {
  42. let i, l
  43. if (!this.ID_KEY || this.ID_KEY === '' || !sNodes) { return [] }
  44. if (sNodes instanceof Array) {
  45. const r = []
  46. const tmpMap = []
  47. for (i = 0, l = sNodes.length; i < l; i++) {
  48. tmpMap[sNodes[i][this.ID_KEY]] = sNodes[i]
  49. }
  50. for (i = 0, l = sNodes.length; i < l; i++) {
  51. if (tmpMap[sNodes[i][this.PARENT_KEY]] &&
  52. sNodes[i][this.ID_KEY] !== sNodes[i][this.PARENT_KEY]) {
  53. if (!tmpMap[sNodes[i][this.PARENT_KEY]][this.CHILD_KEY]) {
  54. tmpMap[sNodes[i][this.PARENT_KEY]][this.CHILD_KEY] = []
  55. }
  56. tmpMap[sNodes[i][this.PARENT_KEY]][this.CHILD_KEY].push(sNodes[i])
  57. } else {
  58. r.push(sNodes[i])
  59. }
  60. }
  61. return r
  62. } else {
  63. return [sNodes]
  64. }
  65. },
  66. /**
  67. * 设置儿子节点等级
  68. * @param {*} parentNode
  69. * @param {*} node
  70. */
  71. setSonNodeLevel: function(parentNode, node) {
  72. if (!node) return
  73. node[this.LEVEL_KEY] = parentNode ? parentNode[this.LEVEL_KEY] + 1 : 0
  74. node[this.PATH_KEY] = node[this.OPEN_KEY] && this.isHttp(node[this.URL_KEY]) ? node[this.URL_KEY] : (parentNode ? parentNode[this.PATH_KEY] : '') + '/' + node[this.NAME_KEY]
  75. if (!node[this.CHILD_KEY]) { return }
  76. for (let i = 0, l = node[this.CHILD_KEY].length; i < l; i++) {
  77. if (node[this.CHILD_KEY][i]) { menuUtil.setSonNodeLevel(node, node[this.CHILD_KEY][i]) }
  78. }
  79. },
  80. /**
  81. * 是否是http
  82. * @param {*} url
  83. */
  84. isHttp: function(url) {
  85. if (url === null || url === undefined || url === '') return false
  86. return !!(url.indexOf('http') !== -1 || url.indexOf('https') !== -1)
  87. },
  88. // ===============导航菜单处理================================
  89. /**
  90. * 获取导航菜单
  91. * @param {*} menuList
  92. */
  93. getHeaderMenus: function(menuList) {
  94. const headerMenus = []
  95. for (const menu of menuList) {
  96. const m = {}
  97. Object.assign(m, menu)
  98. m.children = null
  99. headerMenus.push(m)
  100. }
  101. return headerMenus
  102. },
  103. /**
  104. * 获取当前激活的导航菜单
  105. * @param {*} navMenus
  106. */
  107. getActiveHeaderMenu: function(headerMenus, activeHeader) {
  108. // 首先取缓存
  109. if (activeHeader === 0 || activeHeader == null) {
  110. activeHeader = headerMenus[0].id
  111. }
  112. return activeHeader
  113. },
  114. /**
  115. * 获取当前激活的侧边栏
  116. * @param {*} menuList
  117. * @param {*} activeHeader
  118. */
  119. getAsideMenus: function(menuList, activeHeader) {
  120. const asideMenus = []
  121. if (menuList && menuList.length >= 0) {
  122. for (const menu of menuList) {
  123. if (menu.id === activeHeader) {
  124. return menu.children || []
  125. }
  126. }
  127. }
  128. if (asideMenus.length <= 0 && menuList && menuList.length > 0) {
  129. return menuList[0].children
  130. }
  131. return asideMenus
  132. },
  133. getPermissions: function(menuList) {
  134. let permissions = {}
  135. if (menuList && menuList.length >= 0) {
  136. const key = this.NAME_KEY
  137. permissions = menuList.map((menu) => {
  138. return {
  139. [menu[key]]: true
  140. }
  141. })
  142. }
  143. return permissions
  144. }
  145. }
  146. export default menuUtil