import { useEffect, useMemo, useState } from 'react'; import { CalendarDays, Download, FileText, Search } from 'lucide-react'; import { Button, Input, Pagination, Select, Table, Tag, type TableColumn, } from '@/components/ui'; import { clientApi, type OperationLogItem } from '@/api/adminApi'; type LogLevel = 'info' | 'success' | 'warning' | 'error'; const levelLabelMap: Record = { info: '信息', success: '成功', warning: '警告', error: '错误', }; const levelToneMap: Record = { info: 'info', success: 'success', warning: 'warning', error: 'danger', }; export function ClientSystemLogsPage() { const [keyword, setKeyword] = useState(''); const [level, setLevel] = useState('all'); const [module, setModule] = useState('all'); const [range, setRange] = useState('today'); const [page, setPage] = useState(1); const pageSize = 5; const [logs, setLogs] = useState([]); const [modules, setModules] = useState([]); const [total, setTotal] = useState(0); const [error, setError] = useState(''); useEffect(() => { clientApi.listSystemLogs({ keyword, level, module, range, page, pageSize }) .then((data) => { setLogs(data.items); setModules(data.modules); setTotal(data.total); setError(''); }) .catch((err) => { setLogs([]); setTotal(0); setError(err instanceof Error ? err.message : '系统日志加载失败'); }); }, [keyword, level, module, range, page]); const moduleOptions = useMemo(() => { return [{ label: '全部模块', value: 'all' }, ...modules.map((item) => ({ label: item, value: item }))]; }, [modules]); const totalPages = Math.max(1, Math.ceil(total / pageSize)); const currentPage = Math.min(page, totalPages); const columns = useMemo>>(() => [ { key: 'time', title: '时间', width: '190px', render: (record) => {new Date(record.time).toLocaleString('zh-CN')} }, { key: 'level', title: '级别', width: '110px', render: (record) => {levelLabelMap[record.level]} }, { key: 'module', title: '模块', width: '150px', render: (record) => {record.module} }, { key: 'operator', title: '操作人', width: '130px', render: (record) => {record.operator} }, { key: 'action', title: '操作', width: '160px', render: (record) => {record.action} }, { key: 'detail', title: '详情', render: (record) => {JSON.stringify(record.detail)} }, { key: 'ip', title: 'IP地址', width: '150px', render: (record) => {record.ip} }, ], []); return (

系统日志

{ setKeyword(event.target.value); setPage(1); }} placeholder="搜索操作人、操作或详情" prefix={} value={keyword} /> { setModule(event.target.value); setPage(1); }} options={moduleOptions} value={module} />
时间范围: {[ { label: '今天', value: 'today' }, { label: '近7天', value: '7d' }, { label: '近30天', value: '30d' }, { label: '全部', value: 'all' }, ].map((item) => ( ))}
= totalPages} onNext={() => setPage((value) => Math.min(totalPages, value + 1))} onPrevious={() => setPage((value) => Math.max(1, value - 1))} page={currentPage} previousDisabled={currentPage <= 1} total={total} /> ); }