package plant import ( "sundynix-go/global" "sundynix-go/model/plant" plantReq "sundynix-go/model/plant/request" "sundynix-go/model/system" "gorm.io/gorm" ) type PostService struct{} var PostServiceApp = new(PostService) // PublishPost 发表帖子 func (s *PostService) PublishPost(req plantReq.CreatePost, userId string) error { return global.DB.Transaction(func(tx *gorm.DB) error { //1.验证oss是否存在 var ossList []*system.Oss err := tx.Where("id in ?", req.OssIds).Find(&ossList).Error if err != nil { return err } //2.保存帖子 post := plant.Post{ Title: req.Title, UserId: userId, Content: req.Content, Location: req.Location, } err = tx.Create(&post).Error if err != nil { return err } //3.处理图片关系 if len(ossList) > 0 { var relations []map[string]interface{} for _, oss := range ossList { relations = append(relations, map[string]interface{}{ "post_id": post.Id, "oss_id": oss.Id, }) } err = tx.Table("sundynix_post_oss").Create(relations).Error if err != nil { return err } } return nil }) } // PostPage 帖子列表 func (s *PostService) PostPage(req plantReq.PostPage, userId string) (list interface{}, total int64, err error) { limit := req.PageSize offset := req.PageSize * (req.Current - 1) db := global.DB.Model(&plant.Post{}). Preload("ImgList", func(db *gorm.DB) *gorm.DB { return db.Order("created_at desc") }). Preload("Publisher", func(db *gorm.DB) *gorm.DB { return db.Preload("Avatar") }). Preload("LikeList", func(db *gorm.DB) *gorm.DB { return db.Preload("Liker", func(db *gorm.DB) *gorm.DB { return db.Preload("Avatar") }) }). Preload("CommentList", func(db *gorm.DB) *gorm.DB { return db.Preload("Commentator", func(db *gorm.DB) *gorm.DB { return db.Preload("Avatar") }) }) var posts []plant.Post if req.Title != "" { db = db.Where("title like ?", "%"+req.Title+"%") } //todo 审核帖子 err = db.Count(&total).Error if err != nil { return } err = db.Limit(limit).Offset(offset).Order("created_at desc").Find(&posts).Error // 优化 N+1 查询 var postIds []string for _, v := range posts { postIds = append(postIds, v.Id) } // 批量查询当前用户点赞的记录 var postLikeList []*plant.PostLike err = global.DB.Where("user_id = ? and post_id in ?", userId, postIds).Find(&postLikeList).Error if err != nil { return } // 构建id映射 likesMap := make(map[string]bool) for _, v := range postLikeList { likesMap[v.PostId] = true } // 是否点赞 for i := range posts { if likesMap[posts[i].Id] { posts[i].HasLiked = 1 } else { posts[i].HasLiked = 0 } } return posts, total, err } // MyPost 我的帖子 func (s *PostService) MyPost(req plantReq.PostPage, userId string) (list interface{}, total int64, err error) { limit := req.PageSize offset := req.PageSize * (req.Current - 1) db := global.DB.Model(&plant.Post{}). Preload("ImgList", func(db *gorm.DB) *gorm.DB { return db.Order("created_at desc") }). Preload("Publisher", func(db *gorm.DB) *gorm.DB { return db.Preload("Avatar") }). Preload("LikeList", func(db *gorm.DB) *gorm.DB { return db.Preload("Liker", func(db *gorm.DB) *gorm.DB { return db.Preload("Avatar") }) }). Preload("CommentList", func(db *gorm.DB) *gorm.DB { return db.Preload("Commentator", func(db *gorm.DB) *gorm.DB { return db.Preload("Avatar") }) }) var posts []plant.Post db = db.Where("user_id = ?", userId) if req.Title != "" { db = db.Where("title like ?", "%"+req.Title+"%") } //todo 审核帖子 err = db.Count(&total).Error if err != nil { return } err = db.Limit(limit).Offset(offset).Order("created_at desc").Find(&posts).Error // 优化 N+1 查询 var postIds []string for _, v := range posts { postIds = append(postIds, v.Id) } // 批量查询当前用户点赞的记录 var postLikeList []*plant.PostLike err = global.DB.Where("user_id = ? and post_id in ?", userId, postIds).Find(&postLikeList).Error if err != nil { return } // 构建id映射 likesMap := make(map[string]bool) for _, v := range postLikeList { likesMap[v.PostId] = true } // 是否点赞 for i := range posts { if likesMap[posts[i].Id] { posts[i].HasLiked = 1 } else { posts[i].HasLiked = 0 } } return posts, total, err } // LikePost 点赞帖或取消赞 func (s *PostService) LikePost(userId, postId, class string) error { // class = 1点赞 if class == "1" { return global.DB.Transaction(func(tx *gorm.DB) error { var post plant.Post err := tx.Where("id = ?", postId).First(&post).Error if err != nil { return err } //1.更新点赞数 err = tx.Model(&post).Update("like_count", post.LikeCount+1).Error if err != nil { return err } //2.添加点赞记录 like := plant.PostLike{ UserId: userId, PostId: postId, } return tx.Create(&like).Error }) } else if class == "2" { return global.DB.Transaction(func(tx *gorm.DB) error { var like plant.PostLike err := tx.Where("post_id = ? and user_id = ?", postId, userId).First(&like).Error if err != nil { return err } //1.更新点赞数 var post plant.Post err = tx.Where("id = ?", postId).First(&post).Error if err != nil { return err } err = tx.Model(&post).Update("like_count", post.LikeCount-1).Error if err != nil { return err } //2.删除点赞记录 return tx.Unscoped().Delete(&like).Error }) } return nil } // CommentPost 评论帖子 func (s *PostService) CommentPost(req plantReq.CreateComment, userId string) error { return global.DB.Transaction(func(tx *gorm.DB) error { //1.为帖子评论数量+1 var post plant.Post err := global.DB.Where("id = ?", req.PostId).First(&post).Error if err != nil { return err } //1.更新评论数 err = tx.Model(&post).Update("comment_count", post.CommentCount+1).Error if err != nil { return err } //2.添加评论 comment := plant.PostComment{ PostId: req.PostId, UserId: userId, Content: req.Content, } return tx.Create(&comment).Error }) }