返回

掌握 Go 中的用户业务逻辑处理

见解分享

如何使用 Go 完成用户业务逻辑


开发人员:的技术博客创作专家



在上一节中,我们已经大致学习了如何使用 Gin 读写请求。这一节就是实践了,完成一个用户业务逻辑处理。这一节是核心部分,因为这个项目的主要功能就是在这部分实现的。这部分的代码改动很大,毕竟要完成上述的功能会增加很多代码。

首先,来看下路由,router.go 里增加了如下内容:

// userRouter 用户相关路由
func userRouter(e *gin.Engine) {
    group := e.Group("/user")
    // 获取用户列表
    group.GET("", userList)
    // 创建用户
    group.POST("", createUser)
    // 获取单个用户
    group.GET("/:id", getUser)
    // 更新用户
    group.PUT("/:id", updateUser)
    // 删除用户
    group.DELETE("/:id", deleteUser)
}

接着,来看下控制层代码,user.go 里增加了如下内容:

// userList 获取用户列表
func userList(ctx *gin.Context) {
    var users []user.User
    db.Find(&users)
    resp := response.NewOKResponse("success", users)
    response.WriteResponse(ctx, resp)
}

// createUser 创建用户
func createUser(ctx *gin.Context) {
    var user user.User
    if err := ctx.ShouldBindJSON(&user); err != nil {
        resp := response.NewBadRequestResponse(err.Error())
        response.WriteResponse(ctx, resp)
        return
    }
    if err := db.Create(&user).Error; err != nil {
        resp := response.NewInternalServerErrorResponse(err.Error())
        response.WriteResponse(ctx, resp)
        return
    }
    resp := response.NewOKResponse("success", user)
    response.WriteResponse(ctx, resp)
}

// getUser 获取单个用户
func getUser(ctx *gin.Context) {
    var user user.User
    if err := db.First(&user, ctx.Param("id")).Error; err != nil {
        resp := response.NewNotFoundResponse(err.Error())
        response.WriteResponse(ctx, resp)
        return
    }
    resp := response.NewOKResponse("success", user)
    response.WriteResponse(ctx, resp)
}

// updateUser 更新用户
func updateUser(ctx *gin.Context) {
    var user user.User
    if err := db.First(&user, ctx.Param("id")).Error; err != nil {
        resp := response.NewNotFoundResponse(err.Error())
        response.WriteResponse(ctx, resp)
        return
    }
    if err := ctx.ShouldBindJSON(&user); err != nil {
        resp := response.NewBadRequestResponse(err.Error())
        response.WriteResponse(ctx, resp)
        return
    }
    if err := db.Save(&user).Error; err != nil {
        resp := response.NewInternalServerErrorResponse(err.Error())
        response.WriteResponse(ctx, resp)
        return
    }
    resp := response.NewOKResponse("success", user)
    response.WriteResponse(ctx, resp)
}

// deleteUser 删除用户
func deleteUser(ctx *gin.Context) {
    var user user.User
    if err := db.First(&user, ctx.Param("id")).Error; err != nil {
        resp := response.NewNotFoundResponse(err.Error())
        response.WriteResponse(ctx, resp)
        return
    }
    if err := db.Delete(&user).Error; err != nil {
        resp := response.NewInternalServerErrorResponse(err.Error())
        response.WriteResponse(ctx, resp)
        return
    }
    resp := response.NewOKResponse("success", nil)
    response.WriteResponse(ctx, resp)
}

最后,来看下数据层代码,user.go 里增加了如下内容:

// User 用户模型
type User struct {
    ID        uint64 `gorm:"primary_key;auto_increment" json:"id"`
    Username  string `gorm:"size:255;not null;unique" json:"username"`
    Password  string `gorm:"size:255;not null" json:"password"`
    CreatedAt time.Time  `gorm:"default:current_timestamp" json:"created_at"`
    UpdatedAt time.Time  `gorm:"default:current_timestamp" json:"updated_at"`
}

好了,至此,用户业务逻辑处理已经完成了。