123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304 |
- <template>
- <div class="vue-admin-beautiful-wrapper" :class="classObj">
- <div
- v-if="'horizontal' === layout"
- class="layout-container-horizontal"
- :class="{
- fixed: header === 'fixed',
- 'no-tabs-bar': tabsBar === 'false' || tabsBar === false,
- }"
- >
- <div :class="header === 'fixed' ? 'fixed-header' : ''">
- <vab-top-bar />
- <div
- v-if="tabsBar === 'true' || tabsBar === true"
- :class="{ 'tag-view-show': tabsBar }"
- >
- <div class="vab-main">
- <vab-tabs-bar />
- </div>
- </div>
- </div>
- <div class="vab-main main-padding">
- <vab-ad />
- <vab-app-main />
- </div>
- </div>
- <div
- v-else
- class="layout-container-vertical"
- :class="{
- fixed: header === 'fixed',
- 'no-tabs-bar': tabsBar === 'false' || tabsBar === false,
- }"
- >
- <div
- v-if="device === 'mobile' && collapse === false"
- class="mask"
- @click="handleFoldSideBar"
- />
- <vab-side-bar />
- <div class="vab-main" :class="collapse ? 'is-collapse-main' : ''">
- <div :class="header === 'fixed' ? 'fixed-header' : ''">
- <vab-nav-bar />
- <vab-tabs-bar v-if="tabsBar === 'true' || tabsBar === true" />
- </div>
- <vab-ad />
- <vab-app-main />
- </div>
- </div>
- <el-backtop />
- </div>
- </template>
- <script>
- import { mapActions, mapGetters } from 'vuex'
- import { tokenName } from '@/config/settings'
- export default {
- name: 'Layout',
- data() {
- return { oldLayout: '' }
- },
- computed: {
- ...mapGetters({
- layout: 'settings/layout',
- tabsBar: 'settings/tabsBar',
- collapse: 'settings/collapse',
- header: 'settings/header',
- device: 'settings/device',
- }),
- classObj() {
- return {
- mobile: this.device === 'mobile',
- }
- },
- },
- beforeMount() {
- window.addEventListener('resize', this.handleResize)
- },
- beforeDestroy() {
- window.removeEventListener('resize', this.handleResize)
- },
- mounted() {
- this.oldLayout = this.layout
- const userAgent = navigator.userAgent
- if (userAgent.includes('Juejin')) {
- this.$baseAlert(
- 'vue-admin-beautiful不支持在掘金内置浏览器演示,请手动复制以下地址到浏览器中查看http://mpfhrd48.sanxing.uz7.cn/vue-admin-beautiful'
- )
- }
- const isMobile = this.handleIsMobile()
- if (isMobile) {
- if (isMobile) {
- //横向布局时如果是手机端访问那么改成纵向版
- this.$store.dispatch('settings/changeLayout', 'vertical')
- } else {
- this.$store.dispatch('settings/changeLayout', this.oldLayout)
- }
- this.$store.dispatch('settings/toggleDevice', 'mobile')
- setTimeout(() => {
- this.$store.dispatch('settings/foldSideBar')
- }, 2000)
- } else {
- this.$store.dispatch('settings/openSideBar')
- }
- this.$nextTick(() => {
- window.addEventListener(
- 'storage',
- (e) => {
- if (e.key === tokenName || e.key === null) window.location.reload()
- if (e.key === tokenName && e.value === null)
- window.location.reload()
- },
- false
- )
- })
- },
- methods: {
- ...mapActions({
- handleFoldSideBar: 'settings/foldSideBar',
- }),
- handleIsMobile() {
- return document.body.getBoundingClientRect().width - 1 < 992
- },
- handleResize() {
- if (!document.hidden) {
- const isMobile = this.handleIsMobile()
- if (isMobile) {
- //横向布局时如果是手机端访问那么改成纵向版
- this.$store.dispatch('settings/changeLayout', 'vertical')
- } else {
- this.$store.dispatch('settings/changeLayout', this.oldLayout)
- }
- this.$store.dispatch(
- 'settings/toggleDevice',
- isMobile ? 'mobile' : 'desktop'
- )
- }
- },
- },
- }
- </script>
- <style lang="scss" scoped>
- @mixin fix-header {
- position: fixed;
- top: 0;
- right: 0;
- left: 0;
- z-index: $base-z-index - 2;
- width: 100%;
- overflow: hidden;
- }
- .vue-admin-beautiful-wrapper {
- position: relative;
- width: 100%;
- height: 100%;
- .layout-container-horizontal {
- position: relative;
- &.fixed {
- padding-top: calc(#{$base-top-bar-height} + #{$base-tabs-bar-height});
- }
- &.fixed.no-tabs-bar {
- padding-top: $base-top-bar-height;
- }
- ::v-deep {
- .vab-main {
- width: 88%;
- margin: auto;
- }
- .fixed-header {
- @include fix-header;
- }
- .tag-view-show {
- background: $base-color-white;
- box-shadow: $base-box-shadow;
- }
- .nav-bar-container {
- .fold-unfold {
- display: none;
- }
- }
- .main-padding {
- .app-main-container {
- margin-top: $base-padding;
- margin-bottom: $base-padding;
- background: $base-color-white;
- }
- }
- }
- }
- .layout-container-vertical {
- position: relative;
- .mask {
- position: fixed;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- z-index: $base-z-index - 1;
- width: 100%;
- height: 100vh;
- overflow: hidden;
- background: #000;
- opacity: 0.5;
- }
- &.fixed {
- padding-top: calc(#{$base-nav-bar-height} + #{$base-tabs-bar-height});
- }
- &.fixed.no-tabs-bar {
- padding-top: $base-nav-bar-height;
- }
- .vab-main {
- position: relative;
- min-height: 100%;
- margin-left: $base-left-menu-width;
- background: #f6f8f9;
- transition: $base-transition;
- ::v-deep {
- .fixed-header {
- @include fix-header;
- left: $base-left-menu-width;
- width: $base-right-content-width;
- box-shadow: $base-box-shadow;
- transition: $base-transition;
- }
- .nav-bar-container {
- position: relative;
- box-sizing: border-box;
- }
- .tabs-bar-container {
- box-sizing: border-box;
- }
- .app-main-container {
- width: calc(100% - #{$base-padding} - #{$base-padding});
- margin: $base-padding auto;
- background: $base-color-white;
- border-radius: $base-border-radius;
- }
- }
- &.is-collapse-main {
- margin-left: $base-left-menu-width-min;
- ::v-deep {
- .fixed-header {
- left: $base-left-menu-width-min;
- width: calc(100% - 65px);
- }
- }
- }
- }
- }
- /* 手机端开始 */
- &.mobile {
- ::v-deep {
- .el-pager,
- .el-pagination__jump {
- display: none;
- }
- .layout-container-vertical {
- .el-scrollbar.side-bar-container.is-collapse {
- width: 0;
- }
- .vab-main {
- width: 100%;
- margin-left: 0;
- }
- }
- .vab-main {
- .fixed-header {
- left: 0 !important;
- width: 100% !important;
- }
- }
- }
- }
- /* 手机端结束 */
- }
- </style>
|