123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- <script lang="ts" setup>
- import { computed } from "vue"
- import { storeToRefs } from "pinia"
- import { useAppStore } from "@/store/modules/app"
- import { useSettingsStore } from "@/store/modules/settings"
- import { AppMain, NavigationBar, Sidebar, TagsView, Logo } from "./components"
- const appStore = useAppStore()
- const settingsStore = useSettingsStore()
- const { showTagsView, showLogo } = storeToRefs(settingsStore)
- /** 定义计算属性 layoutClasses,用于控制布局的类名 */
- const layoutClasses = computed(() => {
- return {
- hideSidebar: !appStore.sidebar.opened
- }
- })
- </script>
- <template>
- <div :class="layoutClasses" class="app-wrapper">
- <!-- 头部导航栏和标签栏 -->
- <div class="fixed-header layout-header">
- <Logo v-if="showLogo" :collapse="false" class="logo" />
- <div class="content">
- <NavigationBar />
- <TagsView v-show="showTagsView" />
- </div>
- </div>
- <!-- 主容器 -->
- <div :class="{ hasTagsView: showTagsView }" class="main-container">
- <!-- 左侧边栏 -->
- <Sidebar class="sidebar-container" />
- <!-- 页面主体内容 -->
- <AppMain class="app-main" />
- </div>
- </div>
- </template>
- <style lang="scss" scoped>
- @import "@/styles/mixins.scss";
- $transition-time: 0.35s;
- .app-wrapper {
- @extend %clearfix;
- width: 100%;
- }
- .fixed-header {
- position: fixed;
- top: 0;
- z-index: 1002;
- width: 100%;
- display: flex;
- .logo {
- width: var(--v3-sidebar-width);
- }
- .content {
- flex: 1;
- position: relative;
- }
- }
- .layout-header {
- background-color: var(--v3-header-bg-color);
- box-shadow: var(--el-box-shadow-lighter);
- }
- .main-container {
- min-height: 100%;
- }
- .sidebar-container {
- transition: width $transition-time;
- width: var(--v3-sidebar-width) !important;
- height: 100%;
- position: fixed;
- left: 0;
- z-index: 1001;
- overflow: hidden;
- padding-top: var(--v3-navigationbar-height);
- }
- .app-main {
- transition: padding-left $transition-time;
- padding-top: var(--v3-navigationbar-height);
- padding-left: var(--v3-sidebar-width);
- height: 100vh;
- overflow: auto;
- }
- .hideSidebar {
- .sidebar-container {
- width: var(--v3-sidebar-hide-width) !important;
- }
- .app-main {
- padding-left: var(--v3-sidebar-hide-width);
- }
- }
- .hasTagsView {
- .sidebar-container {
- padding-top: var(--v3-header-height);
- }
- .app-main {
- padding-top: var(--v3-header-height);
- }
- }
- </style>
|