Go-web开发之帖子功能

帖子功能

route.go

go 复制代码
	r.Use(middleware.JWTAuthMiddleware())
	{
		r.POST("/post", controller.CreatePostHandler)
		r.GET("/post/:id", controller.GetPostDetailHandler)
	}

post.go 定义帖子结构

go 复制代码
type Post struct {
	Id          int64     `json:"id" gorm:"primaryKey"`
	PostId      int64     `json:"post_id" gorm:"column:post_id"`
	CommunityId int64     `json:"community_id" gorm:"column:community_id"`
	Status      int       `json:"status" gorm:"column:status" default:"0"`
	AuthorName  string    `json:"author_name" gorm:"column:author_name"`
	Title       string    `json:"title" gorm:"column:title"`
	Content     string    `json:"content" gorm:"column:content"`
	CreateTime  time.Time `json:"create_time" gorm:"column:create_time"`
	UpdateTime  time.Time `json:"update_time" gorm:"column:update_time"`
}

func (p *Post) TableName() string {
	return "post"
}

postDto.go

go 复制代码
type PostDto struct {
	Status        int       `json:"status"`
	AuthorName    string    `json:"author_name"`
	Title         string    `json:"title"`
	Content       string    `json:"content"`
	CommunityName string    `json:"community_name"`
	CreateTime    time.Time `json:"create_time"`
	UpdateTime    time.Time `json:"update_time"`
}

postController.go 处理请求

go 复制代码
func CreatePostHandler(c *gin.Context) {
    // 1. 获取参数和参数校验
    p := new(models.Post)
    err := c.ShouldBindJSON(p)
    if err != nil {
       c.JSON(http.StatusOK, gin.H{
          "code": 30001,
          "msg":  err.Error(),
       })
       zap.L().Error("Bad query params", zap.Error(err))
       return
    }
    if len(p.Title) == 0 || len(p.Content) == 0 {
       c.JSON(http.StatusOK, gin.H{
          "code": 30002,
          "msg":  errors.New("标题和内容不能为空").Error(),
       })
       return
    }
    authorName := c.GetString("username")
    p.AuthorName = authorName
    // 2. 业务处理
    success := logic.CreatePost(p)
    if !success {
       c.JSON(http.StatusOK, gin.H{
          "msg": "创建帖子失败",
       })
       return
    }

    // 3. 返回响应
    c.JSON(http.StatusOK, gin.H{
       "code": 20000,
       "msg":  "创建帖子成功",
    })
}

func GetPostDetailHandler(c *gin.Context) {
    // 1. 获取参数和参数校验
    p := new(models.Post)
    err := c.ShouldBindQuery(p)
    if err != nil {
       c.JSON(http.StatusOK, gin.H{
          "code": 30002,
          "msg":  err.Error(),
       })
       zap.L().Error("Bad query params", zap.Error(err))
       return
    }
    idStr, ok := c.Params.Get("id")
    if len(idStr) == 0 || !ok {
       c.JSON(http.StatusOK, gin.H{
          "code": 30003,
          "msg":  err.Error(),
       })
       return
    }
    pId, _ := strconv.ParseInt(idStr, 10, 64)
    // 2. 业务处理
    var postDto *models.PostDto
    postDto, err = logic.GetPostDetail(pId)
    if err != nil {
       c.JSON(http.StatusOK, gin.H{
          "code": 30004,
          "msg":  "获取帖子详情失败",
       })
       return
    }

    // 3. 返回响应
    c.JSON(http.StatusOK, gin.H{
       "code": 20000,
       "msg":  "获取帖子详情成功",
       "data": postDto,
    })
}

postLogic.go 处理逻辑

go 复制代码
func CreatePost(post *models.Post) bool {
    if post == nil {
       return false
    }
    postUid, _ := snowflake.GetID()
    post.PostId = int64(postUid)
    post.CreateTime = time.Now()
    post.UpdateTime = time.Now()
    // 操作数据库
    err := mysql.CreatePost(post)
    if err != nil {
       zap.L().Error("CreatePost failed", zap.Error(err))
       return false
    }

    return true

}

func GetPostDetail(id int64) (*models.PostDto, error) {
    // 1. 参数校验
    if id <= 0 {
       return nil, nil
    }
    // 2. 业务处理
    post, err := mysql.GetPostDetail(id)
    if err != nil {
       zap.L().Error("GetPostDetail failed", zap.Error(err))
       return nil, err
    }
    community, err := mysql.QueryCommunityById(post.CommunityId)
    postDto := &models.PostDto{
       Status:        post.Status,
       AuthorName:    post.AuthorName,
       Title:         post.Title,
       Content:       post.Content,
       CommunityName: community.CommunityName,
       CreateTime:    post.CreateTime,
       UpdateTime:    post.UpdateTime,
    }

    return postDto, nil
}

postDao.go 操作数据库

go 复制代码
func CreatePost(post *models.Post) error {
    err := db.Create(post).Error
    return err
}

func GetPostDetail(id int64) (*models.Post, error) {
    var post models.Post
    err := db.Where("post_id = ?", id).First(&post).Error
    if err != nil {
       return nil, err
    }
    return &post, nil
}
相关推荐
Catfood_Eason9 分钟前
XML简介
xml·java·前端
jiunian_cn19 分钟前
【c++】【STL】queue详解
开发语言·c++·visualstudio
achene_ql40 分钟前
C++ 与 Lua 联合编程
开发语言·c++·lua
钢铁男儿1 小时前
C#编程精要:局部变量、类型推断与常量深度解析
java·开发语言·c#
黄同学real1 小时前
ES6 知识点整理
前端·javascript·es6
JQLvopkk1 小时前
c#读取txt指定行
java·前端·c#
Charlotte's diary2 小时前
计算机网络 - stp生成树实验
开发语言·计算机网络·php·大作业
weniry2 小时前
动态库与静态库的区别
开发语言·c++
wacpguo2 小时前
VS Code + Linux 远程开发 go
linux·运维·golang
姜太小白2 小时前
【前端】CSS实现div双背景图叠加
前端·css