size: '768x512', steps: 40, cfg_scale: 8.0, image_url: '', created_at: '2026-03-22T11:45:00Z' }, { id: '3', prompt: '奇幻森林中的精灵公主,水彩风格,梦幻色彩', style: 'watercolor', size: '512x768', steps: 35, cfg_scale: 6.5, image_url: '', created_at: '2026-03-21T16:20:00Z' } ]; updateHistoryGrid(mockHistory); document.getElementById('history-empty').style.display = 'none'; } // 加载模型统计 async function loadModelStats() { try { // 调用API获取模型统计 const response = await window.AnimForgeAPI.generate.getStats(); if (response.success) { updateModelStats(response.stats); } else { useMockStats(); } } catch (error) { console.error('加载模型统计失败:', error); useMockStats(); } } // 更新模型统计 function updateModelStats(stats) { if (stats.total_generations !== undefined) { document.getElementById('total-generations').textContent = stats.total_generations.toLocaleString(); } if (stats.success_rate !== undefined) { document.getElementById('success-rate').textContent = stats.success_rate + '%'; } if (stats.avg_time !== undefined) { document.getElementById('avg-time').textContent = stats.avg_time + 's'; } } // 使用模拟统计 function useMockStats() { document.getElementById('total-generations').textContent = '1,247'; document.getElementById('success-rate').textContent = '98.5%'; document.getElementById('avg-time').textContent = '12.3s'; } // 初始化参数调节 function initParameterControls() { // 步数滑块 const stepsSlider = document.getElementById('steps-slider'); const stepsValue = document.getElementById('steps-value'); stepsSlider.addEventListener('input', function() { stepsValue.textContent = this.value; }); // CFG滑块 const cfgSlider = document.getElementById('cfg-slider'); const cfgValue = document.getElementById('cfg-value'); cfgSlider.addEventListener('input', function() { cfgValue.textContent = this.value; }); // 风格选择 const styleOptions = document.querySelectorAll('.style-option'); styleOptions.forEach(option => { option.addEventListener('click', function() { styleOptions.forEach(opt => opt.classList.remove('selected')); this.classList.add('selected'); }); }); // 尺寸选择 const sizeOptions = document.querySelectorAll('.size-option'); sizeOptions.forEach(option => { option.addEventListener('click', function() { sizeOptions.forEach(opt => opt.classList.remove('selected')); this.classList.add('selected'); }); }); } // 初始化事件监听 function initEventListeners() { // 生成按钮 const generateBtn = document.getElementById('generate-btn'); if (generateBtn) { generateBtn.addEventListener('click', handleGenerate); } // 保存按钮 const saveBtn = document.getElementById('save-btn'); if (saveBtn) { saveBtn.addEventListener('click', handleSave); } // 重新生成按钮 const regenerateBtn = document.getElementById('regenerate-btn'); if (regenerateBtn) { regenerateBtn.addEventListener('click', handleRegenerate); } // 刷新历史按钮 const refreshBtn = document.getElementById('refresh-history-btn'); if (refreshBtn) { refreshBtn.addEventListener('click', loadGenerationHistory); } // 导航链接 const navLinks = document.querySelectorAll('.nav-link'); navLinks.forEach(link => { link.addEventListener('click', function(e) { e.preventDefault(); const page = this.getAttribute('data-page'); navigateToPage(page); }); }); } // 处理AI生成 async function handleGenerate() { const promptInput = document.getElementById('prompt-input'); const prompt = promptInput.value.trim(); if (!prompt) { showMessage('请输入生成提示词', 'warning'); promptInput.focus(); return; } if (prompt.length < 5) { showMessage('提示词太短,请详细描述', 'warning'); return; } // 获取当前参数 const selectedStyle = document.querySelector('.style-option.selected').dataset.style; const selectedSize = document.querySelector('.size-option.selected').dataset.size; const steps = parseInt(document.getElementById('steps-slider').value); const cfgScale = parseFloat(document.getElementById('cfg-slider').value); // 解析尺寸 const [width, height] = selectedSize.split('x').map(Number); try { // 显示加载状态 showLoadingState(); // 调用AI生成API const response = await window.AnimForgeAPI.generate.text2img({ prompt: prompt, style: selectedStyle, width: width, height: height, steps: steps, cfg_scale: cfgScale }); if (response.success) { // 显示生成结果 showGenerationResult(response.result); // 添加到历史记录 addToHistory({ id: response.task_id, prompt: prompt, style: selectedStyle, size: selectedSize, steps: steps, cfg_scale: cfgScale, image_url: response.image_url, created_at: new Date().toISOString() }); showMessage('生成成功!', 'success'); } else { throw new Error(response.message || '生成失败'); } } catch (error) { console.error('AI生成失败:', error); showMessage(`生成失败: ${error.message}`, 'error'); } finally { // 隐藏加载状态 hideLoadingState(); } } // 显示加载状态 function showLoadingState() { const generateBtn = document.getElementById('generate-btn'); const previewLoading = document.getElementById('preview-loading'); const loadingText = document.getElementById('loading-text'); // 更新按钮状态 generateBtn.innerHTML = ' 生成中...'; generateBtn.disabled = true; // 显示加载动画 previewLoading.style.display = 'flex'; // 更新加载文本 const messages = [ 'AI正在构思创意...', '绘制草图...', '添加细节...', '调整色彩...', '最终渲染...' ]; let messageIndex = 0; loadingText.textContent = messages[messageIndex]; // 轮换加载消息 const messageInterval = setInterval(() => { messageIndex = (messageIndex + 1) % messages.length; loadingText.textContent = messages[messageIndex]; }, 3000); // 保存interval以便清理 window.loadingMessageInterval = messageInterval; } // 隐藏加载状态 function hideLoadingState() { const generateBtn = document.getElementById('generate-btn'); const previewLoading = document.getElementById('preview-loading'); // 恢复按钮状态 generateBtn.innerHTML = '🤖开始生成'; generateBtn.disabled = false; // 隐藏加载动画 previewLoading.style.display = 'none'; // 清理消息轮换 if (window.loadingMessageInterval) { clearInterval(window.loadingMessageInterval); window.loadingMessageInterval = null; } } // 显示生成结果 function showGenerationResult(result) { const previewImage = document.getElementById('preview-image'); const previewPlaceholder = document.getElementById('preview-placeholder'); const previewActions = document.getElementById('preview-actions'); if (result.image_url) { // 预加载图片 const img = new Image(); img.onload = function() { previewImage.src = result.image_url; previewImage.style.display = 'block'; previewPlaceholder.style.display = 'none'; previewActions.style.display = 'flex'; }; img.onerror = function() { showMessage('图片加载失败', 'error'); }; img.src = result.image_url; } else { // 如果没有图片URL,显示占位符 previewPlaceholder.innerHTML = `