增加 @提及、搜索筛选与找回密码,并将右栏热门改为正在聊。
补齐评论提及补全与通知、按作者/板块/仅标题搜索,以及邮箱验证码重置密码;同时修复 Go 提及正则并优化侧栏悬停样式。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -43,6 +43,15 @@ func (s *NotifyService) AsyncNotifyCommentPublished(comment *model.Comment) {
|
||||
s.goNotify(func() { s.NotifyCommentPublished(&cp) })
|
||||
}
|
||||
|
||||
// AsyncNotifyCommentMentions 异步:评论公开后通知被 @ 的用户
|
||||
func (s *NotifyService) AsyncNotifyCommentMentions(comment *model.Comment) {
|
||||
if s == nil || comment == nil {
|
||||
return
|
||||
}
|
||||
cp := *comment
|
||||
s.goNotify(func() { s.NotifyCommentMentions(&cp) })
|
||||
}
|
||||
|
||||
// AsyncNotifyPendingPost 异步:待审帖通知管理员
|
||||
func (s *NotifyService) AsyncNotifyPendingPost(post *model.Post) {
|
||||
if s == nil || post == nil {
|
||||
@@ -92,6 +101,41 @@ func (s *NotifyService) NotifyCommentPublished(comment *model.Comment) {
|
||||
s.sendReplyMail(toUserID, authorName, title, comment.PostID, displayFloor, isNested, comment.Content)
|
||||
}
|
||||
|
||||
// NotifyCommentMentions 评论公开后通知被 @提及的用户(跳过已收到回复通知的人)
|
||||
func (s *NotifyService) NotifyCommentMentions(comment *model.Comment) {
|
||||
if s == nil || comment == nil || comment.Status != model.ContentStatusPublished {
|
||||
return
|
||||
}
|
||||
names := ExtractMentionNames(comment.Content)
|
||||
ids := ResolveMentionUserIDs(names, comment.UserID)
|
||||
if len(ids) == 0 {
|
||||
return
|
||||
}
|
||||
|
||||
post, err := s.loadPost(comment.PostID)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
// 已作为回复对象收到通知的用户不再重复发 mention
|
||||
replyTo, _ := s.resolveReplyRecipient(comment, post)
|
||||
authorName := s.commentAuthorName(comment)
|
||||
title := post.Title
|
||||
if title == "" {
|
||||
title = "未知帖子"
|
||||
}
|
||||
displayFloor := s.resolveDisplayFloor(comment)
|
||||
pid := comment.PostID
|
||||
subject := "有人 @了你"
|
||||
content := FormatMentionContent(authorName, title, displayFloor)
|
||||
|
||||
for _, uid := range ids {
|
||||
if uid == 0 || uid == comment.UserID || uid == replyTo {
|
||||
continue
|
||||
}
|
||||
_, _ = s.messages.SendSystem(uid, subject, content, model.MessageKindMention, &pid, nil)
|
||||
}
|
||||
}
|
||||
|
||||
// NotifyPendingPost 新帖进入待审时通知全部管理员
|
||||
func (s *NotifyService) NotifyPendingPost(post *model.Post) {
|
||||
if s == nil || post == nil || post.Status != model.ContentStatusPending {
|
||||
@@ -295,6 +339,11 @@ func FormatReplyContent(authorName, postTitle string, displayFloor int, isNested
|
||||
return fmt.Sprintf("%s 在《%s》发表了 #%d 楼。", authorName, postTitle, displayFloor)
|
||||
}
|
||||
|
||||
// FormatMentionContent @提及站内通知正文
|
||||
func FormatMentionContent(authorName, postTitle string, displayFloor int) string {
|
||||
return fmt.Sprintf("%s 在《%s》#%d 楼中提到了你。", authorName, postTitle, displayFloor)
|
||||
}
|
||||
|
||||
// FormatPendingPostContent 待审帖站内私信正文
|
||||
func FormatPendingPostContent(authorName, postTitle string, postID uint) string {
|
||||
return fmt.Sprintf(
|
||||
|
||||
Reference in New Issue
Block a user