permission.js 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. /*
  2. * @Descripttion:
  3. * @version:
  4. * @Author: siwei
  5. * @Date: 2023-02-22 11:38:48
  6. * @LastEditors: siwei
  7. * @LastEditTime: 2023-03-03 16:24:58
  8. */
  9. import router from './router'
  10. import store from './store'
  11. import { ElMessage } from 'element-plus'
  12. import NProgress from 'nprogress'
  13. import 'nprogress/nprogress.css'
  14. import { getToken } from '@/utils/auth'
  15. import { isHttp } from '@/utils/validate'
  16. import { checkToken, currentUserInfo } from "@/api/login";
  17. NProgress.configure({ showSpinner: false });
  18. const whiteList = ['/login', '/auth-redirect', '/bind', '/register'];
  19. router.beforeEach((to, from, next) => {
  20. // 全局前置守卫
  21. NProgress.start()
  22. // 获取地址栏参数
  23. if (to.query && to.query.token && to.path === '/page') {
  24. let access_token = to.query.token
  25. console.log('校验Token是否过期');
  26. //#region test
  27. // // 获取username
  28. // let username = 'admin'
  29. // // 调用action的登录方法,进行自动认证登录
  30. // console.log('开始自动认证登录');
  31. // store.dispatch("LoginNew", username)
  32. // .then(() => {
  33. // store.commit("SET_SUPERUSER", username);
  34. // store.commit("SET_SUPERTOKEN", access_token);
  35. // next()
  36. // })
  37. // .catch((e) => {
  38. // console.log('认证登录失败:');
  39. // next(`/login?redirect=/`) // 否则全部重定向到登录页
  40. // });
  41. //#endregion
  42. checkToken(access_token).then(res => {
  43. console.log('Token未过期,获取Token对应登录用户信息');
  44. // 获取Token对应登录用户信息
  45. currentUserInfo(access_token).then(res => {
  46. console.log('用户信息获取成功:' + res.data);
  47. // 获取username
  48. let username = res.data.user_name
  49. // 调用action的登录方法,进行自动认证登录
  50. console.log('开始自动认证登录');
  51. store.dispatch("LoginNew", username)
  52. .then(() => {
  53. store.commit("SET_SUPERUSER", username);
  54. store.commit("SET_SUPERTOKEN", access_token);
  55. next()
  56. })
  57. .catch((e) => {
  58. console.log('认证登录失败:');
  59. next(`/login?redirect=/`) // 否则全部重定向到登录页
  60. });
  61. })
  62. .catch((e) => {
  63. console.log('用户信息获取失败');
  64. next(`/login?redirect=/`) // 否则全部重定向到登录页
  65. });
  66. }).catch(e => {
  67. console.log('Token过期,请重新登录!');
  68. next(`/login?redirect=/`) // 否则全部重定向到登录页
  69. })
  70. } else {
  71. if (getToken()) {
  72. //#region 获取单点登录的token,验证token是否过期
  73. let tk = store.getters.superToken
  74. if (!tk && to.query && to.query.token) {
  75. tk = to.query.token
  76. store.commit("SET_SUPERTOKEN", tk);
  77. }
  78. //#endregion
  79. to.meta.title && store.dispatch('settings/setTitle', to.meta.title)
  80. /* has token*/
  81. if (to.path === '/login') {
  82. next({ path: '/' })
  83. NProgress.done()
  84. } else if (!tk && to.path === '/page') {
  85. next({ path: '/home' })
  86. } else {
  87. if (store.getters.roles.length === 0) {
  88. // 判断当前用户是否已拉取完user_info信息
  89. store.dispatch('GetInfo').then(() => {
  90. store.dispatch('GenerateRoutes').then(accessRoutes => {
  91. // 根据roles权限生成可访问的路由表
  92. accessRoutes.forEach(route => {
  93. if (!isHttp(route.path)) {
  94. router.addRoute(route) // 动态添加可访问路由表
  95. }
  96. })
  97. next({...to, replace: true }) // hack方法 确保addRoutes已完成
  98. })
  99. }).catch(err => {
  100. store.dispatch('LogOut').then(() => {
  101. ElMessage.error(err)
  102. next({ path: '/' })
  103. })
  104. })
  105. } else {
  106. //#region 单点修改代码片段,跳转验证token是否过期
  107. if (tk) {
  108. console.log('检验token是否过期');
  109. checkToken(tk).then(res => {
  110. console.log('Token未过期,正常跳转');
  111. next()
  112. }).catch(e => {
  113. console.log('Token过期,请重新登录!');
  114. store.commit("SET_SUPERUSER", "");
  115. store.commit("SET_SUPERTOKEN", "");
  116. next(`/login?redirect=/`) // 否则全部重定向到登录页
  117. return
  118. })
  119. } else {
  120. next()
  121. }
  122. //#endregion
  123. //#region 改前代码
  124. // next()
  125. //#endregion
  126. }
  127. }
  128. } else {
  129. // 没有token
  130. if (whiteList.indexOf(to.path) !== -1) {
  131. // 在免登录白名单,直接进入
  132. next()
  133. } else {
  134. next(`/login?redirect=${to.path}`) // 否则全部重定向到登录页
  135. NProgress.done()
  136. }
  137. }
  138. }
  139. })
  140. router.afterEach(() => {
  141. NProgress.done()
  142. })