/** * OSS Community - 轮询数据实时更新 */ document.addEventListener('DOMContentLoaded', () => { if (!window.Polling) return; // ========== 用户数据(称号、权限) ========== let prevTitle = '', prevPerms = {}; window.Polling.on('user', (data) => { if (!data.success || !data.user) return; const { title, role } = data.user; // 更新称号徽章 if (title !== prevTitle) { prevTitle = title; const avatar = document.getElementById('dockUserAvatar'); if (avatar) { const name = avatar.dataset.tooltip.split(' - ')[0] || avatar.dataset.tooltip; avatar.dataset.tooltip = title ? `${name} - ${title}` : name; } let badge = document.querySelector('.user-title-badge'); if (title) { if (!badge) { badge = document.createElement('span'); badge.className = 'user-title-badge'; if (avatar) avatar.appendChild(badge); } badge.textContent = title; } else if (badge) badge.remove(); } // 权限控制 if (data.permissions && JSON.stringify(data.permissions) !== JSON.stringify(prevPerms)) { prevPerms = data.permissions; document.querySelectorAll('.admin-only').forEach(el => el.style.display = prevPerms.can_manage_users ? '' : 'none'); document.querySelectorAll('.moderator-only').forEach(el => el.style.display = prevPerms.can_manage_posts ? '' : 'none'); } }); // ========== 帖子数据实时更新 views/likes/replies ========== window.Polling.on('posts', (data) => { if (!data.posts || !Array.isArray(data.posts)) return; data.posts.forEach(post => { // 更新帖子卡片上的浏览、点赞、回复数 const cards = document.querySelectorAll(`.post-card[data-post-id="${post.id}"]`); cards.forEach(card => { const statsEls = card.querySelectorAll('.post-stats span'); if (statsEls.length >= 3) { // views const viewsSvg = ''; // likes const likesSvg = ''; // replies const repliesSvg = ''; statsEls[0].innerHTML = viewsSvg + ` ${post.views}`; statsEls[1].innerHTML = likesSvg + ` ${post.likes}`; statsEls[2].innerHTML = repliesSvg + ` ${post.reply_count || 0}`; } }); // 更新个人主页帖子列表的 stats const myListItems = document.querySelectorAll(`.my-post-item[data-post-id="${post.id}"] .my-post-meta`); myListItems.forEach(meta => { const spans = meta.querySelectorAll('span'); if (spans.length >= 4) { spans[1].textContent = `👁️ ${post.views} 浏览`; spans[2].textContent = `❤️ ${post.likes} 点赞`; spans[3].textContent = `💬 ${post.reply_count || 0} 回复`; } }); }); }); // ========== 统计数字实时更新 ========== window.Polling.on('stats', (data) => { if (data.posts !== undefined) animateNumber('statPosts', data.posts); if (data.replies !== undefined) animateNumber('statReplies', data.replies); if (data.users !== undefined) animateNumber('statUsers', data.users); const countAll = document.getElementById('countAll'); if (countAll) countAll.textContent = data.posts || 0; // 更新热门帖子 views(如果有这个区域) if (data.hot_posts && Array.isArray(data.hot_posts)) { data.hot_posts.forEach(hp => { const hotItems = document.querySelectorAll(`.hot-post-item[data-post-id="${hp.id}"]`); hotItems.forEach(item => { const viewsEl = item.querySelector('.hot-views'); if (viewsEl) viewsEl.textContent = hp.views; }); }); } }); // ========== 分类更新 ========== window.Polling.on('categories', (data) => { if (!data.categories) return; const countAll = document.getElementById('countAll'); if (countAll) countAll.textContent = data.posts || data.categories.length; }); }); // 数字动画 function animateNumber(id, target) { const el = document.getElementById(id); if (!el) return; const current = parseInt(el.textContent) || 0; if (current === target) return; el.textContent = target; }