fix: 下载数据点击后无反馈,且大店铺会被分页上限截断 (#8)

负责人反馈「点击下载数据没反应」。用真实登录态做只读诊断后确认
后端正常:ListShops 返回 19 个店铺,getPage 返回 total=4304。
问题有两个,都在前端反馈和分页参数上。

1. 前端没有任何运行状态
   downloadProductData 是个纯 await,期间按钮不禁用、不转圈、不提示。
   商品多的店铺要跑几十秒到几分钟,看起来就像点了没用。
   改为:未选店铺时先给出提示不发请求;开始时提示「进度见运行日志」;
   按钮显示 loading 并互斥禁用;失败用 error 而不是 warning。
   下载视频、上传数据两个按钮同样处理。

2. 每页 20 条导致大店铺超出 200 页上限被截断
   实测同一店铺不同 size 的表现:
     size=20   216 页  506ms/页   约 108 秒
     size=200   22 页  836ms/页   约 18 秒
     size=500    9 页  1.48s/页   约 13 秒
   4304 个商品按 20 条一页是 216 页,超过 maximumProductPages=200,
   会在 4000 条处截断并只记一条警告。
   改为每页 200 条:耗时降到约六分之一,且上限对应 4 万商品,
   远超实际店铺规模。选 200 而非 500 是响应体积与速度的平衡。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LbdtsD3ohhSMy3KPoCgARq
This commit is contained in:
QiuSW
2026-09-02 17:43:25 +08:00
co-authored by Claude Opus 5
parent 406fb80e46
commit d5e32f4d2b
2 changed files with 48 additions and 7 deletions
+41 -5
View File
@@ -162,24 +162,41 @@ function reset() {
// ---- 操作按钮 ----
async function run(action, fn) {
running.value = action
try {
await fn()
await search(false)
} catch (err) {
message.warning(`${action}:${err}`)
} finally {
running.value = ''
}
}
async function downloadProductData() {
if (!query.value.platformShopId) {
message.warning('请先在上面选择一个店铺')
return
}
// 商品多的店铺要拉几十页,耗时十几秒到几分钟。
// 必须先给出可见反馈,否则按钮看起来像坏了。
running.value = '下载数据'
message.info('正在下载商品数据,进度见「运行日志」')
try {
await DownloadProductData(query.value.platformShopId)
await search(false)
message.success(`下载完成,已拉取 ${total.value} 条商品数据`)
message.success(`下载完成,本店铺共 ${total.value} 条商品`)
} catch (err) {
message.warning(`下载数据:${err}`)
message.error(`下载数据失败:${err}`)
} finally {
running.value = ''
}
}
// 正在跑的操作名。非空时按钮禁用并显示转圈,
// 否则长耗时操作期间界面毫无反馈,使用者会以为点了没用。
const running = ref('')
const selectedCount = computed(() => checkedIds.value.length)
onMounted(() => {
@@ -223,9 +240,28 @@ onMounted(() => {
</div>
<div class="row">
<n-button type="primary" @click="downloadProductData">下载数据</n-button>
<n-button @click="run('下载视频', () => DownloadVideos(checkedIds))">下载视频</n-button>
<n-button @click="run('上传数据', () => UploadVideos(checkedIds))">上传数据</n-button>
<n-button
type="primary"
:loading="running === '下载数据'"
:disabled="running !== '' && running !== '下载数据'"
@click="downloadProductData"
>
下载数据
</n-button>
<n-button
:loading="running === '下载视频'"
:disabled="running !== '' && running !== '下载视频'"
@click="run('下载视频', () => DownloadVideos(checkedIds))"
>
下载视频
</n-button>
<n-button
:loading="running === '上传数据'"
:disabled="running !== '' && running !== '上传数据'"
@click="run('上传数据', () => UploadVideos(checkedIds))"
>
上传数据
</n-button>
<n-button @click="emit('open-logs')">运行日志</n-button>
<span class="spacer" />
<span class="count">已选 {{ selectedCount }} / 共 {{ total }} 条</span>