From fdd689daf5cf4c2083e6160d932d70e91bad46e1 Mon Sep 17 00:00:00 2001
From: BirtYu <714851131@qq.com>
Date: 星期日, 13 四月 2025 22:51:38 +0800
Subject: [PATCH] Merge pull request #59 from zhitan-cloud/jiayu1.0

---
 zhitan-vue/src/assets/styles/sidebar.scss                |    5 
 zhitan-vue/src/layout/components/AppMain.vue             |    5 
 zhitan-vue/src/layout/components/Sidebar/SidebarItem.vue |  106 ++++++++
 zhitan-vue/src/layout/components/TagsView/index.vue      |  152 +++--------
 zhitan-vue/src/store/modules/permission.js               |   30 ++
 zhitan-vue/src/components/TopNav/index.vue               |  103 ++++++-
 zhitan-vue/src/layout/components/Sidebar/index.vue       |  165 ++++++++++-
 zhitan-vue/src/layout/components/TagsView/ScrollPane.vue |    2 
 zhitan-vue/src/layout/index.vue                          |   25 +
 zhitan-vue/src/permission.js                             |  129 +++++++++
 zhitan-vue/src/router/index.js                           |    8 
 11 files changed, 549 insertions(+), 181 deletions(-)

diff --git a/zhitan-vue/src/assets/styles/sidebar.scss b/zhitan-vue/src/assets/styles/sidebar.scss
index 297e8e4..52245c0 100644
--- a/zhitan-vue/src/assets/styles/sidebar.scss
+++ b/zhitan-vue/src/assets/styles/sidebar.scss
@@ -13,6 +13,7 @@
 
 
     .main-container {
+      background-color: #110f2e !important;
       height: 100%;
       transition: margin-left 0.28s;
       margin-left: $base-sidebar-width;
@@ -28,7 +29,7 @@
       transition: width 0.28s;
       width: $base-sidebar-width !important;
       background-color: $base-menu-background;
-      height: 100%;
+      height: calc(100% - 60px) !important;
       position: fixed;
       top: 60px;
       bottom: 0;
@@ -321,7 +322,7 @@
       transition: width 0.28s;
       width: $base-sidebar-width !important;
       background-color: $base-menu-background;
-      height: 100%;
+      height: calc(100% - 60px) !important;
       position: fixed;
       top: 60px;
       bottom: 0;
diff --git a/zhitan-vue/src/components/TopNav/index.vue b/zhitan-vue/src/components/TopNav/index.vue
index 7c42971..774132d 100644
--- a/zhitan-vue/src/components/TopNav/index.vue
+++ b/zhitan-vue/src/components/TopNav/index.vue
@@ -135,6 +135,28 @@
   setTimeout(updateScrollButtons, 300);
 }
 
+/**
+ * 鏌ユ壘鏈�娣卞眰鐨勫瓙鑿滃崟锛堝彾瀛愯妭鐐癸級
+ * 閫掑綊鏌ユ壘绗竴涓病鏈塩hildren鐨勫瓙鑿滃崟
+ */
+function findDeepestLeafMenu(route) {
+  if (!route) return null;
+  
+  // 濡傛灉娌℃湁瀛愯彍鍗曟垨瀛愯彍鍗曚负绌猴紝鍒欒繑鍥炲綋鍓嶈矾鐢�
+  if (!route.children || route.children.length === 0) {
+    return route;
+  }
+  
+  // 鎵惧埌绗竴涓潪闅愯棌鐨勫瓙鑿滃崟
+  const firstVisibleChild = route.children.find(child => !child.hidden);
+  if (!firstVisibleChild) {
+    return route; // 濡傛灉鎵�鏈夊瓙鑿滃崟閮芥槸闅愯棌鐨勶紝杩斿洖褰撳墠璺敱
+  }
+  
+  // 閫掑綊鏌ユ壘杩欎釜瀛愯彍鍗曠殑鏈�娣卞眰瀛愯彍鍗�
+  return findDeepestLeafMenu(firstVisibleChild);
+}
+
 function handleSelect(key, keyPath) {
   currentIndex.value = key;
   const route = routers.value.find(item => item.path === key);
@@ -145,23 +167,76 @@
     return;
   } 
   
-  if (key === '/index' || key === '/') {
-    // 棣栭〉鏃舵樉绀烘姌鍙犵殑渚ц竟鏍忥紝鑰屼笉鏄殣钘�
-    router.push({ path: key });
-    appStore.showCollapsedSidebar();
-    return;
-  } 
+ 
   
   // 妫�鏌ユ槸鍚︽湁瀛愯矾鐢�
   if (route && route.children && route.children.length > 0) {
     // 鏈夊瓙璺敱锛屾樉绀轰晶杈规爮
     activeRoutes(key);
-    const firstChild = route.children[0];
-    const path = firstChild.path.startsWith('/') ? firstChild.path : `${key}/${firstChild.path}`;
-    if (firstChild.query) {
-      router.push({ path, query: firstChild.query });
+    
+    // 鎸夌収姝g‘鐨勮矾寰勬瀯寤哄眰绾э紝杩欓噷鏄壒娈婂鐞�
+    let targetPath = key; // 浠庡綋鍓嶇偣鍑荤殑鑿滃崟璺緞寮�濮�
+    let targetQuery = null;
+    let currentNode = route;
+    let pathSegments = [];
+    
+    // 褰撳墠璺緞鏄涓�娈�
+    pathSegments.push(currentNode.path);
+    
+    // 閫愬眰娣诲姞瀛愯矾寰�
+    while (currentNode.children && currentNode.children.length > 0) {
+      const firstChild = currentNode.children.find(child => !child.hidden);
+      if (!firstChild) break;
+      
+      // 璺宠繃ParentView绫诲瀷鐨勪腑闂磋妭鐐癸紝鐩存帴浣跨敤鍏跺瓙鑺傜偣鐨刾ath
+      if (firstChild.component === 'ParentView' || firstChild.component.name === 'ParentView') {
+        currentNode = firstChild;
+        pathSegments.push(firstChild.path);
+        continue;
+      }
+      
+      // 鏅�氳妭鐐瑰鐞�
+      currentNode = firstChild;
+      // 濡傛灉璺緞涓嶆槸浠�/寮�澶达紝鍒欐坊鍔犲埌璺緞鐗囨涓�
+      if (!firstChild.path.startsWith('/')) {
+        pathSegments.push(firstChild.path);
+      } else {
+        // 濡傛灉鏄粷瀵硅矾寰勶紝鍒欐浛鎹箣鍓嶆墍鏈夎矾寰�
+        pathSegments = [firstChild.path];
+      }
+      
+      targetQuery = firstChild.query;
+      
+      // 濡傛灉鍒拌揪鍙跺瓙鑺傜偣锛堟病鏈夊瓙鑺傜偣锛夛紝鍒欑粨鏉熸煡鎵�
+      if (!firstChild.children || firstChild.children.length === 0) {
+        break;
+      }
+    }
+    
+    // 鏋勫缓鏈�缁堣矾寰�
+    if (pathSegments.length > 0) {
+      // 濡傛灉绗竴娈典笉鏄互/寮�澶达紝娣诲姞/
+      if (!pathSegments[0].startsWith('/')) {
+        pathSegments[0] = '/' + pathSegments[0];
+      }
+      
+      // 缁勫悎璺緞 - 鎶婃暟缁勪腑鎵�鏈夎矾寰勬嫾鎺ヨ捣鏉ワ紝濡傛灉鏌愭鍖呭惈瀹屾暣璺緞锛堜互/寮�澶达級鍒欎粠璇ユ閲嶆柊寮�濮�
+      targetPath = pathSegments.reduce((fullPath, segment, index) => {
+        if (segment.startsWith('/')) {
+          return segment;
+        } else if (index === 0) {
+          return segment;
+        } else {
+          return `${fullPath}/${segment}`;
+        }
+      });
+    }
+    
+    // 瀵艰埅鍒扮洰鏍囪矾鐢�
+    if (targetQuery) {
+      router.push({ path: targetPath, query: targetQuery });
     } else {
-      router.push({ path });
+      router.push({ path: targetPath });
     }
   } else {
     // 娌℃湁瀛愯矾鐢憋紝闅愯棌渚ц竟鏍�
@@ -178,11 +253,7 @@
 
 function activeRoutes(key) {
   let routes = [];
-  if (key === '/index' || key === '/') {
-    // 棣栭〉鏃舵樉绀烘姌鍙犵殑渚ц竟鏍忥紝鑰屼笉鏄殣钘�
-    appStore.showCollapsedSidebar();
-    return [];
-  }
+ 
   
   // 鏌ユ壘鍖归厤鐨勮矾鐢�
   if (childrenMenus.value && childrenMenus.value.length > 0) {
diff --git a/zhitan-vue/src/layout/components/AppMain.vue b/zhitan-vue/src/layout/components/AppMain.vue
index fb2159e..220b6cc 100644
--- a/zhitan-vue/src/layout/components/AppMain.vue
+++ b/zhitan-vue/src/layout/components/AppMain.vue
@@ -29,6 +29,7 @@
     background: #110f2e;
     padding: 14px;
     box-sizing: border-box;
+    padding-top: 8px;
   }
 
   .fixed-header + .app-main {
@@ -42,7 +43,7 @@
     }
 
     .fixed-header + .app-main {
-      padding-top: 130px;
+      padding-top: 108px; /* 60px(navbar) + 34px(tagsview) + 14px(鍐呰竟璺�) */
     }
   }
 }
@@ -70,7 +71,7 @@
     }
 
     .fixed-header + .app-main {
-      padding-top: 130px;
+      padding-top: 108px; /* 60px(navbar) + 34px(tagsview) + 14px(鍐呰竟璺�) */
     }
   }
 }
diff --git a/zhitan-vue/src/layout/components/Sidebar/SidebarItem.vue b/zhitan-vue/src/layout/components/Sidebar/SidebarItem.vue
index 73346ce..7b468d2 100644
--- a/zhitan-vue/src/layout/components/Sidebar/SidebarItem.vue
+++ b/zhitan-vue/src/layout/components/Sidebar/SidebarItem.vue
@@ -9,7 +9,7 @@
       </app-link>
     </template>
 
-    <el-sub-menu v-else ref="subMenu" :index="resolvePath(item.path)" teleported>
+    <el-sub-menu v-else ref="subMenu" :index="resolvePath(item.path)" teleported @click="handleSubMenuClick">
       <template v-if="item.meta" #title>
         <svg-icon :icon-class="item.meta && item.meta.icon" />
         <span class="menu-title" :title="hasTitle(item.meta.title)">{{ item.meta.title }}</span>
@@ -31,6 +31,9 @@
 import { isExternal } from '@/utils/validate'
 import AppLink from './Link'
 import { getNormalPath } from '@/utils/ruoyi'
+import { useRouter } from 'vue-router'
+
+const router = useRouter();
 
 const props = defineProps({
   // route object
@@ -50,6 +53,100 @@
 
 const onlyOneChild = ref({});
 
+/**
+ * 鏌ユ壘鏈�娣卞眰鐨勫瓙鑿滃崟锛堝彾瀛愯妭鐐癸級
+ * 閫掑綊鏌ユ壘绗竴涓病鏈塩hildren鐨勫瓙鑿滃崟
+ */
+function findDeepestLeafMenu(route) {
+  if (!route) return null;
+  
+  // 濡傛灉娌℃湁瀛愯彍鍗曟垨瀛愯彍鍗曚负绌猴紝鍒欒繑鍥炲綋鍓嶈矾鐢�
+  if (!route.children || route.children.length === 0) {
+    return route;
+  }
+  
+  // 鎵惧埌绗竴涓潪闅愯棌鐨勫瓙鑿滃崟
+  const firstVisibleChild = route.children.find(child => !child.hidden);
+  if (!firstVisibleChild) {
+    return route; // 濡傛灉鎵�鏈夊瓙鑿滃崟閮芥槸闅愯棌鐨勶紝杩斿洖褰撳墠璺敱
+  }
+  
+  // 閫掑綊鏌ユ壘杩欎釜瀛愯彍鍗曠殑鏈�娣卞眰瀛愯彍鍗�
+  return findDeepestLeafMenu(firstVisibleChild);
+}
+
+// 澶勭悊瀛愯彍鍗曠偣鍑�
+function handleSubMenuClick(e) {
+  // 闃绘浜嬩欢鍐掓场
+  e.stopPropagation();
+  
+  // 濡傛灉鐐瑰嚮鐨勬槸瀛愯彍鍗曟爣棰橈紝鍒欒嚜鍔ㄥ鑸埌鏈�娣卞眰鐨勫瓙鑿滃崟
+  if (e.target.closest('.el-sub-menu__title')) {
+    // 鎸夌収姝g‘鐨勮矾寰勬瀯寤哄眰绾�
+    let currentNode = props.item;
+    let pathSegments = [];
+    
+    // 棣栧厛娣诲姞褰撳墠鑺傜偣鐨勮矾寰�
+    if (currentNode.path) {
+      pathSegments.push(currentNode.path);
+    }
+    
+    // 閫愬眰娣诲姞瀛愯矾寰�
+    while (currentNode.children && currentNode.children.length > 0) {
+      const firstChild = currentNode.children.find(child => !child.hidden);
+      if (!firstChild) break;
+      
+      // 璺宠繃ParentView绫诲瀷鐨勪腑闂磋妭鐐�
+      if (firstChild.component === 'ParentView' || firstChild.component.name === 'ParentView') {
+        currentNode = firstChild;
+        pathSegments.push(firstChild.path);
+        continue;
+      }
+      
+      // 鏅�氳妭鐐瑰鐞�
+      currentNode = firstChild;
+      // 濡傛灉璺緞涓嶆槸浠�/寮�澶达紝鍒欐坊鍔犲埌璺緞鐗囨涓�
+      if (!firstChild.path.startsWith('/')) {
+        pathSegments.push(firstChild.path);
+      } else {
+        // 濡傛灉鏄粷瀵硅矾寰勶紝鍒欐浛鎹箣鍓嶆墍鏈夎矾寰�
+        pathSegments = [firstChild.path];
+      }
+      
+      // 濡傛灉鍒拌揪鍙跺瓙鑺傜偣锛屽垯缁撴潫鏌ユ壘
+      if (!firstChild.children || firstChild.children.length === 0) {
+        break;
+      }
+    }
+    
+    // 鏋勫缓鏈�缁堣矾寰�
+    if (pathSegments.length > 0) {
+      // 濡傛灉绗竴娈典笉鏄互/寮�澶达紝娣诲姞/
+      if (!pathSegments[0].startsWith('/')) {
+        pathSegments[0] = '/' + pathSegments[0];
+      }
+      
+      // 缁勫悎璺緞
+      const targetPath = pathSegments.reduce((fullPath, segment, index) => {
+        if (segment.startsWith('/')) {
+          return segment;
+        } else if (index === 0) {
+          return segment;
+        } else {
+          return `${fullPath}/${segment}`;
+        }
+      });
+      
+      // 瀵艰埅鍒扮洰鏍囪矾鐢憋紝濡傛灉鏈夋煡璇㈠弬鏁板垯娣诲姞
+      if (currentNode.query) {
+        router.push({ path: targetPath, query: currentNode.query });
+      } else {
+        router.push({ path: targetPath });
+      }
+    }
+  }
+}
+
 function hasOneShowingChild(children = [], parent) {
   if (!children) {
     children = [];
@@ -65,10 +162,15 @@
   })
 
   // When there is only one child router, the child router is displayed by default
-  if (showingChildren.length === 1) {
+  if (showingChildren.length === 1 && !showingChildren[0].children) {
     return true
   }
 
+  // If the single child also has children, don't treat it as a single showing child
+  if (showingChildren.length === 1 && showingChildren[0].children && showingChildren[0].children.length > 0) {
+    return false
+  }
+
   // Show parent if there are no child router to display
   if (showingChildren.length === 0) {
     onlyOneChild.value = { ...parent, path: '', noShowingChildren: true }
diff --git a/zhitan-vue/src/layout/components/Sidebar/index.vue b/zhitan-vue/src/layout/components/Sidebar/index.vue
index 68596a6..658fc19 100644
--- a/zhitan-vue/src/layout/components/Sidebar/index.vue
+++ b/zhitan-vue/src/layout/components/Sidebar/index.vue
@@ -5,9 +5,8 @@
     class="sidebar-container-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'"
@@ -18,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>
     
     <!-- 搴曢儴鐢ㄦ埛鍖哄煙 -->
@@ -95,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)
@@ -162,12 +172,13 @@
 }
 
 :deep(.scrollbar-wrapper) {
-  height: calc(100% - 290px) !important;
+  height: calc(100% - 220px) !important;
   overflow-x: hidden !important;
 }
 
 :deep(.scrollbar-view) {
   height: 100%;
+  padding-bottom: 20px;
 }
 
 :deep(.el-scrollbar__bar.is-vertical) {
@@ -200,6 +211,12 @@
     &.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 {
@@ -221,6 +238,13 @@
       }
     }
     
+    &.is-active {
+      > .el-sub-menu__title {
+        color: #3883FA !important;
+        font-weight: bold;
+      }
+    }
+    
     .el-menu-item {
       padding-left: 45px !important; 
       min-width: auto !important;
@@ -237,6 +261,28 @@
         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;
+            }
+          }
+        }
+      }
     }
   }
 }
@@ -250,7 +296,7 @@
 // 搴曢儴鐢ㄦ埛鍖哄煙鏍峰紡
 .sidebar-footer {
   position: absolute;
-  bottom: 72px;
+  bottom: 0;
   left: 0;
   width: 100%;
   border-top: 1px solid rgba(255, 255, 255, 0.1);
@@ -425,6 +471,62 @@
   }
 }
 
+// 娣诲姞娣辫壊妯″紡涓撶敤鏍峰紡
+.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) {
@@ -475,4 +577,21 @@
     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>
diff --git a/zhitan-vue/src/layout/components/TagsView/ScrollPane.vue b/zhitan-vue/src/layout/components/TagsView/ScrollPane.vue
index 516b5d2..8af4525 100644
--- a/zhitan-vue/src/layout/components/TagsView/ScrollPane.vue
+++ b/zhitan-vue/src/layout/components/TagsView/ScrollPane.vue
@@ -99,7 +99,7 @@
     bottom: 0px;
   }
   :deep(.el-scrollbar__wrap) {
-    height: 39px;
+    height: 34px !important;
   }
 }
 </style>
\ No newline at end of file
diff --git a/zhitan-vue/src/layout/components/TagsView/index.vue b/zhitan-vue/src/layout/components/TagsView/index.vue
index 2041c96..7688967 100644
--- a/zhitan-vue/src/layout/components/TagsView/index.vue
+++ b/zhitan-vue/src/layout/components/TagsView/index.vue
@@ -232,119 +232,49 @@
 </script>
 
 <style lang="scss" scoped>
-.themeDark {
-  .tags-view-container {
-    height: 52px;
-    width: 100%;
-    background: #1a235d;
-    // border-bottom: 1px solid #d8dce5;
-    box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.12), 0 0 3px 0 rgba(0, 0, 0, 0.04);
-    .tags-view-wrapper {
-      .tags-view-item {
-        display: inline-block;
-        position: relative;
-        cursor: pointer;
-        height: 32px;
-        line-height: 30px;
-        border: 1px solid #5278f5;
-        color: #fff;
-        // background: #3271eb;
-        padding: 0 12px;
-        font-size: 14px;
-        margin-left: 6px;
-        margin-top: 10px;
-        border-radius: 4px;
-        font-family: OPPOSans, OPPOSans;
-        &:first-of-type {
-          margin-left: 16px;
-        }
-        &:last-of-type {
-          margin-right: 15px;
-        }
-        &.active {
-          background-color: #4e77f8 !important;
-          color: #fff;
-          border-color: #4e77f8 !important;
-          &::before {
-            content: "";
-            background: #fff;
-            display: inline-block;
-            width: 8px;
-            height: 8px;
-            border-radius: 50%;
-            position: relative;
-            margin-right: 5px;
-          }
-        }
-      }
-    }
-    .contextmenu {
-      margin: 0;
+.tags-view-container {
+  height: 34px;
+  width: calc(100% - 42px);
+  margin-top: 10px;
+  margin-left: 14px;
+  box-sizing: border-box;
+ // 娣诲姞姘村钩鍐呰竟璺濅笌app-main鐨勫唴杈硅窛涓�鑷�
+ background: #0A3465;
+ 
+  box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.12), 0 0 3px 0 rgba(0, 0, 0, 0.04);
+  .tags-view-wrapper {
+    .tags-view-item {
+      display: inline-block;
+      position: relative;
+      cursor: pointer;
+      height: 26px;
+      line-height: 26px;
+      border: 1px solid #d8dce5;
+      color: #495060;
       background: #fff;
-      z-index: 3000;
-      position: absolute;
-      list-style-type: none;
-      padding: 5px 0;
-      border-radius: 4px;
+      padding: 0 8px;
       font-size: 12px;
-      font-weight: 400;
-      color: #333;
-      box-shadow: 2px 2px 3px 0 rgba(0, 0, 0, 0.3);
-      li {
-        margin: 0;
-        padding: 7px 16px;
-        cursor: pointer;
-        &:hover {
-          background: #eee;
-        }
+      margin-left: 5px;
+      margin-top: 4px;
+      &:first-of-type {
+        margin-left: 5px;
       }
-    }
-  }
-}
-
-.themeLight {
-  .tags-view-container {
-    height: 52px;
-    width: 100%;
-    background: #fff;
-    // border-bottom: 1px solid #d8dce5;
-    box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.12), 0 0 3px 0 rgba(0, 0, 0, 0.04);
-    .tags-view-wrapper {
-      .tags-view-item {
-        display: inline-block;
-        position: relative;
-        cursor: pointer;
-        height: 32px;
-        line-height: 30px;
-        border: 1px solid #d8dce5;
-        color: #495060;
-        background: #fff;
-        padding: 0 12px;
-        font-size: 14px;
-        margin-left: 6px;
-        margin-top: 10px;
-        border-radius: 4px;
-        font-family: OPPOSans, OPPOSans;
-        &:first-of-type {
-          margin-left: 16px;
-        }
-        &:last-of-type {
-          margin-right: 15px;
-        }
-        &.active {
-          background-color: #42b983;
-          color: #fff;
-          border-color: #42b983;
-          &::before {
-            content: "";
-            background: #fff;
-            display: inline-block;
-            width: 8px;
-            height: 8px;
-            border-radius: 50%;
-            position: relative;
-            margin-right: 5px;
-          }
+      &:last-of-type {
+        margin-right: 5px;
+      }
+      &.active {
+        background-color: #42b983;
+        color: #fff;
+        border-color: #42b983;
+        &::before {
+          content: "";
+          background: #fff;
+          display: inline-block;
+          width: 8px;
+          height: 8px;
+          border-radius: 50%;
+          position: relative;
+          margin-right: 2px;
         }
       }
     }
@@ -401,6 +331,6 @@
 }
 
 .scroll-container .el-scrollbar__wrap {
-  height: 50px !important;
+  height: 34px !important;
 }
 </style>
diff --git a/zhitan-vue/src/layout/index.vue b/zhitan-vue/src/layout/index.vue
index 7cb8e3e..90aaa04 100644
--- a/zhitan-vue/src/layout/index.vue
+++ b/zhitan-vue/src/layout/index.vue
@@ -119,21 +119,26 @@
 
 // 鐩戝惉璺敱鍙樺寲锛屽鐞嗛椤电殑渚ц竟鏍忔樉绀�
 watchEffect(() => {
-  // 妫�鏌ユ槸鍚︽槸棣栭〉璺敱
-  if (route.path === '/index' || route.path === '/') {
+  // 妫�鏌ユ槸鍚︽槸棣栭〉璺敱锛屼絾鎺掗櫎/index/index瀛愯矾鐢�
+  if ((route.path === '/index' || route.path === '/') && route.path !== '/index/index') {
     // 棣栭〉璺敱锛岀‘淇濅晶杈规爮涓嶉殣钘忥紝浣嗙姸鎬佹槸鎶樺彔鐨�
-    appStore.showCollapsedSidebar()
+    appStore.toggleSideBarHide(false) // 鏀逛负涓嶉殣钘忎晶杈规爮
   } else if (route.meta && route.meta.showSidebar === false) {
     // 濡傛灉璺敱鏄庣‘鎸囧畾闅愯棌渚ц竟鏍�
     appStore.toggleSideBarHide(true)
+  } else {
+    // 鍏朵粬璺敱锛岀‘淇濅晶杈规爮鍙
+    appStore.toggleSideBarHide(false)
   }
 })
 
 // 缁勪欢鎸傝浇鏃讹紝纭繚棣栭〉渚ц竟鏍忕姸鎬佹纭�
 onMounted(() => {
-  // 濡傛灉褰撳墠鏄椤碉紝纭繚渚ц竟鏍忔槸鎶樺彔鐨勮�屼笉鏄殣钘忕殑
-  if (route.path === '/index' || route.path === '/') {
-    appStore.showCollapsedSidebar()
+  // 濡傛灉褰撳墠鏄椤靛瓙椤甸潰锛屽彧纭繚渚ц竟鏍忎笉琚殣钘忥紝浣嗕繚鎸佹姌鍙�/灞曞紑鐘舵�佷笉鍙�
+  if (route.path === '/index/index') {
+    // 鍙缃笉闅愯棌渚ц竟鏍忥紝浣嗕笉鏀瑰彉鍏跺睍寮�/鎶樺彔鐘舵��
+    appStore.toggleSideBarHide(false)
+    // 涓嶅啀寮哄埗璁剧疆opened涓簍rue锛屼繚鎸佺敤鎴蜂箣鍓嶇殑璁剧疆
   }
 })
 
@@ -306,13 +311,19 @@
   top: 60px;
   right: 0;
   z-index: 9;
-  width: 100%;
+  width: calc(100% - #{$base-sidebar-width});
   transition: width 0.28s;
   display: flex;
   flex-direction: column;
+  box-sizing: border-box;
+  padding: 0;
 }
 
 .hideSidebar .fixed-header {
+  width: calc(100% - 54px);
+}
+
+.sidebarHide .fixed-header {
   width: 100%;
 }
 
diff --git a/zhitan-vue/src/permission.js b/zhitan-vue/src/permission.js
index a521d95..7fc2c80 100644
--- a/zhitan-vue/src/permission.js
+++ b/zhitan-vue/src/permission.js
@@ -14,6 +14,75 @@
 
 const whiteList = ['/login', '/register', '/energy']
 
+/**
+ * 鏌ユ壘鏈�娣卞眰鐨勫瓙鑿滃崟骞舵瀯寤哄畬鏁磋矾寰�
+ */
+function findDeepestPath(route) {
+  if (!route) return { path: null, query: null };
+  
+  // 棣栧厛娣诲姞褰撳墠鑺傜偣鐨勮矾寰�
+  let currentNode = route;
+  let pathSegments = [];
+  
+  if (currentNode.path) {
+    pathSegments.push(currentNode.path);
+  }
+  
+  // 閫愬眰娣诲姞瀛愯矾寰�
+  while (currentNode.children && currentNode.children.length > 0) {
+    const firstChild = currentNode.children.find(child => !child.hidden);
+    if (!firstChild) break;
+    
+    // 璺宠繃ParentView绫诲瀷鐨勪腑闂磋妭鐐�
+    if (firstChild.component === 'ParentView' || 
+        (typeof firstChild.component === 'object' && firstChild.component.name === 'ParentView')) {
+      currentNode = firstChild;
+      pathSegments.push(firstChild.path);
+      continue;
+    }
+    
+    // 鏅�氳妭鐐瑰鐞�
+    currentNode = firstChild;
+    // 濡傛灉璺緞涓嶆槸浠�/寮�澶达紝鍒欐坊鍔犲埌璺緞鐗囨涓�
+    if (!firstChild.path.startsWith('/')) {
+      pathSegments.push(firstChild.path);
+    } else {
+      // 濡傛灉鏄粷瀵硅矾寰勶紝鍒欐浛鎹箣鍓嶆墍鏈夎矾寰�
+      pathSegments = [firstChild.path];
+    }
+    
+    // 濡傛灉鍒拌揪鍙跺瓙鑺傜偣锛屽垯缁撴潫鏌ユ壘
+    if (!firstChild.children || firstChild.children.length === 0) {
+      break;
+    }
+  }
+  
+  // 鏋勫缓鏈�缁堣矾寰�
+  let targetPath = '';
+  if (pathSegments.length > 0) {
+    // 濡傛灉绗竴娈典笉鏄互/寮�澶达紝娣诲姞/
+    if (!pathSegments[0].startsWith('/')) {
+      pathSegments[0] = '/' + pathSegments[0];
+    }
+    
+    // 缁勫悎璺緞
+    targetPath = pathSegments.reduce((fullPath, segment, index) => {
+      if (segment.startsWith('/')) {
+        return segment;
+      } else if (index === 0) {
+        return segment;
+      } else {
+        return `${fullPath}/${segment}`;
+      }
+    });
+  }
+  
+  return { 
+    path: targetPath, 
+    query: currentNode.query
+  };
+}
+
 router.beforeEach((to, from, next) => {
   NProgress.start()
   if (getToken()) {
@@ -45,11 +114,23 @@
               if (topMenus.length > 0) {
                 // 璺宠浆鍒扮涓�涓彍鍗�
                 const firstMenu = topMenus[0]
-                if (firstMenu.children && firstMenu.children.length > 0) {
-                  // 鏈夊瓙鑿滃崟锛岃烦杞埌绗竴涓瓙鑿滃崟
+                
+                // 鏌ユ壘鏈�娣卞眰鐨勫瓙鑿滃崟骞舵瀯寤鸿矾寰�
+                const { path, query } = findDeepestPath(firstMenu);
+                
+                if (path) {
+                  // 鏈夋渶娣卞眰瀛愯彍鍗曪紝璺宠浆鍒拌鑿滃崟
+                  if (query) {
+                    next({ path, query, replace: true });
+                  } else {
+                    next({ path, replace: true });
+                  }
+                  return;
+                } else if (firstMenu.children && firstMenu.children.length > 0) {
+                  // 浣跨敤鍘熸湁閫昏緫
                   const firstChild = firstMenu.children[0]
-                  const path = firstMenu.path.endsWith('/') ? firstMenu.path + firstChild.path : `${firstMenu.path}/${firstChild.path}`
-                  next({ path: path, replace: true })
+                  const childPath = firstMenu.path.endsWith('/') ? firstMenu.path + firstChild.path : `${firstMenu.path}/${firstChild.path}`
+                  next({ path: childPath, replace: true })
                   return
                 } else {
                   // 娌℃湁瀛愯彍鍗曪紝鐩存帴璺宠浆
@@ -75,11 +156,23 @@
           if (topMenus.length > 0) {
             // 璺宠浆鍒扮涓�涓彍鍗�
             const firstMenu = topMenus[0]
-            if (firstMenu.children && firstMenu.children.length > 0) {
-              // 鏈夊瓙鑿滃崟锛岃烦杞埌绗竴涓瓙鑿滃崟
+            
+            // 鏌ユ壘鏈�娣卞眰鐨勫瓙鑿滃崟骞舵瀯寤鸿矾寰�
+            const { path, query } = findDeepestPath(firstMenu);
+            
+            if (path) {
+              // 鏈夋渶娣卞眰瀛愯彍鍗曪紝璺宠浆鍒拌鑿滃崟
+              if (query) {
+                next({ path, query, replace: true });
+              } else {
+                next({ path, replace: true });
+              }
+              return;
+            } else if (firstMenu.children && firstMenu.children.length > 0) {
+              // 浣跨敤鍘熸湁閫昏緫
               const firstChild = firstMenu.children[0]
-              const path = firstMenu.path.endsWith('/') ? firstMenu.path + firstChild.path : `${firstMenu.path}/${firstChild.path}`
-              next({ path: path, replace: true })
+              const childPath = firstMenu.path.endsWith('/') ? firstMenu.path + firstChild.path : `${firstMenu.path}/${firstChild.path}`
+              next({ path: childPath, replace: true })
               return
             } else {
               // 娌℃湁瀛愯彍鍗曪紝鐩存帴璺宠浆
@@ -88,6 +181,26 @@
             }
           }
         }
+        
+        // 鑷姩澶勭悊甯︽湁閲嶅畾鍚戠殑璺敱
+        if (to.matched.length > 0 && to.matched[0].path === to.path) {
+          const currentRouteConfig = router.getRoutes().find(r => r.path === to.path);
+          
+          if (currentRouteConfig && currentRouteConfig.children && currentRouteConfig.children.length > 0) {
+            // 鏈夊瓙璺敱锛岃嚜鍔ㄥ鑸埌鏈�娣卞眰瀛愯彍鍗�
+            const { path, query } = findDeepestPath(currentRouteConfig);
+            
+            if (path && path !== to.path) {
+              if (query) {
+                next({ path, query, replace: true });
+              } else {
+                next({ path, replace: true });
+              }
+              return;
+            }
+          }
+        }
+        
         next()
       }
     }
diff --git a/zhitan-vue/src/router/index.js b/zhitan-vue/src/router/index.js
index 154b3be..42dcb70 100644
--- a/zhitan-vue/src/router/index.js
+++ b/zhitan-vue/src/router/index.js
@@ -67,13 +67,7 @@
         path: '/index',
         component: () => import('@/views/index'),
         name: 'Index',
-        meta: { title: '棣栭〉', icon: 'dashboard', affix: true, showSidebar: true, breadcrumb: false },
-        beforeEnter: (to, from, next) => {
-          // 鑾峰彇app store骞惰缃晶杈规爮涓烘姌鍙犵姸鎬�
-          const appStore = useAppStore()
-          appStore.showCollapsedSidebar()
-          next()
-        }
+        meta: { title: '棣栭〉', icon: 'dashboard', affix: true, showSidebar: true, breadcrumb: false }
       }
     ]
   },
diff --git a/zhitan-vue/src/store/modules/permission.js b/zhitan-vue/src/store/modules/permission.js
index c9d09e6..4eb8185 100644
--- a/zhitan-vue/src/store/modules/permission.js
+++ b/zhitan-vue/src/store/modules/permission.js
@@ -56,8 +56,27 @@
   })
 
 // 閬嶅巻鍚庡彴浼犳潵鐨勮矾鐢卞瓧绗︿覆锛岃浆鎹负缁勪欢瀵硅薄
-function filterAsyncRouter(asyncRouterMap, lastRouter = false, type = false) {
+function filterAsyncRouter(asyncRouterMap, lastRouter = false, type = false, parentRoute = null) {
   return asyncRouterMap.filter(route => {
+    // 涓嶅啀杩囨护鎺夐椤电湅鏉跨浉鍏宠矾鐢�
+    /* 
+    // 杩囨护鎺夐椤电湅鏉跨浉鍏宠矾鐢�
+    if (route.name === 'Index' && route.meta && route.meta.title === '棣栭〉鐪嬫澘') {
+      return false;
+    }
+    
+    // 濡傛灉鏄椤电湅鏉跨殑瀛愯彍鍗曪紝涔熻繃婊ゆ帀
+    if (route.path === '/index' || route.path === 'index' || 
+        (route.meta && route.meta.title === '棣栭〉鐪嬫澘')) {
+      return false;
+    }
+    */
+    
+    // 璁剧疆鐖惰矾鐢卞紩鐢�
+    if (parentRoute) {
+      route.parent = parentRoute;
+    }
+    
     if (type && route.children) {
       route.children = filterChildren(route.children)
     }
@@ -82,7 +101,8 @@
       }
     }
     if (route.children != null && route.children && route.children.length) {
-      route.children = filterAsyncRouter(route.children, route, type)
+      // 灏嗗綋鍓嶈矾鐢变綔涓虹埗璺敱浼犻�掔粰瀛愯矾鐢�
+      route.children = filterAsyncRouter(route.children, route, type, route)
     } else {
       delete route['children']
       delete route['redirect']
@@ -97,6 +117,9 @@
     if (el.children && el.children.length) {
       if (el.component === 'ParentView' && !lastRouter) {
         el.children.forEach(c => {
+          // 璁剧疆鐖惰矾鐢卞紩鐢�
+          c.parent = el;
+          
           c.path = el.path + '/' + c.path
           if (c.children && c.children.length) {
             children = children.concat(filterChildren(c.children, c))
@@ -108,6 +131,9 @@
       }
     }
     if (lastRouter) {
+      // 璁剧疆鐖惰矾鐢卞紩鐢�
+      el.parent = lastRouter;
+      
       el.path = lastRouter.path + '/' + el.path
       if (el.children && el.children.length) {
         children = children.concat(filterChildren(el.children, el))

--
Gitblit v1.9.3