// 数据统计面板脚本 document.addEventListener('DOMContentLoaded', () => { // DOM元素 const totalUsersEl = document.getElementById('total-users'); const onlineUsersEl = document.getElementById('online-users'); const todayUsersEl = document.getElementById('today-users'); const playingUsersEl = document.getElementById('playing-users'); const onlineUsersTable = document.getElementById('online-users-table').querySelector('tbody'); const todayUsersTable = document.getElementById('today-users-table').querySelector('tbody'); const refreshBtn = document.getElementById('refresh-data-btn'); // 状态变量 let refreshInterval = null; // 初始化 loadStats(); // 设置自动刷新 (每60秒) refreshInterval = setInterval(loadStats, 60000); // 刷新按钮事件 refreshBtn.addEventListener('click', loadStats); // 加载统计数据 function loadStats() { // 显示加载状态 totalUsersEl.textContent = '--'; onlineUsersEl.textContent = '--'; todayUsersEl.textContent = '--'; playingUsersEl.textContent = '--'; onlineUsersTable.innerHTML = '加载中...'; todayUsersTable.innerHTML = '加载中...'; // 加载数据 fetch('/api/admin/stats') .then(response => response.json()) .then(data => { // 更新统计数字 totalUsersEl.textContent = data.total_users || 0; onlineUsersEl.textContent = data.online_users_count || 0; todayUsersEl.textContent = data.today_users_count || 0; // 计算游戏中的用户数 const playingUsers = (data.online_users || []).filter(user => user.status === 'playing').length; playingUsersEl.textContent = playingUsers; // 更新在线用户表格 renderOnlineUsersTable(data.online_users || []); // 更新今日新注册用户表格 renderTodayUsersTable(data.today_users || []); }) .catch(error => { console.error('加载统计数据失败:', error); showError('获取数据失败,请稍后重试'); }); } // 渲染在线用户表格 function renderOnlineUsersTable(users) { if (users.length === 0) { onlineUsersTable.innerHTML = '目前没有在线用户'; return; } onlineUsersTable.innerHTML = ''; users.forEach(user => { const row = document.createElement('tr'); // 格式化最后活动时间 let lastActivity = '未知'; if (user.last_activity) { try { const activityDate = new Date(user.last_activity); lastActivity = formatDateTime(activityDate); } catch (e) { lastActivity = user.last_activity; } } // 根据状态设置样式 let statusClass = ''; let statusText = user.status || '未知'; if (statusText === 'playing') { statusClass = 'status-playing'; statusText = '游戏中'; } else if (statusText === 'idle') { statusClass = 'status-idle'; statusText = '空闲'; } row.innerHTML = ` ${user.username} ${statusText} ${user.ip_address || '未知'} ${lastActivity} `; onlineUsersTable.appendChild(row); }); } // 渲染今日新注册用户表格 function renderTodayUsersTable(users) { if (users.length === 0) { todayUsersTable.innerHTML = '今日暂无新注册用户'; return; } todayUsersTable.innerHTML = ''; // 按注册时间排序,最近的在前 users.sort((a, b) => { return new Date(b.created_at) - new Date(a.created_at); }); users.forEach(user => { const row = document.createElement('tr'); // 格式化注册时间 let createdAt = '未知'; if (user.created_at) { try { const createdDate = new Date(user.created_at); createdAt = formatDateTime(createdDate); } catch (e) { createdAt = user.created_at; } } row.innerHTML = ` ${user.username} ${createdAt} `; todayUsersTable.appendChild(row); }); } // 显示错误消息 function showError(message) { // 在表格中显示错误 onlineUsersTable.innerHTML = `${message}`; todayUsersTable.innerHTML = `${message}`; // 在统计卡片中显示错误 totalUsersEl.textContent = 'ERR'; onlineUsersEl.textContent = 'ERR'; todayUsersEl.textContent = 'ERR'; playingUsersEl.textContent = 'ERR'; } // 格式化日期时间 function formatDateTime(date) { const hours = String(date.getHours()).padStart(2, '0'); const minutes = String(date.getMinutes()).padStart(2, '0'); const seconds = String(date.getSeconds()).padStart(2, '0'); const year = date.getFullYear(); const month = String(date.getMonth() + 1).padStart(2, '0'); const day = String(date.getDate()).padStart(2, '0'); return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; } // 页面卸载时清除刷新间隔 window.addEventListener('beforeunload', () => { if (refreshInterval) { clearInterval(refreshInterval); } }); }); // 添加CSS样式 document.head.insertAdjacentHTML('beforeend', ` `);