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
}
相关推荐
青岑CTF1 分钟前
攻防世界-Web_php_include-胎教版wp
开发语言·安全·web安全·网络安全·php
雾岛听蓝8 分钟前
C++11 列表初始化与右值引用核心解析
开发语言·c++·经验分享
穿过锁扣的风10 分钟前
如何操作HTML网页
前端·javascript·html
San30.17 分钟前
从零构建坚固的前端堡垒:TypeScript 与 React 实战深度指南
前端·react.js·typescript
小北方城市网18 分钟前
Spring Boot 多数据源与事务管理实战:主从分离、动态切换与事务一致性
java·开发语言·jvm·数据库·mysql·oracle·mybatis
痴儿哈哈18 分钟前
C++与硬件交互编程
开发语言·c++·算法
yunhuibin30 分钟前
VideoPipe环境搭建及编译ubuntu240403
前端·人工智能
roman_日积跬步-终至千里38 分钟前
【Java 并发-面试】从线程基础到企业级开发的知识点概况
java·开发语言
云中飞鸿39 分钟前
VS2015安装后,安装QT59,之后安装qt-vsaddin-msvc2015-2.4.3.vsix 文件失败问题!
开发语言·qt
m0_7482331742 分钟前
C与C++:底层编程的六大核心共性
java·开发语言