{{ $t('systemSettings.promptOptimizationModelTip') }}
+
+
+
+ {{ $t('systemSettings.storyboardSystemPromptTip') }}
+
+
+
+
+ {{ $t('systemSettings.promptOptimizationSystemPromptTip') }}
+
-
+
+
{{ $t('common.save') }}
@@ -431,7 +459,8 @@ import {
User as Search,
User as ArrowDown,
Delete,
- Refresh
+ Refresh,
+ Check
} from '@element-plus/icons-vue'
import cleanupApi from '@/api/cleanup'
import { getMembershipLevels, updateMembershipLevel } from '@/api/members'
@@ -498,6 +527,8 @@ const cleanupConfig = reactive({
// AI模型设置相关
const promptOptimizationModel = ref('gpt-5.1-thinking')
const promptOptimizationApiUrl = ref('https://ai.comfly.chat')
+const storyboardSystemPrompt = ref('')
+const promptOptimizationSystemPrompt = ref('')
const savingAiModel = ref(false)
const goToDashboard = () => {
@@ -773,6 +804,12 @@ const loadAiModelSettings = async () => {
if (data.promptOptimizationApiUrl) {
promptOptimizationApiUrl.value = data.promptOptimizationApiUrl
}
+ if (data.storyboardSystemPrompt !== undefined) {
+ storyboardSystemPrompt.value = data.storyboardSystemPrompt
+ }
+ if (data.promptOptimizationSystemPrompt !== undefined) {
+ promptOptimizationSystemPrompt.value = data.promptOptimizationSystemPrompt
+ }
}
} catch (error) {
console.error('加载AI模型设置失败:', error)
@@ -790,7 +827,9 @@ const saveAiModelSettings = async () => {
},
body: JSON.stringify({
promptOptimizationModel: promptOptimizationModel.value,
- promptOptimizationApiUrl: promptOptimizationApiUrl.value
+ promptOptimizationApiUrl: promptOptimizationApiUrl.value,
+ storyboardSystemPrompt: storyboardSystemPrompt.value,
+ promptOptimizationSystemPrompt: promptOptimizationSystemPrompt.value
})
})
if (response.ok) {
@@ -1419,6 +1458,38 @@ const fetchSystemStats = async () => {
border-color: #40a9ff;
}
+/* AI模型设置保存按钮样式 */
+.ai-save-btn {
+ width: auto !important;
+ min-width: 140px;
+ padding: 12px 32px !important;
+ font-size: 15px !important;
+ font-weight: 500;
+ border-radius: 8px !important;
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%) !important;
+ border: none !important;
+ box-shadow: 0 4px 15px rgba(102, 126, 234, 0.4);
+ transition: all 0.3s ease !important;
+ display: inline-flex;
+ align-items: center;
+ gap: 8px;
+}
+
+.ai-save-btn:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 6px 20px rgba(102, 126, 234, 0.5);
+ background: linear-gradient(135deg, #5a6fd6 0%, #6a4190 100%) !important;
+}
+
+.ai-save-btn:active {
+ transform: translateY(0);
+ box-shadow: 0 2px 10px rgba(102, 126, 234, 0.4);
+}
+
+.ai-save-btn .el-icon {
+ font-size: 16px;
+}
+
/* 响应式调整 */
@media (max-width: 480px) {
.membership-modal {
diff --git a/demo/frontend/src/views/TextToVideoCreate.vue b/demo/frontend/src/views/TextToVideoCreate.vue
index b1040bb..7f0fb04 100644
--- a/demo/frontend/src/views/TextToVideoCreate.vue
+++ b/demo/frontend/src/views/TextToVideoCreate.vue
@@ -930,7 +930,7 @@ const restoreProcessingTask = async () => {
return false
}
-// 检查最近一条任务的状态(如果失败则显示失败状态,但不恢复输入参数)
+// 检查最近一条任务的状态(如果失败则显示失败状态和提示词)
const checkLastTaskStatus = async () => {
if (!userStore.isAuthenticated) return
@@ -939,14 +939,29 @@ const checkLastTaskStatus = async () => {
if (response.data && response.data.success && response.data.data && response.data.data.length > 0) {
const lastTask = response.data.data[0]
- // 只关注 FAILED 状态,显示失败UI但不恢复输入参数
+ // 只关注 FAILED 状态,显示失败UI和提示词
if (lastTask.status === 'FAILED') {
console.log('[Last Task Failed]', lastTask)
currentTask.value = lastTask
taskStatus.value = 'FAILED'
- // 不恢复输入参数,让用户可以自由创建新任务
+
+ // 恢复提示词,让用户看到失败任务的内容
+ if (lastTask.prompt) {
+ inputText.value = lastTask.prompt
+ }
+ // 恢复其他参数
+ if (lastTask.aspectRatio) {
+ aspectRatio.value = lastTask.aspectRatio
+ }
+ if (lastTask.duration) {
+ duration.value = lastTask.duration
+ }
+ if (lastTask.hdMode !== undefined) {
+ hdMode.value = lastTask.hdMode
+ }
}
+ // 如果最近一条任务是成功的,不需要处理
}
} catch (error) {
console.error('Check last task status error', error)
diff --git a/demo/pom.xml b/demo/pom.xml
index d7ff673..b6afcf9 100644
--- a/demo/pom.xml
+++ b/demo/pom.xml
@@ -28,6 +28,7 @@
21
+ 10.1.34
diff --git a/demo/src/main/java/com/example/demo/controller/AdminController.java b/demo/src/main/java/com/example/demo/controller/AdminController.java
index 85115aa..1677ad9 100644
--- a/demo/src/main/java/com/example/demo/controller/AdminController.java
+++ b/demo/src/main/java/com/example/demo/controller/AdminController.java
@@ -22,6 +22,7 @@ import org.springframework.web.bind.annotation.RestController;
import com.example.demo.model.User;
import com.example.demo.model.SystemSettings;
+import com.example.demo.repository.TaskStatusRepository;
import com.example.demo.service.UserService;
import com.example.demo.service.SystemSettingsService;
import com.example.demo.util.JwtUtils;
@@ -45,6 +46,9 @@ public class AdminController {
@Autowired
private SystemSettingsService systemSettingsService;
+ @Autowired
+ private TaskStatusRepository taskStatusRepository;
+
/**
* 给用户增加积分
*/
@@ -396,6 +400,8 @@ public class AdminController {
response.put("promptOptimizationModel", settings.getPromptOptimizationModel());
response.put("promptOptimizationApiUrl", settings.getPromptOptimizationApiUrl());
+ response.put("promptOptimizationSystemPrompt", settings.getPromptOptimizationSystemPrompt());
+ response.put("storyboardSystemPrompt", settings.getStoryboardSystemPrompt());
response.put("siteName", settings.getSiteName());
response.put("siteSubtitle", settings.getSiteSubtitle());
response.put("registrationOpen", settings.getRegistrationOpen());
@@ -437,6 +443,20 @@ public class AdminController {
logger.info("更新优化提示词API端点为: {}", apiUrl);
}
+ // 更新分镜图系统引导词
+ if (settingsData.containsKey("storyboardSystemPrompt")) {
+ String prompt = (String) settingsData.get("storyboardSystemPrompt");
+ settings.setStoryboardSystemPrompt(prompt);
+ logger.info("更新分镜图系统引导词");
+ }
+
+ // 更新优化提示词系统提示词
+ if (settingsData.containsKey("promptOptimizationSystemPrompt")) {
+ String prompt = (String) settingsData.get("promptOptimizationSystemPrompt");
+ settings.setPromptOptimizationSystemPrompt(prompt);
+ logger.info("更新优化提示词系统提示词");
+ }
+
systemSettingsService.update(settings);
response.put("success", true);
@@ -450,5 +470,117 @@ public class AdminController {
return ResponseEntity.status(500).body(response);
}
}
+
+ /**
+ * 删除单个任务记录
+ */
+ @DeleteMapping("/tasks/{taskId}")
+ public ResponseEntity