import { useMemo, useState } from 'react'; import { Badge, Button, Field, Input, Select } from '../components/ui.jsx'; import { Icon, PageTitle, Toolbar, Panel, ApiNotice, PageLoadingDialog, Drawer, SimpleTable, KeyValue, DateRangeFields } from '../components/layout.jsx'; import { operationLogRows } from '../fixtures/devFixtures.js'; import { dateRangeParams, lastSevenDays } from '../utils/dateRange.js'; const defaultRange = lastSevenDays(); function toneForStatus(status) { return status === '成功' || status === 'SUCCESS' ? 'success' : status === '失败' || status === 'FAILURE' ? 'danger' : 'neutral'; } export function OperationLogsPage({ logRows = operationLogRows, apiLoading, apiError, refreshApi }) { const [keyword, setKeyword] = useState(''); const [moduleFilter, setModuleFilter] = useState('all'); const [resultFilter, setResultFilter] = useState('all'); const [startDate, setStartDate] = useState(defaultRange.startDate); const [endDate, setEndDate] = useState(defaultRange.endDate); const [detailLog, setDetailLog] = useState(null); const modules = useMemo(() => Array.from(new Set(logRows.map((log) => log.module))), [logRows]); const visibleLogs = useMemo(() => { const normalized = keyword.trim().toLowerCase(); return logRows.filter((log) => { const matchesKeyword = !normalized || [log.user, log.username, log.action, log.object, log.ip].some((value) => value.toLowerCase().includes(normalized)); const logDate = log.time.slice(0, 10); return matchesKeyword && (moduleFilter === 'all' || log.module === moduleFilter) && (resultFilter === 'all' || log.result === resultFilter) && (!startDate || logDate >= startDate) && (!endDate || logDate <= endDate); }); }, [endDate, keyword, logRows, moduleFilter, resultFilter, startDate]); const queryLogs = (overrides = {}) => { const next = { moduleFilter, resultFilter, startDate, endDate, ...overrides }; return refreshApi({ module: next.moduleFilter, result: next.resultFilter === '成功' ? 'SUCCESS' : next.resultFilter === '失败' ? 'FAILURE' : 'all', ...dateRangeParams(next.startDate, next.endDate, 'createdFrom', 'createdTo'), }); }; const resetFilters = () => { setKeyword(''); setModuleFilter('all'); setResultFilter('all'); setStartDate(defaultRange.startDate); setEndDate(defaultRange.endDate); void queryLogs({ moduleFilter: 'all', resultFilter: 'all', ...defaultRange }); }; return ( <> }>导出日志} /> void queryLogs()} /> setKeyword(event.target.value)} placeholder="用户、操作对象或 IP" /> 共 {visibleLogs.length} 条} className="wide-panel"> }, ]} /> {detailLog ? ( {detailLog.result}} onClose={() => setDetailLog(null)}>
操作摘要

{detailLog.summary}

) : null} ); }