feat(generate): 生成管线改为异步,前端接入轮询进度

后端:
- POST /api/v1/generate 改为异步模式,立即返回 taskId
- 管线在后台 goroutine 执行,状态通过 GET /tasks/:taskId 轮询
- 任务状态流转: pending → running → saving → completed/failed

前端:
- generation store: submit 后每 2s 轮询 getTask,完成时自动 getAssets
- GeneratePage: 实时显示轮询状态文本 + 进度条
- ResultPage: 挂载时轮询任务,未完成显示骨架屏+进度,完成自动加载素材
- Types: Task.status 增加 submitted / saving 状态
This commit is contained in:
2026-05-25 12:51:49 +08:00
parent c4dc7394b1
commit 322e6aecbb
6 changed files with 230 additions and 118 deletions
-7
View File
@@ -19,13 +19,6 @@ export async function getTask(taskId: string): Promise<Task> {
export async function getAssets(taskId: string): Promise<Asset[]> {
const resp = await get<AssetsResponse>(`/api/v1/tasks/${taskId}/assets`)
return toAssetList(resp)
}
/** 将响应转为 Asset[] 供前端组件使用 */
function toAssetList(
resp: AssetsResponse | GenerateResponse,
): Asset[] {
return resp.assets.map((a, i) => ({
id: `asset-${i}`,
url: a.url,
+2 -12
View File
@@ -67,7 +67,7 @@ export interface Task {
projectId: string
prompt: string
assetType: string
status: 'pending' | 'running' | 'completed' | 'failed'
status: 'pending' | 'submitted' | 'running' | 'completed' | 'failed'
stage?: PipelineStage
progress?: number
retryCount?: number
@@ -106,19 +106,9 @@ export interface GenerateRequest {
format?: 'spritesheet' | 'individual'
}
// 生成响应 — 对应 POST /api/v1/generate 返回
// 生成响应 — 对应 POST /api/v1/generate 返回(异步,仅含 taskId)
export interface GenerateResponse {
taskId: string
assets: {
url: string
format: string
}[]
metadata: {
frameWidth: number
frameHeight: number
frameCount: number
directions: number
}
}
// 素材列表响应 — 对应 GET /api/v1/tasks/:taskId/assets