From 7272158c8e133afcdf752ca09a70c0bd969d7393 Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期三, 25 三月 2026 19:57:26 +0800
Subject: [PATCH] #

---
 src/main/webapp/views/index.html |  191 ++++++++++++++++++++++++++++++++++-------------
 1 files changed, 139 insertions(+), 52 deletions(-)

diff --git a/src/main/webapp/views/index.html b/src/main/webapp/views/index.html
index 37d8d39..7f4c3e4 100644
--- a/src/main/webapp/views/index.html
+++ b/src/main/webapp/views/index.html
@@ -474,11 +474,24 @@
     }
 
     .page-frame {
+      position: absolute;
+      inset: 0;
       width: 100%;
       height: 100%;
       border: 0;
       display: block;
       background: #fff;
+      opacity: 0;
+      visibility: hidden;
+      pointer-events: none;
+      z-index: 0;
+    }
+
+    .page-frame.is-active {
+      opacity: 1;
+      visibility: visible;
+      pointer-events: auto;
+      z-index: 1;
     }
 
     .page-loading {
@@ -792,7 +805,7 @@
 
       <el-main class="content-main">
         <div class="frame-wrapper">
-          <div class="page-loading" v-if="pageLoading">
+          <div key="page-loading" class="page-loading" v-show="pageLoading">
             <i class="el-icon-loading"></i>
             <span>{{ loadingText }}</span>
           </div>
@@ -800,9 +813,8 @@
           <iframe
               v-for="tab in tabs"
               :key="'frame-' + tab.name"
-              class="page-frame"
+              :class="['page-frame', { 'is-active': activeTab === tab.name }]"
               :data-tab-name="tab.name"
-              v-show="activeTab === tab.name"
               :src="tab.currentSrc"
               @load="handleFrameLoad(tab.name)">
           </iframe>
@@ -862,13 +874,15 @@
 <script type="text/javascript" src="../static/vue/js/vue.min.js"></script>
 <script type="text/javascript" src="../static/vue/element/element.js"></script>
 <script>
+  var DASHBOARD_VIEW_VERSION = "20260317-dashboard-stop-password-mask";
   var HOME_TAB_CONFIG = {
-    title: "鎺у埗涓績",
-    url: baseUrl + "/views/watch/console.html",
+    title: "绯荤粺浠〃鐩�",
+    url: baseUrl + "/views/dashboard/dashboard.html?layoutVersion=" + encodeURIComponent(DASHBOARD_VIEW_VERSION),
     home: true,
-    group: "瀹炴椂鐩戞帶",
+    group: "绯荤粺姒傝",
     menuKey: ""
   };
+  var LEGACY_HOME_TAB_URL = baseUrl + "/views/watch/console.html";
   var PROFILE_TAB_CONFIG = {
     title: "鍩烘湰璧勬枡",
     url: baseUrl + "/views/detail.html?resourceId=8",
@@ -891,7 +905,7 @@
     "common.profile": "鍩烘湰璧勬枡",
     "common.logout": "閫�鍑虹櫥褰�",
     "common.closeOtherTabs": "鍏抽棴鍏朵粬椤电",
-    "common.backHome": "杩斿洖鎺у埗涓績",
+    "common.backHome": "杩斿洖浠〃鐩�",
     "common.aiAssistant": "AI鍔╂墜",
     "common.workPage": "宸ヤ綔椤甸潰",
     "common.businessPage": "涓氬姟椤甸潰",
@@ -902,8 +916,8 @@
     "index.fakeRunning": "浠跨湡杩愯涓�",
     "index.fakeStopped": "浠跨湡鏈繍琛�",
     "index.licenseExpiring": "璁稿彲璇佸嵆灏嗚繃鏈�",
-    "index.homeTab": "鎺у埗涓績",
-    "index.homeGroup": "瀹炴椂鐩戞帶",
+    "index.homeTab": "绯荤粺浠〃鐩�",
+    "index.homeGroup": "绯荤粺姒傝",
     "index.profileGroup": "璐︽埛涓績",
     "index.versionLoading": "Version loading...",
     "index.licenseExpireAt": "璁稿彲璇佸皢浜� {0} 杩囨湡锛屽墿浣欐湁鏁堟湡锛歿1} 澶┿��",
@@ -1175,7 +1189,7 @@
         return this.tl(title);
       },
       findMenuMeta: function (tab) {
-        var normalizedUrl;
+        var menuEntry;
         var i;
         var j;
         var group;
@@ -1183,20 +1197,69 @@
         if (!tab) {
           return null;
         }
-        normalizedUrl = this.resolveViewSrc(tab.url);
+        if (tab.menuKey) {
+          for (i = 0; i < this.menus.length; i++) {
+            group = this.menus[i];
+            for (j = 0; j < group.subMenu.length; j++) {
+              item = group.subMenu[j];
+              if (item.tabKey === tab.menuKey) {
+                return {
+                  group: group,
+                  item: item
+                };
+              }
+            }
+          }
+        }
+        menuEntry = this.findMenuEntryByUrl(tab.url);
+        if (menuEntry) {
+          return menuEntry;
+        }
+        return null;
+      },
+      normalizeMenuMatchUrl: function (url, stripQuery) {
+        var normalized = this.resolveViewSrc(url || "");
+        var hashIndex = normalized.indexOf("#");
+        var queryIndex;
+        if (hashIndex > -1) {
+          normalized = normalized.substring(0, hashIndex);
+        }
+        if (stripQuery) {
+          queryIndex = normalized.indexOf("?");
+          if (queryIndex > -1) {
+            normalized = normalized.substring(0, queryIndex);
+          }
+        }
+        return normalized;
+      },
+      findMenuEntryByUrl: function (url) {
+        var normalized = this.normalizeMenuMatchUrl(url, false);
+        var normalizedBase = this.normalizeMenuMatchUrl(url, true);
+        var fallback = null;
+        var i;
+        var j;
+        var group;
+        var item;
+
         for (i = 0; i < this.menus.length; i++) {
           group = this.menus[i];
           for (j = 0; j < group.subMenu.length; j++) {
             item = group.subMenu[j];
-            if ((tab.menuKey && item.tabKey === tab.menuKey) || item.url === normalizedUrl) {
+            if (item.url === normalized) {
               return {
+                group: group,
+                item: item
+              };
+            }
+            if (!fallback && this.normalizeMenuMatchUrl(item.url, true) === normalizedBase) {
+              fallback = {
                 group: group,
                 item: item
               };
             }
           }
         }
-        return null;
+        return fallback;
       },
       syncTabMeta: function (tab, homeConfig, profileConfig) {
         var menuMeta;
@@ -1257,12 +1320,16 @@
         };
       },
       normalizeStoredTab: function (tab) {
+        var homeConfig = this.resolveHomeConfig();
+        var resolvedUrl = this.resolveViewSrc(tab.url);
+        var isLegacyHome = resolvedUrl === this.resolveViewSrc(LEGACY_HOME_TAB_URL);
+        var isHome = !!tab.home || isLegacyHome;
         var created = this.createTab({
-          title: this.translateTabTitle(tab.title),
-          url: this.resolveViewSrc(tab.url),
-          home: !!tab.home,
-          group: this.tl(tab.group || ""),
-          menuKey: tab.menuKey || ""
+          title: isHome ? homeConfig.title : this.translateTabTitle(tab.title),
+          url: isHome ? homeConfig.url : resolvedUrl,
+          home: isHome,
+          group: isHome ? homeConfig.group : this.tl(tab.group || ""),
+          menuKey: isHome ? homeConfig.menuKey : (tab.menuKey || "")
         });
         created.loaded = false;
         return created;
@@ -1285,6 +1352,9 @@
               }
             }
             active = parsed ? parsed.activeTab : "";
+            if (this.resolveViewSrc(active) === this.resolveViewSrc(LEGACY_HOME_TAB_URL)) {
+              active = homeTab.name;
+            }
           } catch (e) {
             tabs = [];
             active = "";
@@ -1593,40 +1663,55 @@
         });
       },
       findMenuKeyByUrl: function (url) {
-        var normalized = this.resolveViewSrc(url);
-        var i;
-        var j;
-        var group;
-        var item;
-
-        for (i = 0; i < this.menus.length; i++) {
-          group = this.menus[i];
-          for (j = 0; j < group.subMenu.length; j++) {
-            item = group.subMenu[j];
-            if (item.url === normalized) {
-              return item.tabKey;
-            }
-          }
+        var entry = this.findMenuEntryByUrl(url);
+        if (entry && entry.item) {
+          return entry.item.tabKey || "";
         }
         return "";
       },
       findMenuGroupIndexByUrl: function (url) {
-        var normalized = this.resolveViewSrc(url);
+        var entry = this.findMenuEntryByUrl(url);
+        if (entry && entry.group) {
+          return "group-" + entry.group.menuId;
+        }
+        return "";
+      },
+      injectDashboardMenu: function (menus) {
+        var homeConfig = this.resolveHomeConfig();
+        var dashboardUrl = this.resolveViewSrc(homeConfig.url);
         var i;
         var j;
         var group;
         var item;
 
-        for (i = 0; i < this.menus.length; i++) {
-          group = this.menus[i];
+        for (i = 0; i < menus.length; i++) {
+          group = menus[i];
           for (j = 0; j < group.subMenu.length; j++) {
             item = group.subMenu[j];
-            if (item.url === normalized) {
-              return "group-" + group.menuId;
+            if (item.url === dashboardUrl) {
+              item.name = homeConfig.title;
+              group.menu = homeConfig.group;
+              group.menuCode = group.menuCode || "index";
+              HOME_TAB_CONFIG.menuKey = item.tabKey || dashboardUrl;
+              return menus;
             }
           }
         }
-        return "";
+
+        HOME_TAB_CONFIG.menuKey = dashboardUrl;
+        menus.unshift({
+          menuId: "dashboard-home",
+          menu: homeConfig.group,
+          menuCode: "index",
+          subMenu: [{
+            id: "dashboard-home-tab",
+            name: homeConfig.title,
+            code: "dashboard/dashboard.html",
+            url: dashboardUrl,
+            tabKey: dashboardUrl
+          }]
+        });
+        return menus;
       },
       normalizeMenuData: function (data) {
         var result = [];
@@ -1659,7 +1744,7 @@
           });
         }
 
-        return result;
+        return this.injectDashboardMenu(result);
       },
       buildMenuSrc: function (code, resourceId) {
         var normalized = code || "";
@@ -1720,11 +1805,9 @@
         var syncVersion;
         var applyMenuState;
 
-        if (!this.isHomeTabUrl(targetUrl)) {
-          activeMenuKey = this.findMenuKeyByUrl(targetUrl);
-          if (activeMenuKey) {
-            groupIndex = this.findMenuGroupIndexByUrl(targetUrl);
-          }
+        activeMenuKey = this.findMenuKeyByUrl(targetUrl);
+        if (activeMenuKey) {
+          groupIndex = this.findMenuGroupIndexByUrl(targetUrl);
         }
 
         this.activeMenuKey = activeMenuKey;
@@ -1983,31 +2066,35 @@
         window.index = window.index || {};
         window.index.loadView = function (param) {
           var url;
+          var menuEntry;
           if (!param || !param.menuPath) {
             return;
           }
           url = that.resolveViewSrc(param.menuPath);
+          menuEntry = that.findMenuEntryByUrl(url);
           that.addOrActivateTab({
-            title: that.stripTags(param.menuName) || that.t("common.workPage"),
-            url: url,
+            title: that.stripTags(param.menuName) || (menuEntry && menuEntry.item ? menuEntry.item.name : that.t("common.workPage")),
+            url: menuEntry && menuEntry.item ? menuEntry.item.url : url,
             home: false,
-            group: that.t("common.businessPage"),
-            menuKey: that.findMenuKeyByUrl(url)
+            group: menuEntry && menuEntry.group ? menuEntry.group.menu : that.t("common.businessPage"),
+            menuKey: menuEntry && menuEntry.item ? menuEntry.item.tabKey : that.findMenuKeyByUrl(url)
           });
         };
         window.index.loadHome = function (param) {
           var url;
+          var menuEntry;
           if (!param || !param.menuPath) {
             that.openHomeTab();
             return;
           }
           url = that.resolveViewSrc(param.menuPath);
+          menuEntry = that.findMenuEntryByUrl(url);
           that.addOrActivateTab({
-            title: that.stripTags(param.menuName) || that.resolveHomeConfig().title,
-            url: url,
+            title: that.stripTags(param.menuName) || (menuEntry && menuEntry.item ? menuEntry.item.name : that.resolveHomeConfig().title),
+            url: menuEntry && menuEntry.item ? menuEntry.item.url : url,
             home: true,
-            group: that.resolveHomeConfig().group,
-            menuKey: that.findMenuKeyByUrl(url)
+            group: menuEntry && menuEntry.group ? menuEntry.group.menu : that.resolveHomeConfig().group,
+            menuKey: menuEntry && menuEntry.item ? menuEntry.item.tabKey : that.findMenuKeyByUrl(url)
           });
         };
 

--
Gitblit v1.9.1