permission.js 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. import { asyncRoutes, constantRoutes } from '@/router'
  2. /**
  3. * Use meta.role to determine if the current user has permission
  4. * @param roles
  5. * @param route
  6. */
  7. function hasPermission(roles, route) {
  8. if (route.meta && route.meta.roles) {
  9. return roles.some(role => route.meta.roles.includes(role))
  10. } else {
  11. return true
  12. }
  13. }
  14. /**
  15. * Filter asynchronous routing tables by recursion
  16. * @param routes asyncRoutes
  17. * @param roles
  18. */
  19. export function filterAsyncRoutes(routes, roles) {
  20. const res = []
  21. routes.forEach(route => {
  22. const tmp = { ...route }
  23. if (hasPermission(roles, tmp)) {
  24. if (tmp.children) {
  25. tmp.children = filterAsyncRoutes(tmp.children, roles)
  26. }
  27. res.push(tmp)
  28. }
  29. })
  30. return res
  31. }
  32. const state = {
  33. routes: [],
  34. addRoutes: []
  35. }
  36. const mutations = {
  37. SET_ROUTES: (state, routes) => {
  38. state.addRoutes = routes
  39. state.routes = constantRoutes.concat(routes)
  40. }
  41. }
  42. const actions = {
  43. generateRoutes({ commit }, roles) {
  44. return new Promise(resolve => {
  45. let accessedRoutes
  46. if (roles.includes('admin')) {
  47. accessedRoutes = asyncRoutes || []
  48. } else {
  49. accessedRoutes = filterAsyncRoutes(asyncRoutes, roles)
  50. }
  51. commit('SET_ROUTES', accessedRoutes)
  52. resolve(accessedRoutes)
  53. })
  54. }
  55. }
  56. export default {
  57. namespaced: true,
  58. state,
  59. mutations,
  60. actions
  61. }