import React, { useState, useEffect, useCallback } from 'react'; import { Container, Row, Col, Table, Spinner, Alert, Form, Button } from 'react-bootstrap'; import { adminAPI } from '../../services/api'; import { toast } from 'react-toastify'; import { debounce } from '../../utils/debounce'; const OperationLog = () => { const [logs, setLogs] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [page, setPage] = useState(1); const [hasMore, setHasMore] = useState(true); const [searchQuery, setSearchQuery] = useState(''); const [selectedUserId, setSelectedUserId] = useState(''); const [startDate, setStartDate] = useState(''); const [endDate, setEndDate] = useState(''); const [users, setUsers] = useState([]); // 用于用户筛选下拉框 const fetchLogs = async (pageNumber = page, search = searchQuery, userId = selectedUserId, start = startDate, end = endDate) => { try { setLoading(true); const params = { page: pageNumber, search: search, user_id: userId || undefined, start_date: start || undefined, end_date: end || undefined, }; const res = await adminAPI.getOperationLogs(params); if (pageNumber === 1) { setLogs(res.data.logs); } else { setLogs((prevLogs) => [...prevLogs, ...res.data.logs]); } setHasMore(res.data.has_more); setPage(pageNumber); } catch (err) { setError('获取操作日志失败'); toast.error('获取操作日志失败'); console.error(err); } finally { setLoading(false); } }; const fetchUsersForFilter = async () => { try { const res = await adminAPI.getUsers({ page: 1, per_page: 9999 }); // 获取所有用户用于筛选 setUsers(res.data.users); } catch (err) { console.error('获取用户列表失败', err); } }; const loadMore = () => { if (hasMore && !loading) { fetchLogs(page + 1); } }; useEffect(() => { fetchUsersForFilter(); }, []); // 防抖搜索函数 const debouncedSearch = useCallback( debounce((search, userId, start, end) => { fetchLogs(1, search, userId, start, end); }, 500), [] ); useEffect(() => { debouncedSearch(searchQuery, selectedUserId, startDate, endDate); }, [searchQuery, selectedUserId, startDate, endDate, debouncedSearch]); return (

操作日志

setSearchQuery(e.target.value)} /> setSelectedUserId(e.target.value)} > {users.map((user) => ( ))} setStartDate(e.target.value)} /> setEndDate(e.target.value)} />
{/* 统一处理加载状态 */} {loading && ( 加载中... )} {error && {error}} {/* 无数据状态(仅在非加载且无错误时显示) */} {!loading && !error && logs.length === 0 && ( 没有找到操作日志。 )} {/* 日志表格(仅在非加载、无错误且有数据时显示) */} {!loading && !error && logs.length > 0 && ( {logs.map((log) => ( ))}
ID 用户 操作类型 文件ID 文件名 时间 详情
{log.id} {log.username} {log.operation_type} {log.file_id || 'N/A'} {log.original_filename || 'N/A'} {new Date(log.timestamp).toLocaleString()} {log.details}
{hasMore && (
)}
)}
); }; export default OperationLog;