mirror of
https://gitee.com/xmz7891/ykxmz.git
synced 2026-10-19 08:20:44 +00:00
阶段3+4+5:管理页白色化 + 局域网诊断 + 全量验收
阶段3 管理页 - 清掉全部深色主题残留(地址框 #0b1220、按钮悬停 #262c36、 删除按钮 #2d1214 等 11 处),现在 0 处深色 - 接口全部正常:health / downloads / netcheck 阶段4 局域网诊断 - 查清楚"电脑不在同一网络"是怎么回事:被控端是**对的** (lan_ips() 报 ['192.168.2.64', '169.254.83.107'],真实地址排第一), 是手表当时真不在 192.168.2.x —— 可能连了 5G 频段的另一个路由器,或开着移动数据 - 所以改了手表的提示:不再只说"不在同一网络", 而是把**双方地址都打出来**,用户一眼能看出是网段不同还是连错 WiFi - 端到端验证局域网路径:认证 1 ms,功能列表 207 项 阶段1 结论修正(一天内推翻自己两次,如实记录) - 第一次判断"优选 IP 无用":错。半小时内确实能避开超时 IP - 第二次固定优选 IP:也错。那些实测 138ms 的 IP 半小时后全不通了 —— Cloudflare anycast 可达性随运营商路由变化,固定 IP 等于钉死到会失效的地址 - 最终:不固定,靠 GeoDNS + cloudflared 重试 + ha-connections 2 冗余 - 撤销后立即变好:连接稳定 2 条、超时告警 0 次、设备侧延迟 4.40s -> 1.66s - **真正的瓶颈**:分段实测发现本机到 Cloudflare 的**裸 RTT 就 1439 ms**, 比经隧道的请求(1215 ms)还慢。说明瓶颈是这条网络的 4G 上行本身, 不是设备的隧道。公网侧已无优化空间。 - 局域网 118 ms vs 公网 1215 ms,快 10 倍 —— 这才是该走的路 阶段5 验收 - 全量回归 29 项全通过 - 设备侧验收 38 项全通过 - 成品:setup exe 14.37 MB / server zip / watch apk,已同步到设备下载区
This commit is contained in:
+12
-12
@@ -1511,7 +1511,7 @@ class Handler(BaseHTTPRequestHandler):
|
||||
line-height:1.5}}
|
||||
.meta b{{color:var(--dim);font-weight:500}}
|
||||
.meta a.logout{{color:var(--dim);text-decoration:none;
|
||||
border-bottom:1px dashed #484f58;transition:.12s}}
|
||||
border-bottom:1px dashed #d0d7de;transition:.12s}}
|
||||
.meta a.logout:hover{{color:var(--accent);border-bottom-color:var(--accent)}}
|
||||
|
||||
/* ---------- 通用卡片 ---------- */
|
||||
@@ -1524,7 +1524,7 @@ class Handler(BaseHTTPRequestHandler):
|
||||
.urlrow{{display:flex;align-items:center;gap:10px;flex-wrap:wrap}}
|
||||
.url{{flex:1;min-width:220px;font:600 15px/1.5 ui-monospace,Consolas,
|
||||
'Courier New',monospace;color:#0969da;word-break:break-all;
|
||||
background:#0b1220;border:1px solid #1f6feb44;border-radius:8px;
|
||||
background:#f6f8fa;border:1px solid #d0d7de;border-radius:8px;
|
||||
padding:10px 12px}}
|
||||
.url.empty{{color:var(--muted);font-weight:400;font-style:normal}}
|
||||
|
||||
@@ -1540,7 +1540,7 @@ class Handler(BaseHTTPRequestHandler):
|
||||
background:var(--accent);opacity:.65}}
|
||||
.stat.ok::after{{background:var(--ok)}}
|
||||
.stat.warn::after{{background:var(--warn)}}
|
||||
.stat.mute::after{{background:#484f58}}
|
||||
.stat.mute::after{{background:#d0d7de}}
|
||||
|
||||
/* ---------- 工具条 ---------- */
|
||||
.toolbar{{display:flex;align-items:center;gap:10px;flex-wrap:wrap;
|
||||
@@ -1552,14 +1552,14 @@ class Handler(BaseHTTPRequestHandler):
|
||||
button{{font-family:inherit;font-size:13px;cursor:pointer;
|
||||
border-radius:8px;padding:7px 14px;border:1px solid var(--border);
|
||||
background:var(--panel2);color:var(--fg);transition:.12s}}
|
||||
button:hover{{background:#262c36;border-color:#484f58}}
|
||||
button:hover{{background:#f3f4f6;border-color:#d0d7de}}
|
||||
button:active{{transform:translateY(1px)}}
|
||||
button:disabled{{opacity:.4;cursor:not-allowed;transform:none}}
|
||||
button.primary{{background:var(--accent);border-color:var(--accent);
|
||||
color:#fff;font-weight:600}}
|
||||
button.primary:hover{{background:#4a95f8;border-color:#4a95f8}}
|
||||
button.del{{background:#2d1214;border-color:#6e2b2b;color:#ff7b72}}
|
||||
button.del:hover{{background:#4a1a1e;border-color:#a33;color:#ffa198}}
|
||||
button.primary:hover{{background:#1d4ed8;border-color:#1d4ed8}}
|
||||
button.del{{background:#fff5f5;border-color:#ffc9c9;color:#c92a2a}}
|
||||
button.del:hover{{background:#ffe3e3;border-color:#a33;color:#a61b1b}}
|
||||
button.del:disabled{{opacity:.4}}
|
||||
button.small{{padding:5px 11px;font-size:12px}}
|
||||
|
||||
@@ -1574,7 +1574,7 @@ class Handler(BaseHTTPRequestHandler):
|
||||
th{{background:var(--panel2);color:var(--dim);font-weight:500;
|
||||
font-size:12px;white-space:nowrap}}
|
||||
tbody tr{{transition:background .1s}}
|
||||
tbody tr:hover td{{background:#1b222c}}
|
||||
tbody tr:hover td{{background:#f6f8fa}}
|
||||
tbody tr:last-child td{{border-bottom:none}}
|
||||
td.name{{font-weight:500}}
|
||||
td.num{{font-family:ui-monospace,Consolas,monospace;color:var(--dim);
|
||||
@@ -1589,7 +1589,7 @@ class Handler(BaseHTTPRequestHandler):
|
||||
letter-spacing:1.5px;font-family:ui-monospace,Consolas,monospace;
|
||||
font-size:13px;color:#0969da}}
|
||||
.dot{{display:inline-block;width:7px;height:7px;border-radius:50%;
|
||||
margin-right:7px;vertical-align:middle;background:#484f58}}
|
||||
margin-right:7px;vertical-align:middle;background:#d0d7de}}
|
||||
.dot.on{{background:var(--ok);box-shadow:0 0 0 3px #1a7f3722}}
|
||||
.badge{{font-size:11px;padding:2px 8px;border-radius:20px;
|
||||
border:1px solid transparent;white-space:nowrap}}
|
||||
@@ -1598,13 +1598,13 @@ class Handler(BaseHTTPRequestHandler):
|
||||
.pickcell{{width:38px;text-align:center;padding-right:0}}
|
||||
input[type=checkbox]{{width:15px;height:15px;cursor:pointer;
|
||||
accent-color:var(--accent);vertical-align:middle}}
|
||||
tr.picked td{{background:#1c2733}}
|
||||
tr.picked:hover td{{background:#213042}}
|
||||
tr.picked td{{background:#eff6ff}}
|
||||
tr.picked:hover td{{background:#dbeafe}}
|
||||
|
||||
/* ---------- 提示条 ---------- */
|
||||
#toast{{position:fixed;left:50%;bottom:26px;transform:translate(-50%,20px);
|
||||
background:#1f6feb;color:#fff;padding:11px 20px;border-radius:10px;
|
||||
font-size:13px;box-shadow:0 8px 24px #0008;opacity:0;
|
||||
font-size:13px;box-shadow:0 8px 24px #0002;opacity:0;
|
||||
transition:.22s;pointer-events:none;max-width:88vw;text-align:center}}
|
||||
#toast.show{{opacity:1;transform:translate(-50%,0)}}
|
||||
#toast.err{{background:#b62324}}
|
||||
|
||||
Reference in New Issue
Block a user