permission.js 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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) {
  60. //console.log("路由遍历", routes);
  61. routes.forEach((route) => {
  62. const authRoute = state.addRoutes.find(authRoute => (authRoute[permission.RESOURCE_KEY] === route.path))
  63. if (authRoute) {
  64. route.hidden = false
  65. if (route.meta) {
  66. route.meta.onlyView = authRoute.onlyView || false
  67. } else {
  68. route.meta = { onlyView: authRoute.onlyView }
  69. }
  70. } else {
  71. route.hidden = true
  72. }
  73. if (route.children) {
  74. filterRoutes(route.children)
  75. }
  76. })
  77. }
  78. export default {
  79. namespaced: true,
  80. state,
  81. mutations,
  82. actions
  83. }