fix: react hook

This commit is contained in:
root 2025-07-13 00:36:55 +08:00
parent 2bca550848
commit 93dd60c082
3 changed files with 180 additions and 9 deletions

View File

@ -495,18 +495,30 @@ def update_segment_name(
updated = False updated = False
tracks_data = draft_content.get('tracks', []) 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): if isinstance(track, dict):
segments = track.get('segments', []) segments = track.get('segments', [])
for segment in segments: logger.info(f"Track {track_idx} has {len(segments)} segments")
if isinstance(segment, dict) and segment.get('id') == segment_id:
segment['name'] = new_name for seg_idx, segment in enumerate(segments):
updated = True if isinstance(segment, dict):
break 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: if updated:
break break
if not updated: if not updated:
logger.warning(f"Segment not found: {segment_id}")
response.error(-32607, f"片段不存在: {segment_id}") response.error(-32607, f"片段不存在: {segment_id}")
return return

View File

@ -56,6 +56,15 @@ const TemplateDetailPageV2: React.FC = () => {
setTemplate(templateInfo) setTemplate(templateInfo)
setTemplateDetail(detail) 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) { } catch (error) {
console.error('Failed to load template detail:', error) console.error('Failed to load template detail:', error)
} finally { } finally {
@ -94,7 +103,7 @@ const TemplateDetailPageV2: React.FC = () => {
if (!templateDetail || !template) return if (!templateDetail || !template) return
try { try {
// 先更新本地状态中的片段名称 // 先更新本地状态中的片段名称(立即响应用户操作)
const updatedDetail = { const updatedDetail = {
...templateDetail, ...templateDetail,
tracks: templateDetail.tracks.map(track => ({ tracks: templateDetail.tracks.map(track => ({
@ -116,13 +125,23 @@ const TemplateDetailPageV2: React.FC = () => {
if (success) { if (success) {
console.log(`Segment ${segmentId} renamed to: ${newName} - saved to database`) 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 { } else {
console.error('Failed to save segment name change to database') console.error('Failed to save segment name change to database')
// 可以选择回滚本地状态或显示错误提示 // 回滚本地状态
await loadTemplateDetail()
alert('保存片段名称失败,已恢复原始状态')
} }
} catch (error) { } catch (error) {
console.error('Error updating segment name:', error) console.error('Error updating segment name:', error)
// 可以选择回滚本地状态或显示错误提示 // 回滚本地状态
await loadTemplateDetail()
alert('保存片段名称失败: ' + (error instanceof Error ? error.message : '未知错误')) alert('保存片段名称失败: ' + (error instanceof Error ? error.message : '未知错误'))
} }
} }

View File

@ -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 <template_id> <segment_id> "新名称" --user-id <user_id> --verbose
# 测试获取模板详情
python -m python_core.cli template detail <template_id> --user-id <user_id> --verbose
```
### 检查数据库状态
```sql
-- 查看模板的 draft_content
SELECT id, name, draft_content FROM templates WHERE id = '<template_id>';
-- 检查片段名称
SELECT
id,
name,
JSON_EXTRACT(draft_content, '$.tracks[*].segments[*].name') as segment_names
FROM templates
WHERE id = '<template_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. 验证数据库中的数据是否正确更新
通过这些步骤可以准确定位问题所在。