mirror of
https://github.com/APIParkLab/APIPark.git
synced 2026-07-06 16:11:56 +08:00
d7e28c9704
- Load balancing (can connect to multiple accounts, automatically switch accounts when there is no quota) - AI call log - Model rate configuration
171 lines
5.3 KiB
TypeScript
171 lines
5.3 KiB
TypeScript
import { FC, useMemo } from 'react'
|
|
import ECharts, { EChartsOption } from 'echarts-for-react'
|
|
import { changeNumberUnit } from '../utils/dashboard'
|
|
import { $t } from '@common/locales'
|
|
import { useGlobalContext } from '@common/contexts/GlobalStateContext'
|
|
|
|
type PieGraphProps = {
|
|
className?: string
|
|
title: string
|
|
pieData: { [key: string]: number }
|
|
labelName: string
|
|
labelValue: string
|
|
subText: string
|
|
subValue: unknown
|
|
status4xxCount?: number
|
|
status5xxCount?: number
|
|
}
|
|
|
|
const MonitorPieGraph: FC<PieGraphProps> = ({
|
|
className,
|
|
title,
|
|
pieData,
|
|
labelName,
|
|
labelValue,
|
|
subText,
|
|
subValue,
|
|
status4xxCount,
|
|
status5xxCount
|
|
}) => {
|
|
const { state } = useGlobalContext()
|
|
const transferData: (value: { [key: string]: number }) => Array<{ name: string; value: number }> = (value: {
|
|
[key: string]: number
|
|
}) => {
|
|
const res: Array<{ name: string; value: number }> = []
|
|
const keys = Object.keys(value)
|
|
for (const item of keys) {
|
|
res.push({ name: item, value: value[item] })
|
|
}
|
|
return res
|
|
}
|
|
|
|
const option: EChartsOption = useMemo(
|
|
() => ({
|
|
tooltip: {
|
|
trigger: 'item',
|
|
formatter: (params: Array<Record<string, unknown>>) => {
|
|
const startHtml =
|
|
'<div><section style="align-items: center;display:flex; justify-content: space-between;flex-wrap: nowrap;"><span> ' +
|
|
$t(title) +
|
|
'</span></div>'
|
|
return (
|
|
startHtml +
|
|
($t(params.name || '-') +
|
|
'    </span><span style="font-weight:bold"> ' +
|
|
params.value +
|
|
'</span></section></div>')
|
|
)
|
|
}
|
|
},
|
|
title: [
|
|
{
|
|
right: '10',
|
|
subtext: `{title|${$t(subText)}}{percent|${subValue}}`,
|
|
top: '15%',
|
|
subtextStyle: {
|
|
rich: {
|
|
title: { fontSize: 14, color: '#666666', lineHeight: 22, padding: [8, 0, 8, 0] },
|
|
percent: {
|
|
fontSize: 14,
|
|
color: '#666666',
|
|
width: 60,
|
|
lineHeight: 22,
|
|
align: 'right',
|
|
padding: [8, 0, 8, 8]
|
|
}
|
|
},
|
|
fontSize: 14,
|
|
color: '#666666',
|
|
lineHeight: 22,
|
|
padding: [8, 0, 8, 0]
|
|
}
|
|
}
|
|
],
|
|
legend: [
|
|
{
|
|
top: 'center',
|
|
right: '10',
|
|
orient: 'vertical',
|
|
formatter: (name) => {
|
|
return `{title|${$t(name)}}{percent|${changeNumberUnit(pieData[name]).value ? changeNumberUnit(pieData[name]).value + $t(changeNumberUnit(pieData[name]).unit) : '0'}}`
|
|
},
|
|
textStyle: {
|
|
rich: {
|
|
title: {
|
|
fontSize: 14,
|
|
color: '#666666',
|
|
lineHeight: 22,
|
|
width: state.language === 'en' ? 134 : 70,
|
|
padding: [8, 0, 8, 0]
|
|
},
|
|
percent: {
|
|
fontSize: 14,
|
|
color: '#666666',
|
|
width: 60,
|
|
lineHeight: 22,
|
|
align: 'right',
|
|
padding: [8, 0, 8, 8]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
],
|
|
series: [
|
|
{
|
|
center: ['25%', '50%'],
|
|
name: title,
|
|
type: 'pie',
|
|
color: ['#1890FF', '#13c2c2'],
|
|
radius: ['50%', '75%'],
|
|
avoidLabelOverlap: false,
|
|
label: {
|
|
show: true,
|
|
position: 'center',
|
|
formatter: '{text|' + $t(labelName) + '}{value|' + labelValue + '}',
|
|
rich: {
|
|
text: { fontSize: 14, color: '#666666', lineHeight: 22, padding: [0, 0, 6, 0] },
|
|
value: { fontSize: 20, color: '#333333', lineHeight: 32, padding: [0, 0, 6, 0] }
|
|
}
|
|
},
|
|
labelLine: {
|
|
show: false
|
|
},
|
|
data: transferData(pieData)
|
|
}
|
|
]
|
|
}),
|
|
[state.language, pieData]
|
|
)
|
|
|
|
return (
|
|
<div className={`${className} min-w-[570px] p-[16px] relative text-DESC_TEXT overflow-x-auto rounded`}>
|
|
<div className="font-medium text-[16px] text-DESC_TEXT">{title}</div>
|
|
<div className="flex">
|
|
<ECharts option={option} style={{ height: '230px', width: '70%' }} />
|
|
|
|
<div className="w-[30%] flex white-nowrap text-[14px]">
|
|
<div className="absolute flex items-center top-[calc(31%+1px)] text-gray-300 border-0 border-l-[1px] border-solid border-gray-200 space-y-[16px] pl-[10px]">
|
|
<ul className="list-none truncate my-0 ps-[10px]">
|
|
<li className="h-[18px]"></li>
|
|
<li className="text-[#999999] mt-[16px]">
|
|
{$t('状态码4XX数')}
|
|
<span className="text-[#999999] inline-block w-[50px] ml-[10px] text-right">
|
|
{changeNumberUnit(status4xxCount).value + $t(changeNumberUnit(status4xxCount).unit)}
|
|
</span>
|
|
</li>
|
|
<li className="text-[#999999] mt-[18px]">
|
|
{$t('状态码5XX数')}
|
|
<span className="text-[#999999] inline-block w-[50px] ml-[10px] text-right">
|
|
{changeNumberUnit(status5xxCount).value + $t(changeNumberUnit(status5xxCount).unit)}
|
|
</span>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
)
|
|
}
|
|
|
|
export default MonitorPieGraph
|