feat: @提及发送通知 + 通知点击定位高亮

- 新增 NotifyCommentMention 通知类型,归属 mention 分类 TAB
- parseMentions 中向被@用户发送通知(排除自己和重复通知)
- 消息中心 mention 通知可点击跳转至文章页面
- 通过 mention 通知进入时,来源评论置顶并持久半透明高亮
- 普通评论链接保持原有短暂高亮行为不变
This commit is contained in:
2026-06-03 13:21:27 +08:00
parent 2ea9788ec7
commit 8bf6ac9e51
6 changed files with 79 additions and 27 deletions

View File

@ -498,21 +498,45 @@
}
// ====== 评论高亮 ======
function highlightComment(commentId) {
function highlightComment(commentId, persistent) {
var card = commentsList.querySelector('.comment-card[data-id="' + commentId + '"]') ||
commentsList.querySelector('.comment-reply-card[data-id="' + commentId + '"]');
if (card) {
commentsList.insertBefore(card, commentsList.firstChild);
card.scrollIntoView({ behavior: 'smooth', block: 'start' });
card.style.background = '#fff8e1';
card.style.transition = 'background 1.5s';
setTimeout(function() { card.style.background = ''; }, 2000);
if (persistent) {
card.classList.add('highlight-mention');
} else {
card.style.background = '#fff8e1';
card.style.transition = 'background 1.5s';
setTimeout(function() { card.style.background = ''; }, 2000);
}
return true;
}
return false;
}
var hash = window.location.hash;
// @提及通知进入:置顶 + 持久高亮
var mentionMatch = hash.match(/^#mention-(\d+)$/);
if (mentionMatch) {
var mentionCommentId = mentionMatch[1];
var mentionInterval = setInterval(function() {
if (highlightComment(mentionCommentId, true)) {
clearInterval(mentionInterval);
}
}, 300);
setTimeout(function() {
clearInterval(mentionInterval);
if (!commentsList.querySelector('.comment-card[data-id="' + mentionCommentId + '"]') &&
!commentsList.querySelector('.comment-reply-card[data-id="' + mentionCommentId + '"]')) {
showToast('该评论已不存在');
}
}, 3000);
}
// 普通评论/回复链接:短暂高亮
var commentMatch = hash.match(/^#comment-(\d+)$/);
if (commentMatch) {
var targetCommentId = commentMatch[1];