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

12 KiB
Raw Blame History

V2.1 后端代码结构盘点(server/)

状态:现状盘点(2026-08-28,鉴权移除后) 用途:一眼看清后端有哪些代码、各自处理什么逻辑、哪些在用哪些冻结。做后端改动前先读本文。 契约细节另见 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.pyasyncio.Lock:一次只跑一个生成队列(防中转限流,ISS 同款)
全部接口无鉴权 V2.1 决策:先功能后鉴权;重新引入时从 deps.py + 路由依赖层加
残留可删 schemas/auth.py(无引用);api/ozon.py(空占位,随冻结链路保留)
密钥 .envDEEPSEEK_API_KEY(规划+文案)、RIGHTAPI_API_KEYgpt/nano 生图)、DASHSCOPE_API_KEY(通义)、ARK_API_KEY(豆包,可选)
前端契约 试算页 studio/src/services/suite.tsschemas/suite.py 逐字段对齐(联调已验证)