|
1 | 1 | <template> |
2 | 2 | <el-container style="height:100vh"> |
3 | | - <!-- 侧边栏 --> |
4 | | - <el-aside width="220px" style="background:#001529;overflow:hidden;"> |
| 3 | + <!-- 侧边栏(可折叠) --> |
| 4 | + <el-aside :width="isCollapse ? '64px' : '220px'" style="background:#001529;overflow:hidden;transition:width .2s;"> |
5 | 5 | <div class="sidebar-logo"> |
6 | | - <span>⚡</span> Juggle |
| 6 | + <span>⚡</span> |
| 7 | + <span v-show="!isCollapse">Juggle</span> |
7 | 8 | </div> |
8 | 9 | <el-scrollbar style="height:calc(100vh - 60px);overflow-y:auto;"> |
9 | | - <el-menu :default-active="activeMenu" router background-color="#001529" |
10 | | - text-color="#aaa" active-text-color="#fff" style="border:none;"> |
| 10 | + <el-menu :default-active="activeMenu" router background-color="#001529" |
| 11 | + text-color="#aaa" active-text-color="#fff" style="border:none;" |
| 12 | + :collapse="isCollapse" :collapse-transition="false"> |
11 | 13 | <el-sub-menu index="monitor" v-if="hasMenu('/flow/dashboard')"> |
12 | 14 | <template #title> |
13 | 15 | <el-icon><Histogram /></el-icon> |
|
76 | 78 | <el-menu-item v-for="a in assistantMenuList" :key="a.id" :index="`/ai/assistant/${a.id}`"> |
77 | 79 | <img v-if="isImageIcon(a.icon)" :src="a.icon" style="width:16px;height:16px;margin-right:6px;vertical-align:-3px" /> |
78 | 80 | <span v-else style="margin-right:6px">{{ a.icon || '🤖' }}</span> |
79 | | - {{ a.assistantName }} |
| 81 | + <span>{{ a.assistantName }}</span> |
80 | 82 | </el-menu-item> |
81 | 83 | </el-sub-menu> |
82 | 84 | <el-menu-item index="/market"> |
|
108 | 110 | <el-container> |
109 | 111 | <!-- 顶部导航 --> |
110 | 112 | <el-header style="background:#fff;border-bottom:1px solid #eee;display:flex;align-items:center;justify-content:space-between;padding:0 24px"> |
111 | | - <el-breadcrumb separator="/"> |
112 | | - <el-breadcrumb-item>Juggle 接口编排平台</el-breadcrumb-item> |
113 | | - </el-breadcrumb> |
| 113 | + <div style="display:flex;align-items:center;gap:14px"> |
| 114 | + <el-icon class="collapse-btn" :size="20" @click="isCollapse = !isCollapse"> |
| 115 | + <Expand v-if="isCollapse" /> |
| 116 | + <Fold v-else /> |
| 117 | + </el-icon> |
| 118 | + <el-breadcrumb separator="/"> |
| 119 | + <el-breadcrumb-item>Juggle 接口编排平台</el-breadcrumb-item> |
| 120 | + </el-breadcrumb> |
| 121 | + </div> |
114 | 122 | <el-dropdown @command="handleCommand"> |
115 | 123 | <span style="cursor:pointer;display:flex;align-items:center;gap:8px"> |
116 | 124 | <el-avatar :size="32" style="background:#0f3460">{{ userName?.charAt(0)?.toUpperCase() }}</el-avatar> |
|
136 | 144 | </template> |
137 | 145 |
|
138 | 146 | <script setup lang="ts"> |
139 | | -import { computed, ref, onMounted } from 'vue' |
| 147 | +import { computed, ref, watch, onMounted } from 'vue' |
140 | 148 | import { useRoute, useRouter } from 'vue-router' |
141 | 149 | import { ElMessageBox } from 'element-plus' |
142 | 150 | import { Connection, Grid, DataBoard, Setting, ArrowDown, Histogram, Document, MagicStick, Collection, Shop, |
143 | 151 | Odometer, Share, Bell, List, Files, Search, DataAnalysis, Reading, Cpu, Link, Key, Timer, User, UserFilled, |
144 | | - OfficeBuilding, Tickets, SetUp, Coin } from '@element-plus/icons-vue' |
| 152 | + OfficeBuilding, Tickets, SetUp, Coin, Fold, Expand } from '@element-plus/icons-vue' |
145 | 153 | import request from '../utils/request' |
146 | 154 |
|
147 | 155 | const route = useRoute() |
| 156 | +
|
| 157 | +// 左侧菜单折叠(记住用户偏好) |
| 158 | +const isCollapse = ref(localStorage.getItem('sidebar_collapse') === '1') |
| 159 | +watch(isCollapse, v => localStorage.setItem('sidebar_collapse', v ? '1' : '0')) |
148 | 160 | const router = useRouter() |
149 | 161 | const userName = computed(() => localStorage.getItem('userName') || 'User') |
150 | 162 | const activeMenu = computed(() => route.path) |
@@ -210,7 +222,11 @@ function handleCommand(cmd: string) { |
210 | 222 | color: #fff; |
211 | 223 | gap: 8px; |
212 | 224 | border-bottom: 1px solid #0a2540; |
| 225 | + white-space: nowrap; |
| 226 | + overflow: hidden; |
213 | 227 | } |
| 228 | +.collapse-btn { cursor: pointer; color: #303133; } |
| 229 | +.collapse-btn:hover { color: #409eff; } |
214 | 230 | .main-content { |
215 | 231 | background: #f5f7fa; |
216 | 232 | overflow: hidden; |
|
0 commit comments