index.ts 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. import { getConfig } from "/@/config";
  2. import { toRouteType } from "./types";
  3. import NProgress from "/@/utils/progress";
  4. import { findIndex } from "lodash-unified";
  5. import type { StorageConfigs } from "/#/index";
  6. import { transformI18n } from "/@/plugins/i18n";
  7. import { useMultiTagsStoreHook } from "/@/store/modules/multiTags";
  8. import { usePermissionStoreHook } from "/@/store/modules/permission";
  9. import {
  10. Router,
  11. createRouter,
  12. RouteRecordRaw,
  13. RouteComponent
  14. } from "vue-router";
  15. import {
  16. ascending,
  17. initRouter,
  18. getHistoryMode,
  19. findRouteByPath,
  20. handleAliveRoute,
  21. formatTwoStageRoutes,
  22. formatFlatteningRoutes
  23. } from "./utils";
  24. import {
  25. buildHierarchyTree,
  26. openLink,
  27. isUrl,
  28. storageSession
  29. } from "@pureadmin/utils";
  30. import pptRouter from "./modules/ppt";
  31. import homeRouter from "./modules/home";
  32. import ableRouter from "./modules/able";
  33. import listRouter from "./modules/list";
  34. import aboutRouter from "./modules/about";
  35. import errorRouter from "./modules/error";
  36. import guideRouter from "./modules/guide";
  37. import resultRouter from "./modules/result";
  38. import editorRouter from "./modules/editor";
  39. import nestedRouter from "./modules/nested";
  40. import flowChartRouter from "./modules/flowchart";
  41. import remainingRouter from "./modules/remaining";
  42. import componentsRouter from "./modules/components";
  43. import formDesignRouter from "./modules/formdesign";
  44. /** 原始静态路由(未做任何处理) */
  45. const routes = [
  46. pptRouter,
  47. homeRouter,
  48. ableRouter,
  49. listRouter,
  50. aboutRouter,
  51. errorRouter,
  52. guideRouter,
  53. resultRouter,
  54. nestedRouter,
  55. editorRouter,
  56. flowChartRouter,
  57. componentsRouter,
  58. formDesignRouter
  59. ];
  60. /** 导出处理后的静态路由(三级及以上的路由全部拍成二级) */
  61. export const constantRoutes: Array<RouteRecordRaw> = formatTwoStageRoutes(
  62. formatFlatteningRoutes(buildHierarchyTree(ascending(routes)))
  63. );
  64. /** 用于渲染菜单,保持原始层级 */
  65. export const constantMenus: Array<RouteComponent> = ascending(routes).concat(
  66. ...remainingRouter
  67. );
  68. /** 不参与菜单的路由 */
  69. export const remainingPaths = Object.keys(remainingRouter).map(v => {
  70. return remainingRouter[v].path;
  71. });
  72. /** 创建路由实例 */
  73. export const router: Router = createRouter({
  74. history: getHistoryMode(),
  75. routes: constantRoutes.concat(...(remainingRouter as any)),
  76. strict: true,
  77. scrollBehavior(to, from, savedPosition) {
  78. return new Promise(resolve => {
  79. if (savedPosition) {
  80. return savedPosition;
  81. } else {
  82. if (from.meta.saveSrollTop) {
  83. const top: number =
  84. document.documentElement.scrollTop || document.body.scrollTop;
  85. resolve({ left: 0, top });
  86. }
  87. }
  88. });
  89. }
  90. });
  91. /** 重置路由 */
  92. export function resetRouter() {
  93. router.getRoutes().forEach(route => {
  94. const { name, meta } = route;
  95. if (name && router.hasRoute(name) && meta?.backstage) {
  96. router.removeRoute(name);
  97. router.options.routes = formatTwoStageRoutes(
  98. formatFlatteningRoutes(buildHierarchyTree(ascending(routes)))
  99. );
  100. }
  101. });
  102. usePermissionStoreHook().clearAllCachePage();
  103. }
  104. /** 路由白名单 */
  105. const whiteList = ["/login"];
  106. router.beforeEach((to: toRouteType, _from, next) => {
  107. if (to.meta?.keepAlive) {
  108. const newMatched = to.matched;
  109. handleAliveRoute(newMatched, "add");
  110. // 页面整体刷新和点击标签页刷新
  111. if (_from.name === undefined || _from.name === "Redirect") {
  112. handleAliveRoute(newMatched);
  113. }
  114. }
  115. const name = storageSession.getItem<StorageConfigs>("info");
  116. NProgress.start();
  117. const externalLink = isUrl(to?.name as string);
  118. if (!externalLink)
  119. to.matched.some(item => {
  120. if (!item.meta.title) return "";
  121. const Title = getConfig().Title;
  122. if (Title)
  123. document.title = `${transformI18n(item.meta.title)} | ${Title}`;
  124. else document.title = transformI18n(item.meta.title);
  125. });
  126. if (name) {
  127. if (_from?.name) {
  128. // name为超链接
  129. if (externalLink) {
  130. openLink(to?.name as string);
  131. NProgress.done();
  132. } else {
  133. next();
  134. }
  135. } else {
  136. // 刷新
  137. if (usePermissionStoreHook().wholeMenus.length === 0)
  138. initRouter(name.username).then((router: Router) => {
  139. if (!useMultiTagsStoreHook().getMultiTagsCache) {
  140. const { path } = to;
  141. const index = findIndex(remainingRouter, v => {
  142. return v.path == path;
  143. });
  144. const routes: any =
  145. index === -1
  146. ? router.options.routes[0].children
  147. : router.options.routes;
  148. const route = findRouteByPath(path, routes);
  149. // query、params模式路由传参数的标签页不在此处处理
  150. if (route && route.meta?.title) {
  151. useMultiTagsStoreHook().handleTags("push", {
  152. path: route.path,
  153. name: route.name,
  154. meta: route.meta
  155. });
  156. }
  157. }
  158. router.push(to.fullPath);
  159. });
  160. next();
  161. }
  162. } else {
  163. if (to.path !== "/login") {
  164. if (whiteList.indexOf(to.path) !== -1) {
  165. next();
  166. } else {
  167. next({ path: "/login" });
  168. }
  169. } else {
  170. next();
  171. }
  172. }
  173. });
  174. router.afterEach(() => {
  175. NProgress.done();
  176. });
  177. export default router;