permission.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. import { asyncRoutes, resetRouter, constantRoutes } from '@/router'
  2. import permission from '@/utils/permission'
  3. /**
  4. * Use meta.role to determine if the current user has permission
  5. * @param roles
  6. * @param route
  7. */
  8. function hasPermission(roles, route) {
  9. if (route.meta && route.meta.roles) {
  10. return roles.some(role => route.meta.roles.includes(role))
  11. } else {
  12. return true
  13. }
  14. }
  15. /**
  16. * Filter asynchronous routing tables by recursion
  17. * @param routes asyncRoutes
  18. * @param roles
  19. */
  20. export function filterAsyncRoutes(routes, roles) {
  21. const res = []
  22. routes.forEach(route => {
  23. const tmp = { ...route }
  24. if (hasPermission(roles, tmp)) {
  25. if (tmp.children) {
  26. tmp.children = filterAsyncRoutes(tmp.children, roles)
  27. }
  28. res.push(tmp)
  29. }
  30. })
  31. return res
  32. }
  33. const state = {
  34. routes: [],
  35. addRoutes: []
  36. }
  37. const mutations = {
  38. SET_ROUTES: (state, routes) => {
  39. resetRouter()
  40. state.addRoutes = routes
  41. state.routes = constantRoutes
  42. filterRoutes(state.routes)
  43. }
  44. }
  45. const actions = {
  46. generateRoutes({ commit }, roles) {
  47. return new Promise(resolve => {
  48. let accessedRoutes
  49. if (roles.includes('admin')) {
  50. accessedRoutes = asyncRoutes || []
  51. } else {
  52. accessedRoutes = filterAsyncRoutes(asyncRoutes, roles)
  53. }
  54. commit('SET_ROUTES', accessedRoutes)
  55. resolve(accessedRoutes)
  56. })
  57. }
  58. }
  59. function filterRoutes(routes, parent) {
  60. //console.log("路由遍历", routes, parent);
  61. routes.forEach((route) => {
  62. const authRoute = state.addRoutes.find(authRoute => (authRoute[permission.RESOURCE_KEY] === route.path))
  63. if (authRoute) {
  64. if (!route.disabled) {
  65. route.hidden = false
  66. if (route.meta) {
  67. route.meta.onlyView = authRoute.onlyView || false
  68. } else {
  69. route.meta = { onlyView: authRoute.onlyView }
  70. }
  71. if (parent) {
  72. parent.hidden = false;
  73. }
  74. } else {
  75. authRoute[permission.RESOURCE_KEY] = "";
  76. route.hidden = true;
  77. }
  78. } else if (route.sharePath) {
  79. const shareRoute = state.addRoutes.find(_route => _route[permission.RESOURCE_KEY] === route.sharePath);
  80. if (shareRoute) {
  81. route.hidden = false
  82. if (route.meta) {
  83. route.meta.onlyView = shareRoute.onlyView || false
  84. } else {
  85. route.meta = { onlyView: shareRoute.onlyView }
  86. }
  87. if (parent) {
  88. parent.hidden = false;
  89. }
  90. state.addRoutes.push({
  91. resourceName: route.name,
  92. resourcePath: route.path
  93. })
  94. }
  95. } else {
  96. route.hidden = true;
  97. }
  98. if (route.children) {
  99. filterRoutes(route.children, route)
  100. }
  101. })
  102. }
  103. export default {
  104. namespaced: true,
  105. state,
  106. mutations,
  107. actions
  108. }