// 画布服务层 import type { CanvasProject, CanvasState, CanvasNode } from '@/types/canvas'; // API 响应类型 interface ApiResponse { success: boolean; data?: T; error?: string; } // 画布服务 export const canvasService = { // 获取画布列表 async getProjects(): Promise> { try { const response = await fetch('/api/canvas'); const data = await response.json(); return data; } catch (error) { return { success: false, error: '获取画布列表失败' }; } }, // 获取单个画布 async getProject(id: string): Promise> { try { const response = await fetch(`/api/canvas/${id}`); const data = await response.json(); return data; } catch (error) { return { success: false, error: '获取画布失败' }; } }, // 创建画布 async createProject(project: Partial): Promise> { try { const response = await fetch('/api/canvas', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(project), }); const data = await response.json(); return data; } catch (error) { return { success: false, error: '创建画布失败' }; } }, // 更新画布 async updateProject(id: string, updates: Partial): Promise> { try { const response = await fetch(`/api/canvas/${id}`, { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(updates), }); const data = await response.json(); return data; } catch (error) { return { success: false, error: '更新画布失败' }; } }, // 删除画布 async deleteProject(id: string): Promise { try { const response = await fetch(`/api/canvas/${id}`, { method: 'DELETE', }); const data = await response.json(); return data; } catch (error) { return { success: false, error: '删除画布失败' }; } }, // 保存画布状态 async saveCanvasState(id: string, canvasData: CanvasState): Promise { try { const response = await fetch(`/api/canvas/${id}`, { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ canvasData }), }); const data = await response.json(); return data; } catch (error) { return { success: false, error: '保存画布状态失败' }; } }, // 自动保存(防抖) createAutoSave(projectId: string, delay = 2000) { let timeoutId: NodeJS.Timeout | null = null; return (canvasData: CanvasState) => { if (timeoutId) { clearTimeout(timeoutId); } timeoutId = setTimeout(async () => { await this.saveCanvasState(projectId, canvasData); }, delay); }; }, }; // 图片生成服务 export const imageGenerationService = { // 上传图片到存储桶 async uploadImage(file: File): Promise> { try { const formData = new FormData(); formData.append('file', file); const response = await fetch('/api/files/upload', { method: 'POST', body: formData, }); if (!response.ok) { const errorData = await response.json(); return { success: false, error: errorData.error || '上传失败' }; } const data = await response.json(); return { success: true, data: { url: data.url, pathname: data.pathname } }; } catch (error) { console.error('[Canvas] 图片上传失败:', error); return { success: false, error: '图片上传失败' }; } }, // AI 生成图片 async generateImage(params: { prompt: string; negativePrompt?: string; model?: string; aspectRatio?: string; imageCount?: number; referenceImage?: string; }): Promise; model?: string; prompt?: string }>> { try { const response = await fetch('/api/canvas/generate/image', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(params), }); const data = await response.json(); return data; } catch (error) { return { success: false, error: '生成图片失败' }; } }, // 图片抠图 - 使用图片URL async removeBackground(imageUrl: string): Promise> { try { const response = await fetch('/api/rmbg', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ imageUrl }), // 使用 imageUrl 参数 }); const data = await response.json(); if (data.success && data.original_url) { return { success: true, data: { url: data.original_url } }; } return { success: false, error: data.error || '抠图失败' }; } catch (error) { console.error('[Canvas] 抠图失败:', error); return { success: false, error: '抠图失败' }; } }, // 图片增强 - 使用图片URL async enhanceImage(imageUrl: string): Promise> { try { const response = await fetch('/api/enhance', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ imageUrl }), // 使用 imageUrl 参数 }); const data = await response.json(); if (data.success && data.original_url) { return { success: true, data: { url: data.original_url } }; } return { success: false, error: data.error || '图片增强失败' }; } catch (error) { console.error('[Canvas] 图片增强失败:', error); return { success: false, error: '图片增强失败' }; } }, // 图片扩展 - 使用图片URL async extendImage(imageUrl: string, direction?: string): Promise> { try { const response = await fetch('/api/extend', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ image_url: imageUrl, direction }), // extend API 使用 image_url 参数名 }); const data = await response.json(); if (data.success && data.original_url) { return { success: true, data: { url: data.original_url } }; } return { success: false, error: data.error || '图片扩展失败' }; } catch (error) { console.error('[Canvas] 图片扩展失败:', error); return { success: false, error: '图片扩展失败' }; } }, // 尺寸调整 async resizeImage(imageUrl: string, width: number, height: number): Promise> { try { const response = await fetch('/api/resize', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ imageUrl, width, height }), }); const data = await response.json(); return data; } catch (error) { return { success: false, error: '尺寸调整失败' }; } }, // 角度编辑 async editAngle(params: { imageUrl: string; horizontalAngle: number; verticalAngle: number; zoom: number; }): Promise> { try { const response = await fetch('/api/angle-edit', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(params), }); const data = await response.json(); return data; } catch (error) { return { success: false, error: '角度编辑失败' }; } }, // 场景裂变 async sceneFusion(params: { productImage: string; backgroundImages: string[]; productName?: string; }): Promise> { try { const response = await fetch('/api/scene-fusion', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(params), }); const data = await response.json(); return data; } catch (error) { return { success: false, error: '场景裂变失败' }; } }, }; // 视频生成服务 export const videoGenerationService = { // 生成视频 async generateVideo(params: { prompt: string; model: string; referenceImage?: string; duration?: number; }): Promise> { try { const response = await fetch('/api/canvas/generate/video', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(params), }); const data = await response.json(); return data; } catch (error) { return { success: false, error: '生成视频失败' }; } }, }; export default { canvas: canvasService, image: imageGenerationService, video: videoGenerationService, };