backEnd.ts 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. import { store } from '/@/store/index.ts';
  2. import { Session } from '/@/utils/storage';
  3. import { NextLoading } from '/@/utils/loading';
  4. import { setAddRoute, setFilterMenuAndCacheTagsViewRoutes } from '/@/router/index';
  5. import { demoRoutes, dynamicRoutes } from '/@/router/route';
  6. import api from '/@/api/system';
  7. const layouModules: any = import.meta.glob('../layout/routerView/*.{vue,tsx}');
  8. const viewsModules: any = import.meta.glob('../views/**/*.{vue,tsx}');
  9. /**
  10. * 获取目录下的 .vue、.tsx 全部文件
  11. * @method import.meta.glob
  12. * @link 参考:https://cn.vitejs.dev/guide/features.html#json
  13. */
  14. const dynamicViewsModules: Record<string, Function> = Object.assign({}, { ...layouModules }, { ...viewsModules });
  15. /**
  16. * 后端控制路由:初始化方法,防止刷新时路由丢失
  17. * @method NextLoading 界面 loading 动画开始执行
  18. * @method store.dispatch('userInfos/setUserInfos') 触发初始化用户信息
  19. * @method store.dispatch('requestOldRoutes/setBackEndControlRoutes') 存储接口原始路由(未处理component),根据需求选择使用
  20. * @method setAddRoute 添加动态路由
  21. * @method setFilterMenuAndCacheTagsViewRoutes 设置递归过滤有权限的路由到 vuex routesList 中(已处理成多级嵌套路由)及缓存多级嵌套数组处理后的一维数组
  22. */
  23. export async function initBackEndControlRoutes() {
  24. // 界面 loading 动画开始执行
  25. if (window.nextLoading === undefined) NextLoading.start();
  26. // 无 token 停止执行下一步
  27. if (!Session.get('token')) return false;
  28. // 触发初始化用户信息
  29. store.dispatch('userInfos/setUserInfos');
  30. // store.dispatch('userInfos/setPermissions');
  31. let menuRoute = Session.get('userMenu')
  32. // let permissions = Session.get('permissions')
  33. if (!menuRoute) {
  34. await getBackEndControlRoutes(); // 获取路由
  35. menuRoute = Session.get('userMenu')
  36. }
  37. // 获取路由菜单数据
  38. // 存储接口原始路由(未处理component),根据需求选择使用
  39. store.dispatch('requestOldRoutes/setBackEndControlRoutes', JSON.parse(JSON.stringify(menuRoute)));
  40. // 处理路由(component),替换 dynamicRoutes(/@/router/route)第一个顶级 children 的路由
  41. dynamicRoutes[0].children?.push(...await backEndComponent(menuRoute), ...demoRoutes);
  42. // 添加动态路由
  43. await setAddRoute();
  44. // 设置递归过滤有权限的路由到 vuex routesList 中(已处理成多级嵌套路由)及缓存多级嵌套数组处理后的一维数组
  45. setFilterMenuAndCacheTagsViewRoutes();
  46. }
  47. /**
  48. * 请求后端路由菜单接口
  49. * @description isRequestRoutes 为 true,则开启后端控制路由
  50. * @returns 返回后端路由菜单数据
  51. */
  52. export async function getBackEndControlRoutes() {
  53. return api.login.currentUser().then((res: any) => {
  54. Session.set('userMenu', res || [])
  55. // Session.set('permissions',res.data.permissions)
  56. // store.dispatch('userInfos/setPermissions',res.data.permissions)
  57. })
  58. }
  59. /**
  60. * 重新请求后端路由菜单接口
  61. * @description 用于菜单管理界面刷新菜单(未进行测试)
  62. * @description 路径:/src/views/system/menu/component/addMenu.vue
  63. */
  64. export function setBackEndControlRefreshRoutes() {
  65. getBackEndControlRoutes();
  66. }
  67. /**
  68. * 后端路由 component 转换
  69. * @param routes 后端返回的路由表数组
  70. * @returns 返回处理成函数后的 component
  71. */
  72. export function backEndComponent(routes: any) {
  73. if (!routes) return;
  74. return routes.map((item: any) => {
  75. if (item.component) item.component = dynamicImport(dynamicViewsModules, item.component as string);
  76. item.children?.length && backEndComponent(item.children);
  77. // 将 meta 信息进行整理
  78. item.meta = {
  79. icon: item.icon,
  80. isAffix: item.isAffix,
  81. isHide: item.isHide,
  82. isIframe: item.isIframe,
  83. isKeepAlive: item.isKeepAlive,
  84. isLink: item.isLink,
  85. linkUrl: item.linkUrl,
  86. title: item.title,
  87. }
  88. return item;
  89. });
  90. }
  91. /**
  92. * 后端路由 component 转换函数
  93. * @param dynamicViewsModules 获取目录下的 .vue、.tsx 全部文件
  94. * @param component 当前要处理项 component
  95. * @returns 返回处理成函数后的 component
  96. */
  97. export function dynamicImport(dynamicViewsModules: Record<string, Function>, component: string) {
  98. const keys = Object.keys(dynamicViewsModules);
  99. const matchKeys = keys.filter((key) => {
  100. const k = key.replace(/..\/views|../, '');
  101. return k.startsWith(`${component}`) || k.startsWith(`/${component}`);
  102. });
  103. if (matchKeys?.length === 1) {
  104. const matchKey = matchKeys[0];
  105. return dynamicViewsModules[matchKey];
  106. }
  107. if (matchKeys?.length > 1) {
  108. return false;
  109. }
  110. }