getMenu.js 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. import router from './router'
  2. import store from './store'
  3. import { Message } from 'element-ui'
  4. import NProgress from 'nprogress' // progress bar
  5. import 'nprogress/nprogress.css' // progress bar style
  6. import { getCodeToken } from '@/utils/auth' // get token from cookie
  7. import getPageTitle from '@/utils/get-page-title'
  8. import Layout from '@/layout'
  9. import { setTree, listToTree } from '@/utils/validate'
  10. import * as _ from 'lodash'
  11. NProgress.configure({ showSpinner: false }) // NProgress Configuration
  12. const whiteList = ['/login'] // no redirect whitelist
  13. function setStaticRoutes (menus, staticRoutes) {
  14. staticRoutes.forEach(route => {
  15. const routeIndex = menus.findIndex(
  16. permissionRoute => permissionRoute.name === route.name
  17. )
  18. if (routeIndex > -1) {
  19. menus[routeIndex] = {
  20. ...menus[routeIndex],
  21. component: route.component,
  22. children: route.children,
  23. }
  24. }
  25. })
  26. }
  27. router.beforeEach(async (to, from, next) => {
  28. // start progress bar
  29. NProgress.start()
  30. // set page title
  31. document.title = getPageTitle(to.meta.title)
  32. // determine whether the user has logged in
  33. const hasToken = getCodeToken()
  34. if (hasToken) {
  35. if (to.path === '/login') {
  36. // if is logged in, redirect to the home page
  37. next({ path: '/' })
  38. NProgress.done()
  39. } else {
  40. const hasRoles = store.getters.roles && store.getters.roles.length > 0
  41. if (hasRoles) {
  42. next()
  43. } else {
  44. try {
  45. const treeData = await store.dispatch('user/getMenuInfo')
  46. if (Array.isArray(treeData)) {
  47. if (treeData.length) {
  48. const ndOrder = _.orderBy(treeData, ['displaynumber'])
  49. const nd = ndOrder.filter(item => item.pageconfigurationid)
  50. store.dispatch('auth/changeAuthArrs', nd)
  51. const menusArray = parseMenuItem(nd)
  52. const treeMenu = listToTree(menusArray, 'up_auth_id', 'auth_id')
  53. const dataMenu = _.unionBy(treeMenu, 'auth_id')
  54. const menus = parseMenu(dataMenu)
  55. store.dispatch('permission/setRoutes', menus)
  56. router.addRoutes(menus)
  57. next({ ...to, replace: true })
  58. } else {
  59. next({ path: '/' })
  60. NProgress.done()
  61. }
  62. } else {
  63. await store.dispatch('user/resetToken')
  64. Message.error(error || 'Has Error')
  65. next(`/login?redirect=${to.path}`)
  66. NProgress.done()
  67. // next({ ...to, replace: true })
  68. }
  69. } catch (error) {
  70. // remove token and go to login page to re-login
  71. await store.dispatch('user/resetToken')
  72. Message.error(error || 'Has Error')
  73. next(`/login?redirect=${to.path}`)
  74. NProgress.done()
  75. }
  76. }
  77. }
  78. } else {
  79. /* has no token*/
  80. if (whiteList.indexOf(to.path) !== -1) {
  81. // in the free login whitelist, go directly
  82. next()
  83. } else {
  84. // other pages that do not have permission to access are redirected to the login page.
  85. next(`/login?redirect=${to.path}`)
  86. NProgress.done()
  87. }
  88. }
  89. })
  90. function parseMenuItem (data) {
  91. //pagetype 1模块 2页面 3按钮 4表格 5树形 6弹窗
  92. const menus = []
  93. data.map(item => {
  94. if (item.pagetype == 'module') {
  95. menus.push({
  96. auth_id: item.pageconfigurationid,
  97. up_auth_id: item.superiorid,
  98. path: "/" + item.pageroute,
  99. name: item.pagename,
  100. meta: {
  101. title: item.pagename,
  102. elSvgIcon: item.pageicon || 'el-icon-s-order',
  103. show_index: item.displaynumber,
  104. qid: item.serviceid,
  105. },
  106. component: Layout,
  107. hidden: item.isdisplay == 1 ? false : true,
  108. })
  109. } else if (item.pagetype == 'page') {
  110. menus.push({
  111. auth_id: item.pageconfigurationid,
  112. up_auth_id: item.superiorid,
  113. path: "/" + item.pageroute,
  114. name: item.pagename,
  115. meta: {
  116. title: item.pagename,
  117. // elSvgIcon: item.pageicon || 'el-icon-s-order',
  118. show_index: item.displaynumber,
  119. qid: item.serviceid,
  120. auth_id: item.pageconfigurationid,
  121. up_auth_id: item.superiorid,
  122. pagecode: item.pagecode,
  123. superiorcode: item.pagecode
  124. },
  125. component: resolve => require(['@/views' + item.pageaddress], resolve),
  126. // component: () => import('./views/table/index.vue'),
  127. hidden: item.isdisplay == 1 ? false : true,
  128. })
  129. }
  130. })
  131. return menus
  132. }
  133. function parseMenu (arr) {
  134. const menus = arr
  135. const newMenus = menus.flat()
  136. const allMenus = newMenus.length
  137. ? newMenus.sort((a, b) => a.meta.show_index - b.meta.show_index)
  138. : []
  139. // allMenus.map(item => {
  140. // item.children = (item.children && item.children.length) ? item.children.sort((a, b) => a.meta.show_index - b.meta.show_index) : item.children
  141. // })
  142. allMenus.push({
  143. path: '/:pathMatch(.*)',
  144. redirect: '/404',
  145. hidden: true,
  146. })
  147. return allMenus
  148. }
  149. router.afterEach(() => {
  150. // finish progress bar
  151. NProgress.done()
  152. })