97 lines
2.9 KiB
Markdown
97 lines
2.9 KiB
Markdown
|
|
# 修复加载用户数据失败问题
|
|||
|
|
|
|||
|
|
## 问题分析
|
|||
|
|
|
|||
|
|
### 错误信息
|
|||
|
|
- "加载用户数据失败: Unexpected non-whitespace character after JSON at position 4 (line 1 column 5)"
|
|||
|
|
|
|||
|
|
### 根本原因
|
|||
|
|
1. **客户端**:UserForm.vue调用`fetchUser(userId)`函数,尝试访问`GET /admin/users/:id`接口获取用户详情
|
|||
|
|
2. **服务器端**:在main.go中缺少`GET /users/:id`路由,导致请求被错误处理
|
|||
|
|
3. **响应格式**:服务器返回非JSON格式响应(可能是HTML错误页面),客户端尝试解析为JSON导致解析错误
|
|||
|
|
|
|||
|
|
### 检查结果
|
|||
|
|
- 服务器端存在`adminGetUsers`、`adminCreateUser`、`adminUpdateUser`、`adminDeleteUser`函数
|
|||
|
|
- 缺少`adminGetUser`函数用于处理单个用户详情请求
|
|||
|
|
- 路由配置中缺少`GET /users/:id`路由
|
|||
|
|
|
|||
|
|
## 解决方案
|
|||
|
|
|
|||
|
|
### 修复步骤
|
|||
|
|
|
|||
|
|
1. **创建adminGetUser函数**:
|
|||
|
|
- 在server/main.go中添加获取单个用户详情的处理函数
|
|||
|
|
- 调用repositories层的GetUserByID函数(需要检查是否存在)
|
|||
|
|
- 返回JSON格式的用户详情响应
|
|||
|
|
|
|||
|
|
2. **添加GET /users/:id路由**:
|
|||
|
|
- 在server/main.go的authAdmin路由组中添加`GET /users/:id`路由
|
|||
|
|
- 绑定到adminGetUser函数
|
|||
|
|
- 添加适当的中间件(如RoleMiddleware)
|
|||
|
|
|
|||
|
|
3. **检查repositories层**:
|
|||
|
|
- 检查是否存在GetUserByID函数
|
|||
|
|
- 如果不存在,需要创建该函数
|
|||
|
|
|
|||
|
|
4. **测试验证**:
|
|||
|
|
- 重启服务器
|
|||
|
|
- 测试编辑用户功能,确保能正确加载用户数据
|
|||
|
|
|
|||
|
|
### 预期效果
|
|||
|
|
|
|||
|
|
- 客户端能成功获取用户详情数据
|
|||
|
|
- 不再出现JSON解析错误
|
|||
|
|
- 用户编辑表单能正确填充现有数据
|
|||
|
|
|
|||
|
|
## 实现细节
|
|||
|
|
|
|||
|
|
### 1. 检查并创建GetUserByID函数
|
|||
|
|
|
|||
|
|
- 检查repositories/user_repository.go是否存在GetUserByID函数
|
|||
|
|
- 如果不存在,创建该函数:
|
|||
|
|
```go
|
|||
|
|
func GetUserByID(id uint) (*models.User, error) {
|
|||
|
|
// 实现逻辑
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. 创建adminGetUser函数
|
|||
|
|
|
|||
|
|
- 在server/main.go中添加:
|
|||
|
|
```go
|
|||
|
|
// 获取单个用户详情
|
|||
|
|
func adminGetUser(c *gin.Context) {
|
|||
|
|
id, err := strconv.ParseUint(c.Param("id"), 10, 32)
|
|||
|
|
if err != nil {
|
|||
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid user ID"})
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
user, err := repositories.GetUserByID(uint(id))
|
|||
|
|
if err != nil {
|
|||
|
|
c.JSON(http.StatusNotFound, gin.H{"error": "User not found"})
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
c.JSON(http.StatusOK, repositories.BuildUserResponse(user))
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 3. 添加GET /users/:id路由
|
|||
|
|
|
|||
|
|
- 在server/main.go的authAdmin路由组中添加:
|
|||
|
|
```go
|
|||
|
|
authAdmin.GET("/users/:id", middleware.RoleMiddleware("admin"), adminGetUser)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 4. 重启服务器并测试
|
|||
|
|
|
|||
|
|
- 重启服务器使新路由生效
|
|||
|
|
- 访问编辑用户页面,验证能正确加载用户数据
|
|||
|
|
|
|||
|
|
## 风险评估
|
|||
|
|
|
|||
|
|
- 修复后对现有功能无影响
|
|||
|
|
- 仅添加新功能,不修改现有逻辑
|
|||
|
|
- 遵循现有的代码架构和风格
|
|||
|
|
- 与其他资源的详情API保持一致的实现方式
|