feat: 实时消息与管理端运营能力

新增群聊/私信与公共 WebSocket 总线,站长用户内容档案,并将通知与待审角标改为推送驱动;同步精简管理仪表盘并修复主题换肤 DOM 冲突。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-09-15 22:58:16 +08:00
parent 29db9ae9b5
commit 42c395a864
55 changed files with 7607 additions and 346 deletions

View File

@@ -158,9 +158,9 @@ func (s *ModerationService) PendingCounts(actor *Actor) (posts int64, comments i
return
}
// ApprovePost 帖子审核通过
func (s *ModerationService) ApprovePost(actor *Actor, id uint) error {
return s.db.Transaction(func(tx *gorm.DB) error {
// ApprovePost 帖子审核通过;成功时返回板块 ID 供 feed 广播
func (s *ModerationService) ApprovePost(actor *Actor, id uint) (boardID uint, err error) {
err = s.db.Transaction(func(tx *gorm.DB) error {
var post model.Post
if err := tx.First(&post, id).Error; err != nil {
return err
@@ -174,10 +174,12 @@ func (s *ModerationService) ApprovePost(actor *Actor, id uint) error {
if err := tx.Model(&post).Update("status", model.ContentStatusPublished).Error; err != nil {
return err
}
boardID = post.BoardID
s.notif.Create(post.UserID, actor.ID, model.NotificationTypeApproved, post.ID, 0,
"你的帖子《"+post.Title+"》已通过审核")
return nil
})
return boardID, err
}
// RejectPost 帖子审核拒绝(标记 rejected,不物理删除;作者仍可在详情页看到结果)
@@ -202,15 +204,15 @@ func (s *ModerationService) RejectPost(actor *Actor, id uint) error {
})
}
// ApproveComment 评论审核通过(通过时才计入帖子评论数)
func (s *ModerationService) ApproveComment(actor *Actor, id uint) error {
return s.db.Transaction(func(tx *gorm.DB) error {
// ApproveComment 评论审核通过(通过时才计入帖子评论数);成功时返回帖子 ID 与板块 ID
func (s *ModerationService) ApproveComment(actor *Actor, id uint) (postID, boardID uint, err error) {
err = s.db.Transaction(func(tx *gorm.DB) error {
var cm model.Comment
if err := tx.First(&cm, id).Error; err != nil {
return err
}
var post model.Post
if err := tx.Select("id", "board_id", "title").First(&post, cm.PostID).Error; err != nil {
if err := tx.Select("id", "board_id", "title", "user_id").First(&post, cm.PostID).Error; err != nil {
return err
}
if !actor.CanModerateBoard(post.BoardID) {
@@ -226,6 +228,8 @@ func (s *ModerationService) ApproveComment(actor *Actor, id uint) error {
UpdateColumn("comment_count", gorm.Expr("comment_count + 1")).Error; err != nil {
return err
}
postID = cm.PostID
boardID = post.BoardID
s.notif.Create(cm.UserID, actor.ID, model.NotificationTypeApproved, cm.PostID, cm.ID,
"你在帖子《"+post.Title+"》下的评论已通过审核")
// 评论此时才公开,补发送业务通知(以评论者为 actor):
@@ -240,6 +244,7 @@ func (s *ModerationService) ApproveComment(actor *Actor, id uint) error {
}
return nil
})
return postID, boardID, err
}
// RejectComment 评论审核拒绝