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
}
相关推荐
林太白5 分钟前
NestJS-角色模块
前端·javascript·nestjs
种豆走天下8 分钟前
VUE进阶案例
前端·javascript·vue.js
陈随易14 分钟前
盘点微信开发者工具V1和V2的区别
前端·后端·程序员
zengyuhan50315 分钟前
使用Rust 串口通信 及 MTP文件获取
前端·rust
小宋搬砖第一名17 分钟前
阿里云部署小白教程
前端
陈随易19 分钟前
ECharts v6.0发布,新布局,新主题,新功能
前端·后端·程序员
HHW20 分钟前
更快更强的 JavaScript 运行时:Bun 入门与实践指南
前端·javascript
好奇心笔记25 分钟前
现代Web开发最佳实践:2025年前沿技术与工程化指南
前端
小宁爱Python26 分钟前
Vue3 状态管理新选择:Pinia 从入门到实战
前端·javascript·vue.js
2zcode40 分钟前
基于Matlab图像处理的静态雨滴去除与质量评估系统
开发语言·图像处理·matlab