Files
ozon-seller-kit/docs/v2.1/backend-structure.md
T
R524809 dc6d38c128 refactor(server): 移除鉴权并归档遗留路由至 legacy/
- 删除 auth.py 与 deps.py,各路由去除 get_current_user 依赖
- collection.py 更名为 materials.py,冻结链路(ozon/publish/shops/categories)移入 legacy/
- 扩展默认生图服务端口并入 8800 并自动迁移旧配置,水印默认文案改为 Panda Store
- 新增 docs/v2.1/backend-structure.md 后端结构盘点文档
2026-08-28 15:09:22 +08:00

159 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# V2.1 后端代码结构盘点(server/
> 状态:现状盘点(2026-08-28,鉴权移除后)
> 用途:一眼看清后端有哪些代码、各自处理什么逻辑、哪些在用哪些冻结。做后端改动前先读本文。
> 契约细节另见 [`api.md`](./api.md)。
---
## 1. 总览
共 5270 行 Python。分层:`api/`HTTP 路由)→ `services/`(业务逻辑)→ `models/`ORM 表);`schemas/`Pydantic 契约)、`core/`AES 加解密)、`config/`(配置)、`migrations/`Alembic)。
状态标注:✅ 在用 · 🧊 冻结(保留不维护)· 🗑 残留(可删)。
```
server/
├── main.py 【72·入口】
│ ├── FastAPI app + CORS + startup create_all(幂等建表,生产以 Alembic 为准)
│ ├── 挂载 12 个路由器(auth 已移除)
│ ├── /media 静态托管 data/media/(本地图片)
│ └── / 挂载 web/(v1 工具台,冻结)
├── api/ ──────────────────────────── 路由层(HTTP 接口,冻结链路已移至 legacy/)
│ ├── materials.py 【267 ✅核心】(原 collection.py,与 /api/materials 路径对齐)
│ │ ├── POST /api/materials 插件采集上报入库(建/复用商品 + 文本解析 + 图片队列下载转存)
│ │ ├── POST /api/materials/bytes 直接上传图片字节(试算页「上传图片」)
│ │ ├── GET /api/products/{id}/fingerprints 素材去重指纹
│ │ └── GET /api/collected 按 platform+itemId 查重(扩展防重复上报)
│ ├── products.py 【178 ✅核心】
│ │ ├── GET·POST /api/products 商品列表 / 新建
│ │ ├── GET·PATCH·DELETE /api/products/{id} 详情 / 自动保存 / 删除(软删 archived | 硬删)
│ │ └── POST /api/products/{id}/copy 复制为新变体(重置货号/图片防冲突)
│ ├── suite.py 【326 ✅核心·Phase B】
│ │ ├── POST /api/suite/plan DeepSeek 出图方案规划(同步,数秒级)
│ │ ├── POST /api/suite/generate 一键生成:方案展开→内存任务→串行生图→回写 generated 素材
│ │ ├── GET /api/suites/{id} 任务状态轮询(前端 3s 一次)
│ │ ├── GET /api/suites/{id}/zip 生成结果打包下载(中文文件名)
│ │ └── POST /api/suite/image-edit 单张 AI 生图(试算页每图按钮,append=true 回写素材)
│ ├── export.py 【121 ✅】POST /api/export/images 采集图片打包 ZIP(标题/分组/SKU规格 文件夹结构)
│ ├── proxy.py 【54 ✅】 GET /api/proxy-image?url= 图片防盗链代理(带站点 Referer 代下)
│ ├── fx.py 【13 ✅】 GET /api/fx 汇率(FloatRates→俄央行→er-api 三级回退 + 区间校验)
│ ├── ai.py 【~30 ✅】 GET /api/ai/models、POST /api/ai/copy 俄文文案生成(试算页 03 区块)
│ ├── image.py 【~12 保留】POST /api/image/edit 万相 wanx2.1 图像编辑(智能修图页专用)
│ ├── shops.py 【118 🧊冻结】店铺 CRUD + 连通测试(发布链路配套,AES 加密凭证)
│ ├── categories.py 【117 🧊冻结】Ozon 类目树/属性/字典值代理
│ ├── publish.py 【179 🧊冻结】Ozon ImportProductsV3 直传 + 任务轮询
│ └── ozon.py 【5 🧊冻结】空占位(远期直传重启时用)
├── services/ ──────────────────────── 业务逻辑层
│ ├── generator.py 【494 ✅核心】三大生图 providerdoubao 火山 / tongyi 通义 / rightapi 中转)
│ │ + asyncio.Lock 全局串行队列 + run_suite 任务执行 + 参考图解析
│ │ variant 精确匹配 SKU 图 → 回退 main 首张;≤2 张转 data-URI
│ ├── planner.py 【227 ✅核心】DeepSeek 出图方案规划器
│ │ (单行 JSON 解析 / kind 白名单 / count 钳 0-3 / 幻觉 SKU 丢弃绑定 / 截断修复)
│ ├── prompts/ 【✅核心】生图提示词引擎(按模型家族分发)
│ │ ├── __init__.py (provider, model) → 家族路由 + build_prompt / build_context / type_name
│ │ ├── common.py 10 种图类型 builderwhite_bg/lifestyle/…)+ 5 套风格 + 图内文案语言规范
│ │ ├── alibaba.py 通义系「主体参考」语义(doubao 复用):商品逐像素一致,只改背景/角度
│ │ ├── gpt.py gpt-image-2「edits 保真」语义:以参考图为准,禁止按文案重造商品
│ │ ├── google.py nano-banana「主体保持」语义:一句话钉死主体 + 自然语言指令
│ │ └── doubao.py 豆包(复用 alibaba
│ ├── tasks.py 【70 ✅】套图内存任务注册表(⚠️ server 重启丢任务状态;已落盘图片不丢)
│ ├── watermark.py 【122 ✅】Pillow 水印合成(图片徽章/文字,右下角,失败回退原图)
│ ├── deepseek.py 【182 ✅】DeepSeek chat 封装(俄文文案 + 出图规划共用;JSON 容错解析)
│ ├── models_catalog.py【84 ✅】读 config/models.yaml(俄文文案模型白名单:快/省、质量两档)
│ ├── storage.py 【117 ✅】存储抽象:Localdata/media//media 托管)+ Qiniu(七牛,生产)
│ │ + local_pathstored_url→本地路径,ZIP 打包用)+ download_bytes(带 Referer 代下)
│ ├── fx.py 【58 ✅】多源汇率 + [5,25] 区间脏数据校验(v1 移植)
│ ├── image_edit.py【185 保留】wanx2.1-imageedit 多模型图像编辑(智能修图页后端)
│ └── suite_service.py【~95 ✅】套图业务逻辑(api 层下沉):texts_to_raw / 模型白名单校验 /
│ append_generated_assetgenerated 回写 + asset_counts 累加)
├── legacy/ ────────────────────────── 🧊 冻结代码(Ozon API 直传链路,接口仍挂载但不再投入)
│ ├── api/ shops(店铺 CRUD+连通测试)/ categories(类目字典代理)/
│ │ publishImportProductsV3 直传)/ ozon(空占位)
│ ├── services/ ozon_clientSeller API 薄封装)/ publish(请求体组装+必填校验)
│ ├── models/ shop / publish_task / category(字典缓存三表)
│ └── schemas/ shop
├── schemas/ ────────────────────────── Pydantic 契约(请求/响应模型)
│ ├── suite.py 【160 ✅】SuitePlanRequest / SuiteGenerateRequest / SuiteOut /
│ │ ImageEditSingleRequestproduct_id + append → 回写)/ WatermarkOptions / 模型白名单
│ ├── collection.py 【✅】MaterialsRequestcamelCasesource.itemId / groupKey / variantName,对齐扩展)
│ ├── product.py 【102 ✅】列表 / 详情 / 部分更新(自动保存)
│ ├── copy.py 【✅】俄文文案(titles_ru/zh、description、tags、usage
│ ├── image_edit.py 【125 保留】智能修图(模型白名单 / function / 强度)
│ └── shop 已移至 legacy/schemas/auth.py 残留已删除)
├── models/ ─────────────────────────── SQLAlchemy ORM(表结构)
│ ├── product.py products 商品主表(Ozon 字段 + raw/pricing/copy 三个 JSON 扩展)
│ ├── asset.py product_assets 素材表(group_key: main/sku/detail/generated/upload/…;stored_urldedupe_key
│ ├── user.py users(预留空置;鉴权移除后暂无用途,表已在库)
│ ├── enums.py stage 状态机(collected→editing→ready→…→archived)等枚举
│ └── types.py JSON/JSONB 兼容类型
├── core/security.py 【保留】店铺凭证 AES-GCM 加解密(shops/categories/publish 使用)
│ 鉴权(JWT/APP_TOKEN)已按 V2.1 决策移除,加账户体系时在此重引
├── db.py 【50】async engine + session 工厂(SQLite 开发 / PostgreSQL 生产)
├── config/
│ ├── settings.py 【94】pydantic-settingsdatabase_url / DEEPSEEK·DASHSCOPE·ARK·RIGHTAPI 密钥 /
│ │ image_provider / request_timeout(300s) / poll_max_wait(600s) / 存储与水印配置
│ └── models.yaml 俄文文案模型白名单(deepseek-v4-flash 默认 / deepseek-v4-pro
└── migrations/ Alembic2 个版本:initial_v2_schema、add_shop_id_to_products
```
---
## 2. 接口一览(20 个端点,全部无鉴权)
| 分组 | 端点 | 用途 | 消费方 |
|---|---|---|---|
| **采集上报** | POST /api/materials | 采集结果入库(返回 product_id | extensions/collector「上报商品」 |
| | POST /api/materials/bytes | 上传图片字节(FormData) | 试算页「上传图片」 |
| | GET /api/collected?platform=&itemId= | 采集前查重 | 扩展面板 |
| | GET /api/products/{id}/fingerprints | 素材去重指纹 | 扩展 |
| **商品库** | GET·POST /api/products | 列表 / 新建 | 采集箱、登记表导出 |
| | GET·PATCH·DELETE /api/products/{id} | 详情 / 自动保存 / 删除 | 试算页、编辑页 |
| | POST /api/products/{id}/copy | 复制为新变体 | 采集箱 |
| | GET /api/products/{id}/assets | 素材列表 | 试算页 04 区块 |
| **套图生图** | POST /api/suite/plan | DeepSeek 出图方案 | 试算页「AI 智能规划」 |
| | POST /api/suite/generate | 提交套图任务(返回 suite_id) | 试算页「一键生图」 |
| | GET /api/suites/{id} | 任务状态轮询 | 试算页进度条 |
| | GET /api/suites/{id}/zip | 结果打包下载 | 试算页「导出 ZIP」 |
| | POST /api/suite/image-edit | 单张 AI 生图(可回写素材) | 试算页每图「AI 生图」 |
| **辅助** | GET /api/fx | 汇率 | 试算页计价 |
| | GET /api/ai/models · POST /api/ai/copy | 文案模型 / 生成 | 试算页 03 区块 |
| | POST /api/export/images | 采集图片 ZIP | 试算页「下载采集图片」 |
| | GET /api/proxy-image | 防盗链代理 | 前端图片回退 |
| | POST /api/image/edit | 万相图像编辑 | 智能修图页 |
| | GET /api/health | 健康检查 | 运维 |
| **🧊冻结** | /api/shops/* · /api/categories/* · /api/publish/* · /api/ozon/* | Ozon 直传链路(代码在 legacy/,接口仍挂载) | 无(保留代码) |
---
## 3. 核心数据流
```
extensions/collector 采集
→ POST /api/materialscollection.py 落库 products + 排队下载图片 → storage 落盘)
→ 试算页 /trial/{id}studio
├─ 01/02/03 编辑 → PATCH /api/products/{id} 自动保存(raw/pricing/copy JSON
├─ 04 生图:POST /api/suite/planplanner+deepseek)→ POST /api/suite/generate
│ → tasks 内存任务 → generatorprompts 家族 → provider API → watermark → storage
│ → 每张成功回写 product_assets(generated) → 前端轮询 GET /api/suites/{id} + 刷新素材
└─ 05 登记(localStorage)→ 导出 CSV / 组合码(纯前端)
```
## 4. 已知特性与注意事项
| 项 | 说明 |
|---|---|
| 套图任务在内存 | `tasks.py` 进程内注册表:server 重启丢任务状态(前端提示重新生成);已落盘图片不丢 |
| 生图全局串行 | `generator.py``asyncio.Lock`:一次只跑一个生成队列(防中转限流,ISS 同款) |
| 全部接口无鉴权 | V2.1 决策:先功能后鉴权;重新引入时从 `deps.py` + 路由依赖层加 |
| 残留可删 | `schemas/auth.py`(无引用);`api/ozon.py`(空占位,随冻结链路保留) |
| 密钥 | `.env`DEEPSEEK_API_KEY(规划+文案)、RIGHTAPI_API_KEYgpt/nano 生图)、DASHSCOPE_API_KEY(通义)、ARK_API_KEY(豆包,可选) |
| 前端契约 | 试算页 `studio/src/services/suite.ts``schemas/suite.py` 逐字段对齐(联调已验证) |