permission.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. import { asyncRoutes, constantRoutes } from '@/router'
  2. import { getRoutes } from '@/api/system/role'
  3. import Layout from '@/layout'
  4. // import sysuserindex from '@/views/sysuser/index'
  5. /**
  6. * Use meta.role to determine if the current user has permission
  7. * @param roles
  8. * @param route
  9. */
  10. function hasPermission(roles, route) {
  11. if (route.meta && route.meta.roles) {
  12. return roles.some(role => route.meta.roles.includes(role))
  13. } else {
  14. return true
  15. }
  16. }
  17. /**
  18. * Use names to determine if the current user has permission
  19. * @param names
  20. * @param route
  21. */
  22. function hasPathPermission(paths, route) {
  23. if (route.path) {
  24. return paths.some(path => route.path === path.path)
  25. } else {
  26. return true
  27. }
  28. }
  29. /**
  30. * 后台查询的菜单数据拼装成路由格式的数据
  31. * @param routes
  32. */
  33. export function generaMenu(routes, data) {
  34. data.forEach(item => {
  35. const menu = {
  36. path: item.path,
  37. component: item.component === 'Layout' ? Layout : loadView(item.component),
  38. hidden: item.visible !== '0',
  39. children: [],
  40. name: item.menuName,
  41. meta: {
  42. title: item.title,
  43. icon: item.icon,
  44. noCache: true
  45. }
  46. }
  47. if (item.children) {
  48. generaMenu(menu.children, item.children)
  49. }
  50. routes.push(menu)
  51. })
  52. }
  53. export const loadView = (view) => { // 路由懒加载
  54. return (resolve) => require(['@/views' + view], resolve)
  55. // return () => import(`@/views${view}`)
  56. }
  57. /**
  58. * Filter asynchronous routing tables by recursion
  59. * @param routes asyncRoutes
  60. * @param roles
  61. */
  62. export function filterAsyncRoutes(routes, roles) {
  63. const res = []
  64. routes.forEach(route => {
  65. const tmp = { ...route }
  66. if (hasPermission(roles, tmp)) {
  67. if (tmp.children) {
  68. tmp.children = filterAsyncRoutes(tmp.children, roles)
  69. }
  70. res.push(tmp)
  71. }
  72. })
  73. return res
  74. }
  75. /**
  76. * Filter asynchronous routing tables by recursion
  77. * @param routes asyncRoutes
  78. * @param components
  79. */
  80. export function filterAsyncPathRoutes(routes, paths) {
  81. const res = []
  82. routes.forEach(route => {
  83. const tmp = { ...route }
  84. if (hasPathPermission(paths, tmp)) {
  85. if (tmp.children) {
  86. tmp.children = filterAsyncPathRoutes(tmp.children, paths)
  87. }
  88. res.push(tmp)
  89. }
  90. })
  91. return res
  92. }
  93. const state = {
  94. routes: [],
  95. addRoutes: []
  96. }
  97. const mutations = {
  98. SET_ROUTES: (state, routes) => {
  99. state.addRoutes = routes
  100. state.routes = constantRoutes.concat(routes)
  101. }
  102. }
  103. const actions = {
  104. generateRoutes({ commit }, roles) {
  105. return new Promise(resolve => {
  106. const loadMenuData = []
  107. getRoutes().then(response => {
  108. // console.log(JSON.stringify(response))
  109. let data = response
  110. if (response.code !== 200) {
  111. this.$message({
  112. message: '菜单数据加载异常',
  113. type: 0
  114. })
  115. } else {
  116. data = response.data
  117. Object.assign(loadMenuData, data)
  118. generaMenu(asyncRoutes, loadMenuData)
  119. asyncRoutes.push({ path: '*', redirect: '/404', hidden: true })
  120. commit('SET_ROUTES', asyncRoutes)
  121. resolve(asyncRoutes)
  122. }
  123. }).catch(error => {
  124. console.log(error)
  125. })
  126. })
  127. }
  128. }
  129. export default {
  130. namespaced: true,
  131. state,
  132. mutations,
  133. actions
  134. }