Client:紧凑排列设置字段并支持管理端地址统一切换 #130

Closed
opened 2026-08-11 09:12:31 +08:00 by ila · 4 comments
Owner

基本信息

  • 类型:需求
  • 父级大工单:#1
  • 所属 MVP / 版本:MVP 后续 / 设置页与在线更新
  • 阶段:设置页紧凑布局与 Admin 地址配置
  • 状态:待验收
  • 关联:细化并替代 #116 中“当前设备、软件更新表单布局”的旧方案;#116 其余启动登记与默认密码范围不在本工单实施

要解决什么

设置页当前设备号、设备名、软件更新账号和密码分别占用独立行,纵向空间利用率较低;Client 虽已读取 admin.base_url,界面却没有可编辑入口。若只把新地址写入 SQLite,已创建的 Admin Gateway 仍可能继续使用旧地址,造成设备登记与任务领取/提交访问不同服务器。

做什么 / 不做什么

  • 做:
    • 当前设备第一行显示“设备号 + 只读输入框、设备名 + 输入框”,保留保存按钮。
    • 当前设备第二行增加“管理端地址”输入框,对应现有 admin.base_url。
    • 软件更新保留清单地址独占一行;账号和密码放在同一行,输入区按约 45:55 伸缩。
    • 使用布局伸缩比例和合理最小宽度,不写死像素百分比;保持标签 buddy、AccessibleName、密码隐藏和 Tab 顺序。
    • 保存当前设备前验证管理端地址;验证通过后保存设备号、设备名和地址,并使用新地址登记 Client。
    • 地址修改后,让后续设备登记、任务领取和结果提交统一使用新地址,不能出现新旧地址并存。
    • 更新相关测试和 Client 界面规范。
  • 不做:
    • 不修改 Admin 接口、SQLite 表结构或任务数据结构。
    • 不修改更新清单地址、账号、密码的存储与认证规则。
    • 不增加心跳、不连接 Android、不执行采集、采购、下单或付款。
    • 不实施 #116 中与本次无关的启动自动登记和默认更新密码工作。

怎么做

  • client/src/settings_ui.py:使用 QGridLayout/布局伸缩重排两组表单,新增 adminBaseUrlInput;管理端地址独占第二行,软件更新账号与密码按 45:55 分配。
  • client/src/settings_ui_event.py:读取并显示 admin.base_url;保存前统一校验,保存配置后用新地址创建 Gateway 并登记 Client;发出地址变更信号。
  • client/src/pdd_ui_event.py 与 client/src/ui_main.py:接收地址变更,只对后续请求切换 Gateway;正在执行的请求不被强制中断。
  • client/test/test_settings_ui_event.py、client/test/test_pdd_ui_event.py:覆盖布局字段、地址读取/验证/保存、登记和后续任务请求统一切换。
  • docs/client/05-ui-specification.md:同步最终布局和保存行为。

验收标准

  • 当前设备的设备号和设备名位于同一视觉行,设备号保持只读、设备名可编辑。
  • 当前设备下一行显示“管理端地址”,启动时读取 admin.base_url,没有保存值时显示现有默认地址。
  • 点击当前设备“保存”时先验证地址;无效地址不保存任何字段、不发起登记,并把焦点移到地址框。
  • 保存成功后设备号、设备名和管理端地址写入现有设置存储,不新增数据库表或迁移。
  • 保存后的 Client 登记以及后续任务领取、结果提交统一使用新地址;正在执行的请求不被强制中断。
  • 软件更新清单地址保持独占一行,账号与密码同一行,输入区约按 45:55 自适应分配。
  • 密码继续隐藏,不改变凭据保存规则。
  • 可见标签、buddy、AccessibleName 和 Tab 阅读顺序正确。
  • 820 像素最小窗口及 100%–200% 缩放下没有横向滚动,输入框仍可操作。
  • Client 相关测试和全量回归通过;测试不连接 Android、不领取任务、不执行真实采购。

怎么验证

从 client/ 执行:

C:/Python310/python.exe -m py_compile src/settings_ui.py src/settings_ui_event.py src/pdd_ui_event.py src/ui_main.py
$env:QT_QPA_PLATFORM="offscreen"
C:/Python310/python.exe -m unittest discover -s test -p "test_settings_ui_event.py" -v
C:/Python310/python.exe -m unittest discover -s test -p "test_pdd_ui_event.py" -v
C:/Python310/python.exe -m unittest discover -s test -p "test_update_ui_event.py" -v
C:/Python310/python.exe -m unittest discover -s test -p "test_*.py"
C:/Python310/python.exe -c "from src.ui_main import MainWindow; from PyQt5.QtWidgets import QApplication; app=QApplication([]); w=MainWindow(); print('OK'); app.quit()"
Remove-Item Env:QT_QPA_PLATFORM

人工检查常规窗口、最小窗口及 100%、150%、200% 缩放下的排列、Tab 顺序和密码隐藏。使用 Mock Gateway 验证地址切换,不访问真实 Admin。

风险和回退

  • 风险:保存地址时任务请求可能正在进行;不强制中断旧请求,只保证下一次请求使用新地址。
  • 风险:错误地址会让 Client 无法登记或领取任务;保存前校验协议和主机,并拒绝可能泄露凭据的账号、密码、查询参数和片段,保留原配置。
  • 回退:回退本工单提交即可恢复旧布局和启动时读取原有 admin.base_url 的行为,不涉及数据库迁移。
## 基本信息 - 类型:需求 - 父级大工单:#1 - 所属 MVP / 版本:MVP 后续 / 设置页与在线更新 - 阶段:设置页紧凑布局与 Admin 地址配置 - 状态:待验收 - 关联:细化并替代 #116 中“当前设备、软件更新表单布局”的旧方案;#116 其余启动登记与默认密码范围不在本工单实施 ## 要解决什么 设置页当前设备号、设备名、软件更新账号和密码分别占用独立行,纵向空间利用率较低;Client 虽已读取 `admin.base_url`,界面却没有可编辑入口。若只把新地址写入 SQLite,已创建的 Admin Gateway 仍可能继续使用旧地址,造成设备登记与任务领取/提交访问不同服务器。 ## 做什么 / 不做什么 - 做: - 当前设备第一行显示“设备号 + 只读输入框、设备名 + 输入框”,保留保存按钮。 - 当前设备第二行增加“管理端地址”输入框,对应现有 `admin.base_url`。 - 软件更新保留清单地址独占一行;账号和密码放在同一行,输入区按约 45:55 伸缩。 - 使用布局伸缩比例和合理最小宽度,不写死像素百分比;保持标签 buddy、AccessibleName、密码隐藏和 Tab 顺序。 - 保存当前设备前验证管理端地址;验证通过后保存设备号、设备名和地址,并使用新地址登记 Client。 - 地址修改后,让后续设备登记、任务领取和结果提交统一使用新地址,不能出现新旧地址并存。 - 更新相关测试和 Client 界面规范。 - 不做: - 不修改 Admin 接口、SQLite 表结构或任务数据结构。 - 不修改更新清单地址、账号、密码的存储与认证规则。 - 不增加心跳、不连接 Android、不执行采集、采购、下单或付款。 - 不实施 #116 中与本次无关的启动自动登记和默认更新密码工作。 ## 怎么做 - `client/src/settings_ui.py`:使用 `QGridLayout`/布局伸缩重排两组表单,新增 `adminBaseUrlInput`;管理端地址独占第二行,软件更新账号与密码按 45:55 分配。 - `client/src/settings_ui_event.py`:读取并显示 `admin.base_url`;保存前统一校验,保存配置后用新地址创建 Gateway 并登记 Client;发出地址变更信号。 - `client/src/pdd_ui_event.py` 与 `client/src/ui_main.py`:接收地址变更,只对后续请求切换 Gateway;正在执行的请求不被强制中断。 - `client/test/test_settings_ui_event.py`、`client/test/test_pdd_ui_event.py`:覆盖布局字段、地址读取/验证/保存、登记和后续任务请求统一切换。 - `docs/client/05-ui-specification.md`:同步最终布局和保存行为。 ## 验收标准 - [x] 当前设备的设备号和设备名位于同一视觉行,设备号保持只读、设备名可编辑。 - [x] 当前设备下一行显示“管理端地址”,启动时读取 `admin.base_url`,没有保存值时显示现有默认地址。 - [x] 点击当前设备“保存”时先验证地址;无效地址不保存任何字段、不发起登记,并把焦点移到地址框。 - [x] 保存成功后设备号、设备名和管理端地址写入现有设置存储,不新增数据库表或迁移。 - [x] 保存后的 Client 登记以及后续任务领取、结果提交统一使用新地址;正在执行的请求不被强制中断。 - [x] 软件更新清单地址保持独占一行,账号与密码同一行,输入区约按 45:55 自适应分配。 - [x] 密码继续隐藏,不改变凭据保存规则。 - [x] 可见标签、buddy、AccessibleName 和 Tab 阅读顺序正确。 - [ ] 820 像素最小窗口及 100%–200% 缩放下没有横向滚动,输入框仍可操作。 - [x] Client 相关测试和全量回归通过;测试不连接 Android、不领取任务、不执行真实采购。 ## 怎么验证 从 `client/` 执行: ```powershell C:/Python310/python.exe -m py_compile src/settings_ui.py src/settings_ui_event.py src/pdd_ui_event.py src/ui_main.py $env:QT_QPA_PLATFORM="offscreen" C:/Python310/python.exe -m unittest discover -s test -p "test_settings_ui_event.py" -v C:/Python310/python.exe -m unittest discover -s test -p "test_pdd_ui_event.py" -v C:/Python310/python.exe -m unittest discover -s test -p "test_update_ui_event.py" -v C:/Python310/python.exe -m unittest discover -s test -p "test_*.py" C:/Python310/python.exe -c "from src.ui_main import MainWindow; from PyQt5.QtWidgets import QApplication; app=QApplication([]); w=MainWindow(); print('OK'); app.quit()" Remove-Item Env:QT_QPA_PLATFORM ``` 人工检查常规窗口、最小窗口及 100%、150%、200% 缩放下的排列、Tab 顺序和密码隐藏。使用 Mock Gateway 验证地址切换,不访问真实 Admin。 ## 风险和回退 - 风险:保存地址时任务请求可能正在进行;不强制中断旧请求,只保证下一次请求使用新地址。 - 风险:错误地址会让 Client 无法登记或领取任务;保存前校验协议和主机,并拒绝可能泄露凭据的账号、密码、查询参数和片段,保留原配置。 - 回退:回退本工单提交即可恢复旧布局和启动时读取原有 `admin.base_url` 的行为,不涉及数据库迁移。
Author
Owner

实施中:已完成设置页紧凑布局、管理端地址校验与原子保存、设备登记 Gateway 切换,以及 PDD 持久 Worker 后续请求 Gateway 切换。额外按凭据红线拒绝 URL 中的账号、密码、查询参数和片段。专项测试与 Client 全量 359 项测试通过;最小 820×560 离屏测得账号/密码输入宽度约 244/299,符合约 45:55。正在整理提交和归档。

实施中:已完成设置页紧凑布局、管理端地址校验与原子保存、设备登记 Gateway 切换,以及 PDD 持久 Worker 后续请求 Gateway 切换。额外按凭据红线拒绝 URL 中的账号、密码、查询参数和片段。专项测试与 Client 全量 359 项测试通过;最小 820×560 离屏测得账号/密码输入宽度约 244/299,符合约 45:55。正在整理提交和归档。
Author
Owner

实现完成,状态更新为待验收。

  • 实现提交:cd2889d
  • 归档提交:a31c367
  • 本地归档:docs/task/130-设置页紧凑布局与管理端地址切换.md
  • 验证:语法检查通过;设置页、PDD 事件、软件更新专项测试通过;Client 全量 359 项测试通过;820×560 离屏布局检查通过。
  • 未验证:真实 Windows 100%/150%/200% 显示缩放人工观感;真实 Admin 地址切换后的领取与提交。未连接 Android,未执行采集、采购、下单或付款。

工单保持开启,等待用户验收。

实现完成,状态更新为待验收。 - 实现提交:`cd2889d` - 归档提交:`a31c367` - 本地归档:`docs/task/130-设置页紧凑布局与管理端地址切换.md` - 验证:语法检查通过;设置页、PDD 事件、软件更新专项测试通过;Client 全量 359 项测试通过;820×560 离屏布局检查通过。 - 未验证:真实 Windows 100%/150%/200% 显示缩放人工观感;真实 Admin 地址切换后的领取与提交。未连接 Android,未执行采集、采购、下单或付款。 工单保持开启,等待用户验收。
Author
Owner

最终回归补跑结果:新增 URL 凭据校验测试后,Client 全量为 360 项,全部通过。归档中的测试数量已由补充提交 f9dc221 修正;此前评论中的 359 项为补测前数量。

最终回归补跑结果:新增 URL 凭据校验测试后,Client 全量为 **360 项,全部通过**。归档中的测试数量已由补充提交 `f9dc221` 修正;此前评论中的 359 项为补测前数量。
Author
Owner

用户于 2026-08-13 明确验收通过。本地归档状态已更新,批量验收记录提交:ad44f83。现关闭工单。

用户于 2026-08-13 明确验收通过。本地归档状态已更新,批量验收记录提交:`ad44f83`。现关闭工单。
ila closed this issue 2026-08-13 15:57:43 +08:00
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: chengma/cmautobuy#130