fix:修改侧边栏样式
Build and Deploy Vue3 / build (push) Successful in 9m50s
Build and Deploy Vue3 / deploy (push) Successful in 1m31s

This commit is contained in:
2026-01-20 18:25:38 +08:00
parent a6d4d70221
commit 1e79005440
4 changed files with 223 additions and 94 deletions
+187 -32
View File
@@ -542,77 +542,232 @@ onUnmounted(() => {
/* Element Plus 菜单项样式优化 */ /* Element Plus 菜单项样式优化 */
:deep(.el-menu) { :deep(.el-menu) {
border-right: none; border-right: none;
padding: 8px 0;
} }
/* 一级菜单标题(有子菜单) */
:deep(.el-sub-menu__title) { :deep(.el-sub-menu__title) {
height: 50px; height: 48px;
line-height: 50px; line-height: 48px;
margin: 0; margin: 2px 8px;
padding: 0 20px; padding: 0 16px !important;
transition: background-color 0.2s ease; border-radius: 6px;
transition: all 0.2s ease;
color: #34495e !important; color: #34495e !important;
font-weight: 500;
font-size: 14px;
} }
:deep(.el-sub-menu__title:hover) { :deep(.el-sub-menu__title:hover) {
background-color: #f8f9fa !important; background-color: #f5f7fa !important;
color: #2c3e50 !important; color: #2c3e50 !important;
} }
:deep(.el-menu-item) { /* 一级菜单项(无子菜单) */
height: 50px; :deep(.sidebar-menu > .el-menu-item) {
line-height: 50px; height: 48px;
margin: 0; line-height: 48px;
padding: 0 20px; margin: 2px 8px;
transition: background-color 0.2s ease; padding: 0 16px !important;
border-radius: 6px;
transition: all 0.2s ease;
color: #34495e !important; color: #34495e !important;
font-weight: 500;
font-size: 14px;
} }
:deep(.el-menu-item:hover) { :deep(.sidebar-menu > .el-menu-item:hover) {
background-color: #f8f9fa !important; background-color: #f5f7fa !important;
color: #2c3e50 !important; color: #2c3e50 !important;
} }
:deep(.el-menu-item.is-active) { :deep(.sidebar-menu > .el-menu-item.is-active) {
background-color: rgba(44, 62, 80, 0.1) !important; background-color: rgba(44, 62, 80, 0.08) !important;
color: #2c3e50 !important; color: #2c3e50 !important;
font-weight: 600; font-weight: 600;
position: relative;
} }
:deep(.el-menu-item.is-active::before) { :deep(.sidebar-menu > .el-menu-item.is-active::before) {
content: ''; content: '';
position: absolute; position: absolute;
left: 0; left: 0;
top: 0; top: 50%;
transform: translateY(-50%);
width: 3px; width: 3px;
height: 100%; height: 24px;
background-color: #2c3e50;
border-radius: 0 2px 2px 0;
}
/* 展开的一级菜单标题 */
:deep(.el-sub-menu.is-opened > .el-sub-menu__title) {
color: #2c3e50 !important;
font-weight: 600;
background-color: #f5f7fa !important;
}
/* 二级菜单容器 */
:deep(.sidebar-menu > .el-sub-menu > .el-menu) {
background-color: transparent !important;
padding: 4px 0 8px 0;
}
/* 二级菜单项 */
:deep(.sidebar-menu > .el-sub-menu > .el-menu > .el-menu-item) {
height: 40px;
line-height: 40px;
margin: 2px 8px 2px 16px;
padding: 0 16px 0 28px !important;
border-radius: 6px;
font-size: 13px;
color: #606266 !important;
background-color: transparent !important;
position: relative;
font-weight: 400;
}
:deep(.sidebar-menu > .el-sub-menu > .el-menu > .el-menu-item::before) {
content: '';
position: absolute;
left: 12px;
top: 50%;
transform: translateY(-50%);
width: 4px;
height: 4px;
background-color: #c0c4cc;
border-radius: 50%;
transition: all 0.2s ease;
}
:deep(.sidebar-menu > .el-sub-menu > .el-menu > .el-menu-item:hover) {
background-color: #f5f7fa !important;
color: #2c3e50 !important;
}
:deep(.sidebar-menu > .el-sub-menu > .el-menu > .el-menu-item:hover::before) {
background-color: #7f8c8d;
}
:deep(.sidebar-menu > .el-sub-menu > .el-menu > .el-menu-item.is-active) {
background-color: rgba(44, 62, 80, 0.08) !important;
color: #2c3e50 !important;
font-weight: 500;
}
:deep(.sidebar-menu > .el-sub-menu > .el-menu > .el-menu-item.is-active::before) {
width: 6px;
height: 6px;
background-color: #2c3e50; background-color: #2c3e50;
} }
:deep(.el-sub-menu.is-active > .el-sub-menu__title) { /* 二级菜单中的子菜单标题(三级菜单父级) */
:deep(.sidebar-menu > .el-sub-menu > .el-menu > .el-sub-menu > .el-sub-menu__title) {
height: 40px;
line-height: 40px;
margin: 2px 8px 2px 16px;
padding: 0 16px 0 28px !important;
border-radius: 6px;
font-size: 13px;
color: #606266 !important;
font-weight: 400;
position: relative;
}
:deep(.sidebar-menu > .el-sub-menu > .el-menu > .el-sub-menu > .el-sub-menu__title::before) {
content: '';
position: absolute;
left: 12px;
top: 50%;
transform: translateY(-50%);
width: 4px;
height: 4px;
background-color: #c0c4cc;
border-radius: 50%;
transition: all 0.2s ease;
}
:deep(.sidebar-menu > .el-sub-menu > .el-menu > .el-sub-menu > .el-sub-menu__title:hover) {
background-color: #f5f7fa !important;
color: #2c3e50 !important; color: #2c3e50 !important;
background-color: #f8f9fa !important;
} }
:deep(.el-sub-menu .el-menu) { :deep(.sidebar-menu > .el-sub-menu > .el-menu > .el-sub-menu > .el-sub-menu__title:hover::before) {
background-color: #fafbfc !important; background-color: #7f8c8d;
margin: 0;
padding: 0;
} }
:deep(.el-sub-menu .el-menu-item) { :deep(.sidebar-menu > .el-sub-menu > .el-menu > .el-sub-menu.is-opened > .el-sub-menu__title) {
margin: 0; color: #2c3e50 !important;
padding-left: 48px !important; font-weight: 500;
background-color: #f5f7fa !important;
}
:deep(.sidebar-menu > .el-sub-menu > .el-menu > .el-sub-menu.is-opened > .el-sub-menu__title::before) {
width: 6px;
height: 6px;
background-color: #2c3e50;
}
/* 三级菜单容器 */
:deep(.sidebar-menu > .el-sub-menu > .el-menu > .el-sub-menu > .el-menu) {
background-color: transparent !important; background-color: transparent !important;
padding: 4px 0;
} }
:deep(.el-sub-menu .el-menu-item.is-active) { /* 三级菜单项 */
background-color: rgba(44, 62, 80, 0.12) !important; :deep(.sidebar-menu > .el-sub-menu > .el-menu > .el-sub-menu > .el-menu > .el-menu-item) {
height: 36px;
line-height: 36px;
margin: 2px 8px 2px 28px;
padding: 0 16px 0 24px !important;
border-radius: 6px;
font-size: 13px;
color: #909399 !important;
background-color: transparent !important;
position: relative;
font-weight: 400;
} }
:deep(.sidebar-menu > .el-sub-menu > .el-menu > .el-sub-menu > .el-menu > .el-menu-item::before) {
content: '-';
position: absolute;
left: 10px;
top: 50%;
transform: translateY(-50%);
color: #c0c4cc;
font-size: 12px;
transition: all 0.2s ease;
}
:deep(.sidebar-menu > .el-sub-menu > .el-menu > .el-sub-menu > .el-menu > .el-menu-item:hover) {
background-color: #f5f7fa !important;
color: #606266 !important;
}
:deep(.sidebar-menu > .el-sub-menu > .el-menu > .el-sub-menu > .el-menu > .el-menu-item:hover::before) {
color: #7f8c8d;
}
:deep(.sidebar-menu > .el-sub-menu > .el-menu > .el-sub-menu > .el-menu > .el-menu-item.is-active) {
background-color: rgba(44, 62, 80, 0.08) !important;
color: #2c3e50 !important;
font-weight: 500;
}
:deep(.sidebar-menu > .el-sub-menu > .el-menu > .el-sub-menu > .el-menu > .el-menu-item.is-active::before) {
content: '•';
color: #2c3e50;
font-size: 14px;
}
/* 子菜单箭头图标 */
:deep(.el-sub-menu__icon-arrow) { :deep(.el-sub-menu__icon-arrow) {
color: #909399 !important;
transition: all 0.2s ease;
font-size: 12px;
}
:deep(.el-sub-menu:hover > .el-sub-menu__title .el-sub-menu__icon-arrow) {
color: #7f8c8d !important; color: #7f8c8d !important;
transition: transform 0.2s ease;
} }
:deep(.el-sub-menu.is-opened > .el-sub-menu__title .el-sub-menu__icon-arrow) { :deep(.el-sub-menu.is-opened > .el-sub-menu__title .el-sub-menu__icon-arrow) {
+32 -29
View File
@@ -1,22 +1,25 @@
<template> <template>
<el-sub-menu v-if="hasChildren" :index="menu.path"> <el-sub-menu v-if="hasChildren" :index="menu.path">
<template #title> <template #title>
<el-icon v-if="menu.icon || menu.meta?.icon"> <el-icon v-if="menu.icon || menu.meta?.icon" class="menu-icon">
<component :is="menu.icon || menu.meta?.icon" /> <component :is="menu.icon || menu.meta?.icon" />
</el-icon> </el-icon>
<span>{{ menu.title || menu.meta?.title }}</span> <span class="menu-title">{{ menu.title || menu.meta?.title }}</span>
</template> </template>
<sidebar-menu-item <sidebar-menu-item
v-for="child in menu.children" v-for="child in menu.children"
:key="child.path" :key="child.path"
:menu="child" :menu="child"
:level="level + 1"
/> />
</el-sub-menu> </el-sub-menu>
<el-menu-item v-else :index="menu.path"> <el-menu-item v-else :index="menu.path">
<el-icon v-if="menu.icon || menu.meta?.icon"> <el-icon v-if="menu.icon || menu.meta?.icon" class="menu-icon">
<component :is="menu.icon || menu.meta?.icon" /> <component :is="menu.icon || menu.meta?.icon" />
</el-icon> </el-icon>
<template #title>{{ menu.title || menu.meta?.title }}</template> <template #title>
<span class="menu-title">{{ menu.title || menu.meta?.title }}</span>
</template>
</el-menu-item> </el-menu-item>
</template> </template>
@@ -29,6 +32,10 @@ const props = defineProps({
menu: { menu: {
type: Object, type: Object,
required: true required: true
},
level: {
type: Number,
default: 1
} }
}) })
@@ -39,49 +46,45 @@ const hasChildren = computed(() => {
</script> </script>
<style scoped> <style scoped>
.el-icon { /* 菜单图标样式 */
margin-right: 12px; .menu-icon {
margin-right: 10px;
width: 20px; width: 20px;
height: 20px; height: 20px;
text-align: center; text-align: center;
color: #7f8c8d; color: #7f8c8d;
transition: color 0.2s ease; transition: color 0.2s ease;
font-size: 18px; font-size: 18px;
flex-shrink: 0;
} }
.el-menu-item .el-icon, :deep(.el-sub-menu__title .el-icon) { /* 菜单标题 */
.menu-title {
font-size: inherit;
letter-spacing: 0.2px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
/* 图标交互状态 */
.el-menu-item .menu-icon,
:deep(.el-sub-menu__title .menu-icon) {
color: #7f8c8d !important; color: #7f8c8d !important;
transition: color 0.2s ease; transition: color 0.2s ease;
} }
.el-menu-item:hover .el-icon, .el-menu-item:hover .menu-icon,
:deep(.el-sub-menu__title:hover .el-icon) { :deep(.el-sub-menu__title:hover .menu-icon) {
color: #34495e !important; color: #34495e !important;
} }
/* 激活菜单项图标 */ /* 激活菜单项图标 */
.el-menu-item.is-active .el-icon { .el-menu-item.is-active .menu-icon {
color: #2c3e50 !important; color: #2c3e50 !important;
} }
:deep(.el-sub-menu.is-active > .el-sub-menu__title .el-icon) { :deep(.el-sub-menu.is-opened > .el-sub-menu__title .menu-icon) {
color: #2c3e50 !important; color: #2c3e50 !important;
} }
/* 菜单文字样式 */
.el-menu-item span, :deep(.el-sub-menu__title span) {
font-size: 14px;
letter-spacing: 0.2px;
}
/* 子菜单项样式优化 */
:deep(.el-sub-menu .el-menu-item) {
font-size: 13px;
padding-left: 48px !important;
}
:deep(.el-sub-menu .el-menu-item .el-icon) {
font-size: 16px;
margin-right: 10px;
}
</style> </style>
-30
View File
@@ -251,37 +251,7 @@
</div> </div>
</div> </div>
<!-- 余额管理区域 -->
<el-card class="balance-card" shadow="never" style="margin-top: 24px;">
<template #header>
<div class="card-header">
<span class="title"><el-icon><Wallet /></el-icon> 余额管理</span>
<el-button type="primary" size="small" @click="handleBalanceManage">前往余额管理</el-button>
</div>
</template>
<div class="balance-content">
<div class="balance-overview">
<div class="balance-item">
<div class="balance-label">账户余额</div>
<div class="balance-value primary">¥{{ (userBalance.balance / 100).toFixed(2) }}</div>
</div>
<div class="balance-item">
<div class="balance-label">冻结余额</div>
<div class="balance-value warning">¥{{ (userBalance.frozen_balance / 100).toFixed(2) }}</div>
</div>
<div class="balance-item">
<div class="balance-label">累计充值</div>
<div class="balance-value success">¥{{ (userBalance.total_recharge / 100).toFixed(2) }}</div>
</div>
<div class="balance-item">
<div class="balance-label">累计消费</div>
<div class="balance-value danger">¥{{ (userBalance.total_consume / 100).toFixed(2) }}</div>
</div>
</div>
</div>
</el-card>
</div> </div>
<!-- 编辑用户对话框 --> <!-- 编辑用户对话框 -->
+4 -3
View File
@@ -26,6 +26,9 @@
/> />
</div> </div>
<div class="search-buttons"> <div class="search-buttons">
<el-button type="warning" @click="handleJumpToUser">
<el-icon><Position /></el-icon><span class="btn-text">跳转</span>
</el-button>
<el-button type="primary" @click="handleQuery"> <el-button type="primary" @click="handleQuery">
<el-icon><Search /></el-icon><span class="btn-text">查询</span> <el-icon><Search /></el-icon><span class="btn-text">查询</span>
</el-button> </el-button>
@@ -35,9 +38,7 @@
<el-button type="success" @click="fetchUserList"> <el-button type="success" @click="fetchUserList">
<el-icon><Refresh /></el-icon><span class="btn-text">刷新</span> <el-icon><Refresh /></el-icon><span class="btn-text">刷新</span>
</el-button> </el-button>
<el-button type="warning" @click="handleJumpToUser">
<el-icon><Position /></el-icon><span class="btn-text">跳转</span>
</el-button>
</div> </div>
</div> </div>
<!-- 第二行操作栏 --> <!-- 第二行操作栏 -->