mirror of
https://gitee.com/xmz7891/ykxmz.git
synced 2026-10-18 12:30:44 +00:00
2.0.0:安装时可设中转服务器 + 手表端新增设置页 + 中转默认留空
按用户定的版本规矩,这一轮既有新内容又有重构,所以升第二位: 1.9.0 -> 2.0.0(最后一位清 0)。 == 一、安装时就能设中转服务器(用户要求)== 安装向导那一页现在是两个输入框:配对码 + 中转服务器。 装的时候是"第一次设置",最该一次把地址填好,不然装完还得去 双击 exe 找设置窗口,很容易漏。 只填域名就行(自动补 https://),留空 = 只走局域网。 批量静默部署同样支持: ykxmz-setup-2.0.0.exe /VERYSILENT /CODE=246810 /RELAY=relay.你的域名 为此新增了一个 --relay-url 参数: --relay 连接一次、打印状态、然后退出(人工排查用) --relay-url 只写进配置,不连接、不退出(安装流程用) 用错那个的话,安装包的命令链会在中间就 return,后面的 --silent 根本跑不到 —— 所以必须分开。 == 二、手表端新增「设置」页(用户要求)== 用户原话:"安卓端加一个设置,各种设置就在这里面调"。 以前设置散在首页(只有一个"中转设置"按钮),现在统一收进设置页: * 中转服务器(填写 / 一键清空) * 记住的配对码(显示 / 清除) * 已配对的电脑(看数量 / 清空,带二次确认) * 关于(版本号从 APK 读,不会和代码对不上) == 三、中转地址默认留空 + 一次性迁移(用户报的问题)== 用户原话:"安卓端为什么还是默认填的我的中转站,以后改成手动填"。 代码里的默认值早就是空的了,但用户看到的还是那个地址 —— 因为**老版本 1.5.0 把作者的域名硬编码成了默认值**,第一次运行就 存进了 SharedPreferences。装新 APK 不会清偏好,所以那个值一直留着。 用户其实从来没"选"过这个地址,是程序硬塞的。 所以加了 migrateLegacyRelay():存的值如果正好等于当时内置的域名, 就当成没设过、清掉。只清完全相等的,用户手填的不会动。 == 四、两个测试自身的毛病 == * test_lan_optimize 那条"没有把旧公网域名当默认值"太粗 —— 它查的是源码里任何位置,于是迁移注释里引用那行老代码就把它判红了。 改成先剥掉注释再查(断言要测的是"有没有把它当默认值")。 * test_image_modes 偶发红:它开真实 Tk 全屏窗口,在全量套件里跑 偶尔起不来(单独跑 19/19 全过)。加了有界重试。 偶发红的测试会让"全量通过"失去意义。 == 五、新增防复发断言 == _tests/test_relay_default_blank.py(15 项,回归阶段 3a3b): * 默认值必须是空串 * 除了迁移清单,源码里不许有写死的中转域名 * 迁移必须真的被调用(不是只定义) * 迁移必须是 remove,不能换成另一个硬编码值 * Windows 端的默认也得是空 理由:用户说过"这个中转站我就自己用,不对外" —— 值得用断言钉死。 == 六、顺手修的 == * release_all.py 崩在 Gitee 那一步:Gitee 的 GET /releases/tags/{tag} 在"标签存在、但还没发行版"时返回的是 **HTTP 200 + JSON null**(不是 404),于是 .get("id") 直接 AttributeError。发 1.9.0 时踩到,已改成容忍 None。 * installer/build_installer.py 里 license-combined.txt 是从 docs/ 三份文档重新生成的,所以光改生成物没用(下次构建又变回去)。 改成在 build_license() 里统一注入当前版本。 * ExE 文件属性里的版本(version_info.txt)从 1.7.1 起就一直没跟上。 全量回归 43 个阶段全部通过。
This commit is contained in:
@@ -3,7 +3,7 @@
|
||||
========================================================
|
||||
|
||||
软件名称:ykxmz(远程管理工具)
|
||||
版本:1.9.0
|
||||
版本:2.0.0
|
||||
作者:小麦子
|
||||
生效日期:2026 年 10 月 5 日
|
||||
|
||||
@@ -150,7 +150,7 @@
|
||||
|
||||
--------------------------------------------------------
|
||||
作者:小麦子
|
||||
软件:ykxmz 1.9.0
|
||||
软件:ykxmz 2.0.0
|
||||
|
||||
如果你不同意本协议的任何一条,请不要安装或使用本软件。
|
||||
--------------------------------------------------------
|
||||
@@ -162,7 +162,7 @@
|
||||
========================================================
|
||||
|
||||
软件名称:ykxmz
|
||||
版本:1.9.0
|
||||
版本:2.0.0
|
||||
作者:小麦子
|
||||
|
||||
请你**在安装之前**花三分钟读完这一页。里面有几条很要紧的
|
||||
@@ -323,7 +323,7 @@ ykxmz 是一套自己搭建的远程管理工具,由三部分组成:
|
||||
|
||||
--------------------------------------------------------
|
||||
作者:小麦子
|
||||
软件:ykxmz 1.9.0
|
||||
软件:ykxmz 2.0.0
|
||||
继续安装,即表示你已阅读并同意《许可协议》。
|
||||
--------------------------------------------------------
|
||||
|
||||
@@ -334,7 +334,7 @@ ykxmz 是一套自己搭建的远程管理工具,由三部分组成:
|
||||
========================================================
|
||||
|
||||
软件名称:ykxmz
|
||||
版本:1.9.0
|
||||
版本:2.0.0
|
||||
作者:小麦子
|
||||
|
||||
装好之后看这一页:怎么确认它在跑、怎么改设置、
|
||||
@@ -528,7 +528,7 @@ ykxmz 是一套自己搭建的远程管理工具,由三部分组成:
|
||||
八、版本记录
|
||||
--------------------------------------------------------
|
||||
|
||||
1.9.0
|
||||
2.0.0
|
||||
* 下载改走 Cloudflare 边缘缓存 —— 安装包和 APK 快了几十倍
|
||||
* 跨网络更稳:隧道**两种协议同时跑**(QUIC + HTTP/2,
|
||||
合计 10 条连接),一种协议犯病另一种还在服务
|
||||
@@ -549,6 +549,6 @@ ykxmz 是一套自己搭建的远程管理工具,由三部分组成:
|
||||
|
||||
--------------------------------------------------------
|
||||
作者:小麦子
|
||||
软件:ykxmz 1.9.0
|
||||
软件:ykxmz 2.0.0
|
||||
许可条款见《许可协议》(LICENSE.txt)
|
||||
--------------------------------------------------------
|
||||
|
||||
+111
-6
@@ -27,7 +27,7 @@
|
||||
; ============================================================================
|
||||
|
||||
#define MyAppName "ykxmz"
|
||||
#define MyAppVersion "1.9.0"
|
||||
#define MyAppVersion "2.0.0"
|
||||
#define MyAppPublisher "小麦子"
|
||||
#define MyAppExeName "ykxmz.exe"
|
||||
|
||||
@@ -137,6 +137,20 @@ Type: filesandordirs; Name: "{app}\data"
|
||||
Filename: "{app}\{#MyAppExeName}"; Parameters: "--code {code:GetPairingCode}"; \
|
||||
Flags: runhidden; Check: HasPairingCode
|
||||
|
||||
; 1b. 写中转服务器(向导里留空就跳过)。
|
||||
; 用户要求"安装时就能设中转服务器" —— 装的时候是第一次设置,
|
||||
; 最该一次填好,不然装完还得去双击 exe 找设置窗口。
|
||||
;
|
||||
; 用了 --relay-url 而不是 --relay:
|
||||
; --relay 会连接一次然后退出(人工排查用),
|
||||
; 放在这条命令链里会让后面的 --silent 跑不到
|
||||
; --relay-url 只写配置,不连不问,适合安装流程
|
||||
;
|
||||
; 地址两侧的引号是必须的:URL 里有 "//" 和可能的 ":",
|
||||
; 不加引号 Inno 会按空格切参数。
|
||||
Filename: "{app}\{#MyAppExeName}"; Parameters: "--relay-url ""{code:GetRelayUrl}"""; \
|
||||
Flags: runhidden; Check: HasRelay
|
||||
|
||||
; 2. 开机自启
|
||||
Filename: "{app}\{#MyAppExeName}"; Parameters: "--autostart on"; \
|
||||
Flags: runhidden; Tasks: autostart
|
||||
@@ -149,7 +163,7 @@ Filename: "{app}\{#MyAppExeName}"; Parameters: "--autostart on"; \
|
||||
; 代价是安装器和它是父子关系:用"等整个进程树"的方式调安装器会卡住
|
||||
; (PowerShell 的 Start-Process -Wait 就是)。
|
||||
; 学校批量部署请用 cmd:
|
||||
; cmd /c ykxmz-setup-1.9.0.exe /VERYSILENT /CODE=123456
|
||||
; cmd /c ykxmz-setup-2.0.0.exe /VERYSILENT /CODE=123456
|
||||
; cmd 只等安装器本身,不等孙子进程,不会卡。
|
||||
Filename: "{app}\{#MyAppExeName}"; Parameters: "--silent"; \
|
||||
Description: "立即启动(后台运行,不显示窗口)"; \
|
||||
@@ -182,6 +196,7 @@ Type: dirifempty; Name: "{app}"
|
||||
var
|
||||
CodePage: TInputQueryWizardPage;
|
||||
ForcedCode: String;
|
||||
ForcedRelay: String;
|
||||
|
||||
{ 把字符串里的非数字滤掉。 }
|
||||
function OnlyDigits(const raw: String): String;
|
||||
@@ -198,22 +213,59 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
{ 配对码那一页。Inno 没有现成的输入页,用官方的 CreateInputQueryPage。 }
|
||||
{ 配对码 + 中转服务器那一页。
|
||||
Inno 没有现成的输入页,用官方的 CreateInputQueryPage(不算自己造轮子)。
|
||||
|
||||
为什么要在这里也能填中转服务器(用户要求):
|
||||
装的时候是"第一次设置",那时候最该一次把地址填好 ——
|
||||
不然装完还得让人去双击 exe 找设置窗口,很容易漏。
|
||||
装完之后照样能改:双击 exe 打开设置窗口就有这一栏。 }
|
||||
procedure InitializeWizard();
|
||||
begin
|
||||
{ 静默部署可以带 /CODE=123456 直接把码传进来(电教批量装用这个)。
|
||||
{ 静默部署可以带 /CODE=123456 /RELAY=https://... 直接把值传进来。
|
||||
注意:Inno 的 [Code] 段连**注释里的花括号**都会当常量去解析,
|
||||
所以这里不能直接写 param 那种写法,否则编译器报语法错误。 }
|
||||
ForcedCode := OnlyDigits(ExpandConstant('{param:CODE|}'));
|
||||
ForcedRelay := Trim(ExpandConstant('{param:RELAY|}'));
|
||||
|
||||
CodePage := CreateInputQueryPage(wpSelectTasks,
|
||||
'配对码',
|
||||
'配对码和中转服务器',
|
||||
'给这台电脑定一个 6 位配对码',
|
||||
'手表上要输这一串数字才能连上这台电脑。自己定个好记的,' +
|
||||
'比如 789113。装完之后也可以在被控端窗口里改。');
|
||||
'比如 789113。' + #13#10 + #13#10 +
|
||||
'中转服务器是**跨网络**才需要的(比如在办公室管教室)。' +
|
||||
'只在一个 WiFi 里用就留空,那样手表和电脑直接连,最快。');
|
||||
CodePage.Add('6 位配对码:', False);
|
||||
CodePage.Add('中转服务器(可以不填):', False);
|
||||
if ForcedCode <> '' then
|
||||
CodePage.Values[0] := ForcedCode;
|
||||
if ForcedRelay <> '' then
|
||||
CodePage.Values[1] := ForcedRelay;
|
||||
end;
|
||||
|
||||
{ 规范化中转地址。规则必须和 run_agent.py 的 normalize_relay_url() 一致:
|
||||
去首尾空白 -> 没协议头就补 https:// -> 去末尾斜杠
|
||||
两边不一致会出现"向导里显示一个样、文件里存另一个样"的怪事。
|
||||
|
||||
⚠ 不用 LowerCase:Inno Pascal 各版本支持不一致,
|
||||
直接四种写法都比一遍最保险。 }
|
||||
function NormalizeRelay(raw: String): String;
|
||||
var
|
||||
s: String;
|
||||
begin
|
||||
s := Trim(raw);
|
||||
if s = '' then
|
||||
begin
|
||||
Result := '';
|
||||
Exit;
|
||||
end;
|
||||
{ 先削末尾斜杠再补协议头 —— 顺序反了会把 https:// 的斜杠也削掉 }
|
||||
while (Length(s) > 0) and (s[Length(s)] = '/') do
|
||||
Delete(s, Length(s), 1);
|
||||
if (Pos('http://', s) <> 1) and (Pos('HTTP://', s) <> 1)
|
||||
and (Pos('https://', s) <> 1) and (Pos('HTTPS://', s) <> 1) then
|
||||
s := 'https://' + s;
|
||||
Result := s;
|
||||
end;
|
||||
|
||||
{ 校验:必须是 6 位数字。
|
||||
@@ -244,6 +296,37 @@ begin
|
||||
end;
|
||||
{ 规范化,后面 [Run] 阶段用得到 }
|
||||
CodePage.Values[0] := digits;
|
||||
|
||||
{ ---- 中转地址的检查 ----
|
||||
只做最基本的:不许有空格、不许有明显不对的字符。
|
||||
不做"能不能连上"的检查 —— 装的时候那台服务器可能还没起,
|
||||
卡在这里会让用户装不下去。地址写错了装完还能改。 }
|
||||
raw := Trim(CodePage.Values[1]);
|
||||
if raw <> '' then
|
||||
begin
|
||||
if Pos(' ', raw) > 0 then
|
||||
begin
|
||||
MsgBox('中转服务器地址里不能有空格。' + #13#10 + #13#10 +
|
||||
'你填的是:' + raw + #13#10 + #13#10 +
|
||||
'只填域名就行,比如 relay.你的域名.com' + #13#10 +
|
||||
'(协议头 https:// 不写也会自动加上)',
|
||||
mbError, MB_OK);
|
||||
Result := False;
|
||||
Exit;
|
||||
end;
|
||||
if Pos('.', raw) = 0 then
|
||||
begin
|
||||
MsgBox('中转服务器地址看着不像个域名。' + #13#10 + #13#10 +
|
||||
'你填的是:' + raw + #13#10 + #13#10 +
|
||||
'应该形如 relay.你的域名.com。' + #13#10 +
|
||||
'只在一个 WiFi 里用的话,这一栏留空即可。',
|
||||
mbError, MB_OK);
|
||||
Result := False;
|
||||
Exit;
|
||||
end;
|
||||
end;
|
||||
{ 规范化后再写回,让用户看到最终会用哪个地址 }
|
||||
CodePage.Values[1] := NormalizeRelay(raw);
|
||||
end;
|
||||
|
||||
{ 最终用的配对码:命令行 /CODE 优先,其次是向导里填的。
|
||||
@@ -280,6 +363,28 @@ begin
|
||||
Result := EffectiveCode() <> '';
|
||||
end;
|
||||
|
||||
{ 最终用的中转地址:命令行 /RELAY 优先,其次是向导里填的。
|
||||
空的就返回空串 —— 那条命令会被 HasRelay 跳过。 }
|
||||
function EffectiveRelay(): String;
|
||||
begin
|
||||
Result := NormalizeRelay(ForcedRelay);
|
||||
if Result = '' then
|
||||
Result := NormalizeRelay(CodePage.Values[1]);
|
||||
end;
|
||||
|
||||
{ 中转服务器。配 HasRelay 一起用 —— 留空时那条命令会被跳过,
|
||||
这样"只在一个 WiFi 里用"的人不会多写一个空地址进配置。 }
|
||||
function GetRelayUrl(Param: String): String;
|
||||
begin
|
||||
Result := EffectiveRelay();
|
||||
end;
|
||||
|
||||
{ 填了中转地址才跑那条 --relay-url 命令 }
|
||||
function HasRelay(): Boolean;
|
||||
begin
|
||||
Result := EffectiveRelay() <> '';
|
||||
end;
|
||||
|
||||
{ 卸载前先停掉正在跑的进程,不然文件删不干净。
|
||||
|
||||
必须在这里做,**不能**改到 UninstallRun 区段去:
|
||||
|
||||
Reference in New Issue
Block a user