+
+
+
INDUSTRIAL CONTROL
+
{{ fmtTitle(route.meta.title, route) }}
+
智慧用电安全监控 · 实时态势感知平台
+
+
+
+
@@ -45,12 +52,13 @@
import GvaTabs from './tabs/index.vue'
import BottomInfo from '@/components/bottomInfo/bottomInfo.vue'
import { emitter } from '@/utils/bus.js'
- import { ref, onMounted, nextTick, reactive, watchEffect } from 'vue'
+ import { ref, onMounted, nextTick, computed } from 'vue'
import { useRouter, useRoute } from 'vue-router'
import { useRouterStore } from '@/pinia/modules/router'
import { useUserStore } from '@/pinia/modules/user'
import { useAppStore } from '@/pinia'
import { storeToRefs } from 'pinia'
+ import { fmtTitle } from '@/utils/fmtRouterTitle'
import '@/style/transition.scss'
const appStore = useAppStore()
const { config, isDark, device } = storeToRefs(appStore)
@@ -60,23 +68,20 @@
})
useResponsive(true)
- const font = reactive({
- color: 'rgba(0, 0, 0, .15)'
- })
-
- watchEffect(() => {
- font.color = isDark.value ? 'rgba(255,255,255, .15)' : 'rgba(0, 0, 0, .15)'
- })
+ const font = computed(() => ({
+ color: isDark.value ? 'rgba(255,255,255, .15)' : 'rgba(0, 0, 0, .15)'
+ }))
const router = useRouter()
const route = useRoute()
const routerStore = useRouterStore()
+ const keepAliveRouterNames = computed(() => routerStore.keepAliveRouters)
onMounted(() => {
// 挂载一些通用的事件
emitter.on('reload', reload)
- if (userStore.loadingInstance) {
- userStore.loadingInstance.close()
+ if (userStore['loadingInstance']) {
+ userStore['loadingInstance']['close']()
}
nextTick(() => {
document.getElementsByClassName(
@@ -88,6 +93,13 @@
const userStore = useUserStore()
+ const hideBannerRouteNames = ['Login', 'Reload', 'Init']
+ const showPageBanner = (currentRoute) => {
+ if (!currentRoute?.meta?.title) return false
+ if (hideBannerRouteNames.includes(currentRoute.name)) return false
+ return !currentRoute.meta.client && !currentRoute.meta['hidePageHeader']
+ }
+
const reloadFlag = ref(true)
let reloadTimer = null
const reload = async () => {
@@ -95,13 +107,13 @@
window.clearTimeout(reloadTimer)
}
reloadTimer = window.setTimeout(async () => {
- if (route.meta.keepAlive) {
+ if (route.meta['keepAlive']) {
reloadFlag.value = false
await nextTick()
reloadFlag.value = true
} else {
- const title = route.meta.title
- router.push({ name: 'Reload', params: { title } })
+ const title = route.meta['title']
+ await router.push({ name: 'Reload', params: { title } })
}
}, 400)
}
diff --git a/src/view/layout/tabs/index.vue b/src/view/layout/tabs/index.vue
index 6a6ad8a..bd48110 100644
--- a/src/view/layout/tabs/index.vue
+++ b/src/view/layout/tabs/index.vue
@@ -3,12 +3,12 @@
@date: 2024/5/7
!-->
-
+
-
+
+
+
@@ -83,6 +86,7 @@
const left = ref(0)
const top = ref(0)
+ const contextMenuRef = ref(null)
const isCollapse = ref(false)
const isMobile = ref(false)
const rightActive = ref('')
@@ -93,18 +97,25 @@
if (historys.value.length === 1 && route.name === defaultRouter.value) {
return false
}
- let id = ''
- if (e.srcElement.nodeName === 'SPAN') {
- id = e.srcElement.offsetParent.id
- } else {
- id = e.srcElement.id
- }
+ const tabEl = e.target?.closest?.('[id^="tab-"]')
+ const id = tabEl?.id || ''
if (id) {
contextMenuVisible.value = true
- left.value = e.clientX
- top.value = e.clientY + 10
rightActive.value = id.substring(4)
+ const tabRect = tabEl.getBoundingClientRect()
+ left.value = tabRect.left
+ top.value = tabRect.bottom + 6
+ nextTick(() => {
+ const menu = contextMenuRef.value
+ if (!menu) return
+ const { offsetWidth, offsetHeight } = menu
+ const edgeSpace = 8
+ const maxLeft = window.innerWidth - offsetWidth - edgeSpace
+ const maxTop = window.innerHeight - offsetHeight - edgeSpace
+ left.value = Math.max(edgeSpace, Math.min(left.value, maxLeft))
+ top.value = Math.max(edgeSpace, Math.min(top.value, maxTop))
+ })
}
}
const closeAll = () => {
@@ -379,16 +390,46 @@
diff --git a/src/view/person/person.vue b/src/view/person/person.vue
index 9920aae..e01544d 100644
--- a/src/view/person/person.vue
+++ b/src/view/person/person.vue
@@ -553,14 +553,58 @@