| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313 |
- <template>
- <a-layout class="admin-layout" style="min-height: 100%">
- <!-- 侧边菜单 side-menu -->
- <a-layout-sider class="side-menu" :width="sideMenuWidth" :collapsed="collapsed" :theme="theme">
- <!-- 左侧菜单 -->
- <SideMenu :collapsed="collapsed" />
- </a-layout-sider>
- <!--中间内容,一共三部分:1、顶部;2、中间内容区域;3、底部(一般是公司版权信息);-->
- <a-layout id="smartAdminMain" :style="`height: ${windowHeight}px`" class="admin-layout-main">
- <!-- 顶部头部信息 -->
- <a-layout-header class="layout-header">
- <a-row class="layout-header-user" justify="space-between">
- <a-col class="layout-header-left">
- <span class="collapsed-button">
- <menu-unfold-outlined v-if="collapsed" class="trigger" @click="() => (collapsed = !collapsed)" />
- <menu-fold-outlined v-else class="trigger" @click="() => (collapsed = !collapsed)" />
- </span>
- <a-tooltip placement="bottom">
- <template #title>首页</template>
- <span class="home-button" @click="goHome">
- <home-outlined class="trigger" />
- </span>
- </a-tooltip>
- <span class="location-breadcrumb">
- <MenuLocationBreadcrumb />
- </span>
- </a-col>
- <!---用戶操作区域-->
- <a-col class="layout-header-right">
- <HeaderUserSpace />
- </a-col>
- </a-row>
- <PageTag @refresh-event="hanldeRefresh" />
- </a-layout-header>
- <!--中间内容-->
- <a-layout-content id="smartAdminLayoutContent" class="admin-layout-content">
- <!--不keepAlive的iframe使用单个iframe组件-->
- <IframeIndex v-if="iframeNotKeepAlivePageFlag" :key="route.name" :name="route.name" :url="route.meta.frameUrl" />
- <!--keepAlive的iframe 每个页面一个iframe组件-->
- <IframeIndex
- v-for="item in keepAliveIframePages"
- v-show="route.name == item.name"
- :key="item.name"
- :name="item.name"
- :url="item.meta.frameUrl"
- />
- <!--非iframe使用router-view-->
- <div v-show="!iframeNotKeepAlivePageFlag && keepAliveIframePages.every((e) => route.name != e.name)">
- <router-view v-slot="{ Component }" v-if="isRouterAlive">
- <keep-alive :include="keepAliveIncludes">
- <Suspense :key="route.name">
- <template #default>
- <component :is="Component" />
- </template>
- <template #fallback>
- <span>loading...</span>
- </template>
- </Suspense>
- </keep-alive>
- </router-view>
- </div>
- </a-layout-content>
- <!-- footer 版权公司信息 -->
- <a-layout-footer class="layout-footer" v-show="footerFlag">
- <smart-footer />
- </a-layout-footer>
- <!--- 回到顶部 -->
- <a-back-top :target="backTopTarget" :visibilityHeight="80" />
- </a-layout>
- <!-- 右侧帮助文档 help-doc -->
- <a-layout-sider
- v-if="helpDocFlag"
- v-show="helpDocExpandFlag"
- theme="light"
- :width="180"
- class="help-doc-sider"
- :trigger="null"
- style="min-height: 100%"
- >
- <SideHelpDoc />
- </a-layout-sider>
- </a-layout>
- </template>
- <script setup>
- import { computed, onMounted, ref, watch, nextTick } from 'vue';
- import { useAppConfigStore } from '../store/modules/system/app-config';
- import HeaderUserSpace from './components/header-user-space/index.vue';
- import MenuLocationBreadcrumb from './components/menu-location-breadcrumb/index.vue';
- import PageTag from './components/page-tag/index.vue';
- import SideMenu from './components/side-menu/index.vue';
- import SmartFooter from './components/smart-footer/index.vue';
- import { smartKeepAlive } from './components/smart-keep-alive';
- import IframeIndex from '/@/components/framework/iframe/iframe-index.vue';
- import watermark from '../lib/smart-watermark';
- import { useUserStore } from '/@/store/modules/system/user';
- import SideHelpDoc from './components/side-help-doc/index.vue';
- import { useRouter } from 'vue-router';
- import { HOME_PAGE_NAME } from '/@/constants/system/home-const';
- const windowHeight = ref(window.innerHeight);
- //菜单宽度
- const sideMenuWidth = computed(() => useAppConfigStore().$state.sideMenuWidth);
- //主题颜色
- const theme = computed(() => useAppConfigStore().$state.sideMenuTheme);
- //是否显示标签页
- const pageTagFlag = computed(() => useAppConfigStore().$state.pageTagFlag);
- // 是否显示帮助文档
- const helpDocFlag = computed(() => useAppConfigStore().$state.helpDocFlag);
- // 是否默认展开帮助文档
- const helpDocExpandFlag = computed(() => useAppConfigStore().$state.helpDocExpandFlag);
- // 是否显示页脚
- const footerFlag = computed(() => useAppConfigStore().$state.footerFlag);
- // 是否显示水印
- const watermarkFlag = computed(() => useAppConfigStore().$state.watermarkFlag);
- // 多余高度
- const dueHeight = computed(() => {
- let due = 40;
- if (useAppConfigStore().$state.pageTagFlag) {
- due = due + 40;
- }
- if (useAppConfigStore().$state.footerFlag) {
- due = due + 40;
- }
- return due;
- });
- //是否隐藏菜单
- const collapsed = ref(false);
- //页面初始化的时候加载水印
- onMounted(() => {
- if (watermarkFlag.value) {
- watermark.set('smartAdminLayoutContent', useUserStore().actualName);
- } else {
- watermark.clear();
- }
- });
- watch(
- () => watermarkFlag.value,
- (newValue) => {
- if (newValue) {
- watermark.set('smartAdminLayoutContent', useUserStore().actualName);
- } else {
- watermark.clear();
- }
- }
- );
- //回到顶部
- const backTopTarget = () => {
- return document.getElementById('smartAdminMain');
- };
- const router = useRouter();
- function goHome() {
- router.push({ name: HOME_PAGE_NAME });
- }
- //刷新当前页面
- const isRouterAlive = ref(true);
- function hanldeRefresh() {
- isRouterAlive.value = false;
- nextTick(() => {
- isRouterAlive.value = true;
- });
- }
- window.addEventListener('resize', function () {
- windowHeight.value = window.innerHeight;
- });
- // ----------------------- keep-alive相关 -----------------------
- let { route, keepAliveIncludes, iframeNotKeepAlivePageFlag, keepAliveIframePages } = smartKeepAlive();
- </script>
- <style lang="less" scoped>
- :deep(.ant-layout-header) {
- height: auto;
- }
- :deep(.layout-header) {
- height: auto;
- }
- .layout-header {
- background: #fff;
- padding: 0;
- z-index: 21;
- }
- .layout-header-user {
- height: @header-user-height;
- border-bottom: 1px solid #f6f6f6;
- }
- .layout-header-left {
- display: flex;
- height: @header-user-height;
- .collapsed-button {
- margin-left: 10px;
- line-height: @header-user-height;
- }
- .home-button {
- margin-left: 15px;
- cursor: pointer;
- padding: 0 5px;
- line-height: @header-user-height;
- }
- .home-button:hover {
- background-color: #efefef;
- }
- .location-breadcrumb {
- margin-left: 15px;
- line-height: @header-user-height;
- }
- }
- .layout-header-right {
- display: flex;
- height: @header-user-height;
- }
- .layout-container {
- height: calc(100vh - @header-height);
- overflow-x: hidden;
- }
- .admin-layout {
- .side-menu {
- height: 100vh;
- overflow-x: hidden;
- overflow-y: scroll;
- &.fixed-side {
- position: fixed;
- height: 100vh;
- left: 0;
- top: 0;
- }
- }
- .side-menu::-webkit-scrollbar {
- width: 4px;
- }
- .side-menu::-webkit-scrollbar-thumb {
- border-radius: 10px;
- background: rgba(0, 0, 0, 0.2);
- }
- .side-menu::-webkit-scrollbar-track {
- border-radius: 0;
- background: rgba(0, 0, 0, 0.1);
- }
- .help-doc-sider {
- flex: 0 !important;
- min-width: 100px;
- height: 100vh;
- max-width: 100px;
- width: auto !important;
- &.fixed-side {
- position: fixed;
- height: 100vh;
- right: 0;
- top: 0;
- }
- }
- .virtual-side {
- transition: all 0.2s;
- }
- .virtual-header {
- transition: all 0.2s;
- opacity: 0;
- &.fixed-tabs.multi-page:not(.fixed-header) {
- height: 0;
- }
- }
- .admin-layout-main {
- overflow-y: hidden;
- overflow-x: hidden;
- }
- .admin-layout-content {
- background-color: inherit;
- min-height: auto;
- position: relative;
- overflow-x: hidden;
- padding: 10px 10px 10px 10px;
- height: calc(100% - v-bind(dueHeight) px);
- }
- }
- .layout-footer {
- position: relative;
- padding: 7px 0px;
- display: flex;
- justify-content: center;
- }
- </style>
|