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:
seaislee1209
2026-06-23 16:28:53 +08:00
co-authored by Claude Opus 4.8
parent 6916f9c877
commit f02c8053a1
4 changed files with 78 additions and 54 deletions
+3
View File
@@ -217,6 +217,9 @@ export const api = {
description?: string;
specs?: Record<string, unknown>;
selling_points?: Array<{ title: string; detail: string; sort_order: number }>;
// upload-first:创建时带上已传进桶的图(cover_asset = 主图 asset id;images = 全部图)
cover_asset?: string;
images?: Array<{ asset: string; sort_order: number; is_primary?: boolean }>;
}) {
return request<Product>("/api/products/", { method: "POST", body: JSON.stringify(payload) });
},