permission.js 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  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. //如果是backurl
  58. const backurl = getBackUrlValue(window.location.href)
  59. //带着token返回原网站
  60. window.location.href = backurl + '?backurl=' + backurl + '&admintoken=' + getToken()
  61. }
  62. } else {
  63. //3.4.2 如果有token,但是没在登录页面
  64. const hasRoles = store.getters.roles && store.getters.roles.length > 0
  65. //此时分为两种情况,一种是用户通过路由访问,一种是用户从url直接访问(刷新)时执行
  66. if (hasRoles) {
  67. const userInfo = await getInfo();
  68. //如果用户没有权限登录该网站,返回登录页面
  69. if(userInfo.code == -1){
  70. console.log("用户没有访问权限,将跳转到无权限页面!")
  71. if (to.path !== '/no-permission') {
  72. //避免重复跳转
  73. next({path:'/no-permission'})
  74. } else {
  75. //已经在无权限页面,不再跳转
  76. next()
  77. }
  78. NProgress.done()
  79. }else{
  80. setUseType(userInfo.data.type_id, 86400)
  81. setWebSiteId(userInfo.data.website_id, 86400)
  82. console.log("用户有访问权限,访问继续!")
  83. next()
  84. }
  85. } else {
  86. //页面刷新的时候执行
  87. try {
  88. const { roles } = await store.dispatch('user/getInfo')
  89. const accessRoutes = await store.dispatch('permission/generateRoutes', roles)
  90. router.addRoutes(accessRoutes)
  91. next({ ...to, replace: true })
  92. } catch (error) {
  93. await store.dispatch('user/resetToken')
  94. Message.error(error || 'Has Error')
  95. next(`/login?redirect=${to.path}`)
  96. NProgress.done()
  97. }
  98. }
  99. }
  100. } else {
  101. //3.5 如果token不存在
  102. if (whiteList.indexOf(to.path) !== -1) {
  103. const userurl = hashParams();
  104. if(userurl){
  105. //更新backurl
  106. setUserUrl(userurl, 86400)
  107. }else{
  108. //设置来源网站为当前域名
  109. setUserUrl(window.location.host,86400);
  110. }
  111. next()
  112. } else {
  113. next(`/login`)
  114. NProgress.done()
  115. }
  116. }
  117. })
  118. router.afterEach(() => {
  119. //路由改变完毕后,结束进度条
  120. NProgress.done()
  121. })
  122. //3.设置路由守卫 end ---------------------------------------->