Files
violin-home/src/components/layout/Layout.vue
T
simple321vip 024f306636 v2 refacting
2026-06-28 23:02:32 +08:00

154 lines
3.3 KiB
Vue

<template>
<div class="homeWrap">
<el-container class="main_container">
<el-aside width="180px">
<SideBar></SideBar>
</el-aside>
<el-container style="margin-left: 180px;">
<el-header>
<NavBar></NavBar>
</el-header>
<el-main>
<MainApp></MainApp>
</el-main>
<el-footer>
<div class="footer-left">
<span>{{ SITE_NAME }} {{ COPYRIGHT_TEXT }}</span>
<span class="separator">|</span>
<span class="icp-link" @click="openSiteQuery">{{ ICP_NUMBER }}</span>
</div>
<div class="footer-right">
<el-avatar :size="24" class="github-icon" @click="openGithub"
src="https://github.githubassets.com/favicons/favicon.svg" />
</div>
</el-footer>
</el-container>
</el-container>
</div>
</template>
<script setup lang='ts'>
import MainApp from '../layout/MainApp.vue'
import NavBar from "../layout/NavBar.vue"
import SideBar from "../layout/SideBar.vue"
import { settingsStore } from "@/store/modules/settings"
import { SITE_NAME, COPYRIGHT_TEXT, ICP_NUMBER, ICP_QUERY_URL } from "@/const/site"
// -- IMPORT --
const useSettingsStore = settingsStore()
// -- REACTIVE OBJECT --
// -- REF OBJECT --
// -- EVENT DEFINITION
const iniPage = () => {
const screenWidth = document.body.clientWidth
if (screenWidth < 1000) {
useSettingsStore.settings.isMobile = true
// isSider.value = false
// isCollaps.value = true
} else if (screenWidth >= 1000 && screenWidth < 1200) {
useSettingsStore.settings.isMobile = false
// isSider.value = false
// isCollaps.value = true
} else {
useSettingsStore.settings.isMobile = false
// isSider.value = true
// isCollaps.value = false
}
}
const openGithub = () => {
let href = 'https://github.com/simple321vip'
window.open(href, '_blank')
}
const openSiteQuery = () => {
window.open(ICP_QUERY_URL, '_blank')
}
/**
* AUTO INVOKE FUNCTION
*/
iniPage()
</script>
<style scoped>
.el-header {
border-bottom-style: solid;
border-bottom-width: 0.5px;
border-bottom-color: rgba(151, 151, 151, 0.3);
}
.el-main {
/* 让 main 区占满 header 与 footer 之间的剩余空间,
内容多了 main 内部滚动,footer 永远钉在 layout 底部 */
padding: 16px;
flex: 1;
min-height: 0; /* flex item 默认 min-height: auto 会阻止收缩 */
overflow-y: auto;
}
.el-aside {
margin-left: -10px;
background: #191a23;
position: fixed;
}
.el-footer {
/* flex: 0 0 auto 让 footer 保持自身高度(不撑开、不收缩) */
flex: 0 0 auto;
margin-top: 20px;
display: flex;
justify-content: space-between;
align-items: center;
padding: 12px 24px;
border-top: 1px solid rgba(151, 151, 151, 0.2);
font-size: 16px;
color: #666;
}
.footer-left {
display: flex;
align-items: center;
gap: 8px;
}
.footer-right {
display: flex;
align-items: center;
}
.separator {
color: #ccc;
}
.icp-link {
cursor: pointer;
user-select: none;
}
.icp-link:hover {
color: #409eff;
}
.github-icon {
/* 跟 footer 文字 baseline 对齐 */
vertical-align: middle;
cursor: pointer;
}
.main_container {
height: 100%;
}
.homeWrap {
position: absolute;
top: 0;
height: 100%;
width: 100%;
}
</style>