permission.js 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import { constantRoutes, asyncRoutes } from '@/router'
  2. import { Role } from '@/constant'
  3. function hasPermission (roles, { include, exclude }) {
  4. if (include) {
  5. return roles.some(role => include.includes(role))
  6. }
  7. return !exclude || !roles.some(role => exclude.includes(role))
  8. }
  9. export function filterAsyncRoutes (routes, roles, force) {
  10. const res = []
  11. routes.forEach(route => {
  12. if (!route.dev && (force || hasPermission(roles, route))) {
  13. if (route.children) {
  14. const children = filterAsyncRoutes(route.children, roles, force)
  15. if (!children.length) {
  16. return
  17. }
  18. res.push({ ...route, children })
  19. } else {
  20. res.push({ ...route })
  21. }
  22. }
  23. })
  24. return res
  25. }
  26. const state = {
  27. routes: []
  28. }
  29. const mutations = {
  30. SET_ROUTES (state, routes) {
  31. state.routes = routes
  32. }
  33. }
  34. const actions = {
  35. generateRoutes ({ commit }, roles) {
  36. let accessedRoutes
  37. if (roles.includes(Role.ADMIN)) {
  38. accessedRoutes = __DEV__ ? asyncRoutes : filterAsyncRoutes(asyncRoutes, roles, true)
  39. } else {
  40. accessedRoutes = filterAsyncRoutes(asyncRoutes, roles)
  41. }
  42. commit('SET_ROUTES', constantRoutes.concat(accessedRoutes))
  43. }
  44. }
  45. export default {
  46. namespaced: true,
  47. state,
  48. mutations,
  49. actions
  50. }