permission.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. import auth from '@/plugins/auth'
  2. import router, { constantRoutes, dynamicRoutes } from '@/router'
  3. import Layout from '@/layout/index'
  4. import ParentView from '@/components/ParentView'
  5. import InnerLink from '@/layout/components/InnerLink'
  6. import request from '@/utils/request'
  7. import service from "@/utils/request";
  8. const permission = {
  9. state: {
  10. routes: [],
  11. addRoutes: [],
  12. defaultRoutes: [],
  13. topbarRouters: [],
  14. sidebarRouters: []
  15. },
  16. mutations: {
  17. SET_ROUTES: (state, routes) => {
  18. state.addRoutes = routes
  19. state.routes = constantRoutes.concat(routes)
  20. },
  21. SET_DEFAULT_ROUTES: (state, routes) => {
  22. state.defaultRoutes = constantRoutes.concat(routes)
  23. },
  24. SET_TOPBAR_ROUTES: (state, routes) => {
  25. state.topbarRouters = routes
  26. },
  27. SET_SIDEBAR_ROUTERS: (state, routes) => {
  28. state.sidebarRouters = routes
  29. },
  30. SET_R: (state, routes) => {
  31. state.routes = routes
  32. }
  33. },
  34. actions: {
  35. // 生成路由
  36. GenerateRoutes({ commit }) {
  37. return new Promise(async (resolve,reject) => {
  38. // 向后端请求路由数据
  39. await request.get('/getRouters').then((res) => {
  40. const sdata = JSON.parse(JSON.stringify(res.data))
  41. const rdata = JSON.parse(JSON.stringify(res.data))
  42. const sidebarRoutes = filterAsyncRouter(sdata)
  43. const rewriteRoutes = filterAsyncRouter(rdata, false, true)
  44. const asyncRoutes = filterDynamicRoutes(dynamicRoutes);
  45. // rewriteRoutes.push({ path: '*', redirect: '/404', hidden: true })
  46. // router.addRoutes(asyncRoutes);
  47. commit('SET_ROUTES', rewriteRoutes)
  48. commit('SET_SIDEBAR_ROUTERS', constantRoutes.concat(sidebarRoutes))
  49. commit('SET_DEFAULT_ROUTES', sidebarRoutes)
  50. commit('SET_TOPBAR_ROUTES', sidebarRoutes)
  51. resolve(rewriteRoutes)
  52. })
  53. })
  54. },
  55. changeRouters({ commit }, routers) {
  56. commit('SET_ROUTES', routers)
  57. },
  58. }
  59. }
  60. // 遍历后台传来的路由字符串,转换为组件对象
  61. function filterAsyncRouter(asyncRouterMap, lastRouter = false, type = false) {
  62. return asyncRouterMap.filter(route => {
  63. if (type && route.children) {
  64. route.children = filterChildren(route.children)
  65. }
  66. if (route.component) {
  67. // Layout ParentView 组件特殊处理
  68. if (route.component === 'Layout') {
  69. route.component = Layout
  70. } else if (route.component === 'ParentView') {
  71. route.component = ParentView
  72. } else if (route.component === 'InnerLink') {
  73. route.component = InnerLink
  74. } else {
  75. route.component = loadView(route.component)
  76. }
  77. }
  78. if (route.children != null && route.children && route.children.length) {
  79. route.children = filterAsyncRouter(route.children, route, type)
  80. } else {
  81. delete route['children']
  82. delete route['redirect']
  83. }
  84. return true
  85. })
  86. }
  87. function filterChildren(childrenMap, lastRouter = false) {
  88. var children = []
  89. childrenMap.forEach((el, index) => {
  90. if (el.children && el.children.length) {
  91. if (el.component === 'ParentView' && !lastRouter) {
  92. el.children.forEach(c => {
  93. c.path = el.path + '/' + c.path
  94. if (c.children && c.children.length) {
  95. children = children.concat(filterChildren(c.children, c))
  96. return
  97. }
  98. children.push(c)
  99. })
  100. return
  101. }
  102. }
  103. if (lastRouter) {
  104. el.path = lastRouter.path + '/' + el.path
  105. }
  106. children = children.concat(el)
  107. })
  108. return children
  109. }
  110. // 动态路由遍历,验证是否具备权限
  111. export function filterDynamicRoutes(routes) {
  112. const res = []
  113. routes.forEach(route => {
  114. if (route.permissions) {
  115. if (auth.hasPermiOr(route.permissions)) {
  116. res.push(route)
  117. }
  118. } else if (route.roles) {
  119. if (auth.hasRoleOr(route.roles)) {
  120. res.push(route)
  121. }
  122. }
  123. })
  124. return res
  125. }
  126. export const loadView = (view) => {
  127. if (process.env.NODE_ENV === 'development') {
  128. return (resolve) => require([`@/views/${view}`], resolve)
  129. } else {
  130. //使用 import 实现生产环境的路由懒加载
  131. return () => import(`@/views/${view}`)
  132. }
  133. }
  134. export default permission