index.ts 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. import { setLoadComplete } from '@/common/methods';
  2. import { getLoadIsComplete } from '@/common/methods/mixin';
  3. import Layout from '@/layout/index.vue';
  4. import { globalDataRefresh } from '@/services/bus';
  5. import { isLogin, login } from '@/services/bus/login';
  6. import { localStorageUtil } from '@/utils/storage';
  7. import { createRouter, createWebHashHistory, RouteRecordRaw } from 'vue-router';
  8. import eventBus from '../utils/eventBus';
  9. import { registerRoutes } from './dynamic';
  10. import { message } from 'ant-design-vue';
  11. const routes: Array<RouteRecordRaw> = [
  12. {
  13. path: '/login',
  14. name: 'login',
  15. component: () => import('@/views/account/login.vue'),
  16. },
  17. {
  18. path: '/logon',
  19. name: 'logon',
  20. component: () => import('@/views/account/logon.vue'),
  21. },
  22. {
  23. path: '/resetPassword',
  24. name: 'resetPassword',
  25. component: () => import('@/views/account/resetPassword.vue'),
  26. },
  27. {
  28. path: '/',
  29. component: Layout,
  30. props: true,
  31. redirect: '/login',
  32. children: [
  33. {
  34. path: '/home',
  35. name: 'home',
  36. component: () => import('@/views/home.vue'),
  37. },
  38. ],
  39. },
  40. {
  41. path: '/test',
  42. name: 'test',
  43. component: () => import('@/views/test/index.vue'),
  44. },
  45. ];
  46. const router = createRouter({
  47. history: createWebHashHistory(),
  48. routes,
  49. });
  50. // 防止加载动态路由无限死循环
  51. let routerComplete = false;
  52. // 路由拦截
  53. router.beforeEach((to, from, next) => {
  54. // 前往登录页时 直接走登出流程
  55. if (to.fullPath === '/login') {
  56. routerComplete = false;
  57. eventBus.$emit('logout');
  58. next();
  59. } else {
  60. // 前往其他页 判断是否是登录状态
  61. if (isLogin()) {
  62. if (routerComplete) {
  63. return next();
  64. } else {
  65. // 注册动态路由
  66. registerRoutes().then(() => {
  67. routerComplete = true;
  68. next({ ...to, replace: true });
  69. }).catch(() => {
  70. message.error('账号没有对应菜单权限');
  71. })
  72. }
  73. } else {
  74. routerComplete = false;
  75. if (!getLoadIsComplete()) { // 没有加载对应的资料,表示第一次启动项目
  76. console.log('to', to);
  77. const { ACCOUNT, PASSWORD } = to.query
  78. const name = to.name ? to.name : 'home'
  79. if (ACCOUNT && PASSWORD) {
  80. setLoadComplete(false)
  81. globalDataRefresh().then(() => {
  82. const { ACCOUNT, PASSWORD } = to.query
  83. login(ACCOUNT as string, PASSWORD as string, [], true).then(res => {
  84. setLoadComplete(true)
  85. localStorageUtil.setItem('loginAccount', ACCOUNT); // 缓存登录账号
  86. eventBus.$emit('loginSuccess', true);
  87. next({ name })
  88. }).catch(err => {
  89. // 异常需要跳转到错误页面,让用户手动重试
  90. console.log('err', err);
  91. })
  92. })
  93. } else { // 跳转到登录页面
  94. next()
  95. }
  96. } else { //
  97. next()
  98. }
  99. }
  100. }
  101. });
  102. export default router;