<script setup lang="ts"> import resolveConfig from 'tailwindcss/resolveConfig'; import tailwindConfig from '~/tailwind.config'; import type { Config } from 'tailwindcss'; import { useWindowSize } from '@vueuse/core'; const theme = useThemeStore(); const config = resolveConfig(tailwindConfig as Config); const { collapsed, manualCollapsed } = storeToRefs(useSystemStore()); const lg = parseFloat( config.theme.screens.lg.substring(0, config.theme.screens.lg.length - 2), ); const store = useUserStore(); const modeName = ref('sunny'); watch(useWindowSize().width, (val) => { setCollapsed(val); }); function setCollapsed(val: number) { if ((val > lg && !collapsed.value) || (val < lg && collapsed.value)) { manualCollapsed.value = false; return; } if (val > lg && collapsed.value) { if (manualCollapsed.value) return; collapsed.value = false; } else if (val < lg && !collapsed.value) { if (manualCollapsed.value) return; collapsed.value = true; } } function changeCollapsed() { collapsed.value = !collapsed.value; manualCollapsed.value = true; } const { currentPage } = storeToRefs(useSystemStore()); function changeMode() { const x = useColorMode(); if (x.preference === 'light') { x.preference = 'dark'; modeName.value = 'moon'; } else if (x.preference === 'dark') { x.preference = 'sepia'; modeName.value = 'tea'; } else { x.preference = 'light'; modeName.value = 'sunny'; } } function changeTheme() { if (theme.theme === 'default') { theme.setTheme('test'); } else if (theme.theme === 'test') { theme.setTheme('self'); } else if (theme.theme === 'self') { theme.setTheme('default'); } } let lastPage = ''; function toCalendar() { const router = useRouter(); lastPage = currentPage.value; currentPage.value = 'calendar'; router.push('/base/calendar'); } function backToLastPage() { const router = useRouter(); currentPage.value = lastPage; router.back(); } function backToLogin() { useLoginStore().logout(); } watch(currentPage, (val) => { const router = useRouter(); router.push('/base/' + val); }); onMounted(() => setCollapsed(useWindowSize().width.value)); onMounted(async () => { await store.getUserInfo(); await store.getAvatarURL(); }); </script> <template> <t-layout class="h-screen w-screen"> <t-header> <t-head-menu value="item1" height="120px"> <span class="text-xl">李晨鑫 的 Web 实验</span> <template #operations> <a @click="changeMode"> <t-icon class="t-menu__operations-icon" :name="modeName" /> </a> <a @click="changeTheme"> <t-icon class="t-menu__operations-icon" name="fill-color" /> </a> <a v-if="currentPage != 'calendar'" @click="toCalendar"> <t-icon class="t-menu__operations-icon" name="calendar" /> </a> <a v-else @click="backToLastPage"> <t-icon class="t-menu__operations-icon" name="rollback" /> </a> <a @click="backToLogin"> <t-icon class="t-menu__operations-icon" name="logout" /> </a> </template> </t-head-menu> </t-header> <t-layout :class="{ collapsed: collapsed, 'non-collapsed': !collapsed }"> <t-aside class="border-t border-gray-100 dark:border-gray-700"> <t-menu v-model="currentPage" theme="light" value="dashboard" height="550px" :collapsed="collapsed" > <t-menu-item value="home"> <template #icon> <t-icon name="home" /> </template> 首页 </t-menu-item> <t-submenu value="resource" title="功能菜单"> <template #icon> <t-icon name="server" /> </template> <t-menu-item value="peopleManage"> <span>用户管理</span> </t-menu-item> <t-menu-item value="articleManage"> <span>文件管理</span> </t-menu-item> </t-submenu> <t-menu-item value="root"> <template #icon> <t-icon name="root-list" /> </template> 导航三 </t-menu-item> <t-menu-item value="control-platform"> <template #icon> <t-icon name="control-platform" /> </template> 导航四 </t-menu-item> <t-menu-item value="precise-monitor"> <template #icon> <t-icon name="precise-monitor" /> </template> 导航五 </t-menu-item> <t-menu-item value="mail"> <template #icon> <t-icon name="mail" /> </template> 导航六 </t-menu-item> <t-menu-item value="user-circle"> <template #icon> <t-icon name="user-circle" /> </template> 导航七 </t-menu-item> <t-menu-item value="play-circle"> <template #icon> <t-icon name="play-circle" /> </template> 导航八 </t-menu-item> <t-menu-item value="edit1"> <template #icon> <t-icon name="edit-1" /> </template> 导航九 </t-menu-item> <template #operations> <t-button class="t-demo-collapse-btn" variant="text" shape="square" @click="changeCollapsed" > <template #icon> <t-icon name="view-list" /> </template> </t-button> </template> </t-menu> </t-aside> <t-layout class="overflow-auto"> <t-content> <NuxtPage /> </t-content> <t-footer class="m-auto"> Copyright @ 2019-{{ new Date().getFullYear() }} Tencent. All Rights Reserved </t-footer> </t-layout> </t-layout> </t-layout> </template> <style scoped lang="less"> .collapsed { :deep(.t-layout__sider) { @apply w-16; } height: calc(100vh - 56px); } .non-collapsed { :deep(.t-layout__sider) { @apply w-60; } height: calc(100vh - 56px); } </style>