index.ts 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. //@ts-nocheck
  2. /**
  3. * @description 所有人可使用的参数配置列表
  4. * @params hideMenu: 是否隐藏当前路由结点不在导航中展示
  5. * @params alwaysShow: 只有一个子路由时是否总是展示菜单,默认false
  6. */
  7. import {createRouter, createWebHistory, RouteRecordRaw} from 'vue-router'
  8. import store from '@/store'
  9. import NProgress from '@/utils/system/nprogress'
  10. import {changeTitle} from '@/utils/system/title'
  11. // 动态路由相关引入数据
  12. // 引入modules
  13. import Dashboard from './modules/dashboard'
  14. import {getUserMenu, IntergrationMenu} from "@/api/settings/menu-settings";
  15. import {createVNode, defineComponent, h} from "vue";
  16. import Layout from "@/layout/index.vue";
  17. import {userInfoStore} from "@/utils/store-public";
  18. import {stringIsBlank} from "@/utils/blank-utils";
  19. import XEUtils from "xe-utils";
  20. const whiteNameRouting = []
  21. function dashboardRouter(data: Array<RouteRecordRaw>) {
  22. data.forEach((item) => {
  23. XEUtils.set(item, "meta.needToken", false)
  24. whiteNameRouting.push(item.path)
  25. if (item.children && item.children.length > 0) {
  26. dashboardRouter(item.children)
  27. }
  28. })
  29. }
  30. dashboardRouter(Dashboard)
  31. const router = createRouter({
  32. history: createWebHistory(),
  33. routes: [...Dashboard],
  34. })
  35. const vueFile = import.meta.glob('../views/**/*.{vue,tsx}');
  36. vueFile.EmptyRouter = import.meta.glob('../layout/EmptyRouter')['../layout/EmptyRouter']
  37. vueFile.Layout = import.meta.glob('../layout/index.vue')['../layout/index.vue']
  38. let asyncFinished = false
  39. export const routerMenus = ref([])
  40. async function beforeAddRoutes() {
  41. routerMenus.value = await getUserMenu()
  42. const routers = addRoutes(routerMenus.value)
  43. routers.forEach(item => {
  44. router.addRoute(item)
  45. })
  46. // 404 要添加到最后面才可以,不然一开始就会是 404
  47. router.addRoute({
  48. path: '/:path(.*)*',
  49. name: 'notFound',
  50. component: Layout,
  51. redirect: '/404',
  52. hideMenu: true,
  53. })
  54. }
  55. function createNameComponent(item) {
  56. return () => {
  57. return new Promise(resolve => {
  58. vueFile[`${item.component}`]().then(res => {
  59. const tmp = defineComponent({
  60. name: item.name,
  61. render() {
  62. let children = [createVNode(res.default)]
  63. const style = {
  64. height: '100%',
  65. width: '100%',
  66. }
  67. const props = {
  68. style
  69. }
  70. if (item.mainCard) {
  71. props.class = 'cy_card'
  72. }
  73. if (item.mainOverflowAuto) {
  74. children = [
  75. h('div', {
  76. style: {
  77. height: '100%',
  78. width: '100%',
  79. overflow: 'auto'
  80. }
  81. }, [createVNode(res.default)])
  82. ]
  83. }
  84. return h('div', props, children);
  85. }
  86. })
  87. resolve(tmp)
  88. })
  89. })
  90. }
  91. }
  92. const capitalizeFirstLower = (word: string) => {
  93. return word.charAt(0).toLowerCase() + word.slice(1);
  94. }
  95. function addRoutes(menus: IntergrationMenu[]) {
  96. const routers: RouteRecordRaw[] = []
  97. menus.forEach(item => {
  98. const meta: { [key: string]: any } = {}
  99. for (let key in item) {
  100. if (key.startsWith("meta")) {
  101. const metaKey = capitalizeFirstLower(key.replace("meta", ""))
  102. meta[metaKey] = item[key]
  103. }
  104. }
  105. const data: RouteRecordRaw = {
  106. path: item.path + item.pathParams,
  107. name: item.name,
  108. redirect: item.redirect,
  109. meta: meta,
  110. component: createNameComponent(item)
  111. };
  112. if (item.children && item.children.length > 0) {
  113. data.children = addRoutes(item.children)
  114. }
  115. routers.push(data)
  116. })
  117. return routers
  118. }
  119. router.beforeEach(async (to, _from, next) => {
  120. NProgress.start();
  121. function tmpNext(...arg) {
  122. to.meta.title && changeTitle(to.meta.title)
  123. if (to.meta.needToken && stringIsBlank(userInfoStore.value.token)) {
  124. next('/login')
  125. return
  126. }
  127. next(...arg);
  128. }
  129. for (let i = 0; i < whiteNameRouting.length; i++) {
  130. const tmp: string = whiteNameRouting[i]
  131. if (tmp.startsWith(to.path)) {
  132. tmpNext()
  133. return
  134. }
  135. }
  136. if (!asyncFinished) {
  137. await beforeAddRoutes()
  138. tmpNext({path: to.path, query: to.query, replace: true});
  139. asyncFinished = true
  140. } else {
  141. tmpNext();
  142. }
  143. }
  144. )
  145. router.afterEach((to, _from) => {
  146. const keepAliveComponentsName = store.getters['keepAlive/keepAliveComponentsName'] || []
  147. const name = to.matched[to.matched.length - 1].components.default.name
  148. if (to.meta && to.meta.cache && name && !keepAliveComponentsName.includes(name)) {
  149. store.commit('keepAlive/addKeepAliveComponentsName', name)
  150. }
  151. NProgress.done()
  152. })
  153. export default router