mirror of
https://github.com/snowykami/neo-blog.git
synced 2025-09-05 16:56:22 +00:00
⚡ add like functionality with Like model, implement like/unlike methods, and update Post and Comment models to track like counts
This commit is contained in:
@ -4,11 +4,13 @@ import "gorm.io/gorm"
|
||||
|
||||
type Comment struct {
|
||||
gorm.Model
|
||||
UserID uint `gorm:"index"` // 评论的用户ID
|
||||
User User `gorm:"foreignKey:UserID;references:ID"` // 关联的用户
|
||||
TargetID uint `gorm:"index"` // 目标ID
|
||||
TargetType string `gorm:"index"` // 目标类型,如 "post", "page"
|
||||
ReplyID uint `gorm:"index"` // 回复的评论ID
|
||||
Content string `gorm:"type:text"` // 评论内容
|
||||
Depth int `gorm:"default:0"` // 评论的层级深度
|
||||
UserID uint `gorm:"index"` // 评论的用户ID
|
||||
User User `gorm:"foreignKey:UserID;references:ID"` // 关联的用户
|
||||
TargetID uint `gorm:"index"` // 目标ID
|
||||
TargetType string `gorm:"index"` // 目标类型,如 "post", "page"
|
||||
ReplyID uint `gorm:"index"` // 回复的评论ID
|
||||
Content string `gorm:"type:text"` // 评论内容
|
||||
Depth int `gorm:"default:0"` // 评论的层级深度
|
||||
LikeCount uint64
|
||||
CommentCount uint64
|
||||
}
|
||||
|
@ -4,7 +4,8 @@ import "gorm.io/gorm"
|
||||
|
||||
type Label struct {
|
||||
gorm.Model
|
||||
Key string `gorm:"uniqueIndex"` // 标签键,唯一标识
|
||||
Value string `gorm:"type:text"` // 标签值,描述标签的内容
|
||||
Color string `gorm:"type:text"` // 前端可用颜色代码
|
||||
Key string `gorm:"uniqueIndex"` // 标签键,唯一标识
|
||||
Value string `gorm:"type:text"` // 标签值,描述标签的内容
|
||||
Color string `gorm:"type:text"` // 前端可用颜色代码
|
||||
TailwindClassName string `gorm:"type:text"` // Tailwind CSS 的类名,用于前端样式
|
||||
}
|
||||
|
42
internal/model/like.go
Normal file
42
internal/model/like.go
Normal file
@ -0,0 +1,42 @@
|
||||
package model
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/snowykami/neo-blog/pkg/constant"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
type Like struct {
|
||||
gorm.Model
|
||||
TargetType string
|
||||
TargetID uint
|
||||
UserID uint
|
||||
}
|
||||
|
||||
// AfterCreate 点赞后更新被点赞对象的计数
|
||||
func (l *Like) AfterCreate(tx *gorm.DB) (err error) {
|
||||
switch l.TargetType {
|
||||
case constant.TargetTypePost:
|
||||
return tx.Model(&Post{}).Where("id = ?", l.TargetID).
|
||||
UpdateColumn("like_count", gorm.Expr("like_count + ?", 1)).Error
|
||||
case constant.TargetTypeComment:
|
||||
return tx.Model(&Comment{}).Where("id = ?", l.TargetID).
|
||||
UpdateColumn("like_count", gorm.Expr("like_count + ?", 1)).Error
|
||||
default:
|
||||
return fmt.Errorf("不支持的目标类型: %s", l.TargetType)
|
||||
}
|
||||
}
|
||||
|
||||
// AfterDelete 取消点赞后更新被点赞对象的计数
|
||||
func (l *Like) AfterDelete(tx *gorm.DB) (err error) {
|
||||
switch l.TargetType {
|
||||
case constant.TargetTypePost:
|
||||
return tx.Model(&Post{}).Where("id = ?", l.TargetID).
|
||||
UpdateColumn("like_count", gorm.Expr("GREATEST(like_count - ?, 0)", 1)).Error
|
||||
case constant.TargetTypeComment:
|
||||
return tx.Model(&Comment{}).Where("id = ?", l.TargetID).
|
||||
UpdateColumn("like_count", gorm.Expr("GREATEST(like_count - ?, 0)", 1)).Error
|
||||
default:
|
||||
return fmt.Errorf("不支持的目标类型: %s", l.TargetType)
|
||||
}
|
||||
}
|
@ -4,9 +4,13 @@ import "gorm.io/gorm"
|
||||
|
||||
type Post struct {
|
||||
gorm.Model
|
||||
UserID uint `gorm:"index"` // 发布者的用户ID
|
||||
User User `gorm:"foreignKey:UserID;references:ID"` // 关联的用户
|
||||
Title string `gorm:"type:text;not null"` // 帖子标题
|
||||
Content string `gorm:"type:text;not null"` // 帖子内容
|
||||
Labels []Label `gorm:"many2many:post_labels;constraint:OnUpdate:CASCADE,OnDelete:SET NULL;"` // 关联的标签
|
||||
UserID uint `gorm:"index"` // 发布者的用户ID
|
||||
User User `gorm:"foreignKey:UserID;references:ID"` // 关联的用户
|
||||
Title string `gorm:"type:text;not null"` // 帖子标题
|
||||
Content string `gorm:"type:text;not null"` // 帖子内容
|
||||
Labels []Label `gorm:"many2many:post_labels;constraint:OnUpdate:CASCADE,OnDelete:SET NULL;"` // 关联的标签
|
||||
IsPrivate bool `gorm:"default:false"` // 是否为私密帖子
|
||||
LikeCount uint64
|
||||
CommentCount uint64
|
||||
VisitorCount uint64
|
||||
}
|
||||
|
Reference in New Issue
Block a user