import { Card, Link, Space, Grid, Divider, Typography } from '@arco-design/web-react'; import { IconApps, IconUser, IconUserGroup } from 'tushan/icon'; import React, { useState, useEffect } from 'react'; import { useTranslation } from 'react-i18next'; const authStorageKey = 'tushan:auth'; export const Dashboard: React.FC = React.memo(() => { const [userCount, setUserCount] = useState(0); //用户数量 const [kbCount, setkbCount] = useState(0); const [modelCount, setmodelCount] = useState(0); useEffect(() => { const fetchCounts = async () => { const baseUrl = import.meta.env.VITE_PUBLIC_SERVER_URL; const { token } = JSON.parse(window.localStorage.getItem(authStorageKey) ?? '{}'); const headers = { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` }; const userResponse = await fetch(`${baseUrl}/users?_end=1`, { headers }); const kbResponse = await fetch(`${baseUrl}/kbs?_end=1`, { headers }); const modelResponse = await fetch(`${baseUrl}/models?_end=1`, { headers }); const userTotalCount = userResponse.headers.get('X-Total-Count'); const kbTotalCount = kbResponse.headers.get('X-Total-Count'); const modelTotalCount = modelResponse.headers.get('X-Total-Count'); console.log(userTotalCount); if (userTotalCount) { setUserCount(Number(userTotalCount)); } if (kbTotalCount) { setkbCount(Number(kbTotalCount)); } if (modelTotalCount) { setmodelCount(Number(modelTotalCount)); } }; fetchCounts(); }, []); return (
FastGpt Admin {/* 把 userCount 传递给 DataItem 组件 */} } title={'用户'} count={userCount} /> } title={'知识库'} count={kbCount} /> } title={'AI模型'} count={modelCount} />
); }); Dashboard.displayName = 'Dashboard'; const DashboardItem: React.FC< React.PropsWithChildren<{ title: string; href?: string; }> > = React.memo((props) => { const { t } = useTranslation(); return ( {t('tushan.dashboard.more')} ) } bordered={false} style={{ overflow: 'hidden' }} > {props.children} ); }); DashboardItem.displayName = 'DashboardItem'; const DataItem: React.FC<{ icon: React.ReactElement; title: string; count: number; }> = React.memo((props) => { return (
{props.icon}
{props.title}
{props.count}
); }); DataItem.displayName = 'DataItem';