1.8 KiB
1.8 KiB
拼图结果页正式图刷新修复
日期:2026-04-27
背景
拼图结果页点击“生成并替换当前图片”后,后端会返回最新 session,并把新图片写回 draft.coverImageSrc。但前端正式图展示仍可能命中旧的签名 URL 或浏览器图片缓存,导致当前正式图看起来没有变化。
这个问题在 /generated-puzzle-assets/... 私有资源链路下尤其明显:
- 结果页展示依赖
ResolvedAssetImage -> useResolvedAssetReadUrl -> /api/assets/read-url - 读地址服务会缓存同一路径的签名 URL
- 如果同一路径对应的资源内容在短时间内被更新,页面可能继续显示旧图
修复口径
src/services/assetReadUrlService.ts- 为
resolveAssetReadUrl(...)增加refreshKey - 当调用方显式传入
refreshKey时,跳过本地签名缓存 - 在最终图片 URL 上追加
_v参数,强制浏览器拉取当前版本
- 为
src/components/ResolvedAssetImage.tsx- 支持透传
refreshKey
- 支持透传
src/components/puzzle-result/PuzzleResultView.tsx- 拼图结果页正式图与发布弹窗正式图统一使用
session.updatedAt + coverImageSrc作为刷新锚点 - 保证每次“生成并替换当前图片”回写新 session 后,结果页主图和发布预览图都会同步刷新
- 拼图结果页正式图与发布弹窗正式图统一使用
回归验证
src/hooks/useResolvedAssetReadUrl.test.tsx- 新增
refreshKey变化时重新获取签名地址并带_v参数的测试
- 新增
src/components/puzzle-result/PuzzleResultView.test.tsx- 新增 session 更新后正式图切换到新
coverImageSrc的回归测试
- 新增 session 更新后正式图切换到新
后续约束
- 任何使用
/generated-*私有资源且存在“同一业务位重复生成替换”的界面,都应明确是否需要refreshKey - 如果后端后续改成稳定对象键覆写,也不能移除前端结果页的主动刷新锚点