fix: 修复场景提示词
This commit is contained in:
@@ -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")
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -68,7 +68,9 @@ export default {
|
|||||||
tip: '提示',
|
tip: '提示',
|
||||||
status: '状态',
|
status: '状态',
|
||||||
createdAt: '创建时间',
|
createdAt: '创建时间',
|
||||||
updatedAt: '更新时间'
|
updatedAt: '更新时间',
|
||||||
|
name: '名称',
|
||||||
|
description: '描述'
|
||||||
},
|
},
|
||||||
settings: {
|
settings: {
|
||||||
title: '设置',
|
title: '设置',
|
||||||
|
|||||||
@@ -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) => {
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user