112 lines
4.1 KiB
Go
112 lines
4.1 KiB
Go
|
|
package model
|
|||
|
|
|
|||
|
|
import (
|
|||
|
|
"encoding/json"
|
|||
|
|
"time"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
// Comment 商品评论
|
|||
|
|
type Comment struct {
|
|||
|
|
ID uint `json:"id" gorm:"primaryKey;autoIncrement"`
|
|||
|
|
UserID uint `json:"user_id" gorm:"not null;index"`
|
|||
|
|
ProductID uint `json:"product_id" gorm:"not null;index"`
|
|||
|
|
OrderID uint `json:"order_id" gorm:"not null;index"`
|
|||
|
|
OrderItemID uint `json:"order_item_id" gorm:"not null;index"`
|
|||
|
|
Rating int `json:"rating" gorm:"not null;default:5"` // 评分 1-5星
|
|||
|
|
Content string `json:"content" gorm:"type:text"` // 评论内容
|
|||
|
|
Images string `json:"images" gorm:"type:text"` // 评论图片,JSON格式存储
|
|||
|
|
IsAnonymous bool `json:"is_anonymous" gorm:"default:false"` // 是否匿名评论
|
|||
|
|
Status int `json:"status" gorm:"default:1"` // 状态:1-正常,2-隐藏,3-删除
|
|||
|
|
ReplyCount int `json:"reply_count" gorm:"default:0"` // 回复数量
|
|||
|
|
LikeCount int `json:"like_count" gorm:"default:0"` // 点赞数量
|
|||
|
|
CreatedAt time.Time `json:"created_at"`
|
|||
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|||
|
|
|
|||
|
|
// 关联数据
|
|||
|
|
User User `json:"user,omitempty" gorm:"foreignKey:UserID"`
|
|||
|
|
Product Product `json:"product,omitempty" gorm:"foreignKey:ProductID"`
|
|||
|
|
Order Order `json:"order,omitempty" gorm:"foreignKey:OrderID"`
|
|||
|
|
OrderItem OrderItem `json:"order_item,omitempty" gorm:"foreignKey:OrderItemID"`
|
|||
|
|
Replies []CommentReply `json:"replies,omitempty" gorm:"foreignKey:CommentID"`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// MarshalJSON 自定义JSON序列化,将Images字段从JSON字符串转换为数组
|
|||
|
|
func (c Comment) MarshalJSON() ([]byte, error) {
|
|||
|
|
type Alias Comment
|
|||
|
|
|
|||
|
|
// 解析Images字段
|
|||
|
|
var images []string
|
|||
|
|
if c.Images != "" {
|
|||
|
|
if err := json.Unmarshal([]byte(c.Images), &images); err != nil {
|
|||
|
|
// 如果解析失败,返回空数组
|
|||
|
|
images = []string{}
|
|||
|
|
}
|
|||
|
|
} else {
|
|||
|
|
images = []string{}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 创建临时结构体用于序列化
|
|||
|
|
return json.Marshal(&struct {
|
|||
|
|
*Alias
|
|||
|
|
Images []string `json:"images"`
|
|||
|
|
}{
|
|||
|
|
Alias: (*Alias)(&c),
|
|||
|
|
Images: images,
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// CommentReply 评论回复
|
|||
|
|
type CommentReply struct {
|
|||
|
|
ID uint `json:"id" gorm:"primaryKey;autoIncrement"`
|
|||
|
|
CommentID uint `json:"comment_id" gorm:"not null;index"`
|
|||
|
|
UserID uint `json:"user_id" gorm:"not null;index"`
|
|||
|
|
Content string `json:"content" gorm:"type:text;not null"`
|
|||
|
|
IsAdmin bool `json:"is_admin" gorm:"default:false"` // 是否管理员回复
|
|||
|
|
Status int `json:"status" gorm:"default:1"` // 状态:1-正常,2-隐藏,3-删除
|
|||
|
|
CreatedAt time.Time `json:"created_at"`
|
|||
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|||
|
|
|
|||
|
|
// 关联数据
|
|||
|
|
Comment Comment `json:"comment,omitempty" gorm:"foreignKey:CommentID"`
|
|||
|
|
User User `json:"user,omitempty" gorm:"foreignKey:UserID"`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// CommentLike 评论点赞
|
|||
|
|
type CommentLike struct {
|
|||
|
|
ID uint `json:"id" gorm:"primaryKey;autoIncrement"`
|
|||
|
|
CommentID uint `json:"comment_id" gorm:"not null;index"`
|
|||
|
|
UserID uint `json:"user_id" gorm:"not null;index"`
|
|||
|
|
CreatedAt time.Time `json:"created_at"`
|
|||
|
|
|
|||
|
|
// 关联数据
|
|||
|
|
Comment Comment `json:"comment,omitempty" gorm:"foreignKey:CommentID"`
|
|||
|
|
User User `json:"user,omitempty" gorm:"foreignKey:UserID"`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// TableName 指定表名
|
|||
|
|
func (Comment) TableName() string {
|
|||
|
|
return "ai_comments"
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// TableName 指定表名
|
|||
|
|
func (CommentReply) TableName() string {
|
|||
|
|
return "ai_comment_replies"
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// TableName 指定表名
|
|||
|
|
func (CommentLike) TableName() string {
|
|||
|
|
return "ai_comment_likes"
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// CommentStats 评论统计
|
|||
|
|
type CommentStats struct {
|
|||
|
|
ProductID uint `json:"product_id"`
|
|||
|
|
TotalCount int `json:"total_count"` // 总评论数
|
|||
|
|
AverageRating float64 `json:"average_rating"` // 平均评分
|
|||
|
|
Rating1Count int `json:"rating_1_count"` // 1星评论数
|
|||
|
|
Rating2Count int `json:"rating_2_count"` // 2星评论数
|
|||
|
|
Rating3Count int `json:"rating_3_count"` // 3星评论数
|
|||
|
|
Rating4Count int `json:"rating_4_count"` // 4星评论数
|
|||
|
|
Rating5Count int `json:"rating_5_count"` // 5星评论数
|
|||
|
|
HasImagesCount int `json:"has_images_count"` // 带图评论数
|
|||
|
|
}
|