Set up project files and add .gitignore to exclude local build/runtime artifacts. Made-with: Cursor
81 lines
2.7 KiB
Go
81 lines
2.7 KiB
Go
package model
|
||
|
||
import (
|
||
"time"
|
||
|
||
"github.com/google/uuid"
|
||
"gorm.io/gorm"
|
||
)
|
||
|
||
// CommentStatus 评论状态
|
||
type CommentStatus string
|
||
|
||
const (
|
||
CommentStatusDraft CommentStatus = "draft"
|
||
CommentStatusPending CommentStatus = "pending"
|
||
CommentStatusPublished CommentStatus = "published"
|
||
CommentStatusRejected CommentStatus = "rejected"
|
||
CommentStatusDeleted CommentStatus = "deleted"
|
||
)
|
||
|
||
// Comment 评论实体
|
||
type Comment struct {
|
||
ID string `json:"id" gorm:"type:varchar(36);primaryKey"`
|
||
PostID string `json:"post_id" gorm:"type:varchar(36);not null;index:idx_comments_post_parent_status_created,priority:1"`
|
||
UserID string `json:"user_id" gorm:"type:varchar(36);index;not null"`
|
||
ParentID *string `json:"parent_id" gorm:"type:varchar(36);index:idx_comments_post_parent_status_created,priority:2"` // 父评论 ID(支持嵌套)
|
||
RootID *string `json:"root_id" gorm:"type:varchar(36);index:idx_comments_root_status_created,priority:1"` // 根评论 ID(用于高效查询)
|
||
Content string `json:"content" gorm:"type:text;not null"`
|
||
Images string `json:"images" gorm:"type:text"` // 图片URL列表,JSON数组格式
|
||
|
||
// 关联
|
||
User *User `json:"-" gorm:"foreignKey:UserID"`
|
||
Replies []*Comment `json:"-" gorm:"-"` // 子回复(手动加载,非 GORM 关联)
|
||
|
||
// 审核状态
|
||
Status CommentStatus `json:"status" gorm:"type:varchar(20);default:published;index:idx_comments_post_parent_status_created,priority:3;index:idx_comments_root_status_created,priority:2"`
|
||
|
||
// 统计
|
||
LikesCount int `json:"likes_count" gorm:"default:0"`
|
||
RepliesCount int `json:"replies_count" gorm:"default:0"`
|
||
|
||
// 软删除
|
||
DeletedAt gorm.DeletedAt `json:"-" gorm:"index"`
|
||
|
||
// 时间戳
|
||
CreatedAt time.Time `json:"created_at" gorm:"autoCreateTime;index:idx_comments_post_parent_status_created,priority:4,sort:asc;index:idx_comments_root_status_created,priority:3,sort:asc"`
|
||
UpdatedAt time.Time `json:"updated_at" gorm:"autoUpdateTime"`
|
||
}
|
||
|
||
// BeforeCreate 创建前生成UUID
|
||
func (c *Comment) BeforeCreate(tx *gorm.DB) error {
|
||
if c.ID == "" {
|
||
c.ID = uuid.New().String()
|
||
}
|
||
return nil
|
||
}
|
||
|
||
func (Comment) TableName() string {
|
||
return "comments"
|
||
}
|
||
|
||
// CommentLike 评论点赞
|
||
type CommentLike struct {
|
||
ID string `json:"id" gorm:"type:varchar(36);primaryKey"`
|
||
CommentID string `json:"comment_id" gorm:"type:varchar(36);index;not null"`
|
||
UserID string `json:"user_id" gorm:"type:varchar(36);index;not null"`
|
||
CreatedAt time.Time `json:"created_at" gorm:"autoCreateTime"`
|
||
}
|
||
|
||
// BeforeCreate 创建前生成UUID
|
||
func (cl *CommentLike) BeforeCreate(tx *gorm.DB) error {
|
||
if cl.ID == "" {
|
||
cl.ID = uuid.New().String()
|
||
}
|
||
return nil
|
||
}
|
||
|
||
func (CommentLike) TableName() string {
|
||
return "comment_likes"
|
||
}
|