网页改成白色简洁 + 修官网两个 bug

配色
- 官网 / 登录页 / 管理页从 GitHub 深色风改成白色简洁
  (用户的设计理念:所有东西都要白色简洁)
- 白底上把浅灰文字换成深色,链接蓝也调深一档保证对比度

修 bug
- 管理入口的链接拼接写坏了,页面上显示成 href= + ADMIN_PATH +,
  点了打不开管理页
- .lead 用的是深色主题的浅灰,白底上几乎看不见

其他
- 清掉提交信息里的 BOM(PowerShell 的 Set-Content 加的)
This commit is contained in:
xmz7891
2026-10-06 23:10:08 +08:00
parent 81e923a0aa
commit 51565112b9
7 changed files with 280 additions and 36 deletions
+19
View File
@@ -0,0 +1,19 @@
1.7.1:修白屏 + 配对 + 官网管理页分家
手表端
- 修「连上后一片白屏」:initTabs() 从来没被调用过,
导致 tabDefs 为 null、selectTab 直接 return,
标签栏里只剩一个孤立的滑动指示器
- 应用名改成 ykxmz
被控端
- 修「设备已关闭新设备配对」:配对码本身就是密钥,
拿着正确的码就该放行。老逻辑"首台配对后自动关窗"会把
手表重装的人永久挡在外面
- 应用名改成 ykxmz
服务器端
- / 改成官网(公开,简洁介绍 + 下载)
- /zhingzhuanzhan 中转站管理(要登录),/admin 自动跳转
- 管理账号 xmz7891,可改
- 官网 / 登录页 / 管理页都加上 favicon
+14
View File
@@ -0,0 +1,14 @@
网页改成白色简洁 + 修官网两个 bug
配色
- 官网 / 登录页 / 管理页从 GitHub 深色风改成白色简洁
(用户的设计理念:所有东西都要白色简洁)
- 白底上把浅灰文字换成深色,链接蓝也调深一档保证对比度
修 bug
- 管理入口的链接拼接写坏了,页面上显示成 href= + ADMIN_PATH +,
点了打不开管理页
- .lead 用的是深色主题的浅灰,白底上几乎看不见
其他
- 清掉提交信息里的 BOM(PowerShell 的 Set-Content 加的)
+20
View File
@@ -0,0 +1,20 @@
ykxmz 1.5.0:手表端 TLS 证书兼容 + 三端分开打包 + 下载区
手表端
- 内置 GTS Root R4 / GlobalSign Root CA
修 SSLHandshakeException: Chain validation failed
- 连接错误翻译成人话:证书 / 时间 / 解析 / 超时分别给提示
- 经中转连上后用服务器报的地址刷新已配对记录
- 版本号 1.3.0 -> 1.5.0(AndroidManifest 之前漏改了)
服务器端
- 支持 chunked 请求体,修每 16 秒一次的连接错乱与大面积 502
- 网络调优 net-tune.sh(开机自动应用)
- 新增下载区,管理页加下载卡片
- 隧道改 HTTP/2 + 双连接
打包方式变更
- 从一个合并 zip 改成三个独立产物:
ykxmz-agent-*.zip 被控端
ykxmz-server-*.zip 服务器端
ykxmz-watch-*.apk 控制端
+74
View File
@@ -0,0 +1,74 @@
# -*- coding: utf-8 -*-
r'''修官网上残留的两个问题。
1. 管理入口的链接拼接写坏了
生成的源码里是:
· <a href="""" + ADMIN_PATH + """">管理入口</a>
结果是页面上真的显示成 href= + ADMIN_PATH +,
点了打不开管理页。改成直接写字面路径。
2. .lead{color:#c9d1d9} 是给深色底配的浅灰,
白底上几乎看不见。换成深色。
'''
from __future__ import annotations
import ast
import sys
from pathlib import Path
ROOT = Path(r"C:\Users\shu\Desktop\deepseekagent\LanRemote")
sys.path.insert(0, str(ROOT / "_build"))
from devssh import run, upload # noqa: E402
RELAY = ROOT / "relay" / "relay.py"
FIXES = [
# 管理入口链接
(''' · <a href="""" + ADMIN_PATH + """">管理入口</a>''',
''' · <a href="/zhingzhuanzhan">管理入口</a>'''),
# 白底上看不见的浅灰
("color:#c9d1d9", "color:#1f2328"),
]
def main() -> int:
text = RELAY.read_text(encoding="utf-8")
changed = []
for old, new in FIXES:
if new in text:
continue
if old in text:
text = text.replace(old, new)
changed.append(old[:50])
if changed:
RELAY.write_text(text, encoding="utf-8", newline="\n")
for c in changed:
print(f" 修好: {c}")
else:
print(" 没有要修的")
ast.parse(text)
print(" 语法 OK")
# 复核
print()
print(" 复核:")
has_link = 'href="/zhingzhuanzhan"' in text
no_light = "#c9d1d9" not in text
print(" 管理入口链接写字面量: " + ("✓" if has_link else "✗"))
print(" 没有残留的 #c9d1d9: " + ("✓" if no_light else "✗"))
print()
print(" 部署…")
upload(str(RELAY), "/root/lanremote-relay/relay.py", 0o755)
run("systemctl restart lanremote-relay", timeout=90)
_c, out, _e = run("sleep 5; bash /root/check_web.sh 2>&1", timeout=200)
print(out[-1000:])
return 0
if __name__ == "__main__":
sys.exit(main())
+27
View File
@@ -0,0 +1,27 @@
# -*- coding: utf-8 -*-
r'''清掉提交信息开头的 BOM。
现象:Gitee 上提交记录显示 "1.7.1:修白屏...",
开头那个看不见的字符就是 BOM ——
PowerShell 的 Set-Content -Encoding UTF8 会加上它。
这个脚本给 git filter-branch --msg-filter 用。
'''
from __future__ import annotations
import sys
def main() -> int:
raw = sys.stdin.buffer.read()
# 直接按字节去掉开头的 BOM,别先解码
if raw.startswith(b"\xef\xbb\xbf"):
raw = raw[3:]
# 正文里也可能混进 BOM,一并清掉
raw = raw.replace(b"\xef\xbb\xbf", b"")
sys.stdout.buffer.write(raw)
return 0
if __name__ == "__main__":
sys.exit(main())
+90
View File
@@ -0,0 +1,90 @@
# -*- coding: utf-8 -*-
r'''把三个网页从深色改成白色简洁(用户的设计理念)。
用户:"所有东西都要白色简洁,这是我的设计理念"
当前配色(GitHub 深色风):
#0d1117 页面底色
#161b22 面板
#1c2128 面板2
#30363d 边框
#e6edf3 主文字
#8b949e 次要文字
#6e7681 更淡的文字
改成白色简洁(GitHub 浅色风):
#ffffff 页面底色
#ffffff 面板
#f6f8fa 面板2
#d0d7de 边框
#1f2328 主文字
#656d76 次要文字
#8b949e 更淡的文字
注意:只改 CSS 里的颜色值,不动别的逻辑。
有些颜色(蓝/绿/红)在浅色底上对比度也够,保留。
'''
from __future__ import annotations
import ast
import sys
from pathlib import Path
RELAY = Path(r"C:\Users\shu\Desktop\deepseekagent\LanRemote\relay" r"\relay.py")
# 深 -> 浅。用带 # 的完整形式,避免误伤。
MAP = [
("#0d1117", "#ffffff"), # 页面底色
("#161b22", "#ffffff"), # 面板
("#1c2128", "#f6f8fa"), # 面板2(略灰,用来区分层次)
("#21262d", "#eaeef2"), # 分隔线
("#30363d", "#d0d7de"), # 边框
("#e6edf3", "#1f2328"), # 主文字
("#8b949e", "#656d76"), # 次要文字
("#6e7681", "#8b949e"), # 更淡的文字
# 深色底上的高亮色,浅色底要换深一档才有对比度
("#79c0ff", "#0969da"), # 链接蓝
("#58a6ff", "#0969da"),
("#2f81f7", "#0969da"),
("#3fb950", "#1a7f37"), # 绿
("#d29922", "#9a6700"), # 黄
]
def main() -> int:
text = RELAY.read_text(encoding="utf-8")
original = text
counts = {}
for dark, light in MAP:
n = text.count(dark)
if n:
text = text.replace(dark, light)
counts[dark] = n
if text == original:
print(" 颜色已经是浅色,没要改的")
return 0
RELAY.write_text(text, encoding="utf-8", newline="\n")
print(" 换掉的颜色:")
for dark, n in counts.items():
light = dict(MAP)[dark]
print(f" {dark} -> {light} ({n} 处)")
try:
ast.parse(text)
print()
print(" relay.py 语法 OK")
except SyntaxError as exc:
print(f" [失败] 语法错误: 行 {exc.lineno}: {exc.msg}")
return 1
# 复核:不该再有深色底
left = [d for d, _ in MAP if d in text]
print(f" 残留的深色值: {left if left else '无 ✓'}")
return 0
if __name__ == "__main__":
sys.exit(main())
+36 -36
View File
@@ -835,32 +835,32 @@ def _site_page() -> str:
<style>
*{box-sizing:border-box}
body{margin:0;font-family:-apple-system,"Segoe UI","Microsoft YaHei",sans-serif;
background:#0d1117;color:#e6edf3;line-height:1.7}
background:#ffffff;color:#1f2328;line-height:1.7}
.wrap{max-width:780px;margin:0 auto;padding:56px 20px 80px}
h1{font-size:34px;margin:0 0 10px;letter-spacing:-.5px}
.sub{color:#8b949e;font-size:17px;margin-bottom:10px}
.ver{display:inline-block;background:#1f6feb22;color:#79c0ff;
.sub{color:#656d76;font-size:17px;margin-bottom:10px}
.ver{display:inline-block;background:#1f6feb22;color:#0969da;
border:1px solid #1f6feb55;border-radius:20px;
padding:2px 12px;font-size:13px;margin-bottom:34px}
.lead{font-size:16px;color:#c9d1d9;margin:0 0 14px}
ul{color:#8b949e;padding-left:22px;margin:0 0 40px}
ul{color:#656d76;padding-left:22px;margin:0 0 40px}
li{margin:4px 0}
.cards{display:grid;gap:14px;grid-template-columns:1fr}
@media(min-width:640px){.cards{grid-template-columns:1fr 1fr 1fr}}
.card{background:#161b22;border:1px solid #30363d;border-radius:12px;
.card{background:#ffffff;border:1px solid #d0d7de;border-radius:12px;
padding:18px 16px;display:flex;flex-direction:column}
.card .t{font-weight:600;font-size:15px;margin-bottom:6px}
.card .d{color:#8b949e;font-size:13px;flex:1;margin-bottom:14px}
.card .d{color:#656d76;font-size:13px;flex:1;margin-bottom:14px}
.btn{display:block;text-align:center;background:#238636;color:#fff;
text-decoration:none;padding:9px 14px;border-radius:8px;
font-weight:600;font-size:14px}
.btn:hover{background:#2ea043}
.soon{color:#6e7681;font-size:13px;text-align:center;padding:9px 0}
.s{color:#6e7681;font-size:11px;margin-top:8px;
.soon{color:#8b949e;font-size:13px;text-align:center;padding:9px 0}
.s{color:#8b949e;font-size:11px;margin-top:8px;
word-break:break-all;text-align:center}
.foot{margin-top:46px;padding-top:20px;border-top:1px solid #21262d;
color:#6e7681;font-size:13px}
.foot a{color:#79c0ff;text-decoration:none}
.foot{margin-top:46px;padding-top:20px;border-top:1px solid #eaeef2;
color:#8b949e;font-size:13px}
.foot a{color:#0969da;text-decoration:none}
</style></head><body><div class=wrap>
<h1>ykxmz</h1>
@@ -880,7 +880,7 @@ li{margin:4px 0}
<div class=foot>
源码在 <a href="https://gitee.com/xmz7891/ykxmz" target=_blank rel=noopener>Gitee</a>
· 历史版本在 <a href="https://gitee.com/xmz7891/ykxmz/releases" target=_blank rel=noopener>发行版</a>
· <a href="""" + ADMIN_PATH + """">管理入口</a>
· <a href="/zhingzhuanzhan">管理入口</a>
</div>
</div></body></html>"""
@@ -896,20 +896,20 @@ def _login_page(message: str = "") -> bytes:
<title>中转服务器 · 登录</title>
<style>
body{font:14px/1.6 -apple-system,'Microsoft YaHei',sans-serif;
background:#0f1117;color:#e6edf3;display:flex;align-items:center;
background:#0f1117;color:#1f2328;display:flex;align-items:center;
justify-content:center;height:100vh;margin:0}
.box{background:#161b22;border:1px solid #30363d;border-radius:12px;
.box{background:#ffffff;border:1px solid #d0d7de;border-radius:12px;
padding:28px 32px;width:320px}
h1{font-size:17px;margin:0 0 4px}
.sub{color:#8b949e;font-size:12px;margin-bottom:18px}
input{width:100%;box-sizing:border-box;background:#0d1117;color:#e6edf3;
border:1px solid #30363d;border-radius:7px;padding:9px 11px;font-size:15px}
.sub{color:#656d76;font-size:12px;margin-bottom:18px}
input{width:100%;box-sizing:border-box;background:#ffffff;color:#1f2328;
border:1px solid #d0d7de;border-radius:7px;padding:9px 11px;font-size:15px}
input:focus{outline:none;border-color:#1f6feb}
button{width:100%;margin-top:14px;background:#1f6feb;color:#fff;border:0;
border-radius:7px;padding:10px;font-size:14px;cursor:pointer}
button:hover{background:#388bfd}
.bad{color:#f85149;font-size:12px;margin:10px 0 0}
.foot{color:#6e7681;font-size:11px;margin-top:16px;text-align:center}
.foot{color:#8b949e;font-size:11px;margin-top:16px;text-align:center}
</style>
<div class=box>
<h1>中转服务器</h1>
@@ -1579,9 +1579,9 @@ class Handler(BaseHTTPRequestHandler):
<style>
*{{box-sizing:border-box}}
:root{{
--bg:#0d1117; --panel:#161b22; --panel2:#1c2128; --border:#30363d;
--fg:#e6edf3; --dim:#8b949e; --muted:#6e7681;
--accent:#2f81f7; --ok:#3fb950; --danger:#f85149; --warn:#d29922;
--bg:#ffffff; --panel:#ffffff; --panel2:#f6f8fa; --border:#d0d7de;
--fg:#1f2328; --dim:#656d76; --muted:#8b949e;
--accent:#0969da; --ok:#1a7f37; --danger:#f85149; --warn:#9a6700;
}}
html,body{{max-width:100%;overflow-x:hidden}}
body{{margin:0;padding:0;background:var(--bg);color:var(--fg);
@@ -1594,7 +1594,7 @@ class Handler(BaseHTTPRequestHandler):
padding-bottom:16px;border-bottom:1px solid var(--border);
margin-bottom:20px;flex-wrap:wrap}}
.logo{{width:38px;height:38px;border-radius:10px;flex:none;
background:linear-gradient(140deg,#2f81f7,#1f6feb);
background:linear-gradient(140deg,#0969da,#1f6feb);
display:flex;align-items:center;justify-content:center;
font-weight:700;font-size:15px;color:#fff;letter-spacing:-.5px}}
.brand h1{{margin:0;font-size:17px;font-weight:600;letter-spacing:.2px}}
@@ -1615,7 +1615,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:#79c0ff;word-break:break-all;
'Courier New',monospace;color:#0969da;word-break:break-all;
background:#0b1220;border:1px solid #1f6feb44;border-radius:8px;
padding:10px 12px}}
.url.empty{{color:var(--muted);font-weight:400;font-style:normal}}
@@ -1661,7 +1661,7 @@ class Handler(BaseHTTPRequestHandler):
table{{width:100%;max-width:100%;border-collapse:collapse;
table-layout:fixed}}
th,td{{padding:11px 14px;text-align:left;font-size:13px;
border-bottom:1px solid #21262d;vertical-align:middle;
border-bottom:1px solid #eaeef2;vertical-align:middle;
overflow-wrap:anywhere;min-width:0}}
th{{background:var(--panel2);color:var(--dim);font-weight:500;
font-size:12px;white-space:nowrap}}
@@ -1677,16 +1677,16 @@ class Handler(BaseHTTPRequestHandler):
.val{{min-width:0;overflow-wrap:anywhere;word-break:break-word}}
td.empty{{text-align:center;padding:44px 20px;color:var(--dim)}}
td.empty .big{{font-size:15px;color:var(--fg);margin-bottom:6px;font-weight:500}}
code{{background:#21262d;padding:2px 8px;border-radius:6px;
code{{background:#eaeef2;padding:2px 8px;border-radius:6px;
letter-spacing:1.5px;font-family:ui-monospace,Consolas,monospace;
font-size:13px;color:#79c0ff}}
font-size:13px;color:#0969da}}
.dot{{display:inline-block;width:7px;height:7px;border-radius:50%;
margin-right:7px;vertical-align:middle;background:#484f58}}
.dot.on{{background:var(--ok);box-shadow:0 0 0 3px #3fb95022}}
.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}}
.badge.on{{color:var(--ok);background:#3fb9501a;border-color:#3fb95040}}
.badge.off{{color:var(--muted);background:#6e76811a;border-color:#6e768140}}
.badge.on{{color:var(--ok);background:#1a7f371a;border-color:#1a7f3740}}
.badge.off{{color:var(--muted);background:#8b949e1a;border-color:#8b949e40}}
.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}}
@@ -1742,7 +1742,7 @@ class Handler(BaseHTTPRequestHandler):
padding:0;min-width:0}}
td.pickcell::before{{content:'';display:none}}
td.ops{{justify-content:flex-end;padding-top:10px;margin-top:4px;
border-top:1px solid #21262d}}
border-top:1px solid #eaeef2}}
td.ops::before{{content:'';display:none}}
td.empty{{display:block;text-align:center}}
td.empty::before{{content:'';display:none}}
@@ -1971,13 +1971,13 @@ if (netBtn) netBtn.onclick = async () => {{
const rows = [];
if (j.tunnelMetrics) {{
const conns = j.tunnelConnections || 0;
const color = conns >= 2 ? '#3fb950'
: (conns === 1 ? '#d29922' : '#f85149');
const color = conns >= 2 ? '#1a7f37'
: (conns === 1 ? '#9a6700' : '#f85149');
rows.push('隧道连接数:<b style="color:' + color + '">' + conns
+ '</b>' + (conns === 0 ? '(断了,看门狗会重启)' : ''));
rows.push('隧道累计请求:' + (j.tunnelRequests || 0));
}} else {{
rows.push('<span style="color:#d29922">读不到隧道指标'
rows.push('<span style="color:#9a6700">读不到隧道指标'
+ (j.tunnelError ? '(' + j.tunnelError + ')' : '') + '</span>');
}}
rows.push('登记设备:' + j.devices + '(在线 ' + j.online + ')');
@@ -2017,7 +2017,7 @@ if (netBtn) netBtn.onclick = async () => {{
const j = await r.json();
const files = (j && j.files) || [];
if (!files.length) {{
body.innerHTML = '<span style="color:#8b949e">服务器上还没有成品。</span>';
body.innerHTML = '<span style="color:#656d76">服务器上还没有成品。</span>';
return;
}}
// 优先挑被控端整包;没有就挑第一个 zip;再没有就第一个
@@ -2031,10 +2031,10 @@ if (netBtn) netBtn.onclick = async () => {{
+ 'background:#238636;color:#fff;text-decoration:none;'
+ 'font-weight:600;font-size:15px">'
+ '⬇ 下载 ' + pick.name + '</a>'
+ '<div style="color:#6e7681;font-size:12px;margin-top:8px">'
+ '<div style="color:#8b949e;font-size:12px;margin-top:8px">'
+ mb + ' MB · 也可以去 '
+ '<a href="https://gitee.com/xmz7891/ykxmz/releases" target="_blank" '
+ 'rel="noopener" style="color:#79c0ff">Gitee 历史版本</a>'
+ 'rel="noopener" style="color:#0969da">Gitee 历史版本</a>'
+ '</div>';
}} catch (e) {{
body.innerHTML = '<span style="color:#f85149">读不到:' + e + '</span>';