🎉 限时特惠活动公告、获取优惠码、最高立减3200元
┌─────────────────────────┐
│ TitleLogo │ ← 品牌 Logo + 标题 (顶部)
├─────────────────────────┤
│ │
│ Nav (导航区域) │ ← 主导航菜单 (上部分)
│ - 首页 │
│ - 其他导航项 │
│ │
├─────────────────────────┤
│ │
│ Menu (功能菜单) │ ← 功能菜单 (下部分)
│ - 对话历史 │
│ - 绘画历史 │
│ - 客服中心 │
│ │
├─────────────────────────┤
│ ChangeTheme │ ← 切换风格按钮 (底部)
└─────────────────────────┘sidebar/index.vue (主容器)
├── title-logo.vue (品牌 Logo)
├── nav.vue (主导航)
│ └── nav-item (NuxtLink)
├── menu.vue (功能菜单)
│ └── menu-item.vue (菜单项)
│ └── Server.vue (客服组件)
└── change-theme.vue (切换主题)| 设计元素 | 浅色模式 | 深色模式 |
|---|---|---|
| 背景色 | #fff | #0D0F10 |
| 文字色 | #333 | #fff |
| 激活项背景 (Nav) | linear-gradient(90deg, #18BFD0, #00ABFF) | 同左 |
| 激活项背景 (Menu) | #E6F7F9 (primary-light-9) | #2B2D31 |
| 边框色 | #f2f2f2 | #2B2D31 |
ChangeTheme 组件切换 light / dark 模式| 元素 | 尺寸 |
|---|---|
| 侧边栏宽度 | 160px (--sidebar-width) |
| Logo 尺寸 | 26px × 26px |
| 导航图标 | 18px × 18px |
| 菜单图标 | 16px × 16px |
| Nav 项高度 | 40px |
| Menu 项高度 | 38px |
| 左右内边距 | 10px |
| 右侧圆角 | 16px |
| 菜单项圆角 | 8px |
#2B2D31#E6F7F9 + 主色文字#2B2D31 + 白色文字#18BFD0<template>
<div
:class="['layout-sidebar', settingStore.sideTheme]"
:style="styleVars"
>
<div class="h-full flex flex-col">
<TitleLogo />
<ElScrollbar>
<div class="flex-1 h-full flex justify-between flex-col">
<Nav class="mb-auto" />
<Menu />
</div>
</ElScrollbar>
<ChangeTheme />
</div>
</div>
</template>
<script setup>
const styleVars = computed(() => {
if (settingStore.sideTheme == 'light') {
return {
'--aside-bg-color': '#fff',
'--aside-color': '#333'
}
} else {
return {
'--aside-bg-color': '#0D0F10',
'--aside-color': '#fff',
'--el-border-color-extra-light': '#2B2D31'
}
}
})
</script>
<style scoped>
.layout-sidebar {
width: var(--sidebar-width);
height: 100%;
border-radius: 0 16px 16px 0;
color: var(--aside-color);
background-color: var(--aside-bg-color);
}
</style><template>
<div class="nav">
<div class="px-[10px]">
<NuxtLink
v-for="(item, index) in nav"
:to="getLink(item)"
class="nav-item"
:class="{ active: currentIndex === index }"
@click="currentIndex = index"
>
<img :src="currentIndex === index ? item.selected : item.unselected" />
<div class="ml-[10px] line-clamp-1">{{ item.name }}</div>
</NuxtLink>
</div>
</div>
</template><template>
<NuxtLink :to="getLink" :target="typeof getLink == 'string' ? '_blank' : '_self'">
<div
class="menu-item"
:class="{ 'menu-item--active': isActive }"
>
<Icon v-if="icon" :name="icon" :size="16" />
<img v-else :src="isActive ? selected : unselected" />
<span class="ml-[6px] line-clamp-1">{{ name }}</span>
</div>
</NuxtLink>
</template>| 特点 | 描述 |
|---|---|
| 简洁现代 | 窄版 160px 设计,不占用过多空间 |
| 双色主题 | 支持浅色/深色模式一键切换 |
| 渐变高亮 | 激活项使用品牌色渐变(青→蓝) |
| 圆角设计 | 8px 圆角菜单项,右侧 16px 大圆角 |
| 图标驱动 | 每个菜单项配图标,视觉识别性强 |
| 响应式激活 | 根据路由自动高亮当前页面 |
| 灵活布局 | Flex 布局,自适应高度 |
pc/layouts/components/aside/
├── index.vue # 侧边栏主容器
└── sidebar/
├── index.vue # Sidebar 主组件
├── title-logo.vue # 品牌 Logo
├── nav.vue # 主导航
├── menu.vue # 功能菜单
├── menu-item.vue # 菜单项
├── change-theme.vue # 切换主题
├── server.vue # 客服组件
└── version.vue # 版本信息flex-col + mb-auto 实现底部固定