feat: 评论系统补充功能完成——图片上传、后台管理、通知跳转高亮
- 评论图片上传(LV4+,经验≥1500),JPEG/PNG 自动转 WebP,二进制搜索质量优化 - 后台评论管理页面,支持关键词搜索、分页、删除,侧边栏新增入口 - 通知跳转高亮:评论通知 RelatedID 改为 postID,消息页链接到 #comments,前端自动滚动 - 新增 adminCommentUseCase/commentStore 接口(遵循 ISP),AdminCommentRow 移至 model 层 - 前端 @mention 联想/图片上传光标插入/评论展开收起/内联回复交互完善
This commit is contained in:
66
internal/controller/admin/admin_comment_controller.go
Normal file
66
internal/controller/admin/admin_comment_controller.go
Normal file
@ -0,0 +1,66 @@
|
||||
package admin
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"metazone.cc/metalab/internal/common"
|
||||
"metazone.cc/metalab/internal/model"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
// AdminCommentController 后台评论管理
|
||||
type AdminCommentController struct {
|
||||
commentService adminCommentUseCase
|
||||
}
|
||||
|
||||
// NewAdminCommentController 构造函数
|
||||
func NewAdminCommentController(cs adminCommentUseCase) *AdminCommentController {
|
||||
return &AdminCommentController{commentService: cs}
|
||||
}
|
||||
|
||||
// CommentsPage SSR 页面
|
||||
func (ctrl *AdminCommentController) CommentsPage(c *gin.Context) {
|
||||
c.HTML(http.StatusOK, "admin/comments/index.html", common.BuildAdminPageData(c, gin.H{
|
||||
"Title": "评论管理",
|
||||
"ExtraCSS": "/admin/static/css/comments.css",
|
||||
}))
|
||||
}
|
||||
|
||||
// ListComments API 列表
|
||||
func (ctrl *AdminCommentController) ListComments(c *gin.Context) {
|
||||
keyword := c.Query("keyword")
|
||||
page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
|
||||
pageSize, _ := strconv.Atoi(c.DefaultQuery("page_size", "20"))
|
||||
|
||||
comments, total, err := ctrl.commentService.ListAllComments(keyword, false, page, pageSize)
|
||||
if err != nil {
|
||||
common.Error(c, http.StatusInternalServerError, "获取评论列表失败")
|
||||
return
|
||||
}
|
||||
if comments == nil {
|
||||
comments = []model.AdminCommentRow{}
|
||||
}
|
||||
|
||||
common.Ok(c, gin.H{
|
||||
"items": comments,
|
||||
"total": total,
|
||||
"page": page,
|
||||
"total_pages": common.PageCount(total, pageSize),
|
||||
})
|
||||
}
|
||||
|
||||
// Delete 软删除评论
|
||||
func (ctrl *AdminCommentController) Delete(c *gin.Context) {
|
||||
commentID, err := strconv.ParseUint(c.Param("id"), 10, 64)
|
||||
if err != nil {
|
||||
common.Error(c, http.StatusBadRequest, "无效的评论ID")
|
||||
return
|
||||
}
|
||||
if err := ctrl.commentService.Delete(uint(commentID)); err != nil {
|
||||
common.Error(c, http.StatusBadRequest, err.Error())
|
||||
return
|
||||
}
|
||||
common.OkMessage(c, "删除成功")
|
||||
}
|
||||
@ -46,3 +46,9 @@ type adminPostUseCase interface {
|
||||
Unlock(postID uint) error
|
||||
Restore(postID uint) error
|
||||
}
|
||||
|
||||
// adminCommentUseCase AdminCommentController 对 CommentService 的最小依赖(ISP:2 个方法)
|
||||
type adminCommentUseCase interface {
|
||||
ListAllComments(keyword string, showDeleted bool, page, pageSize int) ([]model.AdminCommentRow, int64, error)
|
||||
Delete(commentID uint) error
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user