permission.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  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 {
  7. getUserId,
  8. getToken,
  9. // setBtns
  10. } from '@/utils/auth' // get token from cookie
  11. import { adminBuild } from '@/api/user'
  12. import { filterAsyncRouter } from '@/store/modules/permission.js'
  13. import getPageTitle from '@/utils/get-page-title'
  14. NProgress.configure({ showSpinner: false }) // NProgress Configuration
  15. const whiteList = ['/login'] // no redirect whitelist
  16. router.beforeEach(async(to, from, next) => {
  17. // start progress bar
  18. NProgress.start()
  19. // set page title
  20. document.title = getPageTitle(to.meta.title)
  21. // determine whether the user has logged in
  22. const hasToken = getToken()
  23. if (hasToken) {
  24. if (to.path === '/login') {
  25. // if is logged in, redirect to the home page
  26. next({ path: '/' })
  27. NProgress.done()
  28. } else {
  29. // const hasGetUserInfo = store.getters.name
  30. // if (hasGetUserInfo) {
  31. // next()
  32. // } else {
  33. // try {
  34. // // get user info
  35. // // await store.dispatch('user/getInfo')
  36. // next()
  37. // } catch (error) {
  38. // // remove token and go to login page to re-login
  39. // await store.dispatch('user/resetToken')
  40. // Message.error(error || 'Has Error')
  41. // next(`/login?redirect=${to.path}`)
  42. // NProgress.done()
  43. // }
  44. // }
  45. if (store.getters.routers.length === 0) { // 条件加载
  46. loadMenus(next, to)
  47. store.commit('SET_LOAD', true)
  48. } else if (!store.getters.hasLoad) { // 是否加载过动态路由
  49. // // 修改hasLoad,防止死循环
  50. store.commit('SET_LOAD', true)
  51. loadMenus(next, to)
  52. } else {
  53. try {
  54. next()
  55. } catch (error) {
  56. // remove token and go to login page to re-login
  57. await store.dispatch('user/resetToken')
  58. Message.error(error || 'Has Error')
  59. next(`/login?redirect=${to.path}`)
  60. NProgress.done()
  61. }
  62. }
  63. }
  64. } else {
  65. /* has no token*/
  66. if (whiteList.indexOf(to.path) !== -1) {
  67. // in the free login whitelist, go directly
  68. next()
  69. } else {
  70. // other pages that do not have permission to access are redirected to the login page.
  71. next(`/login?redirect=${to.path}`)
  72. NProgress.done()
  73. }
  74. }
  75. })
  76. export const loadMenus = (next, to) => {
  77. adminBuild({ platformUserId: getUserId() }).then(res => {
  78. // setBtns(JSON.stringify(res.buttons))
  79. const asyncRouter = filterAsyncRouter(res.data)
  80. // 画布设置
  81. asyncRouter.forEach(item => {
  82. if (item.path.indexOf('.html') !== -1) {
  83. item.path = item.path + '?' + getToken()
  84. }
  85. })
  86. // 异常跳转添加
  87. asyncRouter.push({ path: '*', redirect: '/404', hidden: true })
  88. store.dispatch('GenerateRoutes', asyncRouter).then(() => { // 存储路由
  89. router.addRoutes(asyncRouter) // 动态添加可访问路由表
  90. next({ ...to, replace: true })
  91. })
  92. })
  93. }
  94. router.afterEach(() => {
  95. // finish progress bar
  96. NProgress.done()
  97. })