123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394 |
- <template>
- <div :class="classObj" class="app__wrap">
- <!-- Classic -->
- <div
- v-if="layout === 'Classic' || layout === 'LeftTop'"
- class="sidebar__wrap"
- :class="{'sidebar__wrap--collapsed': collapsed}"
- >
- <logo
- v-if="showLogo && layout === 'Classic'"
- :collapsed="collapsed"
- />
- <sider :layout="layout" mode="vertical" />
- </div>
- <!-- Classic -->
- <!-- Top -->
- <div v-if="layout !== 'Classic'" class="sidebar__wrap--Top">
- <div>
- <logo
- v-if="showLogo"
- :collapsed="collapsed"
- />
- </div>
- <div v-if="layout === 'Top'" class="sidebar__item--Top">
- <sider :layout="layout" mode="horizontal" />
- </div>
- <div>
- <div v-if="showScreenfull || showUserInfo" class="navbar__wrap--right">
- <screenfull v-if="showScreenfull" class="hover-container screenfull-container" />
- <user-info v-if="showUserInfo" class="hover-container user-container" />
- </div>
- </div>
- </div>
- <!-- Top -->
- <div
- class="main__wrap"
- :class="{
- 'main__wrap--collapsed': collapsed
- }"
- >
- <el-scrollbar
- class="main__wrap--content"
- :class="{
- 'main__wrap--fixed--all': fixedHeader && showNavbar && showTags,
- 'main__wrap--fixed--nav': fixedHeader && showNavbar && !showTags,
- 'main__wrap--fixed--tags': fixedHeader && !showNavbar && showTags
- }"
- >
- <div
- class="header__wrap"
- :class="{
- 'header__wrap--fixed': fixedHeader,
- 'header__wrap--collapsed': fixedHeader && collapsed
- }"
- >
- <div
- v-if="showNavbar && layout !== 'Top'"
- class="navbar__wrap"
- >
- <hamburger
- v-if="showHamburger"
- :collapsed="collapsed"
- class="hover-container"
- @toggleClick="setCollapsed"
- />
- <breadcrumb v-if="showBreadcrumb" />
- <div v-if="showScreenfull || showUserInfo" class="navbar__wrap--right">
- <screenfull v-if="showScreenfull" class="hover-container screenfull-container" />
- <user-info v-if="showUserInfo" class="hover-container user-container" />
- </div>
- </div>
- <div
- v-if="showTags"
- class="tags__wrap"
- >
- <tags-view />
- </div>
- </div>
- <app-main />
- </el-scrollbar>
- </div>
- <!-- setting -->
- <div class="setting__wrap" @click="toggleClick">
- <i class="el-icon-setting" />
- </div>
- <el-drawer
- v-model="drawer"
- direction="rtl"
- size="20%"
- >
- <template #title>
- <div class="setting__title">项目配置</div>
- </template>
- <setting />
- </el-drawer>
- <!-- setting -->
- </div>
- </template>
- <script lang="ts">
- import { defineComponent, computed, ref } from 'vue'
- import { appStore } from '_p/index/store/modules/app'
- import AppMain from '../components/AppMain.vue'
- import TagsView from '_c/TagsView/index.vue'
- import Logo from '_c/Logo/index.vue'
- import Sider from '_c/Sider/index.vue'
- import Hamburger from '_c/Hamburger/index.vue'
- import Breadcrumb from '_c/Breadcrumb/index.vue'
- import Screenfull from '_c/Screenfull/index.vue'
- import UserInfo from '_c/UserInfo/index.vue'
- import Setting from '_c/Setting/index.vue'
- export default defineComponent({
- name: 'Layout',
- components: {
- Sider,
- Hamburger,
- Breadcrumb,
- Screenfull,
- UserInfo,
- AppMain,
- TagsView,
- Logo,
- Setting
- },
- setup() {
- const drawer = ref<boolean>(false)
- const layout = computed(() => appStore.layout)
- const collapsed = computed(() => appStore.collapsed)
- const showLogo = computed(() => appStore.showLogo)
- const showTags = computed(() => appStore.showTags)
- const showBreadcrumb = computed(() => appStore.showBreadcrumb)
- const showHamburger = computed(() => appStore.showHamburger)
- const showScreenfull = computed(() => appStore.showScreenfull)
- const showUserInfo = computed(() => appStore.showUserInfo)
- const showNavbar = computed(() => appStore.showNavbar)
- // const fixedNavbar = computed(() => appStore.fixedNavbar)
- // const fixedTags = computed(() => appStore.fixedTags)
- const fixedHeader = computed(() => appStore.fixedHeader)
- const classObj = computed(() => {
- const obj = {}
- obj[`app__wrap--${layout.value}`] = true
- return obj
- })
- function setCollapsed(collapsed: boolean): void {
- appStore.SetCollapsed(collapsed)
- }
- function toggleClick(): void {
- drawer.value = !drawer.value
- }
- return {
- drawer,
- classObj,
- layout,
- collapsed,
- showLogo,
- showTags,
- showBreadcrumb,
- showHamburger,
- showScreenfull,
- showUserInfo,
- showNavbar,
- fixedHeader,
- // fixedNavbar,
- // fixedTags,
- setCollapsed,
- toggleClick
- }
- }
- })
- </script>
- <style lang="less" scoped>
- .app__wrap {
- position: relative;
- height: 100%;
- width: 100%;
- .sidebar__wrap {
- position: fixed;
- width: @menuWidth;
- top: 0;
- left: 0;
- height: 100%;
- transition: width 0.2s;
- }
- .sidebar__wrap--collapsed {
- width: @menuMinWidth;
- @{deep}(.anticon-item) {
- display: none;
- }
- }
- .main__wrap {
- position: absolute;
- width: calc(~"100% - @{menuWidth}");
- height: 100%;
- top: 0;
- left: @menuWidth;
- transition: all 0.2s;
- z-index: 1;
- .header__wrap {
- transition: all 0.2s;
- .navbar__wrap {
- display: flex;
- align-items: center;
- height: @navbarHeight;
- padding: 0 20px 0 15px;
- position: relative;
- background: @contentBg;
- &:after {
- content: "";
- width: 100%;
- height: 1px;
- border-top: 1px solid #d8dce5;
- position: absolute;
- bottom: 0;
- left: 0;
- }
- @{deep}(.hover-container) {
- transition: background 0.2s;
- height: 100%;
- line-height: @navbarHeight + 5px;
- padding: 0 5px;
- text-align: center;
- &:hover {
- background: #f6f6f6;
- }
- }
- .navbar__wrap--right {
- display: flex;
- align-items: center;
- height: @navbarHeight;
- position: absolute;
- top: 0;
- right: 20px;
- @{deep}(.screenfull-container),
- @{deep}(.user-container) {
- line-height: @navbarHeight !important;
- }
- }
- }
- }
- // content样式
- .main__wrap--content {
- height: 100%;
- @{deep}(.el-scrollbar__wrap) {
- overflow-x: hidden;
- }
- }
- // content样式
- }
- .main__wrap--collapsed {
- width: calc(~"100% - @{menuMinWidth}");
- left: @menuMinWidth;
- }
- }
- // 经典模式
- .app__wrap--Classic {
- .main__wrap--fixed--all {
- margin-top: @navbarHeight + @tagsViewHeight !important;
- height: calc(~"100% - @{navbarHeight} - @{tagsViewHeight}") !important;
- }
- .main__wrap--fixed--nav {
- margin-top: @navbarHeight !important;
- height: calc(~"100% - @{navbarHeight}") !important;
- }
- .main__wrap--fixed--tags {
- margin-top: @tagsViewHeight !important;
- height: calc(~"100% - @{tagsViewHeight}") !important;
- }
- .header__wrap--fixed {
- position: fixed !important;
- width: calc(~"100% - @{menuWidth}") !important;
- top: 0 !important;
- left: @menuWidth !important;
- z-index: 200;
- }
- .header__wrap--collapsed {
- width: calc(~"100% - @{menuMinWidth}") !important;
- left: @menuMinWidth !important;
- }
- }
- // 顶部模式
- .app__wrap--Top,
- .app__wrap--LeftTop {
- .sidebar__wrap--Top {
- height: @topSiderHeight;
- display: flex;
- flex-direction: row;
- justify-content: space-between;
- padding: 0 20px;
- background-color: @topMenuBg;
- position: relative;
- &:after {
- content: "";
- width: 100%;
- height: 1px;
- border-top: 1px solid #d8dce5;
- position: absolute;
- bottom: 0;
- left: 0;
- }
- .sidebar__item--Top(2) {
- flex: 1;
- margin: 0 50px;
- }
- .navbar__wrap--right {
- display: flex;
- align-items: center;
- height: @topSiderHeight;
- @{deep}(.hover-container) {
- transition: background 0.2s;
- height: 100%;
- line-height: @topSiderHeight;
- padding: 0 5px;
- text-align: center;
- &:hover {
- background: #f6f6f6;
- }
- }
- }
- }
- .header__wrap--fixed {
- position: fixed !important;
- width: 100% !important;
- top: @topSiderHeight !important;
- left: 0 !important;
- z-index: 200;
- }
- .main__wrap {
- width: 100%;
- left: 0;
- height: calc(~"100% - @{topSiderHeight}");
- top: @topSiderHeight;
- }
- .main__wrap--fixed--all,
- .main__wrap--fixed--tags {
- margin-top: @navbarHeight !important;
- height: calc(~"100% - @{navbarHeight}") !important;
- }
- }
- .app__wrap--LeftTop {
- .sidebar__wrap {
- top: @topSiderHeight;
- left: 0;
- height: calc(~"100% - @{topSiderHeight}");
- }
- .header__wrap {
-
- }
- .main__wrap {
- width: calc(~"100% - @{menuWidth}");
- left: @menuWidth;
- height: calc(~"100% - @{topSiderHeight}");
- top: @topSiderHeight;
- }
- .main__wrap--collapsed {
- width: calc(~"100% - @{menuMinWidth}");
- left: @menuMinWidth;
- }
- }
- // 项目配置
- .setting__wrap {
- position: fixed;
- top: 45%;
- right: 0;
- z-index: 10;
- display: flex;
- padding: 10px;
- color: #fff;
- cursor: pointer;
- background: #018ffb;
- border-radius: 6px 0 0 6px;
- justify-content: center;
- align-items: center;
- }
- .setting__title {
- font-weight: bold;
- color: black;
- }
- // 项目配置
- </style>
|