permission.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. import router from './router'
  2. import store from './store'
  3. import NProgress from 'nprogress'
  4. import { Message } from 'element-ui'
  5. import 'nprogress/nprogress.css'
  6. import { getToken } from '@/utils/auth'
  7. import getPageTitle from '@/utils/get-page-title'
  8. NProgress.configure({ showSpinner: false })
  9. // 白名单
  10. const whiteList = ['/login', '/face', '/register', '/forgot', '401', '404', '/cert', '/sync']
  11. router.beforeEach(async(to, from, next) => {
  12. // 进度条
  13. NProgress.start()
  14. // 获取网站基本信息
  15. let siteData = store.getters.siteData
  16. if (!siteData.siteName) {
  17. siteData = await store.dispatch('settings/getSite')
  18. }
  19. // 页面标题
  20. document.title = getPageTitle(siteData.siteName, to.meta.title)
  21. // 获取token
  22. const token = getToken()
  23. if (token != null && token !== '') {
  24. // 判断角色
  25. const hasRoles = store.getters.roles != null && store.getters.roles.length > 0
  26. if (hasRoles) {
  27. // 从登陆页面直接跳转到首页
  28. if (to.path === '/login') {
  29. next({ path: '/' })
  30. NProgress.done()
  31. return
  32. }
  33. // 学员进后台跳转到前端
  34. if (to.path.startsWith('/admin') && store.getters.roleType == 1) {
  35. next({ path: '/web/index' })
  36. NProgress.done()
  37. return
  38. }
  39. next()
  40. } else {
  41. try {
  42. // 获取用户信息
  43. await store.dispatch('user/getInfo')
  44. // 加载动态路由
  45. const routes = await store.dispatch('permission/generateRoutes')
  46. // 校验是否有URL的权限
  47. // const access = ifAccess(routes, to.path)
  48. // 无权限
  49. // if (!access) {
  50. // next({ path: '/401' })
  51. // NProgress.done()
  52. // return
  53. // }
  54. // 管理员未获取任何菜单权限
  55. if (routes.length == 0 && store.getters.roleType == 2) {
  56. Message.error('您无权访问此系统,请联系管理员进行菜单授权!')
  57. await store.dispatch('user/resetToken')
  58. next(`/login?redirect=${to.path}`)
  59. return
  60. }
  61. router.addRoutes(routes)
  62. // 确保路由已完成并不改变路由地址
  63. next({ ...to, replace: true })
  64. } catch (error) {
  65. // 清理会话返登录
  66. await store.dispatch('user/resetToken')
  67. Message.error(error || 'Has Error')
  68. next('/login')
  69. NProgress.done()
  70. }
  71. }
  72. } else {
  73. // 检测白名单数据
  74. let white = false
  75. for (let i = 0; i < whiteList.length; i++) {
  76. if (to.path.startsWith(whiteList[i])) {
  77. white = true
  78. }
  79. }
  80. // 无需授权的页面
  81. if (white) {
  82. next()
  83. } else {
  84. // 跳转到登录
  85. next('/login')
  86. NProgress.done()
  87. }
  88. }
  89. })
  90. router.afterEach(() => {
  91. NProgress.done()
  92. })