|
| 1 | +# Wiki API 修复总结 |
| 2 | + |
| 3 | +## 修复概述 |
| 4 | + |
| 5 | +已成功修复Wiki API的三个关键问题,所有修改集中在一个文件中:`routers/api/v1/repo/wiki.go` |
| 6 | + |
| 7 | +提交ID: `44c5b7f762` |
| 8 | +提交时间: 2025-11-24 |
| 9 | + |
| 10 | +## 修复详情 |
| 11 | + |
| 12 | +### 1. Issue #2 Problem 3: Revisions API返回格式错误 (优先级: P1) |
| 13 | + |
| 14 | +**问题描述**: |
| 15 | +- Revisions API直接返回数组,导致前端JavaScript无法访问`.commits`属性 |
| 16 | +- 期望返回`WikiCommitList`对象结构:`{commits: [...], count: N}` |
| 17 | + |
| 18 | +**修复方案**: |
| 19 | +```go |
| 20 | +// 文件位置: routers/api/v1/repo/wiki.go 第451-455行 |
| 21 | +// 使用convert.ToWikiCommitList()正确包装响应 |
| 22 | +result := convert.ToWikiCommitList(commitsHistory, commitsCount) |
| 23 | +ctx.JSON(http.StatusOK, result) |
| 24 | +``` |
| 25 | + |
| 26 | +**修复效果**: |
| 27 | +- ✅ API返回正确的`WikiCommitList`结构 |
| 28 | +- ✅ 前端可以正常访问`.commits`和`.count`属性 |
| 29 | + |
| 30 | +--- |
| 31 | + |
| 32 | +### 2. Issue #2 Problems 1 & 2: GET API内容缺失和404错误 (优先级: P0) |
| 33 | + |
| 34 | +**问题描述**: |
| 35 | +- Problem 1: GET API不返回`content_base64`字段 |
| 36 | +- Problem 2: GET API对非Home页面返回404错误 |
| 37 | +- 根本原因: `wikiContentsByName()`只查找一种文件路径格式,而Wiki页面在Git中可能以两种格式存储 |
| 38 | + |
| 39 | +**修复方案**: |
| 40 | +```go |
| 41 | +// 文件位置: routers/api/v1/repo/wiki.go 第518-542行 |
| 42 | +func wikiContentsByName(ctx *context.APIContext, commit *git.Commit, wikiName wiki_service.WebPath, isSidebarOrFooter bool) (string, string) { |
| 43 | + // 同时尝试查找unescaped和escaped两种文件格式 |
| 44 | + unescaped := string(wikiName) + ".md" |
| 45 | + gitPath := wiki_service.WebPathToGitPath(wikiName) |
| 46 | + |
| 47 | + // 先尝试unescaped版本 (如: Page-Name.md) |
| 48 | + entry, err := findEntryForFile(commit, unescaped) |
| 49 | + if err == nil && entry != nil { |
| 50 | + return wikiContentsByEntry(ctx, entry), unescaped |
| 51 | + } |
| 52 | + |
| 53 | + // 如果找不到,尝试escaped gitPath版本 (如: Page%20Name.md) |
| 54 | + entry, err = findEntryForFile(commit, gitPath) |
| 55 | + // ... 错误处理 |
| 56 | +} |
| 57 | +``` |
| 58 | + |
| 59 | +**修复效果**: |
| 60 | +- ✅ GET API正确返回`content_base64`字段 |
| 61 | +- ✅ 解决了大部分页面返回404的问题 |
| 62 | +- ✅ 与Service层的`prepareGitPath()`逻辑保持一致 |
| 63 | +- ✅ 支持两种文件格式的向后兼容 |
| 64 | + |
| 65 | +--- |
| 66 | + |
| 67 | +### 3. Issue #1: PATCH API标题处理错误 |
| 68 | + |
| 69 | +**问题描述**: |
| 70 | +- 当请求体包含`Title`字段时,即使值与当前标题相同,也会通过`UserTitleToWebPath()`重新转换 |
| 71 | +- 转换可能导致WebPath与原始值不一致,触发不必要的重命名 |
| 72 | +- 特别严重的是,空标题或"."会被转换成"unnamed" |
| 73 | + |
| 74 | +**修复方案**: |
| 75 | +```go |
| 76 | +// 文件位置: routers/api/v1/repo/wiki.go 第137-154行 |
| 77 | +oldWikiName := wiki_service.WebPathFromRequest(ctx.PathParamRaw("pageName")) |
| 78 | + |
| 79 | +var newWikiName wiki_service.WebPath |
| 80 | +if form.Title == "" { |
| 81 | + newWikiName = oldWikiName |
| 82 | +} else { |
| 83 | + // 比较标题是否相同,避免不必要的转换 |
| 84 | + _, currentTitle := wiki_service.WebPathToUserTitle(oldWikiName) |
| 85 | + if strings.TrimSpace(form.Title) == currentTitle { |
| 86 | + // 标题未改变,保持原有的WebPath |
| 87 | + newWikiName = oldWikiName |
| 88 | + } else { |
| 89 | + newWikiName = wiki_service.UserTitleToWebPath("", form.Title) |
| 90 | + } |
| 91 | +} |
| 92 | +``` |
| 93 | + |
| 94 | +**修复效果**: |
| 95 | +- ✅ 避免不必要的路径转换 |
| 96 | +- ✅ 防止意外重命名 |
| 97 | +- ✅ PATCH API正确更新指定的页面 |
| 98 | +- ✅ 修复了总是更新"unnamed"页面的bug |
| 99 | + |
| 100 | +## 技术说明 |
| 101 | + |
| 102 | +### Wiki路径格式兼容性 |
| 103 | + |
| 104 | +Wiki文件在Git仓库中可能以两种格式存储: |
| 105 | + |
| 106 | +1. **Unescaped格式**: `Page-Name.md` |
| 107 | + - 破折号表示空格分隔 |
| 108 | + - 无特殊字符编码 |
| 109 | + |
| 110 | +2. **Escaped格式**: `Page%20Name.md` |
| 111 | + - URL编码格式 |
| 112 | + - 空格编码为`%20` |
| 113 | + |
| 114 | +修复方案确保API层与Service层行为一致,都能正确查找两种格式。 |
| 115 | + |
| 116 | +### 路径转换链 |
| 117 | + |
| 118 | +``` |
| 119 | +用户输入标题 -> WebPath -> GitPath -> Git文件 |
| 120 | + ↓ ↓ ↓ |
| 121 | +"My Page" -> "My-Page" -> "My Page.md" (unescaped) |
| 122 | + "My%20Page.md" (escaped) |
| 123 | +``` |
| 124 | + |
| 125 | +## 验证建议 |
| 126 | + |
| 127 | +建议测试以下场景: |
| 128 | + |
| 129 | +1. **GET API测试**: |
| 130 | + - 获取Home页面 |
| 131 | + - 获取非Home页面(不同命名格式) |
| 132 | + - 验证`content_base64`字段存在且正确 |
| 133 | + |
| 134 | +2. **Revisions API测试**: |
| 135 | + - 调用`/repos/{owner}/{repo}/wiki/revisions/{pageName}` |
| 136 | + - 验证响应包含`.commits`和`.count`属性 |
| 137 | + |
| 138 | +3. **PATCH API测试**: |
| 139 | + - 更新页面但保持标题不变 |
| 140 | + - 更新页面并修改标题 |
| 141 | + - 验证正确的页面被更新 |
| 142 | + |
| 143 | +## 后续工作 |
| 144 | + |
| 145 | +- ✅ 代码修复完成 |
| 146 | +- ⏳ 等待测试验证 |
| 147 | +- ⏳ 回复并关闭相关工单 |
| 148 | + |
| 149 | +## 文件变更 |
| 150 | + |
| 151 | +``` |
| 152 | +修改文件: routers/api/v1/repo/wiki.go |
| 153 | +变更行数: +23 -9 |
| 154 | +提交ID: 44c5b7f762 |
| 155 | +``` |
| 156 | + |
| 157 | +--- |
| 158 | + |
| 159 | +**生成时间**: 2025-11-24 |
| 160 | +**修复人员**: Claude Code Assistant |
0 commit comments