permission.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. import { constantRoutes } from '@/router'
  2. import { getRouters } from '@/api/menu'
  3. import { reject } from 'lodash'
  4. /**
  5. * 路由数据
  6. * @param item
  7. * @returns {{path, children: *[], meta: {icon, id, title}, name}}
  8. */
  9. function getRoute(item) {
  10. // 路由基本格式
  11. const route = {
  12. // 路由的路径
  13. path: item.url,
  14. // 路由名
  15. name: item.label,
  16. hidden: false,
  17. meta: {
  18. id: item.id,
  19. title: item.label,
  20. icon: item.icon
  21. },
  22. // 路由的子路由
  23. children: []
  24. }
  25. if (item.url === 'layout') {
  26. route.component = (resolve) => require([`@/layout`], resolve)
  27. } else {
  28. route.component = (resolve) => require([`@/views${item.url}`], resolve)
  29. }
  30. return route
  31. }
  32. /**
  33. * 菜单数据转换路由
  34. * @param menuList
  35. * @param routes
  36. * @returns {*[]}
  37. */
  38. function dynamicMenuRoutes(menuList = [], routes = []) {
  39. // 用于保存普通路由数据
  40. const temp = []
  41. // 用于保存存在子路由的路由数据
  42. let route = []
  43. // 遍历数据
  44. for (let i = 0; i < menuList.length; i++) {
  45. // 存在子路由,则递归遍历,并返回数据作为 children 保存
  46. if (menuList[i].children && menuList[i].children.length > 0) {
  47. // 获取路由的基本格式
  48. route = getRoute(menuList[i])
  49. // 递归处理子路由数据,并返回,将其作为路由的 children 保存
  50. route.children = dynamicMenuRoutes(menuList[i].children)
  51. // 保存存在子路由的路由
  52. routes.push(route)
  53. } else {
  54. // 保存普通路由
  55. temp.push(getRoute(menuList[i]))
  56. }
  57. }
  58. return routes.concat(temp)
  59. }
  60. const state = {
  61. routes: [],
  62. addRoutes: []
  63. }
  64. const mutations = {
  65. SET_ROUTES: (state, routes) => {
  66. state.addRoutes = routes
  67. state.routes = constantRoutes.concat(routes)
  68. }
  69. }
  70. const actions = {
  71. /**
  72. * 根据角色设置路由菜单
  73. * @param commit
  74. * @param roles
  75. * @returns {Promise<unknown>}
  76. */
  77. GenerateRoutes({ commit }, roles) {
  78. let roleIdList = []
  79. const rCode = roles.find((item) => item.roleCode === 'ManagerRole')
  80. if (rCode) {
  81. roleIdList = [1]
  82. } else if (rCode === undefined) {
  83. roleIdList = [2]
  84. }
  85. return new Promise((resolve) => {
  86. // 向后端请求路由数据
  87. getRouters(roleIdList).then((res) => {
  88. try {
  89. const menuList = res.data.menuTree
  90. const accessedRoutes = dynamicMenuRoutes(menuList)
  91. accessedRoutes.push({ path: '*', redirect: '/404', hidden: true })
  92. commit('SET_ROUTES', accessedRoutes)
  93. resolve(accessedRoutes)
  94. } catch (error) {
  95. reject(error)
  96. }
  97. })
  98. })
  99. }
  100. }
  101. export default {
  102. namespaced: true,
  103. state,
  104. mutations,
  105. actions
  106. }