import { useState, useEffect, useCallback } from 'react'; import { showError, trims } 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 KeywordTableHead from 'ui-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'; import dayjs from 'dayjs'; export default function Log() { const originalKeyword = { p: 0, username: '', token_name: '', model_name: '', start_timestamp: 0, end_timestamp: dayjs().unix() + 3600, log_type: 0, channel: '' }; const [page, setPage] = useState(0); const [order, setOrder] = useState('desc'); const [orderBy, setOrderBy] = useState('created_at'); const [rowsPerPage, setRowsPerPage] = useState(ITEMS_PER_PAGE); const [listCount, setListCount] = useState(0); const [searching, setSearching] = useState(false); const [toolBarValue, setToolBarValue] = useState(originalKeyword); const [searchKeyword, setSearchKeyword] = useState(originalKeyword); const [refreshFlag, setRefreshFlag] = useState(false); const [logs, setLogs] = useState([]); const userIsAdmin = isAdmin(); const handleSort = (event, id) => { const isAsc = orderBy === id && order === 'asc'; if (id !== '') { setOrder(isAsc ? 'desc' : 'asc'); setOrderBy(id); } }; const handleChangePage = (event, newPage) => { setPage(newPage); }; const handleChangeRowsPerPage = (event) => { setPage(0); setRowsPerPage(parseInt(event.target.value, 10)); }; const searchLogs = async () => { setPage(0); setSearchKeyword(toolBarValue); }; const handleToolBarValue = (event) => { setToolBarValue({ ...toolBarValue, [event.target.name]: event.target.value }); }; const fetchData = useCallback( async (page, rowsPerPage, keyword, order, orderBy) => { setSearching(true); keyword = trims(keyword); try { if (orderBy) { orderBy = order === 'desc' ? '-' + orderBy : orderBy; } const url = userIsAdmin ? '/api/log/' : '/api/log/self/'; if (!userIsAdmin) { delete keyword.username; delete keyword.channel; } const res = await API.get(url, { params: { page: page + 1, size: rowsPerPage, order: orderBy, ...keyword } }); const { success, message, data } = res.data; if (success) { setListCount(data.total_count); setLogs(data.data); } else { showError(message); } } catch (error) { console.error(error); } setSearching(false); }, [userIsAdmin] ); // 处理刷新 const handleRefresh = async () => { setOrderBy('created_at'); setOrder('desc'); setToolBarValue(originalKeyword); setSearchKeyword(originalKeyword); setRefreshFlag(!refreshFlag); }; useEffect(() => { fetchData(page, rowsPerPage, searchKeyword, order, orderBy); }, [page, rowsPerPage, searchKeyword, order, orderBy, fetchData, refreshFlag]); return ( <> 日志 theme.spacing(0, 1, 0, 3) }} > {searching && } {logs.map((row, index) => ( ))}
); }