document.addEventListener('DOMContentLoaded', function() { // 日期范围选择器逻辑 const dateRangeSelect = document.getElementById('date_range'); const dateRangeInputs = document.querySelector('.date-range-inputs'); if (dateRangeSelect && dateRangeInputs) { dateRangeSelect.addEventListener('change', function() { if (this.value === 'custom') { dateRangeInputs.style.display = 'flex'; } else { dateRangeInputs.style.display = 'none'; } }); } // 导出日志功能 const btnExport = document.getElementById('btnExport'); const exportModal = new bootstrap.Modal(document.getElementById('exportLogModal')); const confirmExport = document.getElementById('confirmExport'); if (btnExport) { btnExport.addEventListener('click', function() { exportModal.show(); }); } if (confirmExport) { confirmExport.addEventListener('click', function() { // 获取导出格式 const exportFormat = document.getElementById('exportFormat').value; // 获取当前筛选条件 const userId = document.getElementById('user_id').value; const action = document.getElementById('action').value; const targetType = document.getElementById('target_type').value; let startDate = ''; let endDate = ''; const dateRange = document.getElementById('date_range').value; if (dateRange === 'custom') { startDate = document.getElementById('start_date').value; endDate = document.getElementById('end_date').value; } else { // 根据选择的日期范围计算日期 const today = new Date(); endDate = formatDate(today); if (dateRange === '1') { const yesterday = new Date(today); yesterday.setDate(yesterday.getDate() - 1); startDate = formatDate(yesterday); } else if (dateRange === '7') { const lastWeek = new Date(today); lastWeek.setDate(lastWeek.getDate() - 7); startDate = formatDate(lastWeek); } else if (dateRange === '30') { const lastMonth = new Date(today); lastMonth.setDate(lastMonth.getDate() - 30); startDate = formatDate(lastMonth); } } // 显示加载提示 showAlert('info', '正在生成导出文件,请稍候...'); // 发送导出请求 fetch('/log/api/export', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ user_id: userId || null, action: action || null, target_type: targetType || null, start_date: startDate || null, end_date: endDate || null, format: exportFormat }) }) .then(response => response.json()) .then(data => { exportModal.hide(); if (data.success) { showAlert('success', data.message); // 处理文件下载 if (data.filedata && data.filename) { // 解码Base64数据 const binaryData = atob(data.filedata); // 转换为Blob const blob = new Blob([new Uint8Array([...binaryData].map(char => char.charCodeAt(0)))], { type: data.filetype }); // 创建下载链接 const url = window.URL.createObjectURL(blob); const a = document.createElement('a'); a.style.display = 'none'; a.href = url; a.download = data.filename; // 触发下载 document.body.appendChild(a); a.click(); // 清理 window.URL.revokeObjectURL(url); document.body.removeChild(a); } } else { showAlert('danger', data.message || '导出失败'); } }) .catch(error => { exportModal.hide(); showAlert('danger', '导出失败: ' + error.message); }); }); } // 清除日志功能 const btnClear = document.getElementById('btnClear'); const clearModal = new bootstrap.Modal(document.getElementById('clearLogModal')); const confirmClear = document.getElementById('confirmClear'); if (btnClear) { btnClear.addEventListener('click', function() { clearModal.show(); }); } if (confirmClear) { confirmClear.addEventListener('click', function() { const days = parseInt(document.getElementById('clearDays').value); fetch('/log/api/clear', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ days: days }) }) .then(response => response.json()) .then(data => { clearModal.hide(); if (data.success) { showAlert('success', data.message); // 2秒后刷新页面 setTimeout(() => { window.location.reload(); }, 2000); } else { showAlert('danger', data.message); } }) .catch(error => { clearModal.hide(); showAlert('danger', '操作失败: ' + error.message); }); }); } // 辅助函数 - 格式化日期为 YYYY-MM-DD function formatDate(date) { 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}`; } // 辅助函数 - 显示提示框 function showAlert(type, message) { // 移除之前的所有alert const existingAlerts = document.querySelectorAll('.alert-floating'); existingAlerts.forEach(alert => alert.remove()); const alertDiv = document.createElement('div'); alertDiv.className = `alert alert-${type} alert-dismissible fade show alert-floating`; alertDiv.innerHTML = ` ${message} `; document.body.appendChild(alertDiv); // 添加CSS,如果还没有添加 if (!document.getElementById('alert-floating-style')) { const style = document.createElement('style'); style.id = 'alert-floating-style'; style.textContent = ` .alert-floating { position: fixed; top: 20px; right: 20px; z-index: 9999; min-width: 300px; box-shadow: 0 4px 8px rgba(0,0,0,0.1); border-left: 4px solid; animation: slideIn 0.3s ease-out forwards; } @keyframes slideIn { from { transform: translateX(100%); opacity: 0; } to { transform: translateX(0); opacity: 1; } } .alert-floating i { margin-right: 8px; } .alert-floating .close { padding: 0.75rem; } `; document.head.appendChild(style); } // 5秒后自动关闭 setTimeout(() => { if (alertDiv.parentNode) { alertDiv.classList.add('fade'); setTimeout(() => alertDiv.remove(), 300); } }, 5000); // 点击关闭按钮关闭 const closeButton = alertDiv.querySelector('.close'); if (closeButton) { closeButton.addEventListener('click', function() { alertDiv.classList.add('fade'); setTimeout(() => alertDiv.remove(), 300); }); } } });