<template> <!-- 部分全屏页面 --> <app-main v-if="FullScreen" /> <div v-else :class="classObj" class="app-wrapper" :style="{ '--current-color': theme }"> <div v-if="device === 'mobile' && sidebar.opened" class="drawer-bg" @click="handleClickOutside"></div> <!-- 头部 --> <HeaderSys></HeaderSys> <!-- 左侧菜单 --> <sidebar v-if="!sidebar.hide" class="sidebar-container" v-show="!ifShowMenu" /> <div :class="{ hasTagsView: needTagsView, sidebarHide: sidebar.hide, 'main-container': !ifShowMenu, 'main-containerNo': ifShowMenu }"> <div :class="{ 'fixed-header': fixedHeader }"> <!-- <navbar @setLayout="setLayout" /> --> <!-- 面包屑 --> <!-- <tags-view v-if="needTagsView" /> --> </div> <app-main /> <settings ref="settingRef" /> </div> </div> </template> <script setup> import { useWindowSize } from '@vueuse/core'; import Sidebar from './components/Sidebar/index.vue'; import HeaderSys from './components/HeaderSys/index.vue'; import { AppMain, Navbar, Settings, TagsView } from './components'; import defaultSettings from '@/settings'; import useAppStore from '@/store/modules/app'; import useSettingsStore from '@/store/modules/settings'; import { useRouter } from 'vue-router'; import { ref } from 'vue'; import bus from '@/utils/mitt'; const router = useRouter(); const settingsStore = useSettingsStore(); const theme = computed(() => settingsStore.theme); const sideTheme = computed(() => settingsStore.sideTheme); const sidebar = computed(() => useAppStore().sidebar); const device = computed(() => useAppStore().device); const needTagsView = computed(() => settingsStore.tagsView); const fixedHeader = computed(() => settingsStore.fixedHeader); const ifShowMenu = ref(true); const classObj = computed(() => ({ hideSidebar: !sidebar.value.opened, openSidebar: sidebar.value.opened, withoutAnimation: sidebar.value.withoutAnimation, mobile: device.value === 'mobile', })); const { width, height } = useWindowSize(); const WIDTH = 992; // refer to Bootstrap's responsive design watchEffect(() => { if (device.value === 'mobile' && sidebar.value.opened) { useAppStore().closeSideBar({ withoutAnimation: false }); } if (width.value - 1 < WIDTH) { useAppStore().toggleDevice('mobile'); useAppStore().closeSideBar({ withoutAnimation: true }); } else { useAppStore().toggleDevice('desktop'); } }); function handleClickOutside() { useAppStore().closeSideBar({ withoutAnimation: false }); } const settingRef = ref(null); function setLayout() { settingRef.value.openSetting(); } const FullScreen = ref(false); watch( () => router.currentRoute.value.path, (newValue, oldValue) => { if (router.currentRoute.value.query.type == 'FullScreen') { // 全屏页面 FullScreen.value = true; } else { // 非全屏页面 FullScreen.value = false; } }, { immediate: true } ); // 默认收起菜单 function xgMenuSet() { let key = localStorage.getItem('routerPartXG'); if (key == 'SponeScreen' || key == 'FloodSys' || key == 'Project' || key == 'DataAnalysis') { useAppStore().closeSideBar({ withoutAnimation: true }); } else { useAppStore().openSideBar({ withoutAnimation: true }); } } onMounted(() => { xgMenuSet(); bus.on('selfMenuXG', e => { // 默认收起菜单 xgMenuSet(); }); //海绵综合一张图左侧菜单不显示 bus.on('HaiMianScreenMenu', e => { ifShowMenu.value = e; }); }); onBeforeUnmount(() => { bus.off('selfMenuXG'); bus.off('HaiMianScreenMenu'); }); </script> <style lang="scss" scoped> @import '@/assets/styles/mixin.scss'; @import '@/assets/styles/variables.module.scss'; .app-wrapper { @include clearfix; position: relative; height: 100%; width: 100%; overflow: hidden; &.mobile.openSidebar { position: fixed; top: 0; } } .drawer-bg { background: #000; opacity: 0.3; width: 100%; top: 0; height: 100%; position: absolute; z-index: 999; } .fixed-header { position: fixed; top: 0; right: 0; z-index: 9; width: calc(100% - #{$base-sidebar-width}); transition: width 0.28s; } .hideSidebar .fixed-header { width: calc(100% - 54px); } .sidebarHide .fixed-header { width: 100%; } .mobile .fixed-header { width: 100%; } </style>