feat(r2): 前端 API 层——地址/设计清单切换到后端接口(阶段2)

- api/address.ts: fetchAddresses/createAddress/updateAddress/deleteAddress/
  setDefaultAddress;region[] ↔ province/city/district 双向转换唯一落点
- api/design.ts: fetchDesignList/createDesign/updateDesign/deleteDesign/
  deleteDesigns;状态映射 DRAFT↔undesigned、SUBMITTED↔designing、
  PROCESSING↔processing、DONE↔ordered;一条设计=一条清单(items 固定 1 元素,
  title=productName,productIcon 不上传由页面按 productId 兜底)
- types/index.ts: DesignItem.status 补 'processing'、productIcon 改 optional、
  AddressItem 补 createdAt?;全部消费点已确认兼容(均有兜底)
- docs/r2-workflow.md: R2 工作流程与阶段0 契约确认记录

验证:build:weapp 通过;Node 打桩 Taro.request 转发本地 3091 后端实测
13 项全过(region 往返/状态映射/designData 保留/越权 403/无效 token 401)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2026-09-12 03:10:51 +08:00
co-authored by Claude
parent 2b9c785bc4
commit 8438fea72f
9 changed files with 428 additions and 19 deletions
+12 -4
View File
@@ -142,17 +142,23 @@ export interface WordCloudDispatchResult {
message?: string
}
/** 设计清单条目 */
/** 设计清单条目(与后端 DesignList 一一对应,api-contract-v1 §5 */
export interface DesignItem {
id: string
productId: string
productName: string
productIcon: string
/**
* 条目图标。服务端不存储(契约 forbidNonWhitelisted 拒绝多余字段),
* 页面按 PRODUCT_ICON_MAP[productId] 兜底推导;仅本地缓存/旧数据可能携带
*/
productIcon?: string
unitPrice: number
count: number
status: 'undesigned' | 'designing' | 'ordered'
/** undesigned/designing 由前端驱动;processing/ordered 由服务端状态映射产生(R3 驱动) */
status: 'undesigned' | 'designing' | 'processing' | 'ordered'
designData?: DesignDataV1
orderId?: string
/** 服务端 createdAtISO),展示时取日期部分 */
createdAt: string
}
@@ -168,7 +174,7 @@ export interface OrderItem {
sku: string
}
/** 收货地址 */
/** 收货地址(后端 province/city/district/detail 以 region 数组表达,转换只在 api/address.ts */
export interface AddressItem {
id: string
name: string
@@ -176,6 +182,8 @@ export interface AddressItem {
region: string[] // [province, city, district]
detail: string // 门牌号/详细地址
isDefault: boolean
/** 服务端创建时间(ISO 8601),本地缓存数据可能没有 */
createdAt?: string
}
/** 编辑器中的图片状态(向后兼容) */