同样的,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))
})
启动接口服务