You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

210 lines
5.9 KiB

package controller
import (
"net/http"
"strconv"
"gofaster/internal/model"
"gofaster/internal/service"
"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}
}
// RegisterRoutes 注册用户路由
func (c *UserController) RegisterRoutes(r *gin.RouterGroup) {
r.GET("/users", c.ListUsers)
r.POST("/users", c.CreateUser)
r.GET("/users/:id", c.GetUser)
r.PUT("/users/:id", c.UpdateUser)
r.DELETE("/users/:id", c.DeleteUser)
}
// 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 /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 {
ctx.JSON(http.StatusBadRequest, gin.H{"error": "无效的页码参数"})
return
}
pageSize, err := strconv.Atoi(pageSizeStr)
if err != nil || pageSize < 1 || pageSize > 100 {
ctx.JSON(http.StatusBadRequest, gin.H{"error": "无效的每页大小参数,范围1-100"})
return
}
// 调用服务层获取用户列表
users, total, err := c.userService.ListUsers(page, pageSize)
if err != nil {
ctx.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
// 返回分页结果
ctx.JSON(http.StatusOK, 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 /users [post]
func (c *UserController) CreateUser(ctx *gin.Context) {
var user model.User
if err := ctx.ShouldBindJSON(&user); err != nil {
ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
if err := c.userService.CreateUser(&user); err != nil {
ctx.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
ctx.JSON(http.StatusCreated, 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 /users/{id} [get]
func (c *UserController) GetUser(ctx *gin.Context) {
idStr := ctx.Param("id")
id, err := strconv.ParseUint(idStr, 10, 32)
if err != nil {
ctx.JSON(http.StatusBadRequest, gin.H{"error": "无效的用户ID"})
return
}
user, err := c.userService.GetUserByID(uint(id))
if err != nil {
if err == gorm.ErrRecordNotFound {
ctx.JSON(http.StatusNotFound, gin.H{"error": "用户不存在"})
return
}
ctx.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
ctx.JSON(http.StatusOK, 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 /users/{id} [put]
func (c *UserController) UpdateUser(ctx *gin.Context) {
idStr := ctx.Param("id")
id, err := strconv.ParseUint(idStr, 10, 32)
if err != nil {
ctx.JSON(http.StatusBadRequest, gin.H{"error": "无效的用户ID"})
return
}
var user model.User
if err := ctx.ShouldBindJSON(&user); err != nil {
ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
// 确保更新的是正确的用户ID
user.ID = uint(id)
if err := c.userService.UpdateUser(&user); err != nil {
if err == gorm.ErrRecordNotFound {
ctx.JSON(http.StatusNotFound, gin.H{"error": "用户不存在"})
return
}
ctx.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
ctx.JSON(http.StatusOK, 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 /users/{id} [delete]
func (c *UserController) DeleteUser(ctx *gin.Context) {
idStr := ctx.Param("id")
id, err := strconv.ParseUint(idStr, 10, 32)
if err != nil {
ctx.JSON(http.StatusBadRequest, gin.H{"error": "无效的用户ID"})
return
}
if err := c.userService.DeleteUser(uint(id)); err != nil {
if err == gorm.ErrRecordNotFound {
ctx.JSON(http.StatusNotFound, gin.H{"error": "用户不存在"})
return
}
ctx.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
ctx.JSON(http.StatusNoContent, nil)
}