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