@@ -4,27 +4,61 @@ definePageMeta({
44})
55
66const monitorData = useState <MonitorInfo []>(' monitorData' )
7+ const { t, locale } = useI18n ()
78
8- function getColor(value : number ): string {
9- if (value < 0 ) return ' #d9d9d9'
10- if (value < 200 ) return ' #52c41a'
11- if (value < 500 ) return ' #faad14'
12- return ' #f5222d'
9+ const timeLocale = computed (() => {
10+ if (locale .value === ' zh-cn' ) return ' zh-CN'
11+ return ' en-US'
12+ })
13+
14+ function getColor(delay : number , status : boolean ): string {
15+ if (! status ) return ' #f5222d'
16+ if (delay < 500 ) return ' #52c41a'
17+ if (delay < 999 ) return ' #f7ba1e'
18+ return ' #fa8c16'
1319}
1420
1521function formatTime(timestamp : number ): string {
16- return new Date (timestamp ).toLocaleTimeString ()
22+ return new Date (timestamp ).toLocaleTimeString (timeLocale .value )
23+ }
24+
25+ function getAverageDelay(item : MonitorInfo ): number {
26+ if (! item .data .length ) return 0
27+ const totalDelay = item .data .reduce ((sum , data ) => sum + data .delay , 0 )
28+ return Math .round (totalDelay / item .data .length )
29+ }
30+
31+ function getSuccessRate(item : MonitorInfo ): number {
32+ if (! item .total ) return 0
33+ return Number (((item .success / item .total ) * 100 ).toFixed (1 ))
34+ }
35+
36+ function getDelayTagColor(item : MonitorInfo ): ' green' | ' orange' | ' red' {
37+ const avgDelay = getAverageDelay (item )
38+ if (avgDelay < 500 ) return ' green'
39+ if (avgDelay < 999 ) return ' orange'
40+ return ' red'
41+ }
42+
43+ function getSuccessRateTagColor(item : MonitorInfo ): ' green' | ' orange' | ' red' {
44+ const successRate = getSuccessRate (item )
45+ if (successRate > 90 ) return ' green'
46+ if (successRate < 60 ) return ' red'
47+ return ' orange'
1748}
1849
1950function getChartOption(item : MonitorInfo ): ECOption {
2051 const times = item .data .map (data => formatTime (data .time ))
2152 const delays = item .data .map (data => ({
2253 value: data .delay ,
2354 itemStyle: {
24- color: getColor (data .delay )
55+ color: getColor (data .delay , data . status )
2556 }
2657 }))
2758
59+ const maxDelay = item .data .reduce ((max , data ) => Math .max (max , data .delay ), 0 )
60+ const yAxisMax = Math .max (1200 , Math .ceil (maxDelay / 100 ) * 100 )
61+
2862 return {
2963 tooltip: {
3064 trigger: ' axis'
@@ -41,14 +75,14 @@ function getChartOption(item: MonitorInfo): ECOption {
4175 data: times
4276 },
4377 yAxis: {
44- max: 999 ,
78+ max: yAxisMax ,
4579 min: 0 ,
4680 type: ' value' ,
4781 show: false
4882 },
4983 series: [
5084 {
51- name: ' 延迟 ' ,
85+ name: t ( ' label.delay ' ) ,
5286 type: ' bar' ,
5387 data: delays ,
5488 barWidth: ' 70%'
@@ -61,7 +95,22 @@ function getChartOption(item: MonitorInfo): ECOption {
6195<template >
6296 <div class =" flex w-full flex-col gap-4" ref =" monitor" >
6397 <template v-for =" item in monitorData " :key =" item .host " >
64- <ACard :title =" item.host" >
98+ <ACard
99+ :title =" item.host"
100+ class =" [& _.arco-card-body]:!p-0 [& _.arco-card-header]:items-center"
101+ >
102+ <template #extra >
103+ <div
104+ class =" flex flex-nowrap items-center justify-end gap-2 whitespace-nowrap"
105+ >
106+ <ATag bordered :color =" getDelayTagColor(item)"
107+ >{{ getAverageDelay(item) }}ms</ATag
108+ >
109+ <ATag bordered :color =" getSuccessRateTagColor(item)"
110+ >{{ getSuccessRate(item).toFixed(1) }}%</ATag
111+ >
112+ </div >
113+ </template >
65114 <VChart
66115 :autoresize =" true"
67116 :option =" getChartOption(item)"
@@ -71,9 +120,3 @@ function getChartOption(item: MonitorInfo): ECOption {
71120 </template >
72121 </div >
73122</template >
74-
75- <style scoped>
76- :deep(.arco-card-size-medium .arco-card-body ) {
77- padding : 0px !important ;
78- }
79- </style >
0 commit comments