docs: define status bar semantic colors

This commit is contained in:
chengma
2026-07-07 15:30:04 +08:00
parent bb2aa70c54
commit 8bd6a1df91
5 changed files with 29 additions and 6 deletions
+2 -1
View File
@@ -148,6 +148,7 @@
| T-538 | 打包产物用户数据收进 `data/` 子文件夹(便携方案 1) | T-524 | 问题:当前 onedir 产物把用户数据(`config.json`、`config/ai_models.json`、`config/cmhub.json`、`cmshopee.db(+-wal/-shm)`、`chrome_user_data_dir/`、`images/`、`logs/`、`prompts/`、`title_prompt.txt`)生成在 exe 顶层,和程序文件/依赖文件混放:更新易误删数据、放进 Program Files 只读目录会写失败/被 VirtualStore 重定向、程序与数据关注点混杂。方案(保持便携):① **统一数据根**——所有用户数据落到 exe 同级的单个 `data/` 子文件夹;`app/appconfig.py` 用显式 `data_dir`(默认 `<exe目录>/data`,源码运行时可为项目根/`data`)解析并返回绝对路径,**替代现在 `main.py` 的 chdir**(chdir 影响全进程相对路径/文件对话框默认目录,脆弱);文件名保持不变(仍是 `cmshopee.db` 等),只是移入 `data/`。② **旧布局迁移**——新版首次运行若在 exe 顶层发现旧的 `config.json`/`cmshopee.db` 等,自动迁移进 `data/`(或明确提示手动迁移),不得对老用户生成空 `data/` 丢失原数据。③ **可写性检测**——启动时若 `data_dir` 不可写(如放在 Program Files),弹清晰错误「请把程序放到可写目录,勿放 Program Files」并优雅退出,不静默失败。④ **发布只含程序**——`cmshopee.spec`/`scripts/build_exe.ps1` 构建检查确保不打包 `data/` 或任何用户数据;发布 zip 不含 `data/`,从而「整包解压覆盖」也安全(覆盖程序文件、不碰 `data/`);T-540 后当前打包脚本固定 PyInstaller 6.11.1,产物为 `cmshopee.exe` + `_internal/` onedir,具体版本和 release 命名由 T-540 维护。⑤ **更新流程前提**——原地更新=换程序留 `data/`,依赖:DB 迁移幂等且只向前(现 `init_db`+`ALTER TABLE ADD COLUMN`)、`config` 向前兼容(`load_config` 补默认值)。同步更新 `docs/packaging.md`(目录结构、首次运行数据位置、§5 更新步骤简化为「覆盖新版程序文件和依赖文件,`data/` 不动」)。测试:`test_appconfig` 断言各路径解析进 `data_dir`、可写性检测行为、旧布局迁移;`test_packaging` 断言产物不含 `data/`/用户数据。边界:只改路径解析层(`appconfig` 路径 + `main.py` 数据根 + 迁移/可写检测)、spec/构建脚本、打包文档;不改文件名、DB schema、业务逻辑、AI/Excel、CDP/Shopee 流程 | DONE |
| T-539 | ⑤ 隐藏数据路径设置(设置简化,非防逆向) | T-538, T-517 | 背景:T-538 后用户数据固定收进 exe 同级 `data/`,⑤「路径与端口」里的 DB 路径(`dbPathEdit`)、图片目录(`imageDirEdit`)、账号数据根目录(`userDataRootEdit`)已不该由用户改动——改了会指向 `data/` 之外导致数据分裂/丢失。**定性说明**:本任务是**设置简化**,与 T-517/T-529 隐藏 `test_item_id`/`dry_run` 同一思路;**不是防逆向手段**——`cmshopee.db` 在磁盘上任何 SQLite 浏览器可直接打开,隐藏 UI 字段对逆向无意义,防逆向由另行任务(发布包加固/价值上移 cmhub)承担。方案:① ⑤普通设置页**隐藏** `db_path`/`image_dir`/账号数据根三个输入框(不再占表单位置),`config.json` 对应字段保留为内部兼容——手工编辑配置仍生效(内部回滚路径),加载/保存不丢字段;② **保留可见**:Chrome 路径(每台机器安装位置不同,真实配置需求)与默认端口/端口区间/CDP 就绪超时(端口冲突需可调);③ 首次运行/迁移后各路径默认解析到 `data/` 下(沿用 T-538 的 `data_dir` 规则),无需用户感知。同步 `docs/routes.md` ⑤ 说明与 GUI 设置单测(隐藏字段不再可见、config 字段仍读写、手工配置值仍被尊重)。边界:只改⑤设置页展示层与文档;不改 `config.json` schema、路径解析逻辑(T-538 范围)、DB、业务流程、CDP/Shopee | DONE |
| T-540 | 打包版本号与 release 产物命名统一 | T-537, T-538, T-524 | 参考 `D:\chengma\cmbot` 的轻量版本控制方式,但本阶段不引入 Launcher/manifest/自动更新。方案:① 新增 `app/version.py`,统一维护 `APP_NAME="蝦皮圈優化助手"`、`APP_CODE_NAME="cmshopee"`、`APP_VERSION`,作为 GUI 标题、打包脚本、release 目录、zip 文件名和 `version.txt` 的唯一版本源;② 主窗口标题改为 `蝦皮圈優化助手 v<APP_VERSION>`,PySide6 缺失提示继续读中文品牌名;③ `scripts/build_exe.ps1` 从 `app/version.py` 读取版本,并固定通过 Windows Python Launcher 调用 `py -3.10`,返回版本必须是 `3.10.x`;④ PyInstaller 仍输出 `dist\cmshopee\` 作为中间产物,再组装 `release\cmshopee-<APP_VERSION>\` 和 `release\cmshopee-<APP_VERSION>-portable.zip`,发布目录内写 `version.txt`(无 BOM)和中文 `README.txt`;⑤ 发布目录/zip 仍不得包含 `data/`、DB、配置、图片、日志、Chrome 登录态或运营 Excel;当前 PyInstaller 6.11.1 onedir 结构必须包含 `cmshopee.exe` + `_internal\`,脚本会校验 `_internal\` 存在;⑥ 测试覆盖版本文件解析、窗口标题版本、构建脚本 release 命名/排除数据/固定 `py -3.10` 打包。边界:只做手动发版版本号一致性和 release 组装;不做在线更新、启动器、manifest、sha256 下载校验、强制更新或自动替换程序目录 | DONE |
| T-543 | 状态栏语义色与统一提示入口 | T-511, T-523, T-536 | 需求:当前左下角状态栏提示几乎都通过 `statusBar().showMessage(...)` 直接写入,颜色一致,用户很难快速区分“已保存/已完成”“正在处理”“没有可生成任务”“未登录/数据目录不可写”等不同严重程度。方案:① 在 `MainWindow` 增加统一入口 `show_status(message, level="muted")`,使用 `docs/ui-color-design.md` 已定语义色板映射 `muted/info/success/warning/danger`,内部先设置状态栏文字颜色再 `showMessage()`,普通/就绪提示必须重置为 muted 或默认色,避免上一条红/绿状态残留;② 逐步替换主窗口和 ①②③④⑤ Tab 传入的 `status_callback=self.statusBar().showMessage` 以及直接调用,新增代码必须显式传 level,不长期依赖中文关键词猜测;③ 颜色口径:普通/导航/就绪用 muted 或默认,进行中用 info,保存/完成/回写成功用 success,当前筛选无任务、请先采集/配置等用户可处理问题用 warning,失败、阻断、未登录、数据目录不可写、点数不足等中止当前动作的问题用 danger;④ 状态栏只改文字色,不做大面积背景,不替代弹窗、空状态、按钮禁用、运行日志或任务状态列;⑤ 复用 `app/gui/widgets.py` 语义色常量,不新增第二套颜色;⑥ GUI 单测覆盖 `show_status()` 各等级颜色、普通提示会清掉前一条错误颜色,以及至少一个保存成功/无任务/失败路径调用正确等级。边界:只改 GUI 提示层和测试;不改业务流程、DB schema、AI HTTP、Excel、Shopee/CDP、运行日志持久化 | TODO |
## 里程碑
@@ -165,7 +166,7 @@
- AI 生成图的合规/质量自检。
- (已提升为 T-518)② 左栏提示词区组件密度优化:封面模板低频动作(另存为/重命名/删除)收敛进②本页「模板操作」菜单/小按钮;第一版不移入⑤,不改提示词数据结构。
- 界面深色主题:为 `docs/ui-color-design.md` 语义色板另出深色等义映射(当前只服务浅色)。
- 状态栏语义色:依据 `docs/ui-color-design.md` 的状态栏建议,后续统一 `MainWindow.show_status(message, level)`,用 muted/info/success/warning/danger 区分普通、进行中、成功、需处理、失败提示;只改状态栏文字色,不做大面积背景,不替代弹窗/空状态/运行日志。
- (已提升为 T-543)状态栏语义色:依据 `docs/ui-color-design.md` 的状态栏建议,后续统一 `MainWindow.show_status(message, level)`,用 muted/info/success/warning/danger 区分普通、进行中、成功、需处理、失败提示;只改状态栏文字色,不做大面积背景,不替代弹窗/空状态/运行日志。
- DB 版本化迁移:引入 `PRAGMA user_version` + 有序迁移列表,替代当前 ad-hoc `ALTER TABLE ADD COLUMN`(`docs/engineering-review.md` P2)。
- CDP/editor 自动回归:录制 DOM 快照 / mock-CDP 夹具做选择器形状回归,针对 T-404 高频故障源(`docs/engineering-review.md` P2)。
- 宽异常审计:确认 `app/` 中 88 处 `except Exception` 均落诊断日志、无静默吞异常(`docs/engineering-review.md` P2)。
File diff suppressed because one or more lines are too long
+12
View File
@@ -27,6 +27,18 @@
- 样式只影响顶层主 Tab,不改变各业务表格、弹窗和后续 Tab 内部布局。
- 新增业务 Tab 内容时不得缩小主 Tab 栏点击区域。
## 全局状态栏反馈
左下角状态栏用于低打扰反馈,T-543 将统一由 `MainWindow.show_status(message, level)` 控制语义色:
- 普通/导航/就绪:muted 或系统默认,例如「就绪」「当前:② AI生成」。
- 信息/进行中:info,例如「正在生成标题」「检测登录中」。
- 成功:success,例如「设置已保存」「已回写 Excel」。
- 警告/需用户处理:warning,例如「当前筛选结果没有待生成任务」「请先到①完成旧数据采集」「请先配置 cmhub」。
- 错误/阻断:danger,例如「更新失败」「账号未登录」「数据目录不可写」「点数不足」。
状态栏只改变文字色,不做大面积背景;它不能替代弹窗、空状态、运行日志、按钮禁用和任务状态列。普通提示必须重置状态栏颜色,避免上一条错误或成功颜色残留。
## 首次使用引导保护
- ① 导入采集 与 ③ 更新蝦皮 都依赖**账号已配置且已登录**(在 ④ 账号管理)。
+4 -2
View File
@@ -69,7 +69,7 @@
- `删除批次`(①)、`删除账号`(④)等不可逆动作:按钮文字和描边用 danger `#cf222e`,与普通灰按钮区分;保持原有启用/禁用和二次确认逻辑不变。二次确认弹窗仍是主防线,颜色只是二级提示。
### 7)状态栏全局提示色(建议,未落地)
### 7)状态栏全局提示色(T-543 待落地)
左下角状态栏是低打扰反馈,不应做成醒目的大色块。建议只改变状态栏文字颜色,并在每次显示普通提示时重置样式,避免上一条红色/绿色残留到下一条普通消息。
@@ -84,13 +84,15 @@
- 状态栏只做辅助反馈,不能替代弹窗、空状态、运行日志和按钮禁用等主反馈。
- 高频进度信息用 info;不会继续执行、但用户可通过配置/选择修复的问题用 warning;已经失败或阻断当前动作的问题用 danger。
- 不建议给所有状态栏消息都上强颜色;普通导航、就绪、筛选数量等信息保持 muted 或默认色,避免长期使用时视觉疲劳。
- T-543 落地时统一使用 `MainWindow.show_status(message, level)`;新增状态栏提示必须显式传入 `level`,不长期依赖中文关键词猜测。
- T-543 第一版覆盖主窗口和 ①②③④⑤ Tab 现有状态栏调用;状态栏只作为辅助反馈,不改变弹窗、空状态、运行日志、任务状态列或按钮禁用的主反馈职责。
## 实现映射(PySide6,落地时参考)
- **状态色**:在各 TableModel 的 `data()` 里响应 `Qt.ForegroundRole`(必要时 `Qt.BackgroundRole`)按内部 `stage/status` 返回 `QColor`;不要按中文显示文案硬匹配,不要在 QSS 里做,表格单元格上色走 model role 最稳。
- **按钮/汇总数字**:用 `objectName` + 集中 QSS。建议把语义色板定义为 `app/gui.py` 顶部的一组常量(如 `COLOR_SUCCESS = "#1a7f37"`),QSS 与 `QColor` 都引用同一常量,杜绝散落硬编码。③ Tab 单独标识如需落地,用 `setTabIcon(2, ...)`,不要试图用 QSS nth 选择器。
- **登录点**:文字前缀 `●` 用 `QColor`,或状态列走 ForegroundRole。
- **状态栏**:建议在 `MainWindow` 增加统一入口(如 `show_status(message, level="info")`),内部映射 level 到色板并调用 `statusBar().showMessage(message)`;现有 `self.statusBar().showMessage(...)` 后续逐步替换为该入口。第一版如需兼容旧调用,可用轻量关键词兜底分类(失败/错误/异常/点数不足/未登录→danger,完成/成功/已保存/已回写→success,没有/请先/未配置→warning,正在/开始/进度/检测中→info),但新增代码应优先显式传 `level`,不要长期依赖中文字符串匹配。
- **状态栏**:T-543 在 `MainWindow` 增加统一入口 `show_status(message, level="muted")`,内部映射 level 到色板、设置状态栏文字色并调用 `statusBar().showMessage(message)`;普通/就绪提示必须重置为 muted 或默认色,避免上一条 danger/success 残留。现有 `self.statusBar().showMessage(...)` 与传给 Tab 的 `status_callback` 需要替换为该入口或显式等级包装。第一版如需兼容旧调用,可用轻量关键词兜底分类(失败/错误/异常/点数不足/未登录→danger,完成/成功/已保存/已回写→success,没有/请先/未配置→warning,正在/开始/进度/检测中→info),但新增代码必须显式传 `level`,不要长期依赖中文字符串匹配。
- **复用**:所有红/绿/蓝/琥珀只从色板常量取值,新增组件一律引用,不新造颜色。
## 非目标(明确不做)