From f75719ca37f7449c3641a39927c952e11c151e9f Mon Sep 17 00:00:00 2001 From: zhongzm Date: Wed, 6 Nov 2024 15:25:23 +0800 Subject: [PATCH 1/7] =?UTF-8?q?fix:=E4=BF=AE=E6=94=B9=E6=97=A5=E6=9C=9F?= =?UTF-8?q?=E9=80=89=E6=8B=A9=E5=99=A8=E9=BB=98=E8=AE=A4=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/perfManage/kpiKeyTarget/index.vue | 12 +---- src/views/perfManage/kpiOverView/index.vue | 59 +++++++++++++-------- 2 files changed, 39 insertions(+), 32 deletions(-) diff --git a/src/views/perfManage/kpiKeyTarget/index.vue b/src/views/perfManage/kpiKeyTarget/index.vue index 39bae357..58e0a880 100644 --- a/src/views/perfManage/kpiKeyTarget/index.vue +++ b/src/views/perfManage/kpiKeyTarget/index.vue @@ -250,7 +250,6 @@ const chartStates: Record> = O //日期选择器 interface RangePicker extends Record { placeholder: [string, string]; - ranges: Record; } // 日期选择器状态 @@ -258,17 +257,11 @@ const rangePicker = reactive({ ...Object.fromEntries(networkElementTypes.value.map(type => [ type, [ - dayjs().startOf('day').valueOf().toString(), // 0 点 0 分 0 秒 - dayjs().valueOf().toString() // 此时 + dayjs().startOf('hour').valueOf().toString(), // 当前小时内 + dayjs().endOf('hour').valueOf().toString() ] ])) as Record, placeholder: [t('views.monitor.monitor.startTime'), t('views.monitor.monitor.endTime')] as [string, string], - ranges: { - [t('views.monitor.monitor.yesterday')]: [dayjs().subtract(1, 'day').startOf('day'), dayjs().subtract(1, 'day').endOf('day')], - [t('views.monitor.monitor.today')]: [dayjs().startOf('day'), dayjs()], - [t('views.monitor.monitor.week')]: [dayjs().startOf('week'), dayjs().endOf('week')], - [t('views.monitor.monitor.month')]: [dayjs().startOf('month'), dayjs().endOf('month')], - } as Record, }); // 可复用的图表初始化函数 @@ -896,7 +889,6 @@ const applyTwoColumnLayout = () => { format="YYYY-MM-DD HH:mm:ss" value-format="x" :placeholder="rangePicker.placeholder" - :ranges="rangePicker.ranges" style="width: 360px" @change="() => fetchData(item.i)" class="no-drag" diff --git a/src/views/perfManage/kpiOverView/index.vue b/src/views/perfManage/kpiOverView/index.vue index f5508fde..b73736d6 100644 --- a/src/views/perfManage/kpiOverView/index.vue +++ b/src/views/perfManage/kpiOverView/index.vue @@ -19,7 +19,7 @@ interface KPIBase{ kpiId: string; title: string; } - +//继承接口 interface KPIColumn extends KPIBase{ dataIndex: string; key: string; @@ -49,8 +49,8 @@ const ws = ref(null); //日期范围响应式变量 const dateRange = ref<[string, string]>([ - dayjs().startOf('day').valueOf().toString(), - dayjs().valueOf().toString(), + dayjs().startOf('hour').valueOf().toString(), + dayjs().endOf('hour').valueOf().toString(), ]); //实时数据状态 const isRealtime = ref(false); @@ -98,6 +98,10 @@ const TARGET_KPI_IDS: Record = { // 实时数据开关函数 const fnRealTimeSwitch = (bool: boolean) => { if (bool) { + if(!chart){ + isRealtime.value=false; + return; + } if (!ws.value) { ws.value = new WS(); } @@ -141,6 +145,9 @@ const handleWebSocketMessage = (kpiEvent:any)=>{ }; //成功回调 const wsMessage = (res:Record)=>{ + if(!chart){ + return; + } const{code,data}=res; if(code===RESULT_CODE_ERROR||!data?.groupId)return; handleWebSocketMessage(data.data); @@ -304,27 +311,27 @@ const updateChart = () => { }, xAxis: { // 指定x轴类型为类目轴,适用于离散的类目数据 - type: 'category', + //type: 'category', // boundaryGap 控制坐标轴两边留白 // 当为折线图时(isLine为true)时不留白,柱状图时留白 // 这样可以让折线图从原点开始,柱状图有合适的间距 - boundaryGap: isLine, + //boundaryGap: isLine, // 设置x轴的数据 // 将时间戳转换为格式化的时间字符串 data:chartData.value.map(item=> dayjs(Number(item.date)).format('YYYY-MM-DD HH:mm:ss') ), // 设置坐标轴刻度标签的样式 - axisLabel: { - // 格式化函数,这里直接返回原值 - formatter: (value: string) => value, - // 刻度标签旋转角度,0表示不旋转 - rotate: 0, - // 自动计算标签显示的间隔,防止标签重叠 - interval: 'auto', // 自动计算显示间隔 - // 刻度标签对齐方式,右对齐 - align: 'right', - }, + // axisLabel: { + // // 格式化函数,这里直接返回原值 + // formatter: (value: string) => value, + // // 刻度标签旋转角度,0表示不旋转 + // rotate: 0, + // // 自动计算标签显示的间隔,防止标签重叠 + // interval: 'auto', // 自动计算显示间隔 + // // 刻度标签对齐方式,右对齐 + // align: 'right', + // }, }, yAxis: { // y轴配置 @@ -546,14 +553,18 @@ const { t, currentLocale } = useI18n(); // 更新图表数据方法 const updateChartData = (newData: ChartDataItem) => { - chartData.value.push(newData); - if (chartData.value.length > 100) { - chartData.value.shift(); + if(!chart){ + return; } - - if (chart) { + chartData.value.push(newData); + if (chartData.value.length > 50) {//100改为50 + chartData.value.shift();//大于100条时删除最早的数据 + } + //使用try-catch包裹图表更新逻辑 + try { requestAnimationFrame(() => { - chart!.setOption({ + if (!chart) return; + const option = { xAxis: { data: chartData.value.map(item => dayjs(Number(item.date)).format('YYYY-MM-DD HH:mm:ss') @@ -567,11 +578,15 @@ const updateChartData = (newData: ChartDataItem) => { name: kpi?.title || kpiId, }; }), - }); + }; + chart.setOption(option); }); + }catch (error){ + console.error('Failed to update chart:', error); } }; + // groupedKPIs 计算属性,使用 TARGET_KPI_IDS 来分组过滤 const groupedKPIs = computed(() => { const groups: Record = {}; From 6326f46bf21dd2903c983c58d4b208b14f2f6eef Mon Sep 17 00:00:00 2001 From: zhongzm Date: Wed, 6 Nov 2024 19:44:52 +0800 Subject: [PATCH 2/7] =?UTF-8?q?style:=E6=A0=B7=E5=BC=8F=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=EF=BC=8C=E6=9A=97=E9=BB=91=E8=89=B2=E9=80=82=E5=BA=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/perfManage/kpiOverView/index.vue | 109 ++++++++++++++++----- 1 file changed, 83 insertions(+), 26 deletions(-) diff --git a/src/views/perfManage/kpiOverView/index.vue b/src/views/perfManage/kpiOverView/index.vue index b73736d6..891ff313 100644 --- a/src/views/perfManage/kpiOverView/index.vue +++ b/src/views/perfManage/kpiOverView/index.vue @@ -700,29 +700,30 @@ const handleSecondaryKPIChange = (kpiId: string, checked: boolean) => { {{ neType.toUpperCase() }}