Files
image-suite-studio/.zcode/plans/plan-sess_21b5fc7d-daa9-480a-854b-be36b67412a8.md
T

3.3 KiB

移除数据库,纯内存任务表 + 串行生成队列(无恢复功能,无鉴权)

确认结论:不做"恢复进行中任务"则数据库无不可替代用途 —— 轮询用进程内任务表,历史记录功能不存在,重启时任务本来就会死(数据库只是把提示从"任务中断"换成"生成失败")。多用户并发使用单后端实例不受影响。

A. 新增 server/services/tasks.py — 内存任务注册表

  • @dataclass TaskImage(type_id/name/status/url/error)
  • @dataclass Task:id、status(pending|running|done|partial|failed)、platform/lang/ratio、style_set、style_prompt、requirements、provider、model、total、images、error,以及执行参数 context/plan/ref_images
  • 模块级 _TASKS: dict[str, Task];asyncio 单事件循环内读写,无并发问题
  • total 语义保持:计划总张数;images 逐张追加(前端进度 x/y 依赖)

B. 改造 server/services/generator.py

  • run_suite(task: Task) 接收内存任务,不再查库;每张生成后 task.images.append(...);storage.write_bytes(文件系统)不动
  • 串行生成队列:模块级 asyncio.Lock,拿锁后才置 running;多用户同时提交时后续任务保持 pending(前端已显示"排队中"),避免共享 API key 触发 rightapi 同 key 分钟级冷却
  • 删除:商品路径分支(product 加载、_select_ref_images)、SuiteImage/Suite 读写、fail_stale_suites(重启后内存为空,轮询自然 404,前端已有"任务已中断"提示)

C. 改造 server/api/generate.py

  • POST /api/generate:原 Suite 构建逻辑(texts_to_raw、plan 展开、ref_images 排序、模型路由校验)平移到 Task 对象,存入 _TASKS,background.add_task(run_suite, task)
  • POST /api/plan 不动(本就不碰数据库)

D. 改造 server/api/suites.py

  • 保留 GET /api/suites/{id}(读内存,不存在 404「任务不存在(服务可能已重启)」)、GET /api/suites/{id}/zip(从 Task.images 打包成功图)
  • 删除两个商品挂载端点

E. 删除文件与依赖

  • 删除:server/db.pyserver/models.py(4 张表)、server/api/collection.pyserver/api/products.py
  • server/main.py:去掉 lifespan/init_db/fail_stale_suites 与对应路由
  • server/schemas.py:删除商品路径与 materials 类型(SuiteCreateRequest、MaterialsRequest/Response、ProductOut/AssetOut/ProductListOut);保留 TextMaterial、GenerateRequest、SuiteOut 契约(前端零改动)
  • server/requirements.txt:删 sqlalchemy[asyncio]aiosqlite
  • 前端 client.ts:删除 materials 死代码(buildMaterialsPayload/uploadMaterials 及类型)

F. README

架构说明更新:进程内任务表、重启即新会话(进行中任务中断,前端有提示)、数据目录只剩 media/;标注接口暂无鉴权,公网暴露前需内网/反代白名单,登录鉴权后续版本补充;将来若需恢复任务/历史记录/多实例,再引入数据库(任务表结构简单,迁移成本低)

不改的部分

  • 前端交互/UI、生图 provider、prompt 逻辑、data/media/ 图片文件
  • data/app.db 数据文件保留(不再被使用,可自行删除)

验证

  1. py_compile 后端改动文件;tsc --noEmit + 前端 build
  2. 零成本链路测试(count=0 的 plan,不实际生图):提交 → 轮询 done/0 张 → 不存在的 id 返回 404
  3. start.command 重启,health 正常