permission.js 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. //1.引入vue-element-admin 依赖 start ---------------------------------------->
  2. import router from './router'//引入路由
  3. const whiteList = ['/login', '/auth-redirect','/no-permission']//配置路由白名单
  4. import store from './store'//引入vuex
  5. import { Message } from 'element-ui'//引入element的弹框提示
  6. import getPageTitle from '@/utils/get-page-title'//获得系统标题
  7. import NProgress from 'nprogress'//引入进度条库
  8. import 'nprogress/nprogress.css'//引入进度条样式
  9. NProgress.configure({ showSpinner: false })
  10. //1.引入vue-element-admin依赖 end ---------------------------------------->
  11. //2.引入单点登录需要的方法 start ---------------------------------------->
  12. import { getToken, setUserUrl, getUseType, getUserUrl,setUseType,setWebSiteId,
  13. hashParams,removeToken,getLoginType,getBackUrlValue } from '@/utils/auth' //设置cookie的方法
  14. import URL from '@/utils/baseUrl'; //获得请求路径
  15. import { getInfo } from '@/api/user' //获得用户信息
  16. //2.引入单点登录需要的方法 end ---------------------------------------->
  17. //3.设置路由守卫 start ---------------------------------------->
  18. router.beforeEach(async (to, from, next) => {
  19. //3.1 当路由开始改变时,加载进度条
  20. NProgress.start()
  21. //3.2 设置系统标题
  22. document.title = getPageTitle(to.meta.title)
  23. //3.3 检查cookie中的token是否已经存在
  24. const hasToken = getToken()
  25. //3.4 如果token存在
  26. if (hasToken) {
  27. //3.4.1 如果有token,而且是在登录页面
  28. if (to.path === '/login') {
  29. //获取登录参数,是backurl还是userurl
  30. let loginType = getLoginType(window.location.href)
  31. if(loginType == 'userurl'){
  32. //如果是userurl
  33. const userurl = hashParams();
  34. if (userurl) {
  35. setUserUrl(userurl, 86400)
  36. }
  37. const userInfo = await getInfo();
  38. console.log("User Info:", userInfo);
  39. if (userInfo.code === 200) {
  40. console.log("####")
  41. //每次返回login的时候都获取一下用户类型和网站id
  42. setUseType(userInfo.data.type_id, 86400)
  43. setWebSiteId(userInfo.data.website_id, 86400)
  44. next({ path: '/' })
  45. NProgress.done()
  46. } else {
  47. if(userInfo.code == -1){
  48. next({ path: '/' })
  49. NProgress.done()
  50. }else{
  51. next({ path: '/' })
  52. NProgress.done()
  53. }
  54. }
  55. }
  56. if(loginType == 'backurl'){
  57. const userInfo = await getInfo();
  58. //此时分为两种情况,如果这个用户的token被放入了黑名单,此时不能允许用户带着token返回原网站
  59. //否则他就会一直登录不了,这个时候应该让他重新登录
  60. if(userInfo.code == 400){
  61. //跳转到登录页面
  62. if (to.path !== '/no-permission') {
  63. //避免重复跳转
  64. next({path:'/no-permission'})
  65. } else {
  66. //已经在无权限页面,不再跳转
  67. next()
  68. }
  69. }else{
  70. //如果不是400,说明用户的这个token是可以用的,可以带着token返回C端
  71. //如果是backurl
  72. const backurl = getBackUrlValue(window.location.href)
  73. //带着token返回原网站
  74. window.location.href = backurl + '?backurl=' + backurl + '&admintoken=' + getToken()
  75. }
  76. }
  77. } else {
  78. //3.4.2 如果有token,但是没在登录页面
  79. const hasRoles = store.getters.roles && store.getters.roles.length > 0
  80. //此时分为两种情况,一种是用户通过路由访问,一种是用户从url直接访问(刷新)时执行
  81. if (hasRoles) {
  82. const userInfo = await getInfo();
  83. //如果用户没有权限登录该网站,返回登录页面
  84. if(userInfo.code == 400){
  85. console.log("用户没有访问权限,将跳转到无权限页面!")
  86. if (to.path !== '/no-permission') {
  87. //到达此页面后直接清理token,避免出现用户直接从url返回login导致无限循环
  88. removeToken()
  89. //避免重复跳转
  90. next({path:'/no-permission'})
  91. } else {
  92. //已经在无权限页面,不再跳转
  93. next()
  94. }
  95. NProgress.done()
  96. }else{
  97. setUseType(userInfo.data.type_id, 86400)
  98. setWebSiteId(userInfo.data.website_id, 86400)
  99. console.log("用户有访问权限,访问继续!")
  100. //稳定性待测试
  101. if(router.options.routes.length < 2){
  102. console.log("用户路由出现异常,重新获取路由菜单!")
  103. const { roles } = await store.dispatch('user/getInfo')
  104. const accessRoutes = await store.dispatch('permission/generateRoutes', roles)
  105. router.addRoutes(accessRoutes)
  106. console.log("添加路由成功!")
  107. }
  108. next()
  109. }
  110. } else {
  111. //页面刷新的时候执行
  112. try {
  113. const { roles } = await store.dispatch('user/getInfo')
  114. const accessRoutes = await store.dispatch('permission/generateRoutes', roles)
  115. router.addRoutes(accessRoutes)
  116. next({ ...to, replace: true })
  117. console.log("添加路由成功!")
  118. } catch (error) {
  119. await store.dispatch('user/resetToken')
  120. Message.error(error || 'Has Error')
  121. next(`/login?redirect=${to.path}`)
  122. NProgress.done()
  123. }
  124. }
  125. }
  126. } else {
  127. //3.5 如果token不存在
  128. if (whiteList.indexOf(to.path) !== -1) {
  129. const userurl = hashParams();
  130. if(userurl){
  131. //更新backurl
  132. setUserUrl(userurl, 86400)
  133. }else{
  134. //设置来源网站为当前域名
  135. setUserUrl(window.location.host,86400);
  136. }
  137. next()
  138. } else {
  139. next(`/login`)
  140. NProgress.done()
  141. }
  142. }
  143. })
  144. router.afterEach(() => {
  145. //路由改变完毕后,结束进度条
  146. NProgress.done()
  147. })
  148. //3.设置路由守卫 end ---------------------------------------->