feat: 开发采集、采集箱和商品编辑功能

This commit is contained in:
Joey
2026-08-15 22:17:26 +08:00
parent c61d1a3154
commit 36357843d0
130 changed files with 18005 additions and 12 deletions
+14
View File
@@ -0,0 +1,14 @@
"""鉴权请求/响应模型。"""
from __future__ import annotations
from pydantic import BaseModel
class LoginRequest(BaseModel):
token: str
class LoginResponse(BaseModel):
access_token: str
token_type: str = "bearer"
expires_at: int
+42
View File
@@ -0,0 +1,42 @@
"""采集上传(插件 → 服务端)请求/响应模型,对齐 docs/extension/plan.md §14。"""
from __future__ import annotations
from pydantic import BaseModel, Field
class SourceInfo(BaseModel):
platform: str = Field(..., description="ozon | 1688 | taobao")
itemId: str | None = None
url: str = ""
collectedAt: int | None = None # epoch 毫秒
class TextMaterial(BaseModel):
kind: str = Field(..., description="title | params | selling_point | desc | price | brand")
content: str = ""
pairs: list[dict] | None = None # table 模式 kv[{key, value}]
class ImageMaterial(BaseModel):
groupKey: str = Field(..., description="main | sku | detail | video | param")
groupName: str = ""
variantName: str | None = None # SKU 规格名
url: str = Field(..., description="源站原图 URL")
index: int = 0
type: str = "img" # img | video
dedupeKey: str | None = None
class MaterialsRequest(BaseModel):
product_id: str | None = Field(default=None, description="传了=追加到已有商品(跨平台补素材)")
source: SourceInfo
texts: list[TextMaterial] = Field(default_factory=list)
images: list[ImageMaterial] = Field(default_factory=list)
refererOrigin: str | None = None # 下载源图时需带的 Referer
class MaterialsResponse(BaseModel):
product_id: str
stage: str
assets_queued: int
assets_skipped: int = 0 # 因 dedupeKey 重复而跳过
+102
View File
@@ -0,0 +1,102 @@
"""商品 Pydantic 模型(列表 / 详情 / 部分更新)。"""
from __future__ import annotations
from datetime import datetime
from uuid import UUID
from pydantic import BaseModel, ConfigDict, Field
class ProductListItem(BaseModel):
model_config = ConfigDict(from_attributes=True)
id: UUID
stage: str
name: str = ""
offer_id: str = ""
price: float | None = None
currency_code: str = "RUB"
source_platform: str | None = None
source_url: str | None = None
asset_counts: dict | None = None
ozon_product_id: int | None = None
created_at: datetime
updated_at: datetime
class ProductDetail(BaseModel):
model_config = ConfigDict(from_attributes=True)
id: UUID
shop_id: UUID | None = None
stage: str
source_platform: str | None = None
source_item_id: str | None = None
source_url: str | None = None
offer_id: str = ""
ozon_product_id: int | None = None
name: str = ""
description: str = ""
description_category_id: int | None = None
type_id: int | None = None
price: float | None = None
old_price: float | None = None
currency_code: str = "RUB"
vat: str = "0"
depth: float | None = None
width: float | None = None
height: float | None = None
dimension_unit: str = "mm"
weight: float | None = None
weight_unit: str = "g"
barcode: str | None = None
images: list | None = None
primary_image: str | None = None
images360: list | None = None
color_image: str | None = None
attributes: list | None = None
complex_attributes: list | None = None
raw: dict | None = None
pricing: dict | None = None
copy: dict | None = None
fx_rate: float | None = None
asset_counts: dict | None = None
published_at: datetime | None = None
created_at: datetime
updated_at: datetime
class ProductUpdate(BaseModel):
"""编辑页 autosave 的部分更新。仅允许业务字段,id/时间由服务端维护。"""
shop_id: UUID | None = None
stage: str | None = None
offer_id: str | None = None
name: str | None = None
description: str | None = None
description_category_id: int | None = None
type_id: int | None = None
price: float | None = None
old_price: float | None = None
currency_code: str | None = None
vat: str | None = None
depth: float | None = None
width: float | None = None
height: float | None = None
dimension_unit: str | None = None
weight: float | None = None
weight_unit: str | None = None
barcode: str | None = None
images: list | None = None
primary_image: str | None = None
attributes: list | None = None
complex_attributes: list | None = None
raw: dict | None = None
pricing: dict | None = None
copy: dict | None = None
fx_rate: float | None = None
source_url: str | None = None
+33
View File
@@ -0,0 +1,33 @@
"""店铺(Ozon 凭证)请求/响应模型。"""
from __future__ import annotations
from datetime import datetime
from uuid import UUID
from pydantic import BaseModel, ConfigDict
class ShopCreate(BaseModel):
name: str
client_id: str
api_key: str
currency_code: str = "CNY"
class ShopUpdate(BaseModel):
name: str | None = None
client_id: str | None = None
api_key: str | None = None
currency_code: str | None = None
class ShopListItem(BaseModel):
model_config = ConfigDict(from_attributes=True)
id: UUID
name: str
currency_code: str
status: str
client_id_masked: str = "" # 打码尾号
last_checked_at: datetime | None = None
created_at: datetime