App.vue 4.2 KB

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