App.vue 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. <script lang="ts" setup>
  2. import eruda from 'eruda'
  3. import VConsole from 'vconsole'
  4. import { useI18n } from 'vue-i18n'
  5. import hotkeys from 'hotkeys-js'
  6. import { InjectionI18nTitle } from './utils/injectionKeys'
  7. import eventBus from './utils/eventBus'
  8. import { getElementLocales } from '@/locales'
  9. import useSettingsStore from '@/store/modules/settings'
  10. import useMenuStore from '@/store/modules/menu'
  11. import useTabbarStore from '@/store/modules/tabbar'
  12. const route = useRoute()
  13. const settingsStore = useSettingsStore()
  14. const menuStore = useMenuStore()
  15. const tabbarStore = useTabbarStore()
  16. const tabbar = useTabbar()
  17. const locales = computed(() => getElementLocales())
  18. const buttonConfig = ref({
  19. autoInsertSpace: true,
  20. })
  21. // 侧边栏主导航当前实际宽度
  22. const mainSidebarActualWidth = computed(() => {
  23. let actualWidth = parseInt(getComputedStyle(document.documentElement).getPropertyValue('--g-main-sidebar-width'))
  24. if (settingsStore.settings.menu.menuMode === 'single' || (['head', 'only-head'].includes(settingsStore.settings.menu.menuMode) && settingsStore.mode !== 'mobile')) {
  25. actualWidth = 0
  26. }
  27. return `${actualWidth}px`
  28. })
  29. // 侧边栏次导航当前实际宽度
  30. const subSidebarActualWidth = computed(() => {
  31. let actualWidth = parseInt(getComputedStyle(document.documentElement).getPropertyValue('--g-sub-sidebar-width'))
  32. if (settingsStore.settings.menu.subMenuCollapse && settingsStore.mode !== 'mobile') {
  33. actualWidth = parseInt(getComputedStyle(document.documentElement).getPropertyValue('--g-sub-sidebar-collapse-width'))
  34. }
  35. if (['only-side', 'only-head'].includes(settingsStore.settings.menu.menuMode) && settingsStore.mode !== 'mobile') {
  36. actualWidth = 0
  37. }
  38. if (
  39. settingsStore.settings.menu.subMenuOnlyOneHide
  40. && menuStore.sidebarMenus.length === 1
  41. && (
  42. !menuStore.sidebarMenus[0].children
  43. || menuStore.sidebarMenus[0]?.children.every(item => item.meta?.sidebar === false)
  44. )
  45. ) {
  46. actualWidth = 0
  47. }
  48. return `${actualWidth}px`
  49. })
  50. // 设置页面 title
  51. watch([
  52. () => settingsStore.settings.app.enableDynamicTitle,
  53. () => settingsStore.title,
  54. ], () => {
  55. if (settingsStore.settings.app.enableDynamicTitle && settingsStore.title) {
  56. const title = settingsStore.titleFirst
  57. ? settingsStore.title
  58. : settingsStore.settings.app.routeBaseOn !== 'filesystem'
  59. ? generateI18nTitle(route.meta.breadcrumbNeste?.at(-1)?.i18n, settingsStore.title)
  60. : generateI18nTitle(route.meta.i18n, settingsStore.title)
  61. document.title = `${title} - ${import.meta.env.VITE_APP_TITLE}`
  62. }
  63. else {
  64. document.title = import.meta.env.VITE_APP_TITLE
  65. }
  66. if (settingsStore.settings.tabbar.enable && settingsStore.titleFirst && settingsStore.title) {
  67. tabbarStore.editTitle({
  68. tabId: tabbar.getId(),
  69. title: settingsStore.title,
  70. })
  71. }
  72. }, {
  73. immediate: true,
  74. })
  75. onMounted(() => {
  76. settingsStore.setMode(document.documentElement.clientWidth)
  77. window.onresize = () => {
  78. settingsStore.setMode(document.documentElement.clientWidth)
  79. }
  80. hotkeys('alt+i', () => {
  81. eventBus.emit('global-system-info-toggle')
  82. })
  83. })
  84. const { t, te } = useI18n()
  85. provide(InjectionI18nTitle, generateI18nTitle)
  86. function generateI18nTitle(key: string | undefined, defaultTitle: string | Function = t('route.undefined')) {
  87. return (settingsStore.settings.toolbar.enableI18n && !!key && te(key))
  88. ? t(key)
  89. : typeof defaultTitle === 'function'
  90. ? defaultTitle()
  91. : defaultTitle
  92. }
  93. import.meta.env.VITE_APP_DEBUG_TOOL === 'eruda' && eruda.init()
  94. import.meta.env.VITE_APP_DEBUG_TOOL === 'vconsole' && new VConsole()
  95. </script>
  96. <template>
  97. <el-config-provider :locale="locales[settingsStore.settings.app.defaultLang]" :size="settingsStore.settings.app.elementSize" :button="buttonConfig">
  98. <RouterView
  99. :style="{
  100. '--g-main-sidebar-actual-width': mainSidebarActualWidth,
  101. '--g-sub-sidebar-actual-width': subSidebarActualWidth,
  102. }"
  103. />
  104. <system-info />
  105. </el-config-provider>
  106. </template>