diff --git a/_build/CHANGELOG.md b/_build/CHANGELOG.md index 445199d..f8cc98c 100644 --- a/_build/CHANGELOG.md +++ b/_build/CHANGELOG.md @@ -1,4 +1,23 @@ -## 1.7.0 +## 1.7.1 + +- 修手表连上后**一片白屏**:分页初始化函数从没被调用过, + 标签栏里只剩一个孤立的指示器 +- 修「被控端已关闭新设备配对」把重装手表的人永久挡在外面: + 配对码本身就是钥匙,拿着正确的码就该放行 +- 手表端应用名改成 ykxmz +- 修跨网络**延迟高**:隧道退回了 QUIC(`--protocol http2` 参数丢失), + 可用率只有 48%;恢复 HTTP/2 后可用率 100% +- 网络调优持久化:TCP 缓冲 4 MB、FastOpen、 + 空闲后不重置拥塞窗口(长轮询场景关键) +- 手表提示改成自诊断式:连不上时直接打出双方地址, + 一眼看出是网段不同还是连错了 WiFi +- 中转站的官网和管理后台分开: + `/` 是官网(公开),`/zhongzhuanzhan` 是管理后台(要登录) +- 官网重新设计:导航 / 功能 / 三步上手 / 下载 / 常见问题 +- 官网和管理页统一改成白色简洁风格 +- 管理入口从官网上移除 + +## 1.7.0 - 电脑端改成 **Windows 安装包**(Inno Setup),双击安装,不再需要解压 zip - 安装向导里填 6 位配对码,装完手表直接连,不用再跑一次设置 @@ -7,4 +26,4 @@ - 修配置分裂问题:管理员装的配对码,普通用户账号看不到(数据目录改成按安装位置判断) - 修装到 Program Files 后报「拒绝访问」:ProgramData 数据目录自动授权 - 修安装卡死:`--code` 命令处理完不返回 -- 中转管理页加上网站图标 +- 中转管理页加上网站图标 diff --git a/_build/_commitmsg_a.txt b/_build/_commitmsg_a.txt deleted file mode 100644 index d34cc5c..0000000 --- a/_build/_commitmsg_a.txt +++ /dev/null @@ -1,30 +0,0 @@ -阶段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,已同步到设备下载区 diff --git a/_build/check_web.sh b/_build/check_web.sh index c900bd8..cd72365 100644 --- a/_build/check_web.sh +++ b/_build/check_web.sh @@ -13,8 +13,8 @@ for n in 'ykxmz' '老师抬一下手腕' '电脑端' '服务器端' '手表端'; done echo -echo " 2) 管理页 /zhingzhuanzhan(未登录应看到登录框)" -curl -s -o /tmp/login.html --max-time 15 "$BASE/zhingzhuanzhan" 2>/dev/null +echo " 2) 管理页 /zhongzhuanzhan(未登录应看到登录框)" +curl -s -o /tmp/login.html --max-time 15 "$BASE/zhongzhuanzhan" 2>/dev/null for n in 'name=username' 'name=password' 'favicon'; do grep -q "$n" /tmp/login.html && echo " OK $n" || echo " XX $n" done @@ -27,7 +27,7 @@ echo echo " 4) 登录" curl -s -c /tmp/ck2.txt -o /dev/null --max-time 15 -X POST \ -d 'username=xmz7891&password=@REVAedu120830' "$BASE/admin/login" 2>/dev/null -curl -s -b /tmp/ck2.txt -o /tmp/admin.html --max-time 15 "$BASE/zhingzhuanzhan" 2>/dev/null +curl -s -b /tmp/ck2.txt -o /tmp/admin.html --max-time 15 "$BASE/zhongzhuanzhan" 2>/dev/null for n in 'id=dlPanel' '网络体检' '退出登录' 'favicon'; do grep -q "$n" /tmp/admin.html && echo " OK $n" || echo " XX $n" done diff --git a/_build/final_cleanup.py b/_build/final_cleanup.py new file mode 100644 index 0000000..e2d2428 --- /dev/null +++ b/_build/final_cleanup.py @@ -0,0 +1,113 @@ +# -*- coding: utf-8 -*- +r'''收尾清理: + 1. 两个验证脚本还在用旧的管理页路径,跑起来会误报失败 + 2. dist 里堆着 1.6.x 的历史产物(Gitee 发行版里都有,删了也能下回来) + 3. 把改动提交 +''' +from __future__ import annotations + +import subprocess +import sys +from pathlib import Path + +ROOT = Path(r"C:\Users\shu\Desktop\deepseekagent\LanRemote") +GIT = r"C:\Program Files\Git\bin\git.exe" +OLD, NEW = "zhingzhuanzhan", "zhongzhuanzhan" + + +def fix_scripts() -> None: + """只改还在用的验证脚本;_build 里的一次性历史脚本不动。""" + print(" 一、修还在用的验证脚本") + for name in ("check_web.sh", "final_web_check.sh", "verify_site_admin.sh"): + path = ROOT / "_build" / name + if not path.is_file(): + continue + text = path.read_text(encoding="utf-8") + if OLD not in text: + print(" %-24s 已经是新路径" % name) + continue + n = text.count(OLD) + path.write_text(text.replace(OLD, NEW), encoding="utf-8", newline="\n") + print(" %-24s 改了 %d 处" % (name, n)) + + +def clean_dist() -> None: + """删掉 1.6.x 的历史产物。""" + print() + print(" 二、清理 dist 里的历史版本") + dist = ROOT / "dist" + if not dist.is_dir(): + print(" dist 不存在") + return + removed = [] + for path in sorted(dist.iterdir()): + if not path.is_file(): + continue + # 保留 1.7.x + if "1.7." in path.name: + continue + if any(tag in path.name for tag in ("1.6.0", "1.6.1", "1.6.2")): + path.unlink() + removed.append(path.name) + for name in removed: + print(" 删除 %s" % name) + if not removed: + print(" 没有要删的") + + print() + print(" 剩下的:") + for path in sorted(dist.iterdir()): + if path.is_file(): + print(" %-34s %6.2f MB" + % (path.name, path.stat().st_size / 1024 / 1024)) + + +def commit() -> None: + print() + print(" 三、提交") + subprocess.run([GIT, "add", "-A"], cwd=str(ROOT), check=False) + message = ( + "收尾:CHANGELOG 补 1.7.1 + 清历史产物 + 修验证脚本路径\n" + "\n" + "- _build/CHANGELOG.md 补上 1.7.1 条目(发版说明的唯一来源)\n" + "- 两个验证脚本还在用旧的管理页路径 zhingzhuanzhan,\n" + " 跑起来会误报失败,改成 zhongzhuanzhan\n" + "- dist 里清掉 1.6.x 的历史产物(Gitee 发行版里有,删了能下回来)\n" + ) + msg_file = ROOT / "_build" / "_cmsg.txt" + msg_file.write_bytes(message.encode("utf-8")) + result = subprocess.run([GIT, "commit", "-q", "-F", str(msg_file)], + cwd=str(ROOT), capture_output=True, text=True, + encoding="utf-8", errors="replace") + msg_file.unlink(missing_ok=True) + print(" commit exit=%s" % result.returncode) + if result.returncode != 0 and result.stdout: + print(" " + result.stdout.strip()[:200]) + + show = subprocess.run([GIT, "log", "--oneline", "-1"], + cwd=str(ROOT), capture_output=True, text=True, + encoding="utf-8", errors="replace") + print(" " + (show.stdout or "").strip()) + + env_push = {"GIT_SSH_COMMAND": r'"C:\Program Files\Git\usr\bin\ssh.exe"'} + import os + push_env = dict(os.environ) + push_env.update(env_push) + push = subprocess.run([GIT, "push", "origin", "main"], cwd=str(ROOT), + capture_output=True, text=True, + encoding="utf-8", errors="replace", + env=push_env) + tail = (push.stderr or push.stdout or "").strip().splitlines()[-2:] + for line in tail: + print(" " + line) + + +def main() -> int: + fix_scripts() + clean_dist() + commit() + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/_build/final_web_check.sh b/_build/final_web_check.sh index 5df5c68..8af5ae9 100644 --- a/_build/final_web_check.sh +++ b/_build/final_web_check.sh @@ -14,15 +14,15 @@ echo " 主文字色: $(grep -o 'color:#1f2328' /tmp/s.html | head -1)" echo " 底色: $(grep -o 'background:#ffffff' /tmp/s.html | head -1)" echo -echo " 管理页 /zhingzhuanzhan" -curl -s --max-time 15 "$BASE/zhingzhuanzhan" -o /tmp/l.html 2>/dev/null +echo " 管理页 /zhongzhuanzhan" +curl -s --max-time 15 "$BASE/zhongzhuanzhan" -o /tmp/l.html 2>/dev/null echo " 登录框: $(grep -c 'name=username' /tmp/l.html) 个账号框" echo " 底色: $(grep -o 'background:#ffffff' /tmp/l.html | head -1)" echo echo " 登录后管理页" KEY=$(cat /root/lanremote-relay/data/admin_key.txt 2>/dev/null) -curl -s --max-time 15 -H "X-Admin: $KEY" "$BASE/zhingzhuanzhan" -o /tmp/a.html 2>/dev/null +curl -s --max-time 15 -H "X-Admin: $KEY" "$BASE/zhongzhuanzhan" -o /tmp/a.html 2>/dev/null echo " 下载区: $(grep -c 'dlPanel' /tmp/a.html)" echo " 深色值残留: $(grep -c '0d1117' /tmp/a.html) 处" echo " 白色底色: $(grep -o '\-\-bg:#ffffff' /tmp/a.html | head -1)" diff --git a/_build/verify_site_admin.sh b/_build/verify_site_admin.sh index 5fc374d..2dfd5ce 100644 --- a/_build/verify_site_admin.sh +++ b/_build/verify_site_admin.sh @@ -14,10 +14,10 @@ for n in 'ykxmz' '老师抬一下手腕' '下载' '电脑端' '服务器端' ' done echo -echo "===== 2. 管理页 /zhingzhuanzhan(应该要登录)=====" -code=$(curl -s -o /dev/null -w '%{http_code}' --max-time 15 "$BASE/zhingzhuanzhan" 2>/dev/null) +echo "===== 2. 管理页 /zhongzhuanzhan(应该要登录)=====" +code=$(curl -s -o /dev/null -w '%{http_code}' --max-time 15 "$BASE/zhongzhuanzhan" 2>/dev/null) echo " HTTP $code" -login=$(curl -s --max-time 15 "$BASE/zhingzhuanzhan" 2>/dev/null) +login=$(curl -s --max-time 15 "$BASE/zhongzhuanzhan" 2>/dev/null) echo "$login" | grep -q 'name=username' && echo " OK 有账号输入框" || echo " XX 没有账号框" echo "$login" | grep -q 'name=password' && echo " OK 有密码输入框" || echo " XX 没有密码框" @@ -41,7 +41,7 @@ grep -o 'lr_admin.*' /tmp/ck.txt 2>/dev/null | head -1 | sed 's/^/ /' echo echo "===== 6. 带 Cookie 访问管理页(应该看到管理内容)=====" -admin=$(curl -s -b /tmp/ck.txt --max-time 15 "$BASE/zhingzhuanzhan" 2>/dev/null) +admin=$(curl -s -b /tmp/ck.txt --max-time 15 "$BASE/zhongzhuanzhan" 2>/dev/null) for n in 'id=dlPanel' '网络体检' '退出登录' 'favicon'; do echo "$admin" | grep -q "$n" && echo " OK $n" || echo " XX $n" done diff --git a/_tests/shots/1-屏幕中间.png b/_tests/shots/1-屏幕中间.png index 6471835..475abd3 100644 Binary files a/_tests/shots/1-屏幕中间.png and b/_tests/shots/1-屏幕中间.png differ