package handlers import ( "net/http" "goblog/database" "goblog/models" "github.com/gin-gonic/gin" ) // 创建评论请求 type CreateCommentRequest struct { PostID uint `json:"post_id" binding:"required"` ParentID *uint `json:"parent_id"` Author string `json:"author" binding:"required"` Email string `json:"email" binding:"required,email"` Website string `json:"website"` Content string `json:"content" binding:"required"` } // 获取评论列表 func GetComments(c *gin.Context) { postID := c.Query("post_id") status := c.Query("status") db := database.DB.Model(&models.Comment{}).Preload("User") if postID != "" { db = db.Where("post_id = ?", postID) } if status != "" { db = db.Where("status = ?", status) } var comments []models.Comment db.Order("created_at DESC").Find(&comments) c.JSON(http.StatusOK, gin.H{"data": comments}) } // 创建评论 func CreateComment(c *gin.Context) { var req CreateCommentRequest if err := c.ShouldBindJSON(&req); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } // 检查文章是否存在 var post models.Post if err := database.DB.First(&post, req.PostID).Error; err != nil { c.JSON(http.StatusNotFound, gin.H{"error": "文章不存在"}) return } comment := models.Comment{ PostID: req.PostID, ParentID: req.ParentID, Author: req.Author, Email: req.Email, Website: req.Website, Content: req.Content, IP: c.ClientIP(), Status: "pending", // 默认待审核 } // 如果用户已登录 if userID, exists := c.Get("userID"); exists { uid := userID.(uint) comment.UserID = &uid comment.Status = "approved" // 登录用户评论自动通过 } if err := database.DB.Create(&comment).Error; err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "发表评论失败"}) return } c.JSON(http.StatusCreated, gin.H{"data": comment}) } // 审核评论 func ApproveComment(c *gin.Context) { id := c.Param("id") var comment models.Comment if err := database.DB.First(&comment, id).Error; err != nil { c.JSON(http.StatusNotFound, gin.H{"error": "评论不存在"}) return } comment.Status = "approved" if err := database.DB.Save(&comment).Error; err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "审核失败"}) return } c.JSON(http.StatusOK, gin.H{"message": "审核通过"}) } // 标记为垃圾评论 func MarkSpamComment(c *gin.Context) { id := c.Param("id") var comment models.Comment if err := database.DB.First(&comment, id).Error; err != nil { c.JSON(http.StatusNotFound, gin.H{"error": "评论不存在"}) return } comment.Status = "spam" if err := database.DB.Save(&comment).Error; err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "操作失败"}) return } c.JSON(http.StatusOK, gin.H{"message": "已标记为垃圾评论"}) } // 删除评论 func DeleteComment(c *gin.Context) { id := c.Param("id") var comment models.Comment if err := database.DB.First(&comment, id).Error; err != nil { c.JSON(http.StatusNotFound, gin.H{"error": "评论不存在"}) return } if err := database.DB.Delete(&comment).Error; err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "删除评论失败"}) return } c.JSON(http.StatusOK, gin.H{"message": "删除成功"}) }