Files
cmshoppe/docs/tasks/T-579.md
T

73 lines
5.2 KiB
Markdown
Raw Normal View History

---
id: T-579
title: 打包版内置默认标题和封面提示词,首次运行自动写入用户 data
phase: 8
deps: [T-524, T-538, T-540]
2026-07-10 09:00:06 +08:00
status: DONE
created: 2026-07-10
---
## 问题 / 背景
当前 release 包不包含 `data/title_prompt.txt` 和 `data/prompts/cover/*.txt`。全新用户第一次打开软件时,②AI生成模块的标题提示词为空,封面模板下拉只显示空占位「默认」,用户必须先手工填写提示词才能使用。
用户希望把当前已验证使用的标题提示词和封面提示词模板随打包版本一起提供,让最终用户安装后无需手动填写即可直接生成标题和封面。
必须注意:`data/` 是用户数据目录,包含配置、数据库、账号登录态、图片、日志和可能的密钥,**不能整体打进 release 包**。本任务只能打包“默认提示词资源”,并在用户本地缺失提示词时初始化到 `data/`。
## 方案
### 1. 新增内置默认提示词资源
- 新增 `app/default_prompts/title_prompt.txt`:来自当前本机 `data/title_prompt.txt`,发布前已人工检查不包含 API Key、Cookie、账号密码等密钥类内容。
- 新增 `app/default_prompts/cover/papa1.txt`:来自当前本机 `data/prompts/cover/papa1.txt`,发布前已人工检查不包含 API Key、Cookie、账号密码等密钥类内容。
- 新增 `app/default_prompts/__init__.py`,使其作为应用资源包存在。
### 2. 首次运行自动初始化到用户 `data/`
- 在 `app/prompts.py` 增加默认提示词初始化函数,例如 `ensure_default_prompts(...)`。
- 初始化规则:
- 若用户 `data/title_prompt.txt` 不存在或为空,则写入内置默认标题提示词。
- 若用户 `data/prompts/cover/` 下没有任何 `.txt` 模板,则复制内置默认封面模板。
- 若用户已经有标题提示词或封面模板,**不得覆盖**。
- ②AI生成页初始化时,在读取提示词前调用该函数,确保首开界面能直接看到默认标题提示词和封面模板。
### 3. 打包脚本包含默认资源,但仍排除用户数据
- 修改 `cmshopee.spec`,把 `app/default_prompts/**/*.txt` 作为 PyInstaller data 放入 `_internal/app/default_prompts/...`。
- 保持 `scripts/build_exe.ps1` 的用户数据排除规则不变:`data/`、`title_prompt.txt`、`prompts/`、DB、配置、图片、日志、登录态仍不得出现在 release 根目录。
- 发布包允许包含 `_internal/app/default_prompts/...`,这是只读默认资源,不是用户数据。
## 验收要点
- 全新 data 目录下打开②AI生成页后:
- 自动生成 `data/title_prompt.txt`,内容等于内置默认标题提示词。
- 自动生成 `data/prompts/cover/papa1.txt`,封面模板下拉显示 `papa1` 且内容回显。
- 用户已有 `data/title_prompt.txt` 时不覆盖用户内容。
- 用户已有任意封面模板时不复制默认 `papa1`,不打乱用户模板。
- `cmshopee.spec` 会把 `app/default_prompts` 文本资源打进 PyInstaller 包。
- release 根目录和 zip 仍不包含用户数据:`data/`、根 `title_prompt.txt`、根 `prompts/`、DB、配置、图片、日志、登录态。
- 验证命令:
- `py -3.10 -m unittest tests.test_prompts tests.test_gui tests.test_packaging`
- `python -m ruff check app tests main.py`
- `py -3.10 -m compileall app main.py`
- `py -3.10 -m unittest discover -s tests`
- `git diff --check`
## 边界(不改什么)
- 不把整个 `data/` 打进 release 包。
- 不提交 `data/config.json`、`data/config/cmhub.json`、`data/cmshopee.db`、`data/images/`、`data/chrome_user_data_dir/`、`data/logs/`。
- 不改 AI/cmhub 请求协议、生成并发、DB schema、Excel、Shopee/CDP 更新流程。
- 不在升级时覆盖用户已经修改过的提示词。
2026-07-10 09:00:06 +08:00
## 执行记录
- 2026-07-10:完成 T-579。
- 新增 `app/default_prompts/` 默认提示词资源包,内置当前已验证使用的标题提示词和封面模板 `papa1`;发布前已扫描常见密钥关键词,未发现 API Key、Cookie、token、密码等密钥类内容。
- `app/prompts.py` 新增 `ensure_default_prompts()`:用户 `data/title_prompt.txt` 缺失或为空时写入默认标题提示词;用户 `data/prompts/cover/` 没有模板时写入默认封面模板;已有用户提示词或模板时不覆盖。
- `app/gui/tabs/generate.py` 在②AI生成页读取提示词前执行默认提示词初始化,保证全新用户首次打开即可看到默认标题提示词和 `papa1` 封面模板。
- `cmshopee.spec` 改为通过 `collect_data_files("app.default_prompts")` 收集内置默认提示词文本;仍不打包 release 根目录的 `data/`、`title_prompt.txt`、`prompts/`、DB、配置、图片、日志或登录态。
- 测试:`tests/test_prompts.py` 覆盖默认提示词播种和不覆盖用户提示词;`tests/test_gui.py` 覆盖②AI生成页全新用户自动回显默认提示词;`tests/test_packaging.py` 覆盖 PyInstaller spec 收集默认资源。
- 验证通过:`py -3.10 -m unittest tests.test_prompts tests.test_gui tests.test_packaging`、`python -m ruff check app tests main.py`、`py -3.10 -m compileall app main.py`、`py -3.10 -m unittest discover -s tests`(319 tests)、`git diff --check`。