帖子功能
route.go
r.Use(middleware.JWTAuthMiddleware()){r.POST("/post", controller.CreatePostHandler)r.GET("/post/:id", controller.GetPostDetailHandler)}
post.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
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
處理請求
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.PostDtopostDto, 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
處理邏輯
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
操作數據庫
func CreatePost(post *models.Post) error {err := db.Create(post).Errorreturn err
}func GetPostDetail(id int64) (*models.Post, error) {var post models.Posterr := db.Where("post_id = ?", id).First(&post).Errorif err != nil {return nil, err}return &post, nil
}