评论分页
This commit is contained in:
+48
-15
@@ -17,15 +17,15 @@ func GetComments(c *gin.Context) {
|
||||
postSlug := c.Query("post_slug") // 前台使用 slug
|
||||
status := c.Query("status")
|
||||
pageStr := c.DefaultQuery("page", "1")
|
||||
pageSizeStr := c.DefaultQuery("page_size", "1000")
|
||||
pageSizeStr := c.DefaultQuery("page_size", "10")
|
||||
|
||||
// 解析分页参数
|
||||
page := 1
|
||||
pageSize := 1000
|
||||
pageSize := 10
|
||||
if p, err := strconv.Atoi(pageStr); err == nil && p > 0 {
|
||||
page = p
|
||||
}
|
||||
if ps, err := strconv.Atoi(pageSizeStr); err == nil && ps > 0 && ps <= 1000 {
|
||||
if ps, err := strconv.Atoi(pageSizeStr); err == nil && ps > 0 && ps <= 10 {
|
||||
pageSize = ps
|
||||
}
|
||||
|
||||
@@ -34,22 +34,20 @@ func GetComments(c *gin.Context) {
|
||||
return db.Select("id", "title", "slug")
|
||||
})
|
||||
|
||||
// 非管理员只能查看自己文章上的评论(后台)或已审核的评论(前台)
|
||||
if isAdmin(c) {
|
||||
// 管理员可以查看所有评论
|
||||
if status != "" {
|
||||
db = db.Where("status = ?", status)
|
||||
}
|
||||
} else {
|
||||
// 状态过滤(管理员和普通用户均适用)
|
||||
if status != "" {
|
||||
db = db.Where("status = ?", status)
|
||||
}
|
||||
|
||||
// 非管理员只能查看自己文章上的评论
|
||||
if !isAdmin(c) {
|
||||
if userID, exists := c.Get("userID"); exists {
|
||||
// 如果是后台接口调用,限制为自己的文章
|
||||
// 未指定具体文章时,限制为自己名下的文章
|
||||
if postID == "" && postSlug == "" {
|
||||
db = db.Where("post_id IN (?)",
|
||||
database.DB.Model(&models.Post{}).Select("id").Where("author_id = ?", userID))
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// 按文章 ID 或 slug 过滤
|
||||
@@ -64,14 +62,16 @@ func GetComments(c *gin.Context) {
|
||||
db = db.Where("post_id = ?", post.ID)
|
||||
}
|
||||
|
||||
// 统计总数
|
||||
// 只统计并查询顶级评论(parent_id IS NULL),子评论在 Preload 中加载
|
||||
// Count 必须与列表使用相同过滤条件,否则分页总数会包含子评论而不准确
|
||||
db = db.Where("parent_id IS NULL")
|
||||
|
||||
var total int64
|
||||
db.Count(&total)
|
||||
|
||||
// 只查询顶级评论(parent_id IS NULL),子评论在 Preload 中加载
|
||||
var comments []models.Comment
|
||||
offset := (page - 1) * pageSize
|
||||
db.Where("parent_id IS NULL").Order("created_at ASC").Offset(offset).Limit(pageSize).Find(&comments)
|
||||
db.Order("created_at ASC").Offset(offset).Limit(pageSize).Find(&comments)
|
||||
|
||||
// 预加载子评论
|
||||
for i := range comments {
|
||||
@@ -102,6 +102,39 @@ func GetComments(c *gin.Context) {
|
||||
})
|
||||
}
|
||||
|
||||
// GetCommentPosts 获取所有有评论的文章列表(用于评论管理页的文章筛选下拉框)
|
||||
// 与评论列表分页无关,始终返回权限范围内的全部文章
|
||||
func GetCommentPosts(c *gin.Context) {
|
||||
// 有评论的文章 ID 子查询
|
||||
postIDsWithComments := database.DB.Model(&models.Comment{}).Select("DISTINCT post_id")
|
||||
|
||||
query := database.DB.Model(&models.Post{}).
|
||||
Select("id", "title", "slug").
|
||||
Where("id IN (?)", postIDsWithComments)
|
||||
|
||||
// 非管理员只能看到自己名下的文章
|
||||
if !isAdmin(c) {
|
||||
if userID, exists := c.Get("userID"); exists {
|
||||
query = query.Where("author_id = ?", userID)
|
||||
}
|
||||
}
|
||||
|
||||
var posts []models.Post
|
||||
query.Order("id DESC").Find(&posts)
|
||||
|
||||
type postOption struct {
|
||||
ID uint `json:"id"`
|
||||
Title string `json:"title"`
|
||||
Slug string `json:"slug"`
|
||||
}
|
||||
list := make([]postOption, 0, len(posts))
|
||||
for _, p := range posts {
|
||||
list = append(list, postOption{ID: p.ID, Title: p.Title, Slug: p.Slug})
|
||||
}
|
||||
|
||||
c.JSON(http.StatusOK, gin.H{"data": list})
|
||||
}
|
||||
|
||||
// loadAndVerifyComment 加载评论并校验权限,成功返回评论,失败直接写响应并返回 nil
|
||||
func loadAndVerifyComment(c *gin.Context) *models.Comment {
|
||||
id := c.Param("id")
|
||||
|
||||
Reference in New Issue
Block a user