From 93dd60c082aabc2ca5b00288d58bf6bf9f14e11a Mon Sep 17 00:00:00 2001 From: root Date: Sun, 13 Jul 2025 00:36:55 +0800 Subject: [PATCH] fix: react hook --- python_core/cli/commands/template.py | 24 +++-- src/pages/TemplateDetailPageV2.tsx | 25 ++++- test_segment_rename_debug.md | 140 +++++++++++++++++++++++++++ 3 files changed, 180 insertions(+), 9 deletions(-) create mode 100644 test_segment_rename_debug.md diff --git a/python_core/cli/commands/template.py b/python_core/cli/commands/template.py index f23a845..d289171 100644 --- a/python_core/cli/commands/template.py +++ b/python_core/cli/commands/template.py @@ -495,18 +495,30 @@ def update_segment_name( updated = False tracks_data = draft_content.get('tracks', []) - for track in tracks_data: + logger.info(f"Searching for segment {segment_id} in {len(tracks_data)} tracks") + + for track_idx, track in enumerate(tracks_data): if isinstance(track, dict): segments = track.get('segments', []) - for segment in segments: - if isinstance(segment, dict) and segment.get('id') == segment_id: - segment['name'] = new_name - updated = True - break + logger.info(f"Track {track_idx} has {len(segments)} segments") + + for seg_idx, segment in enumerate(segments): + if isinstance(segment, dict): + seg_id = segment.get('id') + seg_name = segment.get('name', 'Unknown') + logger.info(f" Segment {seg_idx}: id={seg_id}, name={seg_name}") + + if seg_id == segment_id: + old_name = segment.get('name', 'Unknown') + segment['name'] = new_name + updated = True + logger.info(f"Updated segment {segment_id}: '{old_name}' -> '{new_name}'") + break if updated: break if not updated: + logger.warning(f"Segment not found: {segment_id}") response.error(-32607, f"片段不存在: {segment_id}") return diff --git a/src/pages/TemplateDetailPageV2.tsx b/src/pages/TemplateDetailPageV2.tsx index e9c74ec..e796da2 100644 --- a/src/pages/TemplateDetailPageV2.tsx +++ b/src/pages/TemplateDetailPageV2.tsx @@ -56,6 +56,15 @@ const TemplateDetailPageV2: React.FC = () => { setTemplate(templateInfo) setTemplateDetail(detail) + + // 调试信息:显示加载的模板详情 + console.log('Template detail loaded:', { + templateId: templateInfo.id, + tracksCount: detail?.tracks?.length || 0, + segments: detail?.tracks?.flatMap(track => + track.segments?.map(seg => ({ id: seg.id, name: seg.name })) || [] + ) || [] + }) } catch (error) { console.error('Failed to load template detail:', error) } finally { @@ -94,7 +103,7 @@ const TemplateDetailPageV2: React.FC = () => { if (!templateDetail || !template) return try { - // 先更新本地状态中的片段名称 + // 先更新本地状态中的片段名称(立即响应用户操作) const updatedDetail = { ...templateDetail, tracks: templateDetail.tracks.map(track => ({ @@ -116,13 +125,23 @@ const TemplateDetailPageV2: React.FC = () => { if (success) { console.log(`Segment ${segmentId} renamed to: ${newName} - saved to database`) + + // 重新加载模板详情以确保数据一致性 + const freshDetail = await TemplateServiceV2.getTemplateDetail(template.id) + if (freshDetail) { + setTemplateDetail(freshDetail) + console.log('Template detail reloaded from database') + } } else { console.error('Failed to save segment name change to database') - // 可以选择回滚本地状态或显示错误提示 + // 回滚本地状态 + await loadTemplateDetail() + alert('保存片段名称失败,已恢复原始状态') } } catch (error) { console.error('Error updating segment name:', error) - // 可以选择回滚本地状态或显示错误提示 + // 回滚本地状态 + await loadTemplateDetail() alert('保存片段名称失败: ' + (error instanceof Error ? error.message : '未知错误')) } } diff --git a/test_segment_rename_debug.md b/test_segment_rename_debug.md new file mode 100644 index 0000000..ed6ef0a --- /dev/null +++ b/test_segment_rename_debug.md @@ -0,0 +1,140 @@ +# 片段重命名调试指南 + +## 问题诊断步骤 + +### 1. 检查前端调用 + +在浏览器开发者工具的控制台中查看以下日志: + +```javascript +// 当用户重命名片段时,应该看到: +"Segment {segmentId} renamed to: {newName} - saved to database" +"Template detail reloaded from database" + +// 以及模板详情加载日志: +"Template detail loaded: {templateId: ..., tracksCount: ..., segments: [...]}" +``` + +### 2. 检查后端日志 + +在后端日志中查看以下信息: + +``` +INFO - Searching for segment {segment_id} in {track_count} tracks +INFO - Track {track_idx} has {segment_count} segments +INFO - Segment {seg_idx}: id={seg_id}, name={seg_name} +INFO - Updated segment {segment_id}: '{old_name}' -> '{new_name}' +``` + +### 3. 验证数据库更新 + +可以通过以下方式验证: + +1. **前端验证**: + - 重命名片段后,刷新页面 + - 检查片段名称是否保持新名称 + +2. **后端验证**: + - 查看数据库中的 `draft_content` 字段 + - 确认片段名称已更新 + +### 4. 常见问题排查 + +#### 问题1:片段ID不匹配 +- **症状**:后端日志显示"片段不存在" +- **原因**:前端传递的 segmentId 与数据库中的不匹配 +- **解决**:检查片段ID的生成和传递逻辑 + +#### 问题2:权限问题 +- **症状**:后端返回"无权限修改模板" +- **原因**:用户ID不匹配或权限验证失败 +- **解决**:检查用户认证状态 + +#### 问题3:数据库连接问题 +- **症状**:更新操作失败 +- **原因**:数据库连接或事务问题 +- **解决**:检查数据库连接和事务处理 + +#### 问题4:前端状态不同步 +- **症状**:本地显示更新但刷新后恢复 +- **原因**:后端更新失败但前端没有回滚 +- **解决**:检查错误处理和状态回滚逻辑 + +## 调试命令 + +### 手动测试后端API + +```bash +# 测试更新片段名称 +python -m python_core.cli template update-segment "新名称" --user-id --verbose + +# 测试获取模板详情 +python -m python_core.cli template detail --user-id --verbose +``` + +### 检查数据库状态 + +```sql +-- 查看模板的 draft_content +SELECT id, name, draft_content FROM templates WHERE id = ''; + +-- 检查片段名称 +SELECT + id, + name, + JSON_EXTRACT(draft_content, '$.tracks[*].segments[*].name') as segment_names +FROM templates +WHERE id = ''; +``` + +## 预期行为 + +### 正常流程 + +1. **用户操作**:双击片段 → 选择分类 → 确认 +2. **前端处理**: + - 立即更新本地状态(UI响应) + - 调用后端API保存 + - 重新加载模板详情 +3. **后端处理**: + - 验证权限和数据 + - 更新数据库中的 draft_content + - 返回成功状态 +4. **结果验证**: + - 页面刷新后名称保持 + - 控制台显示成功日志 + +### 错误处理 + +1. **网络错误**:显示错误提示,回滚本地状态 +2. **权限错误**:显示权限提示 +3. **数据错误**:显示数据错误提示,回滚状态 + +## 修复历史 + +### 已修复的问题 + +1. ✅ **后端API缺失**:添加了 `update-segment` CLI命令 +2. ✅ **前端调用缺失**:添加了 `updateSegmentName` 方法 +3. ✅ **状态同步问题**:添加了重新加载逻辑 +4. ✅ **错误处理**:添加了完善的错误处理和回滚 + +### 当前状态 + +- ✅ Python CLI命令:`template update-segment` +- ✅ Rust Tauri命令:`update_template_segment_cli` +- ✅ TypeScript服务方法:`updateSegmentName` +- ✅ 前端处理逻辑:`handleSegmentNameChange` +- ✅ 错误处理和状态回滚 +- ✅ 调试日志和验证 + +## 下一步 + +如果问题仍然存在,请: + +1. 检查浏览器控制台的日志输出 +2. 检查后端服务的日志 +3. 手动测试后端CLI命令 +4. 验证数据库中的数据是否正确更新 + +通过这些步骤可以准确定位问题所在。