From 965c37f2ffa05115ca62cef9cabc96766932f86a Mon Sep 17 00:00:00 2001 From: zerosaturation Date: Wed, 8 Apr 2026 00:07:08 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=89=8D=E7=AB=AF=E6=94=B9=E4=B8=BA?= =?UTF-8?q?=E8=BD=AE=E8=AF=A2=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pages/discover/generation-loading.vue | 152 ++++++++++++------ 1 file changed, 100 insertions(+), 52 deletions(-) diff --git a/frontend/pages/discover/generation-loading.vue b/frontend/pages/discover/generation-loading.vue index e68b932..7a58311 100644 --- a/frontend/pages/discover/generation-loading.vue +++ b/frontend/pages/discover/generation-loading.vue @@ -91,59 +91,107 @@ const revertProgress = () => { }, 100); }; -// 调用图生图API +// job_id 轮询 +let jobId = null; + +// 调用图生图API - 异步模式 const callImageGeneration = async () => { - try { - const res = await imageGenerationApi(generationData); - - if (res.data && res.data.base_resp && res.data.base_resp.status_code === 0) { - console.log('[GenerationLoading] 图生图成功:', res); - - // 获取返回的图片数据 - const imageUrls = res.data.data?.image_urls || []; - - if (imageUrls.length > 0) { - // 将base64图片数据转换为可用的格式 - const processedImages = imageUrls.map(base64Data => { - // 如果已经是完整的data URL,直接返回 - if (base64Data.startsWith('data:image')) { - return base64Data; - } - // 否则添加data URL前缀 - return `data:image/png;base64,${base64Data}`; - }); - - // 存储图片数据 - uni.setStorageSync('generated_images', JSON.stringify(processedImages)); - - // 成功,完成进度 - completeProgress(); - } else { - uni.showToast({ - title: '未生成图片', - icon: 'none', - duration: 2000 - }); - revertProgress(); - } - } else { - // 失败,回退进度 - uni.showToast({ - title: res.data?.base_resp?.status_msg || '生成失败', - icon: 'none', - duration: 2000 - }); - revertProgress(); - } - } catch (err) { - console.error('[GenerationLoading] 图生图失败:', err); - uni.showToast({ - title: '生成失败', - icon: 'none', - duration: 2000 - }); - revertProgress(); - } + try { + const res = await imageGenerationApi(generationData); + + if (res.data && res.data.job_id) { + jobId = res.data.job_id; + console.log('[GenerationLoading] 任务已创建:', jobId); + // 开始轮询 + pollJobStatus(); + } else { + uni.showToast({ + title: '创建任务失败', + icon: 'none', + duration: 2000 + }); + revertProgress(); + } + } catch (err) { + console.error('[GenerationLoading] 创建任务失败:', err); + uni.showToast({ + title: '创建任务失败', + icon: 'none', + duration: 2000 + }); + revertProgress(); + } +}; + +// 轮询任务状态 +const pollJobStatus = () => { + let pollCount = 0; + const maxPolls = 40; // 120秒 / 3秒 = 40次 + + const poll = async () => { + if (!jobId) return; + + try { + const res = await uni.request({ + url: 'http://192.168.110.60:8080' + `/api/v1/assets/mints/image/generation/${jobId}`, + method: 'GET', + header: { + 'Authorization': `Bearer ${uni.getStorageSync('access_token')}` + } + }); + + const data = res.data?.data; + if (data) { + // 更新进度 + if (data.progress) { + progress.value = Math.min(data.progress, 90); + } + + if (data.status === 'COMPLETED') { + // 完成 + const imageUrls = data.images || []; + if (imageUrls.length > 0) { + uni.setStorageSync('generated_images', JSON.stringify(imageUrls)); + completeProgress(); + } else { + uni.showToast({ title: '未生成图片', icon: 'none' }); + revertProgress(); + } + return; + } else if (data.status === 'FAILED') { + // 失败 + uni.showToast({ + title: data.error_msg || '生成失败', + icon: 'none', + duration: 2000 + }); + revertProgress(); + return; + } + } + + pollCount++; + if (pollCount >= maxPolls) { + uni.showToast({ title: '生成超时,请重试', icon: 'none' }); + revertProgress(); + return; + } + + // 3秒后继续轮询 + setTimeout(poll, 3000); + } catch (err) { + console.error('[GenerationLoading] 轮询失败:', err); + pollCount++; + if (pollCount >= maxPolls) { + uni.showToast({ title: '查询失败,请重试', icon: 'none' }); + revertProgress(); + } else { + setTimeout(poll, 3000); + } + } + }; + + poll(); }; // 处理成功