Files
gva/web/src/view/layout/index.vue
PiexlMax(奇淼 8ef4f408bf feat: 优化自动化代码结构,增加顶栏侧边栏组合式结构 (#1793)
* feature:增加顶栏组合模式。

* Update:
1. request.go.tpl and model.go.tpl indent problem
2. api.go.tpl, request.go.tpl, service.go.tpl struct {}

* Update:
1. model.go.tpl import blank line

* feature:增加顶栏组合模式。

* feature:增加左侧检测逻辑保证存在左侧菜单。

---------

Co-authored-by: SliverHorn <caiwei.lai@jutze.com.cn>
2024-06-21 21:03:47 +08:00

107 lines
3.1 KiB
Vue

<template>
<div
class="bg-gray-50 text-slate-700 dark:text-slate-500 dark:bg-slate-800 w-screen h-screen"
>
<el-watermark
v-if="config.show_watermark"
:font="font"
:z-index="9999"
:gap="[180, 150]"
class="absolute inset-0 pointer-events-none"
:content="userStore.userInfo.nickName"
/>
<gva-header />
<div class="flex flex-row w-full gva-container pt-16">
<gva-aside v-if="config.side_mode === 'normal' || (device === 'mobile' && config.side_mode == 'head' ) || (device === 'mobile' && config.side_mode == 'combination' )" />
<gva-aside v-if="config.side_mode === 'combination' && device !== 'mobile'" mode="normal"/>
<div class="flex-1 p-2 w-0 h-full">
<gva-tabs v-if="config.showTabs" />
<div
class="overflow-auto"
:class="config.showTabs ? 'gva-container2' : 'gva-container pt-1'"
>
<router-view v-if="reloadFlag" v-slot="{ Component }">
<div
id="gva-base-load-dom"
class="gva-body-h bg-gray-50 dark:bg-slate-800"
>
<transition mode="out-in" name="el-fade-in-linear">
<keep-alive :include="routerStore.keepAliveRouters">
<component :is="Component" />
</keep-alive>
</transition>
</div>
</router-view>
<BottomInfo />
</div>
</div>
</div>
</div>
</template>
<script setup>
import GvaAside from "@/view/layout/aside/index.vue";
import GvaHeader from "@/view/layout/header/index.vue";
import useResponsive from "@/hooks/responsive";
import GvaTabs from "./tabs/index.vue";
import BottomInfo from "@/components/bottomInfo/bottomInfo.vue";
import { emitter } from "@/utils/bus.js";
import { ref, onMounted, nextTick, reactive, watchEffect } from "vue";
import { useRouter, useRoute } from "vue-router";
import { useRouterStore } from "@/pinia/modules/router";
import { useUserStore } from "@/pinia/modules/user";
import { useAppStore } from "@/pinia";
import { storeToRefs } from "pinia";
const appStore = useAppStore();
const { config, theme, device } = storeToRefs(appStore);
defineOptions({
name: "GvaLayout",
});
useResponsive(true);
const font = reactive({
color: "rgba(0, 0, 0, .15)",
});
watchEffect(() => {
font.color =
theme.value === "dark" ? "rgba(255,255,255, .15)" : "rgba(0, 0, 0, .15)";
});
const router = useRouter();
const route = useRoute();
const routerStore = useRouterStore();
onMounted(() => {
// 挂载一些通用的事件
emitter.on("reload", reload);
if (userStore.loadingInstance) {
userStore.loadingInstance.close();
}
});
const userStore = useUserStore();
const reloadFlag = ref(true);
let reloadTimer = null;
const reload = async () => {
if (reloadTimer) {
window.clearTimeout(reloadTimer);
}
reloadTimer = window.setTimeout(async () => {
if (route.meta.keepAlive) {
reloadFlag.value = false;
await nextTick();
reloadFlag.value = true;
} else {
const title = route.meta.title;
router.push({ name: "Reload", params: { title } });
}
}, 400);
};
</script>
<style lang="scss">
</style>