Files
nl-blogs/.trae/documents/plan_20260114_083525.md
2026-01-15 13:51:44 +08:00

2.9 KiB
Raw Permalink Blame History

修复加载用户数据失败问题

问题分析

错误信息

  • "加载用户数据失败: 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导致解析错误

检查结果

  • 服务器端存在adminGetUsersadminCreateUseradminUpdateUseradminDeleteUser函数
  • 缺少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函数
  • 如果不存在,创建该函数:
    func GetUserByID(id uint) (*models.User, error) {
        // 实现逻辑
    }
    

2. 创建adminGetUser函数

  • 在server/main.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路由组中添加
    authAdmin.GET("/users/:id", middleware.RoleMiddleware("admin"), adminGetUser)
    

4. 重启服务器并测试

  • 重启服务器使新路由生效
  • 访问编辑用户页面,验证能正确加载用户数据

风险评估

  • 修复后对现有功能无影响
  • 仅添加新功能,不修改现有逻辑
  • 遵循现有的代码架构和风格
  • 与其他资源的详情API保持一致的实现方式