router.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. import Vue from "vue";
  2. import Router from "vue-router";
  3. import store from "./store";
  4. import { SYS_ADMIN_NAME } from "@/constants/enumerate";
  5. import Home from "./views/Home.vue";
  6. import HomePage from "./views/home-page/HomePage.vue";
  7. import NotFound from "./views/404.vue";
  8. import login from "./modules/login/router";
  9. // module-example
  10. import base from "./modules/base/router";
  11. import exam from "./modules/exam/router";
  12. import print from "./modules/print/router";
  13. import stmms from "./modules/stmms/router";
  14. import analysis from "./modules/analysis/router";
  15. import mark from "./modules/mark/router";
  16. import course from "./modules/course/router";
  17. import target from "./modules/target/router";
  18. import statistics from "./modules/statistics/router";
  19. // card part
  20. import card from "./modules/card/router";
  21. // admin
  22. import admin from "./modules/admin/router";
  23. // tool
  24. import tool from "../tools/router";
  25. // ignore NavigationDuplicated. https://github.com/vuejs/vue-router/issues/2881
  26. // const originalPush = Router.prototype.push;
  27. // Router.prototype.push = function push(location, onResolve, onReject) {
  28. // if (onResolve || onReject)
  29. // return originalPush.call(this, location, onResolve, onReject);
  30. // try {
  31. // return originalPush.call(this, location).catch((err) => err);
  32. // } catch (error) {
  33. // console.log(error);
  34. // }
  35. // };
  36. // end ignore
  37. Vue.use(Router);
  38. /*
  39. history模式 nginx配置
  40. location / {
  41. try_files $uri $uri/ /index.html;
  42. }
  43. */
  44. const router = new Router({
  45. mode: "history",
  46. routes: [
  47. {
  48. path: "/",
  49. name: "Index",
  50. redirect: { name: "Login" },
  51. },
  52. {
  53. path: "/home/:nextRouter?",
  54. name: "Home",
  55. component: Home,
  56. children: [
  57. {
  58. path: "/home-page",
  59. name: "HomePage",
  60. component: HomePage,
  61. },
  62. ...base,
  63. ...exam,
  64. ...print,
  65. ...stmms,
  66. ...analysis,
  67. ...mark,
  68. ...course,
  69. ...target,
  70. ...statistics,
  71. ],
  72. },
  73. { ...login },
  74. { ...admin },
  75. ...card,
  76. ...tool,
  77. {
  78. path: "*",
  79. name: "NotFound",
  80. component: NotFound,
  81. meta: {
  82. noRequire: true,
  83. },
  84. },
  85. // [lazy-loaded] route level code-splitting
  86. // {
  87. // path: "/about",
  88. // name: "about",
  89. // // this generates a separate chunk (about.[hash].js) for this route
  90. // // which is lazy-loaded when the route is visited.
  91. // component: () =>
  92. // import(/* webpackChunkName: "about" */ "./views/About.vue")
  93. // }
  94. ],
  95. });
  96. function getRouteType(routeMatched) {
  97. const typeData = routeMatched.find(
  98. (item) => item.name === "Home" || item.name === "Admin"
  99. );
  100. return typeData ? typeData.name : null;
  101. }
  102. // route interceptor
  103. const whiteRoutes = ["CardRulePreview"];
  104. router.beforeEach(async (to, from, next) => {
  105. const token = Vue.ls.get("token");
  106. if (to.meta.noRequire) {
  107. next();
  108. return;
  109. }
  110. if (!token) {
  111. // 登录失效的处理
  112. const returnUrl = Vue.ls.get("returnUrl");
  113. if (returnUrl) {
  114. window.location.href = returnUrl;
  115. return;
  116. }
  117. Vue.ls.clear();
  118. const paramDomainCode = window.sessionStorage.getItem("paramDomainCode");
  119. const routeDomainCode = window.sessionStorage.getItem("routeDomainCode");
  120. if (paramDomainCode) {
  121. next({ name: "Login", query: { code: paramDomainCode } });
  122. } else if (routeDomainCode) {
  123. next({ name: "Login", params: { code: routeDomainCode } });
  124. } else {
  125. next({ name: "Login" });
  126. }
  127. return;
  128. }
  129. const fromType = getRouteType(from.matched);
  130. const toType = getRouteType(to.matched);
  131. // 只有超管才可访问Admin
  132. const isSuperAdmin =
  133. Vue.ls.get("user", { loginName: "" }).loginName === SYS_ADMIN_NAME;
  134. if (toType === "Admin" && !isSuperAdmin) {
  135. next({ name: "NotFound" });
  136. return;
  137. }
  138. if (!store.state.app.privileges.length || fromType !== toType) {
  139. if (toType === "Home") {
  140. await store.dispatch("app/updatePrivilegeMap", isSuperAdmin);
  141. } else if (toType === "Admin") {
  142. store.dispatch("app/updateAdminPrivilegeMap");
  143. } else {
  144. store.commit("app/initStore");
  145. }
  146. }
  147. // console.log(fromType, toType);
  148. // console.log(store.state.app.validRoutes);
  149. // console.log(to.name);
  150. if (
  151. !whiteRoutes.includes(to.name) &&
  152. !store.state.app.validRoutes.includes(to.name)
  153. ) {
  154. next({ name: "NotFound" });
  155. return;
  156. }
  157. const privilegeMap = store.state.app.privilegeMap;
  158. Vue.ls.set(
  159. "privilegeId",
  160. privilegeMap[to.name] ? privilegeMap[to.name][0] : ""
  161. );
  162. next();
  163. });
  164. export default router;