diff --git a/Release/Models/libXNATA04DataProcessor.so.1.0.0.0 b/Release/Models/libXNATA04DataProcessor.so.1.0.0.0 index b867af2..d7dbcf7 100644 Binary files a/Release/Models/libXNATA04DataProcessor.so.1.0.0.0 and b/Release/Models/libXNATA04DataProcessor.so.1.0.0.0 differ diff --git a/Release/database/XNSim.db b/Release/database/XNSim.db index be98c45..07e7c1a 100644 Binary files a/Release/database/XNSim.db and b/Release/database/XNSim.db differ diff --git a/XNSimHtml/components/network-monitor.js b/XNSimHtml/components/network-monitor.js index 7f33b15..2dbbab2 100644 --- a/XNSimHtml/components/network-monitor.js +++ b/XNSimHtml/components/network-monitor.js @@ -13,6 +13,7 @@ class NetworkMonitor extends HTMLElement { data: [], timer: null, statusMsg: '', + selectedData: null, }; } @@ -37,7 +38,25 @@ class NetworkMonitor extends HTMLElement { border-radius: 12px; box-shadow: 0 2px 12px rgba(0,0,0,0.07); padding: 24px 20px 20px 20px; - max-width: 600px; + width: 100%; + min-width: 400px; + max-width: 100%; + height: 100%; + overflow-y: auto; + box-sizing: border-box; + } + .container { + display: flex; + height: 100%; + gap: 20px; + } + .left-panel { + flex: 1; + min-width: 0; + } + .right-panel { + flex: 1; + min-width: 0; } .form-row { display: flex; @@ -118,13 +137,16 @@ class NetworkMonitor extends HTMLElement { color: #e53935; } .data-list { - max-height: 340px; + height: calc(100% - 143px); + min-height: 200px; overflow-y: auto; background: #fff; border-radius: 10px; border: 1px solid #e0e3e7; padding: 10px 0 10px 0; box-shadow: 0 1px 6px rgba(0,0,0,0.04); + width: 100%; + box-sizing: border-box; } .data-item { background: #f8fafc; @@ -135,36 +157,146 @@ class NetworkMonitor extends HTMLElement { border-left: 4px solid #409eff; font-size: 14px; transition: box-shadow 0.2s; + cursor: pointer; } .data-item:hover { box-shadow: 0 2px 8px rgba(64,158,255,0.13); } + .data-item.selected { + background: #e3f2fd; + border-left-color: #1976d2; + box-shadow: 0 2px 8px rgba(25,118,210,0.2); + } .data-item b { color: #1976d2; } - .data-item pre { - background: #f3f7fa; - border-radius: 4px; - padding: 4px 6px; - margin: 2px 0 0 0; + .detail-panel { + background: #fff; + border-radius: 10px; + border: 1px solid #e0e3e7; + padding: 20px; + box-shadow: 0 1px 6px rgba(0,0,0,0.04); + height: calc(100% - 40px); + overflow-y: auto; + } + .detail-header { + margin-bottom: 6px; + padding-bottom: 4px; + border-bottom: 2px solid #e3f2fd; + } + .detail-header h2 { + margin: 0 0 10px 0; + color: #1976d2; + font-size: 20px; + font-weight: 600; + } + .hex-content { + background: #f8fafc; + border-radius: 8px; + padding: 16px; + font-family: 'Courier New', monospace; font-size: 13px; - color: #333; + line-height: 1.4; + white-space: pre-wrap; + word-break: break-all; + border: 1px solid #e0e3e7; + height: 250px; + max-height: 250px; + overflow-y: auto; + overflow-x: hidden; + box-sizing: border-box; + } + .parse-content { + background: #f8fafc; + border-radius: 8px; + padding: 16px; + font-family: 'Segoe UI', sans-serif; + font-size: 14px; + line-height: 1.6; + border: 1px solid #e0e3e7; + margin-top: 16px; + max-height: 400px; + overflow-y: auto; + } + .parse-item { + margin-bottom: 12px; + padding: 8px 12px; + background: #fff; + border-radius: 6px; + border-left: 4px solid #409eff; + box-shadow: 0 1px 3px rgba(0,0,0,0.05); + } + .parse-item b { + color: #1976d2; + margin-right: 8px; + font-size: 16px; + } + .parse-item .hex-value { + background: #e3f2fd; + padding: 2px 6px; + border-radius: 4px; + font-family: 'Courier New', monospace; + font-size: 12px; + color: #1976d2; + margin: 0 4px; + } + .hex-content .offset { + color: #666; + font-weight: bold; + } + .hex-content .hex { + color: #1976d2; + } + .no-selection { + text-align: center; + padding: 60px 20px; + color: #999; + font-style: italic; + font-size: 16px; + } + .no-selection::before { + content: '📋'; + display: block; + font-size: 48px; + margin-bottom: 16px; } .nodata { color: #bbb; text-align: center; padding: 30px 0; } + .detail-title { + font-size: 16px; + font-weight: 600; + color: #2c3e50; + margin-bottom: 4px; + padding: 8px 0; + border-bottom: 2px solid #409eff; + } -
${typeof item.data === 'object' ? JSON.stringify(item.data, null, 2) : item.data}
时间: ${new Date(item.timestamp).toLocaleString('zh-CN', { + year: 'numeric', + month: '2-digit', + day: '2-digit', + hour: '2-digit', + minute: '2-digit', + second: '2-digit', + fractionalSecondDigits: 3 + })} | +来源: ${item.source} | +大小: ${item.length || this.getDataSize(item.data)} 字节 | +