// app/static/js/user_activity.js document.addEventListener('DOMContentLoaded', function() { let activityChart = null; // 初始加载 loadUserActivity(); function loadUserActivity() { // 显示加载状态 document.getElementById('user-table-body').innerHTML = ` 加载中... `; // 调用API获取数据 fetch('/statistics/api/user-activity') .then(response => { if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } return response.json(); }) .then(data => { updateUserTable(data); updateUserChart(data); }) .catch(error => { console.error('加载用户活跃度数据失败:', error); document.getElementById('user-table-body').innerHTML = ` 加载数据失败,请稍后重试 `; // 也可以考虑清除或提示图表加载失败 if (activityChart) { activityChart.destroy(); activityChart = null; } const canvas = document.getElementById('user-activity-chart'); const ctx = canvas.getContext('2d'); ctx.clearRect(0, 0, canvas.width, canvas.height); // 清除画布 // 可以在画布上显示错误信息,但这比较复杂,通常表格的错误提示已足够 }); } function updateUserTable(data) { const tableBody = document.getElementById('user-table-body'); if (!data || data.length === 0) { // 增加了对 data 本身的检查 tableBody.innerHTML = ` 暂无数据 `; return; } let tableHtml = ''; data.forEach((user, index) => { tableHtml += ` ${index + 1} ${user.username || 'N/A'} ${user.nickname || 'N/A'} ${user.borrow_count} `; }); tableBody.innerHTML = tableHtml; } function updateUserChart(data) { // 销毁旧图表 if (activityChart) { activityChart.destroy(); activityChart = null; // 确保旧实例被完全清除 } const canvas = document.getElementById('user-activity-chart'); const ctx = canvas.getContext('2d'); if (!data || data.length === 0) { // 如果没有数据,清除画布,避免显示旧图表或空白图表框架 ctx.clearRect(0, 0, canvas.width, canvas.height); // 也可以在这里显示 "暂无数据" 的文本到 canvas 上,如果需要 // 例如: // ctx.textAlign = 'center'; // ctx.fillText('暂无图表数据', canvas.width / 2, canvas.height / 2); return; } // 准备图表数据 const labels = data.map(user => user.nickname || user.username || '未知用户'); const borrowCounts = data.map(user => user.borrow_count); // 创建图表 activityChart = new Chart(ctx, { type: 'bar', data: { labels: labels, datasets: [{ label: '借阅次数', data: borrowCounts, backgroundColor: 'rgba(153, 102, 255, 0.6)', borderColor: 'rgba(153, 102, 255, 1)', borderWidth: 1 }] }, options: { responsive: true, maintainAspectRatio: false, scales: { y: { beginAtZero: true, title: { display: true, text: '借阅次数' } }, x: { title: { display: true, text: '用户' // 这个标题现在应该有空间显示了 } } }, plugins: { legend: { display: false // 保持不显示图例 }, title: { display: true, // 如果HTML中已有h3标题,这里可以设为 false text: '最活跃用户排行' // 这个是图表内部的标题 } }, layout: { // <--- 这是添加的部分 padding: { bottom: 30 // 为X轴标题和标签留出足够的底部空间,可以根据实际显示效果调整此数值 } } } }); } });