4.6 KiB
4.6 KiB
id, title, phase, deps, status, created
| id | title | phase | deps | status | created | ||
|---|---|---|---|---|---|---|---|
| T-700 | 会员过期强制提示与续费后重新检测 | 8 |
|
TODO | 2026-07-23 |
问题 / 背景
桌面端已经具备真实订阅查询和强制门禁分支。强制模式检测到 expired 时会禁用除“设置”外的业务 Tab,并阻止新的 AI 生成、AI 帮写和商品套图提交,但当前只在状态栏显示到期原因,没有明确的续费入口。
用户需要在套餐到期时立即知道业务功能为何不可用,并能从默认浏览器进入线上会员中心。打开会员中心后程序仍应保持运行和锁定,让用户续费完成后主动重新检测,不要求修改设置或重启软件。
方案
1. 强制模式与弹窗触发
- 当前开发测试版本启用真实查询与客户端强制门禁。
- 仅当强制门禁开启,且本次程序运行期间首次进入
expired状态时弹出中文模态框。 - 重复检查仍为
expired时不重复弹窗;恢复为允许工作流的active、grace或legacy后,再次进入expired可以重新弹出。 - 网络抖动、接口暂时不可用、Key 无效、未订阅、撤销或账号禁用不复用该过期弹窗,继续使用各自现有中文状态和门禁语义。
- 应先应用业务 Tab 门禁和状态栏提示,再显示弹窗,避免弹窗关闭瞬间出现短暂可操作窗口。
2. 过期弹窗
- 标题使用「会员套餐已过期」,正文说明当前账号会员到期、业务功能已暂停,需要前往会员中心续费或更换套餐。
- 提供「前往会员中心」和「退出程序」两个明确操作:
- 「前往会员中心」调用 Qt 桌面服务,在系统默认浏览器打开
SubscriptionStatus.manage_url;应用保持打开并停留在受限的设置页。 - 「退出程序」关闭主窗口,沿用现有关闭事件、未保存设置确认和后台 worker 协作取消,不强杀进程。
- 「前往会员中心」调用 Qt 桌面服务,在系统默认浏览器打开
manage_url只使用subscription._safe_manage_url()已接受的同网关主机 HTTPS 地址;地址缺失或不安全时禁用跳转按钮并显示中文说明,绝不猜测会员中心路径或打开其它协议。- 默认按钮优先为可用的「前往会员中心」;不得把「退出程序」设为易误触的默认动作。关闭弹窗标题栏只关闭提示,业务门禁仍保持。
- 默认浏览器打开失败时显示中文状态反馈,不能暴露完整接口路径、API Key 或原始错误。
3. 续费后重新检测
- 设置页增加「重新检测会员状态」按钮,只负责通知主窗口重新执行现有异步订阅检查,不复制订阅请求逻辑。
- 检查运行期间按钮防重复触发;完成后恢复可用。返回
active/grace/legacy时恢复业务 Tab,返回expired时继续锁定且不重复弹窗。 - 保存设置后的自动重查、启动异步检查、请求 token 隔离和陈旧结果丢弃逻辑保持不变。
验收要点
- 强制模式启动检测为
expired时,先只保留“设置”Tab,再弹出一次「会员套餐已过期」。 - 同一次运行中连续返回
expired不重复弹窗;恢复有效后再次到期会重新弹出。 - 点击「前往会员中心」使用默认浏览器打开经过安全过滤的
manage_url,应用保持打开且业务功能仍锁定。 manage_url缺失、非 HTTPS、带账号密码或跨域时不能打开,跳转按钮不可用并有中文说明。- 点击「退出程序」走主窗口正常关闭流程;存在未保存设置时仍遵守现有保存/放弃/取消确认。
- 点击「重新检测会员状态」复用主窗口现有异步检查;续费后返回有效状态会恢复业务 Tab。
- 观察模式不弹过期框、不限制工作流;已有异步任务查询、下载、历史和导出不受影响。
- 自动验证:
- 订阅状态与安全会员中心地址测试
- 主窗口过期弹窗、去重、浏览器跳转、退出和重新检测定向 GUI 测试
py -3.10 -m unittest discover -s testspy -3.10 -m ruff check app tests main.pypy -3.10 -m compileall app main.pygit diff --check
边界(不改什么)
- 不实现客户端会员中心、登录、支付、订单、退款或套餐购买页面。
- 不修改 cmhub 订阅接口路径、响应 schema、套餐状态或服务端最终授权。
- 不为
manage_url设置硬编码备用网址,不开放 HTTP、外部域名或自定义协议。 - 不修改 AI、CDP、采集、封面上传、拖拽排序或更新蝦皮逻辑。
- 不中止已提交的异步生成任务,不限制本地历史查看和导出。
执行记录
- 待完成。