Go 搭建跟帖模块之服务端功能开发

滔哥 2021年02月27日 310次浏览

同样的,Go 语言的服务端跟帖模块相关代码我们分为以下三部分:

  • 结构体:comment_model
  • 业务服务:comment_service
  • 控制器:comment_controller

结构体(comment_model)

新建文件server/comment_model.go,在该文件中定义跟帖的结构体,完整代码如下:

package main

import "time"

type Comment struct {
    Id         int64     `gorm:"PRIMARY_KEY;AUTO_INCREMENT" json:"id"`  // 编号
    UserId     int64     `gorm:"not null" json:"userId"`                // 作者编号
    TopicId    int64     `gorm:"size:128;not null" json:"topicId"`      // 帖子编号
    Content    string    `gorm:"type:longtext;not null" json:"content"` // 内容
    CreateTime time.Time `gorm:"not null" json:"createTime"`            // 创建时间
}

跟帖结构体定义完成之后不要忘记将Comment结构体放入gorm的AutoMigrate中,这样启动服务的时候gorm会自动创建 comment 表,打开server/main.go,修改gorm配置如下:

db.AutoMigrate(&User{}, &UserToken{}, &Topic{}, &Comment{})

业务服务(comment_service)

新建文件server/comment_service.go,在该文件中我们去实现跟帖相关的业务逻辑,并进行数据库的读写操作,完整代码如下:

package main

import (
    "time"
)

var CommentService = &commentService{}

type commentService struct {
}

// 创建评论
func (commentService) Create(userId, topicId int64, content string) (*Comment, error) {
    comment := &Comment{
        UserId:     userId,
        TopicId:    topicId,
        Content:    content,
        CreateTime: time.Now(),
    }
    if err := db.Create(comment).Error; err != nil {
        return nil, err
    }
    return comment, nil
}

// 评论列表
func (commentService) List(topicId int64, page int) (comments []Comment, totalCount int) {
    if page <= 0 {
        page = 1
    }
    offset := 20 * (page - 1)
    db.Where("topic_id = ?", topicId).Order("id desc").Offset(offset).Limit(20).Find(&comments) // 查列表
    db.Where("topic_id = ?", topicId).Model(&Comment{}).Count(&totalCount)                      // 查计数
    return
}

控制器(comment_controller)

新建文件server/comment_controller.go,该文件中定义跟帖相关接口,完整代码如下:

package main

import (
    "github.com/kataras/iris/context"
    "github.com/mlogclub/simple"
)

type CommentController struct {
    Ctx context.Context
}

// 发表评论
func (this *CommentController) PostAdd() *simple.JsonResult {
    // 获取当前登录用户,发表评论必须要求用户已经登录了
    user := UserService.GetCurrent(this.Ctx)
    if user == nil {
        return simple.JsonErrorMsg("请先登录")
    }

    var (
        topicId = this.Ctx.PostValueInt64Default("topicId", 0)
        content = this.Ctx.FormValue("content")
    )

    // 校验数据
    if topicId <= 0 {
        return simple.JsonErrorMsg("请传入正确的帖子编号")
    }
    if len(content) == 0 {
        return simple.JsonErrorMsg("请输入评论内容")
    }

    // 写入数据
    comment, err := CommentService.Create(user.Id, topicId, content)
    if err != nil {
        return simple.JsonErrorMsg(err.Error())
    }

    return simple.NewRspBuilder(comment).Put("user", user).JsonResult()
}

// 评论列表
func (this *CommentController) GetList() *simple.JsonResult {
    page := this.Ctx.URLParamIntDefault("page", 1)
    topicId := this.Ctx.URLParamInt64Default("topicId", 0)
    if topicId <= 0 {
        return simple.JsonErrorMsg("请传入正确的帖子编号")
    }
    comments, totalCount := CommentService.List(topicId, page)

    var commentList []map[string]interface{}
    for _, comment := range comments {
        // 将评论的作者信息查询出来,并放到评论信息中一起返回
        user := UserService.Get(comment.UserId)
        commentList = append(commentList, simple.NewRspBuilder(comment).Put("user", user).Build())
    }
    return simple.NewEmptyRspBuilder().Put("comments", commentList).Put("totalCount", totalCount).JsonResult()
}

完成comment_controller功能开发之后,需要将comment_controller添加到iris路由中,打开server/main.go文件,修改代码如下:

mvc.Configure(app.Party("/api/comment"), func(mvcApp *mvc.Application) {
    mvcApp.Handle(new(CommentController))
})

启动服务