mirror of
https://gitee.com/xmz7891/ykxmz.git
synced 2026-10-19 15:20:44 +00:00
2.2.0:手表端连上后先到「远控 / 静默更新被控端」选择页
== 用户要求 ==
"安卓那个逻辑也要改一下,就是你输入配对码后,进入一个页面,
页面有两个按钮,第一个按钮是远控,第二个按钮是静默更新被控端"
== 做成什么样 ==
新增 choicePanel,连接成功后先进这一页:
已连接「电脑名」
电脑端 2.1.5 → 可更新到 2.2.0
[ 远控 ] <- 第一个按钮
[ 静默更新被控端 ] <- 第二个按钮
按钮顺序按用户说的来(远控在前)。
页面顶上显示电脑名和**电脑端当前版本** —— 用户之前要求
"手表端连接那个电脑端也可以查看电脑端目前所处的版本",
这里是最自然的展示位置(不弹框,只显示一行)。
为什么不让它直接进控制页:老版本的被控端可能缺功能或有 bug,
"先更新再远控"是更合理的顺序 —— 但不强制,给用户自己选。
== 一个刻意不改的地方 ==
自动切到中转服务器**恢复**时的 `showControlPanel()` **没动** ——
用户本来就在远控页,中途弹一层选择页会打断他。
测试里专门断言了这一点,免得以后有人"顺手统一一下"改坏。
== 顺手修的几个问题 ==
1. **忘了定义 lastDeviceName** —— 写选择页时凭直觉用了这个变量,
编译报"找不到符号"。补上字段并在连接回调里赋值。
(教训:写代码时要用的变量,先确认它存在。)
2. **泄漏闸门拦下我自己** —— 这两天写的一批服务器诊断/配置脚本里
硬编码了服务器 IP(26 处,5 个文件)。规则是 IP 不能进任何
被跟踪的文件。已全部改成占位符,真实值仍从
_build/.lightsail_host(已 gitignore)读。
3. **verify_all.ps1 删掉「锁屏时记 SKIP」的逻辑** ——
用户明确要求删。那个好意带来一个更糟的后果:锁屏时几关根本不跑,
回归"全绿"了但关键测试其实一跳而过。
**"因为环境不满足所以不测"比"测了发现失败"更危险。**
删掉之后果然暴露出 3 个 FAIL —— 屏幕解锁后重跑全部通过,
确认是环境问题而不是代码问题。
== 服务器这边(不在这份提交里,但同一天做的)==
* nginx 按用户要求重排:
IP(80) 任何路径 -> 404(没东西)
域名 / -> 官网;/zhongzhuanzhan -> 中转站设置
9100 -> 同样的内容(等 AWS 开防火墙)
* 删掉早年 Cloudflare Tunnel 的 systemd 残留
* **补上 ACME 挑战例外** —— 这是最要紧的一条:
80 端口原来把所有请求都 301 到 https,包括
/.well-known/acme-challenge/,**续期时会失败**。
而且它是延迟爆发的(最长 90 天后证书到期才暴露)。
* 清理 1Panel 安装包残留(223MB)
== 验证 ==
全量回归 21 关全部 PASS(零 FAIL,桌面可用状态)
Java 编译通过(android-34, --release 8)
623+ Python 文件语法通过
泄漏闸门通过
全部产物重建,Win7 兼容校验通过
This commit is contained in:
@@ -20,6 +20,7 @@ from __future__ import annotations
|
||||
|
||||
import json
|
||||
import re
|
||||
import shutil
|
||||
import subprocess
|
||||
import sys
|
||||
import time
|
||||
@@ -117,37 +118,61 @@ def install() -> tuple:
|
||||
def _clean_previous() -> None:
|
||||
"""把上一次安装/测试的残留清掉,让这一轮从零开始。
|
||||
|
||||
要清三样:
|
||||
1. 先**卸载**(走正规卸载器,能清注册表和自启项)
|
||||
2. 删安装目录
|
||||
3. 删数据目录 —— 卸载器**故意不删**它(存着用户的配置),
|
||||
所以必须手动删。**这一步就是修 `(旧的残留值)` 那个假 bug 的关键。**
|
||||
⚠ **这个函数第一版是坏的**,记下来免得再犯:
|
||||
|
||||
每一步都 best-effort:清不掉也不该让测试崩,后面会有断言报出来。
|
||||
第一版对卸载器和 rmdir 都用了
|
||||
subprocess.run(["cmd", "/c", '"%s" ...' % path])
|
||||
这种**嵌套引号**的写法。而 `run_bat()` 上面那大段注释
|
||||
就是在说这个坑:"引号会被 Python 和 cmd 来回吃掉,
|
||||
实测 0.0 秒就返回 exit=1"。
|
||||
|
||||
于是"装前清理"实际上什么都没清 —— 目录还在、旧的 settings.json
|
||||
还在(配对码是上一轮遗留的值),测试报:
|
||||
|
||||
[FAIL] 安装目录已清
|
||||
[FAIL] 数据目录已清
|
||||
[FAIL] 配对码正确写入 实际 '(上一轮的旧值)'
|
||||
|
||||
看上去像"安装包有 bug",其实是**清理函数自己没跑通**。
|
||||
|
||||
现在:
|
||||
* 卸载器走 `run_bat()`(已经验证过的方式)
|
||||
* 删目录用 `shutil.rmtree` —— **完全不过 cmd**,没有引号问题,
|
||||
而且失败时能拿到真实原因(权限 / 占用),不会静默吞掉
|
||||
"""
|
||||
# 1) 走正规卸载器(顺带清注册表和开机自启)
|
||||
try:
|
||||
found = ps("Get-ChildItem '%s\\unins*.exe' -ErrorAction SilentlyContinue "
|
||||
"| Select-Object -First 1 -ExpandProperty FullName" % APP)
|
||||
if found and found.strip():
|
||||
subprocess.run(["cmd", "/c", '"%s" /VERYSILENT /SUPPRESSMSGBOXES '
|
||||
'/NORESTART' % found.strip()],
|
||||
capture_output=True, timeout=180)
|
||||
run_bat(['"%s" /VERYSILENT /SUPPRESSMSGBOXES /NORESTART'
|
||||
% found.strip()], timeout=240)
|
||||
time.sleep(4)
|
||||
except Exception: # noqa: BLE001
|
||||
pass
|
||||
# 万一还有进程占着文件,先杀掉
|
||||
except Exception as exc: # noqa: BLE001
|
||||
print(" (卸载器这步跳过: %s)" % type(exc).__name__)
|
||||
|
||||
# 2) 还有进程占着文件就先杀掉
|
||||
try:
|
||||
ps("Get-Process ykxmz -ErrorAction SilentlyContinue | "
|
||||
"Stop-Process -Force -ErrorAction SilentlyContinue")
|
||||
except Exception: # noqa: BLE001
|
||||
pass
|
||||
time.sleep(1)
|
||||
for target in (APP, DATA):
|
||||
try:
|
||||
subprocess.run(["cmd", "/c", 'rmdir /s /q "%s"' % target],
|
||||
capture_output=True, timeout=120)
|
||||
except Exception: # noqa: BLE001
|
||||
pass
|
||||
|
||||
# 3) 直接删目录。**不过 cmd** —— shutil.rmtree 能报出为什么删不掉。
|
||||
for target, label in ((APP, "安装目录"), (DATA, "数据目录")):
|
||||
if not target.exists():
|
||||
continue
|
||||
problems = []
|
||||
|
||||
def _onerr(func, path, exc_info): # noqa: ANN001
|
||||
problems.append("%s: %s" % (path, exc_info[1]))
|
||||
|
||||
shutil.rmtree(str(target), onerror=_onerr)
|
||||
if target.exists():
|
||||
print(" ⚠ %s 没清干净:%s" % (label, problems[:2]))
|
||||
else:
|
||||
print(" 清了 %s" % label)
|
||||
time.sleep(1)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user