From 34ce6e1aae690327e881924e574fc4c7232c99b9 Mon Sep 17 00:00:00 2001 From: xiamuceer Date: Sun, 30 Nov 2025 13:00:26 +0800 Subject: [PATCH] =?UTF-8?q?update:1.=E6=9B=B4=E6=96=B0=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E7=BC=96=E8=BE=91=E7=AB=A0=E8=8A=82=E6=A6=82=E8=A6=81=E5=86=85?= =?UTF-8?q?=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/app/api/chapters.py | 36 +++++++---- backend/app/schemas/chapter.py | 1 + .../src/components/ExpansionPlanEditor.tsx | 64 +++++++++++++------ frontend/src/pages/Chapters.tsx | 1 + 4 files changed, 69 insertions(+), 33 deletions(-) diff --git a/backend/app/api/chapters.py b/backend/app/api/chapters.py index a1fe916..8e88c29 100644 --- a/backend/app/api/chapters.py +++ b/backend/app/api/chapters.py @@ -2856,11 +2856,11 @@ async def update_chapter_expansion_plan( db: AsyncSession = Depends(get_db) ): """ - 更新章节的展开规划信息 + 更新章节的展开规划信息和情节概要 Args: chapter_id: 章节ID - expansion_plan: 规划信息更新数据 + expansion_plan: 规划信息更新数据(包含summary和expansion_plan字段) Returns: 更新后的章节规划信息 @@ -2881,18 +2881,27 @@ async def update_chapter_expansion_plan( # 准备更新数据(排除None值) plan_data = expansion_plan.model_dump(exclude_unset=True, exclude_none=True) - # 如果已有规划,合并更新;否则创建新规划 - if chapter.expansion_plan: - try: - existing_plan = json.loads(chapter.expansion_plan) - # 合并更新 - existing_plan.update(plan_data) - chapter.expansion_plan = json.dumps(existing_plan, ensure_ascii=False) - except json.JSONDecodeError: - logger.warning(f"章节 {chapter_id} 的expansion_plan格式错误,将覆盖") + # 分离summary和expansion_plan数据 + summary_value = plan_data.pop('summary', None) + + # 更新summary字段(如果提供) + if summary_value is not None: + chapter.summary = summary_value + logger.info(f"更新章节概要: {chapter_id}") + + # 更新expansion_plan字段(如果有其他字段) + if plan_data: + if chapter.expansion_plan: + try: + existing_plan = json.loads(chapter.expansion_plan) + # 合并更新 + existing_plan.update(plan_data) + chapter.expansion_plan = json.dumps(existing_plan, ensure_ascii=False) + except json.JSONDecodeError: + logger.warning(f"章节 {chapter_id} 的expansion_plan格式错误,将覆盖") + chapter.expansion_plan = json.dumps(plan_data, ensure_ascii=False) + else: chapter.expansion_plan = json.dumps(plan_data, ensure_ascii=False) - else: - chapter.expansion_plan = json.dumps(plan_data, ensure_ascii=False) await db.commit() await db.refresh(chapter) @@ -2904,6 +2913,7 @@ async def update_chapter_expansion_plan( return { "id": chapter.id, + "summary": chapter.summary, "expansion_plan": updated_plan, "message": "规划信息更新成功" } diff --git a/backend/app/schemas/chapter.py b/backend/app/schemas/chapter.py index 3054437..d6e27db 100644 --- a/backend/app/schemas/chapter.py +++ b/backend/app/schemas/chapter.py @@ -130,6 +130,7 @@ class SceneData(BaseModel): class ExpansionPlanUpdate(BaseModel): """章节规划更新模型""" + summary: Optional[str] = Field(None, description="章节情节概要") key_events: Optional[List[str]] = Field(None, description="关键事件列表") character_focus: Optional[List[str]] = Field(None, description="涉及角色列表") emotional_tone: Optional[str] = Field(None, description="情感基调") diff --git a/frontend/src/components/ExpansionPlanEditor.tsx b/frontend/src/components/ExpansionPlanEditor.tsx index 37653f6..94c88c4 100644 --- a/frontend/src/components/ExpansionPlanEditor.tsx +++ b/frontend/src/components/ExpansionPlanEditor.tsx @@ -1,4 +1,4 @@ -import { Modal, Form, Input, InputNumber, Select, Tag, Space, Button, message } from 'antd'; +import { Modal, Form, Input, InputNumber, Select, Tag, Space, Button, message, Divider } from 'antd'; import { PlusOutlined } from '@ant-design/icons'; import { useState, useEffect } from 'react'; import type { ExpansionPlanData, Character } from '../types'; @@ -9,14 +9,16 @@ const { TextArea } = Input; interface ExpansionPlanEditorProps { visible: boolean; planData: ExpansionPlanData | null; + chapterSummary: string | null; projectId: string; - onSave: (data: ExpansionPlanData) => Promise; + onSave: (data: ExpansionPlanData & { summary?: string }) => Promise; onCancel: () => void; } export default function ExpansionPlanEditor({ visible, planData, + chapterSummary, projectId, onSave, onCancel @@ -69,24 +71,29 @@ export default function ExpansionPlanEditor({ } }; - // 当planData变化时更新状态 + // 当planData或chapterSummary变化时更新状态 useEffect(() => { - if (planData) { - setKeyEvents(planData.key_events || []); - setCharacters(planData.character_focus || []); - form.setFieldsValue({ - emotional_tone: planData.emotional_tone, - narrative_goal: planData.narrative_goal, - conflict_type: planData.conflict_type, - estimated_words: planData.estimated_words - }); - } else { - // 重置状态 - setKeyEvents([]); - setCharacters([]); - form.resetFields(); + if (visible) { + if (planData) { + setKeyEvents(planData.key_events || []); + setCharacters(planData.character_focus || []); + form.setFieldsValue({ + summary: chapterSummary || '', + emotional_tone: planData.emotional_tone, + narrative_goal: planData.narrative_goal, + conflict_type: planData.conflict_type, + estimated_words: planData.estimated_words + }); + } else { + // 重置状态 + setKeyEvents([]); + setCharacters([]); + form.setFieldsValue({ + summary: chapterSummary || '' + }); + } } - }, [planData, form, visible]); + }, [planData, chapterSummary, form, visible]); const handleAddKeyEvent = () => { if (keyEventInput.trim()) { @@ -120,7 +127,8 @@ export default function ExpansionPlanEditor({ return; } - const updatedPlan: ExpansionPlanData = { + const updatedPlan: ExpansionPlanData & { summary?: string } = { + summary: values.summary, key_events: keyEvents, character_focus: characters, emotional_tone: values.emotional_tone, @@ -173,8 +181,24 @@ export default function ExpansionPlanEditor({ estimated_words: 3000 }} > + {/* 情节概要 */} + +