fix: 修复场景提示词

This commit is contained in:
kongweigen
2026-01-18 22:50:07 +08:00
parent f2b8bfaa25
commit 7e1220091b
7 changed files with 92 additions and 14 deletions

View File

@@ -74,6 +74,28 @@ func (h *SceneHandler) GenerateSceneImage(c *gin.Context) {
}) })
} }
func (h *SceneHandler) UpdateScenePrompt(c *gin.Context) {
sceneID := c.Param("scene_id")
var req services2.UpdateScenePromptRequest
if err := c.ShouldBindJSON(&req); err != nil {
response.BadRequest(c, "Invalid request")
return
}
if err := h.sceneService.UpdateScenePrompt(sceneID, &req); err != nil {
h.log.Errorw("Failed to update scene prompt", "error", err, "scene_id", sceneID)
if err.Error() == "scene not found" {
response.NotFound(c, "场景不存在")
return
}
response.InternalError(c, err.Error())
return
}
response.Success(c, gin.H{"message": "场景提示词已更新"})
}
func (h *SceneHandler) DeleteScene(c *gin.Context) { func (h *SceneHandler) DeleteScene(c *gin.Context) {
sceneID := c.Param("scene_id") sceneID := c.Param("scene_id")

View File

@@ -137,6 +137,7 @@ func SetupRouter(cfg *config.Config, db *gorm.DB, log *logger.Logger, localStora
scenes := api.Group("/scenes") scenes := api.Group("/scenes")
{ {
scenes.PUT("/:scene_id", sceneHandler.UpdateScene) scenes.PUT("/:scene_id", sceneHandler.UpdateScene)
scenes.PUT("/:scene_id/prompt", sceneHandler.UpdateScenePrompt)
scenes.DELETE("/:scene_id", sceneHandler.DeleteScene) scenes.DELETE("/:scene_id", sceneHandler.DeleteScene)
scenes.POST("/generate-image", sceneHandler.GenerateSceneImage) scenes.POST("/generate-image", sceneHandler.GenerateSceneImage)
} }

View File

@@ -399,6 +399,28 @@ func (s *StoryboardCompositionService) GenerateSceneImage(req *GenerateSceneImag
return nil, fmt.Errorf("image generation service not available") return nil, fmt.Errorf("image generation service not available")
} }
type UpdateScenePromptRequest struct {
Prompt string `json:"prompt"`
}
func (s *StoryboardCompositionService) UpdateScenePrompt(sceneID string, req *UpdateScenePromptRequest) error {
var scene models.Scene
if err := s.db.Where("id = ?", sceneID).First(&scene).Error; err != nil {
if err == gorm.ErrRecordNotFound {
return fmt.Errorf("scene not found")
}
return fmt.Errorf("failed to find scene: %w", err)
}
scene.Prompt = req.Prompt
if err := s.db.Save(&scene).Error; err != nil {
return fmt.Errorf("failed to update scene prompt: %w", err)
}
s.log.Infow("Scene prompt updated", "scene_id", sceneID, "prompt", req.Prompt)
return nil
}
func (s *StoryboardCompositionService) DeleteScene(sceneID string) error { func (s *StoryboardCompositionService) DeleteScene(sceneID string) error {
var scene models.Scene var scene models.Scene
if err := s.db.Where("id = ?", sceneID).First(&scene).Error; err != nil { if err := s.db.Where("id = ?", sceneID).First(&scene).Error; err != nil {

View File

@@ -108,8 +108,12 @@ export const dramaAPI = {
return request.put(`/scenes/${sceneId}`, data) return request.put(`/scenes/${sceneId}`, data)
}, },
generateSceneImage(data: { scene_id: string; prompt?: string; model?: string }) { generateSceneImage(data: { scene_id: number; prompt?: string; model?: string }) {
return request.post('/scenes/generate-image', data) return request.post<{ image_generation: { id: number } }>('/scenes/generate-image', data)
},
updateScenePrompt(sceneId: string, prompt: string) {
return request.put(`/scenes/${sceneId}/prompt`, { prompt })
}, },
deleteScene(sceneId: string) { deleteScene(sceneId: string) {

View File

@@ -68,7 +68,9 @@ export default {
tip: '提示', tip: '提示',
status: '状态', status: '状态',
createdAt: '创建时间', createdAt: '创建时间',
updatedAt: '更新时间' updatedAt: '更新时间',
name: '名称',
description: '描述'
}, },
settings: { settings: {
title: '设置', title: '设置',

View File

@@ -241,10 +241,10 @@
<el-dialog v-model="addSceneDialogVisible" :title="$t('common.add')" width="600px"> <el-dialog v-model="addSceneDialogVisible" :title="$t('common.add')" width="600px">
<el-form :model="newScene" label-width="100px"> <el-form :model="newScene" label-width="100px">
<el-form-item :label="$t('common.name')"> <el-form-item :label="$t('common.name')">
<el-input v-model="newScene.name" :placeholder="$t('common.name')" /> <el-input v-model="newScene.location" :placeholder="$t('common.name')" />
</el-form-item> </el-form-item>
<el-form-item :label="$t('common.description')"> <el-form-item :label="$t('common.description')">
<el-input v-model="newScene.description" type="textarea" :rows="4" :placeholder="$t('common.description')" /> <el-input v-model="newScene.prompt" type="textarea" :rows="4" :placeholder="$t('common.description')" />
</el-form-item> </el-form-item>
</el-form> </el-form>
<template #footer> <template #footer>
@@ -285,8 +285,8 @@ const newCharacter = ref({
}) })
const newScene = ref({ const newScene = ref({
name: '', location: '',
description: '' prompt: ''
}) })
const episodesCount = computed(() => drama.value?.episodes?.length || 0) const episodesCount = computed(() => drama.value?.episodes?.length || 0)
@@ -494,14 +494,14 @@ const deleteCharacter = async (character: any) => {
const openAddSceneDialog = () => { const openAddSceneDialog = () => {
newScene.value = { newScene.value = {
name: '', location: '',
description: '' prompt: ''
} }
addSceneDialogVisible.value = true addSceneDialogVisible.value = true
} }
const addScene = async () => { const addScene = async () => {
if (!newScene.value.name.trim()) { if (!newScene.value.location.trim()) {
ElMessage.warning('请输入场景名称') ElMessage.warning('请输入场景名称')
return return
} }
@@ -517,7 +517,11 @@ const addScene = async () => {
} }
const editScene = (scene: any) => { const editScene = (scene: any) => {
ElMessage.info('编辑功能开发中') newScene.value = {
location: scene.location || scene.name || '',
prompt: scene.prompt || scene.description || ''
}
addSceneDialogVisible.value = true
} }
const deleteScene = async (scene: any) => { const deleteScene = async (scene: any) => {

View File

@@ -1601,8 +1601,9 @@ const saveShotEdit = async () => {
// 对话框相关方法 // 对话框相关方法
const openPromptDialog = (item: any, type: 'character' | 'scene') => { const openPromptDialog = (item: any, type: 'character' | 'scene') => {
currentEditItem.value = item currentEditItem.value = item
currentEditItem.value.name = item.name || item.location
currentEditType.value = type currentEditType.value = type
editPrompt.value = item.appearance || item.description || '' editPrompt.value = item.prompt || item.appearance || item.description || ''
promptDialogVisible.value = true promptDialogVisible.value = true
} }
@@ -1614,10 +1615,32 @@ const savePrompt = async () => {
}) })
await generateCharacterImage(currentEditItem.value.id) await generateCharacterImage(currentEditItem.value.id)
} else { } else {
await dramaAPI.generateSceneImage({ // 1. 先保存场景提示词
await dramaAPI.updateScenePrompt(currentEditItem.value.id.toString(), editPrompt.value)
// 2. 生成场景图片
const model = selectedImageModel.value || undefined
const response = await dramaAPI.generateSceneImage({
scene_id: parseInt(currentEditItem.value.id), scene_id: parseInt(currentEditItem.value.id),
prompt: editPrompt.value prompt: editPrompt.value,
model
}) })
const imageGenId = response.image_generation?.id
// 3. 轮询图片生成状态
if (imageGenId) {
ElMessage.info('场景图片生成中,请稍候...')
generatingSceneImages.value[currentEditItem.value.id] = true
pollImageStatus(imageGenId, async () => {
await loadDramaData()
ElMessage.success('场景图片生成完成!')
}).finally(() => {
generatingSceneImages.value[currentEditItem.value.id] = false
})
} else {
ElMessage.success('场景图片生成已启动')
await loadDramaData()
}
} }
promptDialogVisible.value = false promptDialogVisible.value = false
} catch (error: any) { } catch (error: any) {