feat(product-create): upload-first 建商品 —— 图拖入即进桶,创建时带 asset 一块落库
- 抽屉拖入/选图 → 立刻 POST /api/assets/upload/ 传进 TOS 桶拿 asset id(每张带上传中/完成/失败态, 首图标「主图」=cover_asset);上传未完成禁用「创建商品」 - 点创建 → POST /api/products/ 直接带 cover_asset + images inline 落库,一步到位,不再「先建后传图」 (那条因传图接口需先有商品 ID,与「创建必须带图」校验天然冲突 → 建商品恒 400「商品创建失败」) - 同步读取 File:addImages 一进来就 Array.from 取文件,避免 pickImage 紧接的 input.value="" 清空 input.files 导致「第一次点没反应、第二次才上传」;选好即发起上传,不靠会滞后的 effect - 后端保留「创建必须带图」校验(upload-first 下可满足、且正确) 真实接口验:独立上传 201 → 带 cover+images 创建 201(落库)→ 无图创建 400;tsc/build/后端测试通过。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
6916f9c877
commit
f02c8053a1
@@ -61,11 +61,11 @@ class ProductSerializer(serializers.ModelSerializer):
|
||||
return _asset_preview_url(obj.cover_asset)
|
||||
|
||||
def validate(self, attrs):
|
||||
# 创建商品必须至少有一张图:无图商品会让下游"商品参考图"彻底落空(主图兜底也没得兜),
|
||||
# 导致故事板 / 视频退化纯文生图。前端抽屉已校验,这里在后端堵死 API / 向导路径。
|
||||
if self.instance is None: # 仅创建时强制(编辑已有商品不阻断)
|
||||
if not attrs.get("cover_asset") and not attrs.get("images"):
|
||||
raise serializers.ValidationError({"images": "创建商品至少需要上传一张商品图片"})
|
||||
# 创建商品必须至少有一张图:无图商品会让下游"商品参考图"彻底落空,故事板/视频退化纯文生图。
|
||||
# 前端抽屉走 upload-first(拖入即传 /assets/upload/ 拿 asset → 创建时带 cover_asset/images 进来),
|
||||
# 所以这道校验是可满足的、且正确。只在创建时强制,编辑已有商品不阻断。
|
||||
if self.instance is None and not attrs.get("cover_asset") and not attrs.get("images"):
|
||||
raise serializers.ValidationError({"images": "创建商品至少需要上传一张商品图片"})
|
||||
return attrs
|
||||
|
||||
def create(self, validated_data):
|
||||
|
||||
Reference in New Issue
Block a user