package controller import ( "net/http" "strconv" "gofaster/internal/auth/model" "gofaster/internal/auth/service" "gofaster/internal/shared/response" "github.com/gin-gonic/gin" "gorm.io/gorm" ) // UserController 用户控制器 type UserController struct { userService *service.UserService } // NewUserController 创建用户控制器实例 func NewUserController(userService *service.UserService) *UserController { return &UserController{userService: userService} } // ListUsers godoc // @Summary 获取用户列表 // @Description 获取分页用户列表 // @Tags 用户管理 // @Accept json // @Produce json // @Param page query int false "页码" default(1) // @Param pageSize query int false "每页数量" default(10) // @Success 200 {object} map[string]interface{} "用户列表" // @Failure 400 {object} map[string]string "请求参数错误" // @Failure 500 {object} map[string]string "服务器内部错误" // @Router /auth/admin/users [get] func (c *UserController) ListUsers(ctx *gin.Context) { // 获取分页参数,默认值 page=1, pageSize=10 pageStr := ctx.DefaultQuery("page", "1") pageSizeStr := ctx.DefaultQuery("pageSize", "10") page, err := strconv.Atoi(pageStr) if err != nil || page < 1 { response.Error(ctx, http.StatusBadRequest, "请求参数错误", "无效的页码参数") return } pageSize, err := strconv.Atoi(pageSizeStr) if err != nil || pageSize < 1 || pageSize > 100 { response.Error(ctx, http.StatusBadRequest, "请求参数错误", "无效的每页大小参数,范围1-100") return } // 调用服务层获取用户列表 users, total, err := c.userService.ListUsers(ctx.Request.Context(), page, pageSize) if err != nil { response.Error(ctx, http.StatusInternalServerError, "获取用户列表失败", err.Error()) return } // 返回分页结果 response.Success(ctx, "获取用户列表成功", gin.H{ "data": users, "total": total, "page": page, "size": pageSize, }) } // CreateUser godoc // @Summary 创建用户 // @Description 创建新用户 // @Tags 用户管理 // @Accept json // @Produce json // @Param user body model.User true "用户信息" // @Success 201 {object} model.User "创建的用户信息" // @Failure 400 {object} map[string]string "请求参数错误" // @Failure 500 {object} map[string]string "服务器内部错误" // @Router /auth/admin/users [post] func (c *UserController) CreateUser(ctx *gin.Context) { var user model.User if err := ctx.ShouldBindJSON(&user); err != nil { response.Error(ctx, http.StatusBadRequest, "请求参数错误", err.Error()) return } if err := c.userService.CreateUser(ctx.Request.Context(), &user); err != nil { response.Error(ctx, http.StatusInternalServerError, "创建用户失败", err.Error()) return } response.Success(ctx, "用户创建成功", user) } // GetUser godoc // @Summary 获取用户详情 // @Description 根据ID获取用户详情 // @Tags 用户管理 // @Accept json // @Produce json // @Param id path int true "用户ID" // @Success 200 {object} model.User "用户信息" // @Failure 400 {object} map[string]string "无效的用户ID" // @Failure 404 {object} map[string]string "用户不存在" // @Failure 500 {object} map[string]string "服务器内部错误" // @Router /auth/admin/users/{id} [get] func (c *UserController) GetUser(ctx *gin.Context) { idStr := ctx.Param("id") id, err := strconv.ParseUint(idStr, 10, 32) if err != nil { response.Error(ctx, http.StatusBadRequest, "请求参数错误", "无效的用户ID") return } user, err := c.userService.GetUserByID(ctx.Request.Context(), uint(id)) if err != nil { if err == gorm.ErrRecordNotFound { response.Error(ctx, http.StatusNotFound, "用户不存在", "未找到指定ID的用户") return } response.Error(ctx, http.StatusInternalServerError, "获取用户信息失败", err.Error()) return } response.Success(ctx, "获取用户信息成功", user) } // UpdateUser godoc // @Summary 更新用户信息 // @Description 根据ID更新用户信息 // @Tags 用户管理 // @Accept json // @Produce json // @Param id path int true "用户ID" // @Param user body model.User true "用户信息" // @Success 200 {object} model.User "更新后的用户信息" // @Failure 400 {object} map[string]string "无效的用户ID或请求参数" // @Failure 404 {object} map[string]string "用户不存在" // @Failure 500 {object} map[string]string "服务器内部错误" // @Router /auth/admin/users/{id} [put] func (c *UserController) UpdateUser(ctx *gin.Context) { idStr := ctx.Param("id") id, err := strconv.ParseUint(idStr, 10, 32) if err != nil { response.Error(ctx, http.StatusBadRequest, "请求参数错误", "无效的用户ID") return } var user model.User if err := ctx.ShouldBindJSON(&user); err != nil { response.Error(ctx, http.StatusBadRequest, "请求参数错误", err.Error()) return } // 确保更新的是正确的用户ID user.ID = uint(id) // 密码只能通过专门的密码修改接口修改,不允许在用户信息更新中修改 user.Password = "" if err := c.userService.UpdateUser(ctx.Request.Context(), &user); err != nil { if err == gorm.ErrRecordNotFound { response.Error(ctx, http.StatusNotFound, "用户不存在", "未找到指定ID的用户") return } response.Error(ctx, http.StatusInternalServerError, "更新用户信息失败", err.Error()) return } response.Success(ctx, "用户信息更新成功", user) } // DeleteUser godoc // @Summary 删除用户 // @Description 根据ID删除用户 // @Tags 用户管理 // @Accept json // @Produce json // @Param id path int true "用户ID" // @Success 204 "删除成功" // @Failure 400 {object} map[string]string "无效的用户ID" // @Failure 404 {object} map[string]string "用户不存在" // @Failure 500 {object} map[string]string "服务器内部错误" // @Router /auth/admin/users/{id} [delete] func (c *UserController) DeleteUser(ctx *gin.Context) { idStr := ctx.Param("id") id, err := strconv.ParseUint(idStr, 10, 32) if err != nil { response.Error(ctx, http.StatusBadRequest, "请求参数错误", "无效的用户ID") return } if err := c.userService.DeleteUser(ctx.Request.Context(), uint(id)); err != nil { if err == gorm.ErrRecordNotFound { response.Error(ctx, http.StatusNotFound, "用户不存在", "未找到指定ID的用户") return } response.Error(ctx, http.StatusInternalServerError, "删除用户失败", err.Error()) return } response.Success(ctx, "用户删除成功", nil) }