import { useState, useEffect } from 'react'; import { showError } from 'utils/common'; import Table from '@mui/material/Table'; import TableBody from '@mui/material/TableBody'; import TableContainer from '@mui/material/TableContainer'; import PerfectScrollbar from 'react-perfect-scrollbar'; import TablePagination from '@mui/material/TablePagination'; import LinearProgress from '@mui/material/LinearProgress'; import ButtonGroup from '@mui/material/ButtonGroup'; import Toolbar from '@mui/material/Toolbar'; import { Button, Card, Stack, Container, Typography, Box } from '@mui/material'; import LogTableRow from './component/TableRow'; import LogTableHead from './component/TableHead'; import TableToolBar from './component/TableToolBar'; import { API } from 'utils/api'; import { isAdmin } from 'utils/common'; import { ITEMS_PER_PAGE } from 'constants'; import { IconRefresh, IconSearch } from '@tabler/icons-react'; export default function Log() { const originalKeyword = { p: 0, username: '', token_name: '', model_name: '', start_timestamp: 0, end_timestamp: new Date().getTime() / 1000 + 3600, type: 0, channel: '' }; const [logs, setLogs] = useState([]); const [activePage, setActivePage] = useState(0); const [searching, setSearching] = useState(false); const [searchKeyword, setSearchKeyword] = useState(originalKeyword); const [initPage, setInitPage] = useState(true); const userIsAdmin = isAdmin(); const loadLogs = async (startIdx) => { setSearching(true); const url = userIsAdmin ? '/api/log/' : '/api/log/self/'; const query = searchKeyword; query.p = startIdx; if (!userIsAdmin) { delete query.username; delete query.channel; } const res = await API.get(url, { params: query }); const { success, message, data } = res.data; if (success) { if (startIdx === 0) { setLogs(data); } else { let newLogs = [...logs]; newLogs.splice(startIdx * ITEMS_PER_PAGE, data.length, ...data); setLogs(newLogs); } } else { showError(message); } setSearching(false); }; const onPaginationChange = (event, activePage) => { (async () => { if (activePage === Math.ceil(logs.length / ITEMS_PER_PAGE)) { // In this case we have to load more data and then append them. await loadLogs(activePage); } setActivePage(activePage); })(); }; const searchLogs = async (event) => { event.preventDefault(); await loadLogs(0); setActivePage(0); return; }; const handleSearchKeyword = (event) => { setSearchKeyword({ ...searchKeyword, [event.target.name]: event.target.value }); }; // 处理刷新 const handleRefresh = () => { setInitPage(true); }; useEffect(() => { setSearchKeyword(originalKeyword); setActivePage(0); loadLogs(0) .then() .catch((reason) => { showError(reason); }); setInitPage(false); }, [initPage]); return ( <> 日志 theme.spacing(0, 1, 0, 3) }} > {searching && } {logs.slice(activePage * ITEMS_PER_PAGE, (activePage + 1) * ITEMS_PER_PAGE).map((row, index) => ( ))}
); }