09d9da75创建于 2025年7月7日历史提交
<script setup lang="ts">
import zhCn from 'element-plus/lib/locale/lang/zh-cn'
import en from 'element-plus/lib/locale/lang/en'
import { useDark, useToggle } from '@vueuse/core'
import { useWindowStore } from './store/window'
import router from './router'
import { i18n } from './i18n'
import { useMonitorStore } from './store/monitor'

const observabilitySign = 'observability-sql-diagnosis'

const themeBool = ref<boolean>(false)

const isDark = useDark({
    storageKey: 'theme',
    valueDark: 'dark',
    valueLight: 'light',
})

useToggle(isDark)

const collapse = ref(false)
const isFromObservability = ref<boolean>(false)
const mainDiv = ref<HTMLDivElement | null>()
const windowStore = useWindowStore()
const monitorStore = useMonitorStore()

// wujie frame special params
const getWujieParam = () => {
    // @ts-ignore
    if (window.$wujie) {
        // @ts-ignore
        const { id } = window.$wujie.props
        console.log('instanceId:', id)
        if (typeof id === 'string' && id !== '') {
            monitorStore.instanceId = id
        }
    }
}

const dealUrlTo = () => {
    let urlTo = '/vem'
    const curUrl = window.location.href
    if (curUrl.indexOf(observabilitySign) > -1) {
        isFromObservability.value = true
        if (curUrl.indexOf('/vem') > -1) {
            urlTo = curUrl.slice(curUrl.indexOf('/vem'))
        }
    }
    router.replace(urlTo)
}

const onThemeChange = (bool: boolean, themeType: string) => {
    themeBool.value = bool
    localStorage.setItem('theme', themeType)
    windowStore.setTheme(themeType)
}

const wujieInit = () => {
    if (localStorage.getItem('locale') === 'en-US') {
        i18n.global.locale.value = 'en'
    } else {
        i18n.global.locale.value = 'zhCn'
    }
    if (localStorage.getItem('opengauss-theme') === 'dark') {
        onThemeChange(false, 'dark')
    } else {
        onThemeChange(true, 'auto')
    }
}

onMounted(() => {
    new ResizeObserver(() => {
        windowStore.setMainHeight(mainDiv.value!.clientHeight)
        windowStore.setMainWidth(mainDiv.value!.clientWidth)
    }).observe(mainDiv.value!)
    dealUrlTo()
    getWujieParam()

    // @ts-ignore
    const wujie = window.$wujie
    // Judge whether it is a plug-in environment or a local environment through wujie
    if (wujie) {
        localStorage.setItem('INSTANCE_CURRENT_MODE', 'wujie')

        // init theme and language
        wujieInit()

        // Monitoring platform theme changes
        wujie?.bus.$on('opengauss-theme-change', (val: string) => {
            if (val === 'dark') {
                onThemeChange(false, 'dark')
            } else {
                onThemeChange(true, 'auto')
            }
        })

        // Monitoring platform language change
        wujie?.bus.$on('opengauss-locale-change', (val: string) => {
            if (val === 'en-US') {
                i18n.global.locale.value = 'en'
            } else {
                i18n.global.locale.value = 'zhCn'
            }
        })

        const htmlstyle = document.getElementsByTagName('html')[0].style
        wujie?.bus.$on('opengauss-menu-collapse', (val: string) => {
            if (val === '1') {
                htmlstyle.setProperty('padding-left', '64px', 'important')
            } else {
                htmlstyle.setProperty('padding-left', '236px', 'important')
            }
        })
    } else {
        // local default
        localStorage.setItem('INSTANCE_CURRENT_MODE', 'local')
    }
})
</script>

<template>
    <el-config-provider size="small" :locale="$i18n.locale === 'zhCn' ? zhCn : en">
        <div class="container">
            <aside v-if="!isFromObservability">
                <my-menu :collapse="collapse" />
            </aside>
            <div class="main" ref="mainDiv">
                <div class="page"><router-view /></div>
            </div>
        </div>
    </el-config-provider>
</template>

<style scoped lang="scss">
.container {
    /* height: calc(100% - var(--vem-header-height)); */
    height: 100%;
    overflow: hidden;
    display: flex;
    flex-flow: row nowrap;
}
.main {
    flex: 1;
    min-width: 0;
    background-color: var(--el-bg-color);
    display: flex;
    flex-direction: column;
}
.page {
    padding: 16px;
    height: calc(100% - var(--vem-header-height));
    overflow: auto;
}
</style>