permission.js 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  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. //出现这种情况,说明用户使用的是管理员登录
  78. if(loginType == null){
  79. const userInfo = await getInfo();
  80. //此时不需要返回C端
  81. if(userInfo.code == 400){
  82. console.log("用户没有访问权限,将跳转到无权限页面!")
  83. if (to.path !== '/no-permission') {
  84. //到达此页面后直接清理token,避免出现用户直接从url返回login导致无限循环
  85. removeToken()
  86. //避免重复跳转
  87. next({path:'/no-permission'})
  88. } else {
  89. //已经在无权限页面,不再跳转
  90. next()
  91. }
  92. NProgress.done()
  93. }else{
  94. setUseType(userInfo.data.type_id, 86400)
  95. setWebSiteId(userInfo.data.website_id, 86400)
  96. console.log("用户有访问权限,访问继续!")
  97. next()
  98. }
  99. }
  100. } else {
  101. //3.4.2 如果有token,但是没在登录页面
  102. const hasRoles = store.getters.roles && store.getters.roles.length > 0
  103. //此时分为两种情况,一种是用户通过路由访问,一种是用户从url直接访问(刷新)时执行
  104. if (hasRoles) {
  105. const userInfo = await getInfo();
  106. //如果用户没有权限登录该网站,返回登录页面
  107. if(userInfo.code == 400){
  108. console.log("用户没有访问权限,将跳转到无权限页面!")
  109. if (to.path !== '/no-permission') {
  110. //到达此页面后直接清理token,避免出现用户直接从url返回login导致无限循环
  111. removeToken()
  112. //避免重复跳转
  113. next({path:'/no-permission'})
  114. } else {
  115. //已经在无权限页面,不再跳转
  116. next()
  117. }
  118. NProgress.done()
  119. }else{
  120. setUseType(userInfo.data.type_id, 86400)
  121. setWebSiteId(userInfo.data.website_id, 86400)
  122. console.log("用户有访问权限,访问继续!")
  123. next()
  124. }
  125. } else {
  126. //页面刷新的时候执行
  127. try {
  128. const { roles } = await store.dispatch('user/getInfo')
  129. const accessRoutes = await store.dispatch('permission/generateRoutes', roles)
  130. router.addRoutes(accessRoutes)
  131. next({ ...to, replace: true })
  132. console.log("添加路由成功!")
  133. } catch (error) {
  134. await store.dispatch('user/resetToken')
  135. Message.error(error || 'Has Error')
  136. next(`/login?redirect=${to.path}`)
  137. NProgress.done()
  138. }
  139. }
  140. }
  141. } else {
  142. //3.5 如果token不存在
  143. if (whiteList.indexOf(to.path) !== -1) {
  144. const userurl = hashParams();
  145. if(userurl){
  146. //更新backurl
  147. setUserUrl(userurl, 86400)
  148. }else{
  149. //设置来源网站为当前域名
  150. setUserUrl(window.location.host,86400);
  151. }
  152. next()
  153. } else {
  154. next(`/login`)
  155. NProgress.done()
  156. }
  157. }
  158. })
  159. router.afterEach(() => {
  160. //路由改变完毕后,结束进度条
  161. NProgress.done()
  162. })
  163. //3.设置路由守卫 end ---------------------------------------->