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'; import { XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer, AreaChart, Area } from 'tushan/chart'; import dayjs from 'dayjs'; const authStorageKey = 'tushan:auth'; type UsersChartDataType = { count: number; date: string; increase: number; increaseRate: string }; export const Dashboard: React.FC = React.memo(() => { const [userCount, setUserCount] = useState(0); //用户数量 const [kbCount, setkbCount] = useState(0); const [modelCount, setmodelCount] = useState(0); const [usersData, setUsersData] = useState([]); useEffect(() => { 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 fetchCounts = async () => { 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'); if (userTotalCount) { setUserCount(Number(userTotalCount)); } if (kbTotalCount) { setkbCount(Number(kbTotalCount)); } if (modelTotalCount) { setmodelCount(Number(modelTotalCount)); } }; const fetchUserData = async () => { const userResponse: UsersChartDataType[] = await fetch(`${baseUrl}/users/data`, { headers }).then((res) => res.json()); setUsersData( userResponse.map((item) => ({ ...item, date: dayjs(item.date).format('MM/DD') })) ); }; fetchCounts(); fetchUserData(); }, []); return (
FastGpt Admin {/* 把 userCount 传递给 DataItem 组件 */} } title={'用户'} count={userCount} /> } title={'知识库'} count={kbCount} /> } title={'应用'} count={modelCount} />
); }); Dashboard.displayName = 'Dashboard'; const DashboardItem = React.memo( (props: { title: string; href?: string; children: React.ReactNode }) => { const { t } = useTranslation(); return ( {t('tushan.dashboard.more')} ) } bordered={false} style={{ overflow: 'hidden' }} > {props.children} ); } ); DashboardItem.displayName = 'DashboardItem'; const DataItem = React.memo((props: { icon: React.ReactElement; title: string; count: number }) => { return (
{props.icon}
{props.title}
{props.count}
); }); DataItem.displayName = 'DataItem'; const CustomTooltip = ({ active, payload }: any) => { const data = payload?.[0]?.payload as UsersChartDataType; if (active && data) { return (

count: {data.count}

increase: {data.increase}

increaseRate: {data.increaseRate}

); } return null; }; const UserChart = ({ data }: { data: UsersChartDataType[] }) => { return ( } /> ); };