fix: react hook
This commit is contained in:
parent
2bca550848
commit
93dd60c082
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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 : '未知错误'))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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. 验证数据库中的数据是否正确更新
|
||||||
|
|
||||||
|
通过这些步骤可以准确定位问题所在。
|
||||||
Loading…
Reference in New Issue