index.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. /**
  2. * 路由配置
  3. */
  4. import Vue from 'vue';
  5. import NProgress from 'nprogress';
  6. import VueRouter from 'vue-router';
  7. import { WHITE_LIST, REDIRECT_PATH, LAYOUT_PATH } from '@/config/setting';
  8. import store from '@/store';
  9. import { getToken, setToken } from '@/utils/token-util';
  10. import { routes, getMenuRoutes } from './routes';
  11. import { getLoginUser } from '@/api/login';
  12. import { changeRole } from '@/api/layout/index';
  13. Vue.use(VueRouter);
  14. const router = new VueRouter({
  15. routes,
  16. mode: 'history',
  17. scrollBehavior() {
  18. return { y: 0 };
  19. }
  20. });
  21. /**
  22. * 路由守卫
  23. */
  24. router.beforeEach((to, from, next) => {
  25. console.log(to, 'beforeEach-to');
  26. console.log(from, 'beforeEach-from');
  27. if (!from.path.includes(REDIRECT_PATH)) {
  28. NProgress.start();
  29. }
  30. // 判断是否登录
  31. if (getToken()) {
  32. if (!store.state.user.info?.userId) {
  33. getLoginUser().then((res) => {
  34. store.commit('user/setUserInfo', res);
  35. });
  36. }
  37. // 还未注册动态路由则先获取
  38. if (!store.state.user.menus) {
  39. store
  40. .dispatch('user/fetchUserInfo')
  41. .then(({ menus, homePath, authoritiesRouter }) => {
  42. if (menus) {
  43. router.addRoute(
  44. getMenuRoutes([...menus, ...authoritiesRouter], homePath)
  45. );
  46. next({ ...to, replace: true });
  47. }
  48. })
  49. .catch((e) => {
  50. console.error(e);
  51. next();
  52. });
  53. } else {
  54. // 判断外链并跳转
  55. if (to.meta) {
  56. if (to.meta.source && to.meta.source == 2) {
  57. next({
  58. path: `/sourceLink`,
  59. query: { link: to.meta.path }
  60. });
  61. return;
  62. }
  63. }
  64. // console.log(router.getRoutes(), 'router', routes);
  65. if (routes.length >= router.getRoutes()?.length) {
  66. router.addRoute(
  67. getMenuRoutes([
  68. ...store.state.user.menus,
  69. ...store.state.user.authoritiesRouter,
  70. to.fullPath
  71. ])
  72. );
  73. next({ ...to });
  74. } else {
  75. next();
  76. }
  77. }
  78. } else if (WHITE_LIST.includes(to.path)) {
  79. next();
  80. } else {
  81. next({
  82. path: '/login',
  83. query: to.path === LAYOUT_PATH ? {} : { from: to.path }
  84. });
  85. }
  86. });
  87. router.afterEach((to) => {
  88. if (!to.path.includes(REDIRECT_PATH) && NProgress.isStarted()) {
  89. setTimeout(() => {
  90. NProgress.done(true);
  91. }, 200);
  92. }
  93. });
  94. router.roleChange = async ({ menus, homePath, authoritiesRouter }) => {
  95. const currentUser = JSON.parse(sessionStorage['currentUser']);
  96. if (menus && menus.length > 0) {
  97. router.addRoute(getMenuRoutes([...menus, ...authoritiesRouter], homePath));
  98. if (router.currentRoute.path != (menus[0].redirect || menus[0].path)) {
  99. await router.replace({
  100. path: menus[0].redirect || menus[0].path
  101. });
  102. }
  103. const newToken = await changeRole({
  104. groupId: currentUser.currentGroupId,
  105. roleId: currentUser.currentRoleId
  106. });
  107. setToken(newToken);
  108. setTimeout(() => {
  109. [
  110. 'vuex-eos',
  111. 'vuex-wt',
  112. 'vuex-aps',
  113. 'vuex-mes',
  114. 'vuex-eam',
  115. 'vuex-pro',
  116. 'vuex-fm',
  117. 'vuex-main-data',
  118. 'vuex-wms',
  119. 'vuex-qms',
  120. 'vuex-vis'
  121. ].forEach((key) => {
  122. sessionStorage.removeItem(key);
  123. });
  124. window.location.reload();
  125. }, 100);
  126. }
  127. // next({ ...to, replace: true });
  128. };
  129. export default router;