index.js 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. /*
  2. * 路由
  3. *
  4. * @Author: admin
  5. * @Date: 2022-09-06 20:52:04
  6. */
  7. import nProgress from 'nprogress';
  8. import 'nprogress/nprogress.css';
  9. import {nextTick} from 'vue';
  10. import {createRouter, createWebHashHistory} from 'vue-router';
  11. import {routerArray} from './routers';
  12. import {PAGE_PATH_404, PAGE_PATH_AUTO_LOGIN, PAGE_PATH_LOGIN} from '/@/constants/common-const';
  13. import {HOME_PAGE_NAME,HOME_PAGE_PATH} from '/@/constants/system/home-const';
  14. import SmartLayout from '../layout/index.vue';
  15. import {useUserStore} from '/@/store/modules/system/user';
  16. import {localClear, localRead,localSave} from '/@/utils/local-util';
  17. import _ from 'lodash';
  18. import LocalStorageKeyConst from '/@/constants/local-storage-key-const.js';
  19. import useBsDict from "/@/utils/dict.js";
  20. export const router = createRouter({
  21. history: createWebHashHistory(),
  22. routes: routerArray,
  23. strict: true,
  24. scrollBehavior: () => ({left: 0, top: 0}),
  25. });
  26. // ----------------------- 路由加载前 -----------------------
  27. router.beforeEach(async (to, from, next) => {
  28. // 进度条开启
  29. nProgress.start();
  30. // 如果是白名单,不需要拦截,直接放行
  31. if (to.meta.isWhite) {
  32. next();
  33. return;
  34. }
  35. // 公共页面,任何时候都可以跳转
  36. if (to.path === PAGE_PATH_404) {
  37. next();
  38. return;
  39. }
  40. // 验证登录
  41. if(to.query.token && to.query.isMobile){
  42. localSave(LocalStorageKeyConst.USER_TOKEN, to.query.token ? to.query.token : '');
  43. next();
  44. return;
  45. }
  46. const token = localRead(LocalStorageKeyConst.USER_TOKEN);
  47. if (!token && to.path != PAGE_PATH_AUTO_LOGIN) {//autoLogin页面不需要登录验证
  48. useUserStore().logout();
  49. if (to.path === PAGE_PATH_LOGIN) {
  50. next();
  51. } else {
  52. next({path: PAGE_PATH_LOGIN});
  53. }
  54. return;
  55. }
  56. // if(!token){
  57. // next({path: HOME_PAGE_PATH});
  58. // return;
  59. // }
  60. // 登录页,则跳转到首页
  61. if (to.path === PAGE_PATH_LOGIN) {
  62. next({path: HOME_PAGE_PATH});
  63. return;
  64. }
  65. // 首页( 需要登录 ,但不需要验证权限)
  66. if (to.path === HOME_PAGE_NAME) {
  67. next();
  68. return;
  69. }
  70. // 下载路由对应的 页面组件,并修改组件的Name,如果修改过,则不需要修改
  71. let toRouterInfo = routerMap.get(to.name);
  72. if (toRouterInfo && _.isFunction(toRouterInfo.component) && toRouterInfo.meta.renameComponentFlag === false) {
  73. // 因为组件component 为 lazy load是个方法,所以可以直接执行 component()方法
  74. toRouterInfo.component().then((val) => {
  75. // 修改组件的name
  76. val.default.name = to.meta.componentName;
  77. // 记录已经修改过 组件的name
  78. toRouterInfo.meta.renameComponentFlag = true;
  79. });
  80. }
  81. // 设置tagNav
  82. useUserStore().setTagNav(to, from);
  83. // 设置keepAlive
  84. if (to.meta.keepAlive) {
  85. nextTick(() => {
  86. useUserStore().pushKeepAliveIncludes(to.meta.componentName);
  87. });
  88. }
  89. // 初始化字典
  90. await useBsDict.init();
  91. next();
  92. });
  93. // ----------------------- 路由加载后 -----------------------
  94. router.afterEach(() => {
  95. nProgress.done();
  96. });
  97. // ----------------------- 构建router对象 -----------------------
  98. const routerMap = new Map();
  99. export function buildRoutes(menuRouterList) {
  100. let menuList = menuRouterList ? menuRouterList : useUserStore().getMenuRouterList || [];
  101. /**
  102. * 1、构建整个路由信息
  103. * 2、添加到路由里
  104. */
  105. const routerList = [];
  106. // 获取所有vue组件引用地址 用于构建路由
  107. const modules = import.meta.glob('../views/**/**.vue');
  108. // 获取所有vue组件 用于注入name属性 name属性用于keep-alive
  109. //1、构建整个路由信息
  110. for (const e of menuList) {
  111. if (!e.menuId) {
  112. continue;
  113. }
  114. if (!e.path) {
  115. continue;
  116. }
  117. if (e.deletedFlag && e.deletedFlag === true) {
  118. continue;
  119. }
  120. let route = {
  121. path: e.path.startsWith('/') ? e.path : `/${e.path}`,
  122. // 使用【menuId】作为name唯一标识
  123. name: e.menuId.toString(),
  124. meta: {
  125. // 数据库菜单(页面)id
  126. id: e.menuId.toString(),
  127. // 组件名称
  128. componentName: e.menuId.toString(),
  129. // 菜单展示
  130. title: e.menuName,
  131. // 菜单图标展示
  132. icon: e.icon,
  133. // 是否在菜单隐藏
  134. hideInMenu: !e.visibleFlag,
  135. // 页面是否keep-alive缓存
  136. keepAlive: e.cacheFlag,
  137. // 是否为外链
  138. frameFlag: e.frameFlag,
  139. // 外链地址
  140. frameUrl: e.frameUrl,
  141. // 是否 rename了组件的名字
  142. renameComponentFlag: false,
  143. },
  144. };
  145. if (e.frameFlag) {
  146. route.component = () => import('../components/framework/iframe/iframe-index.vue');
  147. } else {
  148. let componentPath = e.component && e.component.startsWith('/') ? e.component : '/' + e.component;
  149. let relativePath = `../views${componentPath}`;
  150. // // eslint-disable-next-line no-prototype-builtins
  151. route.component = modules[relativePath];
  152. }
  153. routerList.push(route);
  154. routerMap.set(e.menuId.toString(), route);
  155. }
  156. //2、添加到路由里
  157. router.addRoute({
  158. path: '/',
  159. meta: {},
  160. component: SmartLayout,
  161. children: routerList,
  162. });
  163. }