permission.ts 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. import { to as tos} from 'await-to-js';
  2. import router from './router';
  3. import NProgress from 'nprogress';
  4. import 'nprogress/nprogress.css';
  5. import {getToken} from '@/utils/auth';
  6. import {isHttp} from '@/utils/validate';
  7. import {isRelogin} from '@/utils/request';
  8. import useUserStore from '@/store/modules/user';
  9. import useSettingsStore from '@/store/modules/settings';
  10. import usePermissionStore from '@/store/modules/permission';
  11. import { useNoticeStore } from '@/store/modules/notice'
  12. import {LoginData} from "@/api/types";
  13. NProgress.configure({ showSpinner: false });
  14. import { setToken } from '@/utils/auth';
  15. import { ElMessage } from 'element-plus';
  16. const whiteList = ['/login', '/register', '/social-callback','/ssoredirect'];
  17. router.beforeEach(async (to, from, next) => {
  18. NProgress.start();
  19. // https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww5323bd8ab4394132&redirect_uri=https%3A%2F%2Fsales.test.storlead.com%2Findex&response_type=code&scope=snsapi_base&agentid=1000033&state=fromQYwx#wechat_redirect
  20. if(to.query.code && to.query.state === 'fromQYwx') {
  21. const userStore = useUserStore();
  22. const loginForm = ref<LoginData>({
  23. wxCode: to.query.code as string
  24. });
  25. const res = await tos(userStore.loginWx(loginForm.value));
  26. // if(err){
  27. // ElMessage.error('授权登录失败,请用账号密码登录');
  28. // next({path: '/login'});
  29. // return
  30. // }
  31. let param = {}
  32. Object.keys(to.query).forEach(item=>{
  33. if(item!=="code"){
  34. param[item] = to.query[item]
  35. }
  36. })
  37. let path = to.path + "?" + Object.keys(param).map(item=>item+"="+param[item]).join("&")
  38. next(path)
  39. return
  40. }
  41. if (to.query.token && to.query.state === 'fromQYwx'){
  42. debugger
  43. let redirect = to.query.redirect as string
  44. let token = to.query.token as string;
  45. setToken(token);
  46. //获取用户信息
  47. const [err] = await tos(useUserStore().getInfo());
  48. // if (err) {
  49. // await useUserStore().logout();
  50. // ElMessage.error(err);
  51. // next({path: '/login'});
  52. // } else {
  53. // next(redirect);
  54. // }
  55. }
  56. // /sys/auth/login
  57. if (getToken()) {
  58. to.meta.title && useSettingsStore().setTitle(to.meta.title as string);
  59. /* has token*/
  60. if (to.path === '/login') {
  61. next({path: '/'});
  62. NProgress.done();
  63. } else if (whiteList.indexOf(to.path) !== -1) {
  64. next()
  65. } else {
  66. if (useUserStore().roles.length === 0) {
  67. isRelogin.show = true;
  68. // 判断当前用户是否已拉取完user_info信息
  69. const [err] = await tos(useUserStore().getInfo());
  70. if (err) {
  71. await useUserStore().logout();
  72. ElMessage.error(err);
  73. next({path: '/login'});
  74. } else {
  75. isRelogin.show = false;
  76. const accessRoutes = await usePermissionStore().generateRoutes();
  77. // 根据roles权限生成可访问的路由表
  78. accessRoutes.forEach((route) => {
  79. if (!isHttp(route.path)) {
  80. router.addRoute(route); // 动态添加可访问路由表
  81. }
  82. });
  83. // 邮箱页面不需要循环调未读数接口
  84. if(to.path.indexOf('/email') == -1) {
  85. const currentAppId = usePermissionStore().activeAppId;
  86. useNoticeStore().getCount() // 邮箱未读
  87. useNoticeStore().getMessageCount(currentAppId) // 消息未读
  88. setInterval(() => {
  89. useNoticeStore().getCount()
  90. useNoticeStore().getMessageCount(usePermissionStore().activeAppId)
  91. }, 1000 * 60)
  92. }
  93. next({...to, replace: true}); // hack方法 确保addRoutes已完成
  94. }
  95. } else {
  96. next();
  97. }
  98. }
  99. } else {
  100. // 没有token
  101. if (whiteList.indexOf(to.path) !== -1) {
  102. // 在免登录白名单,直接进入
  103. next();
  104. } else {
  105. next(`/login?redirect=${to.fullPath}`); // 否则全部重定向到登录页
  106. NProgress.done();
  107. }
  108. }
  109. });
  110. router.afterEach(() => {
  111. NProgress.done();
  112. });