menu.js 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. import Layout from '@/layout'//引入admin的layout布局
  2. import router from '../router'//引入router
  3. import request from '../api/request.js'//自定义封装的请求
  4. import store from '../store'//Vuex
  5. export default {
  6. // 获取路由菜单
  7. getMenu() {
  8. return new Promise((resolve, reject) => {
  9. return request.getRoleMenu().then(res => {
  10. //声明一个空数组,用来装处理好的菜单信息
  11. const result = []
  12. // 获取到路由菜单,进行数据处理
  13. this.parseRoute(res.data,result)
  14. // 添加菜单
  15. this.addMenu(result)
  16. //缓存用户菜单,我这里使用的是sessionStorage,用localStorage也可以
  17. sessionStorage.setItem("route", JSON.stringify(res.data))
  18. // 输出成功
  19. resolve()
  20. }).catch(err =>{
  21. reject()
  22. })
  23. })
  24. },
  25. // 对路由菜单数据处理
  26. parseRoute(fullList, resultList) {
  27. return new Promise((resolve, reject) => {
  28. let result = []
  29. fullList.forEach( (ele,index) => {
  30. let routerObject = null
  31. const childrenList = []
  32. routerObject = {
  33. path: ele['path'],
  34. component: Layout,
  35. redirect: ele['redirect']?ele['redirect']:'noRedirect',
  36. alwaysShow: ele['alwaysShow'], // 是否始终为根元素
  37. meta: {
  38. title: ele.meta['title'],
  39. icon: ele.meta['icon']
  40. },
  41. children: childrenList,
  42. }
  43. const itemResult = ele.children;
  44. for (let j = 0; j < itemResult.length; j++) {
  45. childrenList.push({
  46. path: itemResult[j]['path'],
  47. name: itemResult[j]['name'],
  48. hidden: itemResult[j]['hidden'],
  49. component: resolve => require([`@/views/${itemResult[j].component}`], resolve),
  50. meta: {
  51. title: itemResult[j].meta['title'],
  52. icon: itemResult[j].meta['icon'],
  53. keepAlive: itemResult[j].meta['keepAlive'] == 0 ? false : true,
  54. },
  55. })
  56. }
  57. //插入组装好的数据
  58. resultList.push(routerObject);
  59. //插入最终完整的数据列表
  60. result.push(routerObject);
  61. });
  62. //输出已经组装好并且能用的数据
  63. resolve(result)
  64. })
  65. },
  66. // 添加菜单
  67. addMenu(data) {
  68. return new Promise((resolve, reject) => {
  69. // 在处理完的菜单列表数据后面插入404页面,404必须存在菜单列表的最后一项,否则会对所有页面进行拦截,并跳转404页面
  70. data.push({
  71. path: '*',
  72. redirect: '/404',
  73. hidden: true
  74. })
  75. // 打印菜单列表
  76. // console.log(data)
  77. // 将可用的路由权限列表存入Vuex
  78. store.dispatch('user/modifyMenu', data)
  79. // 添加菜单
  80. router.addRoutes(data)
  81. // 将路由元注入路由对象,必须添加
  82. router.options.routes.push(data)
  83. console.log('router.options.routes', router.options.routes)
  84. //输出成功
  85. resolve()
  86. })
  87. },
  88. //
  89. }