permission.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. import {
  2. asyncRoutes,
  3. constantRoutes,
  4. resetRouter
  5. } from '@/router';
  6. import {
  7. getRoule
  8. } from '@/model/indexRx'
  9. import { clearStorage } from '../../utils/auth'
  10. /**
  11. * 递归过滤异步路由表,返回符合用户角色权限的路由表
  12. * @param routes asyncRoutes
  13. * @param roles 传递参数-用户权限内容
  14. */
  15. function filterAsyncRoutes(routes, roles) {
  16. const res = [];
  17. routes.forEach(route => {
  18. const currentRoute = {
  19. ...route,
  20. };
  21. if (currentRoute.meta && currentRoute.meta.module) {
  22. const routeModule = currentRoute.meta.module;
  23. console.log(roles)
  24. if(routeModule.indexOf(',')!=-1){
  25. var routeModules=routeModule.split(',')
  26. for (let i = 0; i < routeModules.length; i++) {
  27. if(roles.some(role => role.indexOf(routeModules[i]) === 0)){
  28. if(res.every((item)=>{return item.name!=currentRoute.name})){
  29. if (Array.isArray(currentRoute.children) && currentRoute.children.length > 0) {
  30. currentRoute.children = filterAsyncRoutes(currentRoute.children, roles);
  31. }
  32. res.push(currentRoute);
  33. }
  34. }
  35. }
  36. }else{
  37. if (roles.some(role => role.indexOf(routeModule) === 0)) {
  38. if (Array.isArray(currentRoute.children) && currentRoute.children.length > 0) {
  39. currentRoute.children = filterAsyncRoutes(currentRoute.children, roles);
  40. }
  41. res.push(currentRoute);
  42. }
  43. }
  44. } else {
  45. res.push(currentRoute);
  46. }
  47. })
  48. // console.log(routes)
  49. return res
  50. }
  51. /**
  52. * 权限添加 日后优化
  53. * @param {*} roles
  54. * @param {*} res
  55. * @param {*} parentModule
  56. */
  57. function handleRoles(roles, res, parentModule) {
  58. // console.log(roles, res, parentModule)
  59. roles.forEach((role) => {
  60. if (Array.isArray(role.children) && role.children.length > 0) {
  61. handleRoles(role.children, res, parentModule + role.name + '.')
  62. } else {
  63. const lastIndex = role.name.lastIndexOf('.');
  64. if(parentModule.indexOf(role.name.split('.')[0])!=-1){
  65. res.push(`${parentModule}${role.name.substring(lastIndex + 1)}`)
  66. }else{
  67. res.push(`${parentModule}${role.name}`)
  68. }
  69. }
  70. })
  71. }
  72. const state = {
  73. routes: [],
  74. menu: []
  75. }
  76. const mutations = {
  77. SET_ROUTES: (state, routes) => {
  78. const routerList = constantRoutes.concat(routes)
  79. // console.log(routerList)
  80. state.menu = leftMenu(routerList, {})
  81. state.routes = routerList
  82. // console.log(routerList)
  83. },
  84. SET_MENU: (state, menu) => {
  85. state.menu = menu
  86. }
  87. }
  88. const group = (routerChild = []) => {
  89. let groupChild = []
  90. routerChild.forEach(item => {
  91. const routerGroup = [
  92. item.path,
  93. ...group(item.children || [])
  94. ]
  95. groupChild.push(...routerGroup)
  96. })
  97. return groupChild.filter(item => item)
  98. }
  99. const formatUrl = (url = '') => {
  100. return url.replace(/\/\//g, '/')
  101. }
  102. /**
  103. * 获取左侧菜单列表 数据模型 供日后后台提供接口使用
  104. * @param {*} menuList 按权限区分出来的集合
  105. * @param {*} param1 {path=''} 父节点路径
  106. */
  107. const leftMenu = (menuList, { path = '' }) => {
  108. const res = [];
  109. menuList.filter(item => !item.hidden).forEach(route => {
  110. // console.info(route, 'route.children')
  111. const currentRoute = {
  112. 'alias': 'menu',
  113. 'code': route.name,
  114. 'name': route.meta ? route.meta.title : route.name,
  115. 'path': formatUrl(path + (route.path.indexOf('/') > -1 ? '' : '/') + route.path),
  116. 'source': route.meta ? `iconfont icon${route.meta.icon}` : '',
  117. 'sort': 1,
  118. 'category': 1,
  119. 'isOpen': 1,
  120. 'children': leftMenu(route.children || [], route),
  121. 'hasChildren': false,
  122. 'actionName': '',
  123. 'isOpenName': '',
  124. 'group': group(route.children || [])
  125. };
  126. res.push(currentRoute);
  127. })
  128. // console.info(JSON.stringify(res), 'luyou')
  129. return res
  130. }
  131. const actions = {
  132. generateRoutes({
  133. commit
  134. }) {
  135. return new Promise(async resolve => {
  136. const data = await getRoule().toPromise()
  137. .catch((err) => {
  138. clearStorage()
  139. resetRouter()
  140. // window.location.href="https://www.eliangeyun.com"
  141.       })
  142. const roles = [];
  143. handleRoles(data, roles, '');
  144. // console.log(roles)
  145. const accessedRoutes = filterAsyncRoutes(asyncRoutes, roles)
  146. commit('user/SET_ROLES', roles, { root: true });
  147. commit('SET_ROUTES', accessedRoutes)
  148. resolve(accessedRoutes)
  149. })
  150. },
  151. }
  152. export default {
  153. namespaced: true,
  154. state,
  155. mutations,
  156. actions
  157. }