From 725da078afc3398f49f1efdc25bc82b9ec1dac35 Mon Sep 17 00:00:00 2001 From: DYL0109 <dn18191638832@163.com> Date: 星期三, 16 四月 2025 19:27:30 +0800 Subject: [PATCH] Merge pull request #64 from zhitan-cloud/develop1.0 --- zhitan-vue/src/layout/components/Sidebar/index.vue | 250 ++++++++++++++++++++++++++++++++++++++++++++----- 1 files changed, 224 insertions(+), 26 deletions(-) diff --git a/zhitan-vue/src/layout/components/Sidebar/index.vue b/zhitan-vue/src/layout/components/Sidebar/index.vue index 603f4f2..658fc19 100644 --- a/zhitan-vue/src/layout/components/Sidebar/index.vue +++ b/zhitan-vue/src/layout/components/Sidebar/index.vue @@ -2,11 +2,11 @@ <div :class="{ 'has-logo': showLogo }" :style="{ backgroundColor: sideTheme === 'theme-dark' ? variables.menuBackground : variables.menuLightBackground }" + class="sidebar-container-wrapper" > - <el-scrollbar :class="sideTheme" wrap-class="scrollbar-wrapper"> - <!-- 棣栭〉鏃朵笉鏄剧ず浠讳綍鑿滃崟椤� --> + <el-scrollbar :class="sideTheme" wrap-class="scrollbar-wrapper" view-class="scrollbar-view"> + <!-- 濮嬬粓鏄剧ず鑿滃崟椤癸紝涓嶅啀鏍规嵁璺緞鍒ゆ柇 --> <el-menu - v-if="!isHomePage" :default-active="activeMenu" :collapse="isCollapse" :background-color="'transparent'" @@ -17,15 +17,24 @@ mode="vertical" class="custom-menu" > - <sidebar-item - v-for="(route, index) in sidebarRouters" - :key="route.path + index" - :item="route" - :base-path="route.path" - /> + <!-- 褰撳墠鏄椤电湅鏉垮瓙璺敱鏃讹紝娓叉煋涓撶敤璺敱 --> + <template v-if="isIndexSubRoute"> + <sidebar-item + v-for="(route, index) in indexPageRouters" + :key="route.path + index" + :item="route" + :base-path="route.path" + /> + </template> + <template v-else> + <sidebar-item + v-for="(route, index) in sidebarRouters" + :key="route.path + index" + :item="route" + :base-path="route.path" + /> + </template> </el-menu> - <!-- 棣栭〉鏃剁殑绌虹櫧鍖哄煙 --> - <div v-else class="home-empty-menu"></div> </el-scrollbar> <!-- 搴曢儴鐢ㄦ埛鍖哄煙 --> @@ -94,19 +103,21 @@ const sidebarRouters = computed(() => permissionStore.sidebarRouters) -// 鍒ゆ柇褰撳墠鏄惁涓洪椤� -const isHomePage = computed(() => { - return route.path === '/index' || route.path === '/' || route.fullPath.startsWith('/index') +// 鍒ゆ柇褰撳墠鏄惁涓洪椤靛瓙璺敱(/index/index) +const isIndexSubRoute = computed(() => { + return route.path === '/index/index' }) -// 棣栭〉涓撶敤璺敱锛屽彧鏈夐椤典竴涓彍鍗曢」 -const homePageRouters = computed(() => { - // 浠庡師濮嬭矾鐢变腑绛涢�夊嚭棣栭〉璺敱 - const homeRoute = sidebarRouters.value.find(route => { - return route.children && route.children.find(child => child.path === '/index') - }) - - return homeRoute ? [homeRoute] : [] +// 鍒ゆ柇褰撳墠鏄惁涓轰富棣栭〉璺敱(/index鎴�/) +const isMainIndexRoute = computed(() => { + return route.path === '/index' || route.path === '/' +}) + +// 棣栭〉涓撶敤璺敱锛岄椤电湅鏉跨浉鍏宠彍鍗� +const indexPageRouters = computed(() => { + // 鏌ユ壘name涓篒ndex鐨勮矾鐢� + const indexRoute = sidebarRouters.value.find(route => route.name === 'Index') + return indexRoute ? [indexRoute] : [] }) const showLogo = computed(() => settingsStore.sidebarLogo) @@ -152,9 +163,41 @@ } </script> <style lang="scss" scoped> -:deep(.custom-menu) { +.sidebar-container-wrapper { + position: relative; + height: 100%; + overflow: hidden; + display: flex; + flex-direction: column; +} + +:deep(.scrollbar-wrapper) { + height: calc(100% - 220px) !important; + overflow-x: hidden !important; +} + +:deep(.scrollbar-view) { + height: 100%; + padding-bottom: 20px; +} + +:deep(.el-scrollbar__bar.is-vertical) { + right: 0; + width: 6px; +} + +:deep(.el-scrollbar__thumb) { + background-color: rgba(144, 147, 153, 0.3); + &:hover { + background-color: rgba(144, 147, 153, 0.5); + } +} + +.custom-menu { + width: 100%; padding: 6px 0; - height: calc(100% - 150px); // 鐣欏嚭搴曢儴鐢ㄦ埛鍖哄煙鐨勭┖闂� + height: auto !important; // 鏀逛负鑷�傚簲楂樺害锛岄伩鍏嶅浐瀹氶珮搴﹀鑷村唴瀹规孩鍑� + transition: all 0.3s ease; // Override Element Plus default menu styles .el-menu-item { @@ -163,10 +206,17 @@ border-radius: 4px; margin: 4px 10px; width: calc(100% - 20px); + transition: all 0.2s ease; &.is-active { background-color: #3883FA !important; color: #fff !important; + font-weight: bold; + position: relative; + box-shadow: 0 2px 8px rgba(56, 131, 250, 0.5); + + // 宸︿晶鎸囩ず鏉� + } &:hover { @@ -181,9 +231,17 @@ border-radius: 4px; margin: 4px 10px; width: calc(100% - 20px); + transition: all 0.2s ease; &:hover { background-color: rgba(56, 131, 250, 0.1) !important; + } + } + + &.is-active { + > .el-sub-menu__title { + color: #3883FA !important; + font-weight: bold; } } @@ -203,19 +261,42 @@ height: 38px !important; line-height: 38px !important; } + + // Add styling for deeply nested submenus (level 3+) + .el-sub-menu { + .el-menu-item { + padding-left: 65px !important; + + &.is-active { + padding-left: 65px !important; + } + } + + // Level 4 + .el-menu { + .el-menu-item { + padding-left: 85px !important; + + &.is-active { + padding-left: 85px !important; + } + } + } + } } } } // 棣栭〉绌虹櫧鑿滃崟鍖哄煙鏍峰紡 .home-empty-menu { - height: calc(100% - 150px); + height: auto; + min-height: 100px; } // 搴曢儴鐢ㄦ埛鍖哄煙鏍峰紡 .sidebar-footer { position: absolute; - bottom: 72px; + bottom: 0; left: 0; width: 100%; border-top: 1px solid rgba(255, 255, 255, 0.1); @@ -390,10 +471,127 @@ } } +// 娣诲姞娣辫壊妯″紡涓撶敤鏍峰紡 +.theme-dark { + :deep(.custom-menu) { + // Override Element Plus menu styles for dark theme + .el-menu-item { + &.is-active { + background-color: #4e77f8 !important; + color: #ffffff !important; + font-weight: bold; + box-shadow: 0 2px 10px rgba(78, 119, 248, 0.6); + position: relative; + + // 宸︿晶鎸囩ず鏉� + + } + + &:hover { + background-color: rgba(78, 119, 248, 0.2) !important; + } + } + + .el-sub-menu { + &.is-active { + > .el-sub-menu__title { + color: #4e77f8 !important; + font-weight: bold; + } + } + + .el-sub-menu__title { + &:hover { + background-color: rgba(78, 119, 248, 0.2) !important; + } + } + + // 宓屽瀛愯彍鍗曟牱寮� + .el-menu { + .el-menu-item { + &.is-active { + background-color: #4e77f8 !important; + color: #ffffff !important; + } + } + + .el-sub-menu { + &.is-active { + > .el-sub-menu__title { + color: #4e77f8 !important; + } + } + } + } + } + } +} + // Add global style to override Element Plus defaults :global(.el-menu--vertical .el-menu-item), :global(.el-menu--vertical .el-sub-menu__title) { height: 38px !important; line-height: 38px !important; } + +// Add styles for collapsed menu items +:deep(.custom-menu.el-menu--collapse) { + width: 54px !important; + + .el-menu-item, .el-sub-menu__title { + width: 36px !important; + min-width: 36px !important; + margin: 4px 9px !important; /* 9px鏄负浜嗙‘淇濆眳涓細(54px瀹� - 36px鑿滃崟椤�) / 2 = 9px */ + padding: 0 !important; + display: flex; + justify-content: center; + align-items: center; + border-radius: 4px; + + &.is-active { + background-color: #3883FA !important; + color: #fff !important; + box-shadow: 0 2px 6px rgba(56, 131, 250, 0.4); + transform: scale(0.95); + transition: all 0.2s ease; + } + + .el-icon, .svg-icon { + margin: 0 !important; + font-size: 18px !important; + + svg { + width: 1.2em; + height: 1.2em; + } + } + + // 纭繚鎶樺彔鏃跺瓙鑿滃崟鐨勬爣棰樹篃灞呬腑瀵归綈 + .el-sub-menu__icon-arrow { + display: none; + } + } + + // 纭繚鎶樺彔鏃跺脊鍑虹殑瀛愯彍鍗曟湁姝g‘鏍峰紡 + .el-tooltip__trigger:focus:not(.focusing) { + outline: none; + } +} + +// 娣辫壊妯″紡涓嬫姌鍙犺彍鍗曠殑鏍峰紡 +.theme-dark { + :deep(.custom-menu.el-menu--collapse) { + .el-menu-item, .el-sub-menu__title { + &.is-active { + background-color: #4e77f8 !important; + color: #ffffff !important; + box-shadow: 0 2px 8px rgba(78, 119, 248, 0.6); + } + + &:hover { + background-color: rgba(78, 119, 248, 0.2) !important; + } + } + } +} </style> -- Gitblit v1.9.3