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:
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user