# 修复加载用户数据失败问题 ## 问题分析 ### 错误信息 - "加载用户数据失败: 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保持一致的实现方式