fix(wxcp): 修复活动封面编辑后丢失
ImageUpload 在 maxNumber=1 时 getValue() 只返回 URL 字符串,而 form-ui 的
valueKey 转换要求「值是带 status 的对象数组」,字符串会被跳过,于是 valueKey:'id'
形同虚设。normalizeBlobIds 拿到 URL 后 Number() 得到 NaN、被 filter 掉,
最终提交 blobIds: [] —— 后端把空数组理解为「明确清空封面」,所以编辑活动
选了图反而把封面清掉了。
- data.ts:schema 加 resultField(组件里它是布尔开关,真值时改返回 item.response,
即上传响应对象 {url,name,id}),这样才拿得到真正的 blobId
- form.vue:回显对象补 response:{id,name,url},否则「进编辑页不动图直接保存」
仍会走 URL 分支 → NaN → [] → 封面被清空
Co-Authored-By: Claude <noreply@anthropic.com>
| | |
| | | component: 'ImageUpload', |
| | | componentProps: { |
| | | valueKey: 'id', |
| | | // 关键:ImageUpload 在 maxNumber=1 时 getValue() 只吐 URL 字符串, |
| | | // form-ui 的 valueKey 转换又要求「值是带 status 的对象数组」,字符串会被跳过, |
| | | // 结果 blobIds 被 normalizeBlobIds 转成 NaN → [],后端把空数组理解为「清空封面」。 |
| | | // resultField 非空时组件改返回 item.response(上传响应对象 {url,name,id}), |
| | | // 才拿得到真正的 blobId。 |
| | | resultField: 'id', |
| | | maxNumber: 1, |
| | | multiple: false, |
| | | disabled: readonly, |
| | |
| | | activity: WxCpActivityApi.Activity, |
| | | ): Record<string, unknown> { |
| | | const form: Record<string, unknown> = { ...activity }; |
| | | form.blobIds = (activity.attachmentList ?? []).map((item) => ({ |
| | | uid: String(item.id), |
| | | name: item.name || item.originalFilename || '', |
| | | url: toAccessibleFileUrl(item.url || item.previewURL), |
| | | status: 'done', |
| | | id: item.id, |
| | | })); |
| | | form.blobIds = (activity.attachmentList ?? []).map((item) => { |
| | | const name = item.name || item.originalFilename || ''; |
| | | const url = toAccessibleFileUrl(item.url || item.previewURL); |
| | | return { |
| | | uid: String(item.id), |
| | | name, |
| | | url, |
| | | status: 'done', |
| | | id: item.id, |
| | | // 回显对象也必须带 response:组件设了 resultField 后只认 item.response, |
| | | // 不带的话「进编辑页不动图直接保存」会走 URL 分支 → NaN → [] → 封面被清空 |
| | | response: { id: item.id, name, url }, |
| | | }; |
| | | }); |
| | | return form; |
| | | } |
| | | |