Go 帖子模块服务端接口开发

2021年02月27日 640次浏览 Golang

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

  • 结构体:topic_model
  • 业务服务:topic_service
  • 控制器:topic_controller

结构体(topic_model)

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

package main

import "time"

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

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

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

业务服务(topic_service)

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

package main

import (
    "time"
)

var TopicService = &topicService{}

type topicService struct {
}

// 创建帖子
func (topicService) Create(userId int64, title, content string) (*Topic, error) {
    topic := &Topic{
        UserId:     userId,
        Title:      title,
        Content:    content,
        CreateTime: time.Now(),
    }
    err := db.Create(topic).Error
    if err != nil {
        return nil, err
    }
    return topic, nil
}

// 根据编号获取帖子
func (topicService) Get(id int64) *Topic {
    ret := &Topic{}
    if err := db.First(ret, "id = ?", id).Error; err != nil {
        return nil
    }
    return ret
}

// 查询帖子列表
func (topicService) List(page int) (topics []Topic, totalCount int) {
    if page <= 0 {
        page = 1
    }
    offset := 20 * (page - 1)
    db.Order("id desc").Offset(offset).Limit(20).Find(&topics) // 查列表
    db.Model(&Topic{}).Count(&totalCount)     // 查计数
    return
}

控制器(topic_controller)

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

package main

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

type TopicController struct {
    Ctx context.Context
}

// 创建帖子
func (this *TopicController) PostAdd() *simple.JsonResult {

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

    var (
        title   = this.Ctx.FormValue("title")
        content = this.Ctx.FormValue("content")
    )

    topic, err := TopicService.Create(user.Id, title, content)
    if err != nil {
        return simple.JsonErrorMsg(err.Error())
    }

    return simple.JsonData(topic)
}

// 根据id获取
func (this *TopicController) GetBy(id int64) *simple.JsonResult {
    topic := TopicService.Get(id)
    if topic == nil {
        return simple.JsonErrorMsg("帖子不存在")
    }
    user := UserService.Get(topic.UserId)
    return simple.NewRspBuilder(topic).Put("user", user).JsonResult()
}

// 帖子列表
func (this *TopicController) GetListBy(page int) *simple.JsonResult {
    topics, totalCount := TopicService.List(page)
    return simple.NewEmptyRspBuilder().Put("topics", topics).Put("totalCount", totalCount).JsonResult()
}

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

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

启动接口服务