8 Commits

Author SHA1 Message Date
yangsy 1f73019714 release: v0.42.0 2026-05-20 13:55:46 +08:00
yangsy 0b39c9c602 chore: 版本信息和更新日志 2026-05-20 13:55:14 +08:00
yangsy ec77b28cf2 fix: 修复设备硬件卡片进度条异常值并完善状态判断逻辑
新增进度百分比限制函数,修正0值进度的状态判断,调整模板变量判断条件
2026-05-20 13:35:41 +08:00
yangsy 983b865ff7 feat: 新增录像机环境状态卡片和网卡信息 2026-05-20 12:52:24 +08:00
yangsy 161f7db147 feat: 为交换机诊断信息添加temperature字段 2026-05-20 12:50:27 +08:00
yangsy 01a2a5bda6 feat: 新增安防箱网卡信息展示并更新卡片标题
- 修改安防箱环境卡片标题为“安防箱环境状态”
- 新增网卡信息展示模块,包含IP、子网掩码、MAC地址等参数
2026-05-20 12:48:18 +08:00
yangsy 6437b6bf35 feat: 添加服务器网卡信息展示
扩展NdmServerDiagInfo数据类型,新增网卡和IP信息字段,并在服务器诊断面板展示相关网络状态详情
2026-05-20 12:45:54 +08:00
yangsy 848f2a0018 fix: 优化安防箱环境数据卡片空标签渲染并重构风扇展示
为温度、湿度、门禁和防雷标签添加数据存在性判断,避免渲染空标签;移除冗余计算属性,改为循环直接展示每个风扇转速
2026-05-20 12:04:04 +08:00
14 changed files with 262 additions and 37 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "ndm-web-platform", "name": "ndm-web-platform",
"version": "0.41.0", "version": "0.42.0",
"private": true, "private": true,
"type": "module", "type": "module",
"engines": { "engines": {
+16
View File
@@ -1,4 +1,20 @@
[ [
{
"version": "0.42.0",
"date": "2026-05-20",
"changes": {
"fixes": [
{ "content": "优化安防箱环境数据卡片,避免空标签渲染并改进风扇信息展示" },
{ "content": "修复设备硬件卡片进度条异常值显示问题,并完善状态判断逻辑" }
],
"feats": [
{ "content": "新增服务器网卡信息展示" },
{ "content": "新增安防箱网卡信息展示,并优化相关卡片标题" },
{ "content": "为交换机诊断信息新增温度字段" },
{ "content": "新增录像机环境状态卡片和网卡信息展示" }
]
}
},
{ {
"version": "0.41.0", "version": "0.41.0",
"date": "2026-05-19", "date": "2026-05-19",
+2 -2
View File
@@ -1,4 +1,4 @@
{ {
"version": "0.41.0", "version": "0.42.0",
"buildTime": "2026-05-19 19:40:37" "buildTime": "2026-05-20 13:52:07"
} }
+43 -8
View File
@@ -10,6 +10,37 @@ export interface NdmNvrDiagInfo {
totalSize?: number; totalSize?: number;
}[]; }[];
}; };
ethInfo: {
adminStatus?: string; // '1'
desc?: string; // 'bond1'
ifType?: string; // '6'
inDiscards?: string; // '17931688'
inErrors?: string; // '0'
inNUcastPkts?: string; // '40945433'
inOctets?: string; // '3453544614'
inUcastPkts?: string; // '3375411816'
inUnknownProtos?: string; // '0'
index?: string; // '8'
lastChange?: string; // '0:05:42.15'
mTU?: string; // '1500'
macAddress?: string; // '04:7b:cb:69:92:58'
operStatus?: string; // '1'
outDiscards?: string; // '0'
outErrors?: string; // '0'
outNUcastPkts?: string; // '0'
outOctets?: string; // '3443476717'
outQLen?: string; // '0'
outUcastPkts?: string; // '415381735'
specific?: string; // '0.0'
speed?: string; // '2000000000'
};
ipInfo: {
broadcastAddress?: string; // '1'
iPAddress?: string; // '10.14.1.22'
index?: string; // '8'
mASK?: string; // '255.255.255.0'
reasmMaxSize?: string; // '0'
};
stCommonInfo?: { stCommonInfo?: {
设备ID?: string; 设备ID?: string;
软件版本?: string; 软件版本?: string;
@@ -20,12 +51,16 @@ export interface NdmNvrDiagInfo {
内存使用率?: string; 内存使用率?: string;
CPU使用率?: string; CPU使用率?: string;
}; };
cdFanInfo?: { cdFanInfo?: NdmNvrFanInfo[];
索引号?: string; cdPowerSupplyInfo?: NdmNvrPowerSupplyInfo[];
'风扇转速(rpm)'?: string; }
}[];
cdPowerSupplyInfo?: { export interface NdmNvrFanInfo {
索引号?: string; 索引号?: string;
电源状态?: string; '风扇转速(rpm)'?: string;
}[]; }
export interface NdmNvrPowerSupplyInfo {
索引号?: string;
电源状态?: string;
} }
@@ -1,5 +1,36 @@
export interface NdmSecurityBoxDiagInfo { export interface NdmSecurityBoxDiagInfo {
[key: string]: any; [key: string]: any;
ethInfo?: {
adminStatus?: string; // '1'
desc?: string; // 'br-lan'
ifType?: string; // '6'
inDiscards?: string; // '84977'
inErrors?: string; // '0'
inNUcastPkts?: string; // '233473'
inOctets?: string; // '92355850'
inUcastPkts?: string; // '899970'
inUnknownProtos?: string; // '0'
index?: string; // '8'
lastChange?: string; // '0:00:00.00'
mTU?: string; // '1500'
macAddress?: string; // '56:62:bc:d3:9e:37'
operStatus?: string; // '1'
outDiscards?: string; // '0'
outErrors?: string; // '0'
outNUcastPkts?: string; // '0'
outOctets?: string; // '68175904'
outQLen?: string; // '0'
outUcastPkts?: string; // '748100'
specific?: string; // '0.0'
speed?: string; // '0'
};
ipInfo?: {
broadcastAddress?: string; // '1'
iPAddress?: string; // '10.24.18.101'
index?: string; // '8'
mASK?: string; // '255.255.255.0'
reasmMaxSize?: string; // '0'
};
info?: [ info?: [
{ {
addrCode?: number; addrCode?: number;
@@ -6,4 +6,35 @@ export interface NdmServerDiagInfo {
磁盘使用率?: string; 磁盘使用率?: string;
系统运行时间?: string; 系统运行时间?: string;
}; };
ethInfo?: {
adminStatus?: string; // '1'
desc?: string; // 'Intel Corporation I350 Gigabit Network Connection'
ifType?: string; // '6'
inDiscards?: string; // '6707634'
inErrors?: string; // '0'
inNUcastPkts?: string; // '8991944'
inOctets?: string; // '4220524983'
inUcastPkts?: string; // '2342740610'
inUnknownProtos?: string; // '0'
index?: string; // '2'
lastChange?: string; // '0:03:15.26'
mTU?: string; // '1500'
macAddress?: string; // 'e8:78:ee:f6:8d:98'
operStatus?: string; // '1'
outDiscards?: string; // '0'
outErrors?: string; // '0'
outNUcastPkts?: string; // '0'
outOctets?: string; // '1415770066'
outQLen?: string; // '0'
outUcastPkts?: string; // '3335494729'
specific?: string; // '0.0'
speed?: string; // '1000000000'
};
ipInfo?: {
broadcastAddress?: string; // '1'
iPAddress?: string; // '10.14.1.8'
index?: string; // '2'
mASK?: string; // '255.255.255.0'
reasmMaxSize?: string; // '0'
};
} }
@@ -2,6 +2,7 @@ export interface NdmSwitchDiagInfo {
[key: string]: any; [key: string]: any;
cpuRatio?: string; // 因环境不同可能不存在 cpuRatio?: string; // 因环境不同可能不存在
memoryRatio?: string; // 因环境不同可能不存在 memoryRatio?: string; // 因环境不同可能不存在
temperature?: number;
logTime?: string; logTime?: string;
info?: { info?: {
overFlowPorts?: string[]; overFlowPorts?: string[];
@@ -51,8 +51,13 @@ const formattedRunningTime = computed(() => {
return (runningTime?.value ?? '-').replace('days', '天'); return (runningTime?.value ?? '-').replace('days', '天');
}); });
const getProgressStatus = (percent?: number): ProgressStatus | undefined => { const getProgressPercentage = (percent: number) => {
if (!percent) return undefined; if (percent < 0) return 0;
if (percent > 100) return 100;
return percent;
};
const getProgressStatus = (percent: number): ProgressStatus => {
if (percent >= 90) return 'error'; if (percent >= 90) return 'error';
if (percent >= 70) return 'warning'; if (percent >= 70) return 'warning';
return 'success'; return 'success';
@@ -66,20 +71,20 @@ const getProgressStatus = (percent?: number): ProgressStatus | undefined => {
</template> </template>
<template #default> <template #default>
<NFlex vertical> <NFlex vertical>
<NFlex v-if="cpuUsage" style="width: 100%" align="center" :wrap="false"> <NFlex v-if="cpuPercent" style="width: 100%" align="center" :wrap="false">
<NIcon :component="CpuIcon" /> <NIcon :component="CpuIcon" />
<span style="word-break: keep-all">{{ cpuUsageLabel || 'CPU' }}</span> <span style="word-break: keep-all">{{ cpuUsageLabel || 'CPU' }}</span>
<NProgress :percentage="cpuPercent" :status="getProgressStatus(cpuPercent)">{{ cpuPercent ?? '-' }}%</NProgress> <NProgress :percentage="getProgressPercentage(cpuPercent)" :status="getProgressStatus(cpuPercent)">{{ cpuPercent }}%</NProgress>
</NFlex> </NFlex>
<NFlex v-if="memUsage" style="width: 100%" align="center" :wrap="false"> <NFlex v-if="memPercent" style="width: 100%" align="center" :wrap="false">
<NIcon :component="MemoryStickIcon" /> <NIcon :component="MemoryStickIcon" />
<span style="word-break: keep-all">{{ memUsageLabel || '内存' }}</span> <span style="word-break: keep-all">{{ memUsageLabel || '内存' }}</span>
<NProgress :percentage="memPercent" :status="getProgressStatus(memPercent)">{{ memPercent ?? '-' }}%</NProgress> <NProgress :percentage="getProgressPercentage(memPercent)" :status="getProgressStatus(memPercent)">{{ memPercent }}%</NProgress>
</NFlex> </NFlex>
<NFlex v-if="diskUsage" style="width: 100%" align="center" :wrap="false"> <NFlex v-if="diskPercent" style="width: 100%" align="center" :wrap="false">
<NIcon :component="HardDriveIcon" /> <NIcon :component="HardDriveIcon" />
<span style="word-break: keep-all">{{ diskUsageLabel || '磁盘' }}</span> <span style="word-break: keep-all">{{ diskUsageLabel || '磁盘' }}</span>
<NProgress :percentage="diskPercent" :status="getProgressStatus(diskPercent)">{{ diskPercent ?? '-' }}%</NProgress> <NProgress :percentage="getProgressPercentage(diskPercent)" :status="getProgressStatus(diskPercent)">{{ diskPercent }}%</NProgress>
</NFlex> </NFlex>
<NFlex v-if="runningTime" style="width: 100%" align="center" :wrap="false"> <NFlex v-if="runningTime" style="width: 100%" align="center" :wrap="false">
<NIcon :component="ClockCheckIcon" /> <NIcon :component="ClockCheckIcon" />
@@ -2,6 +2,7 @@ import type { ComponentInstance } from 'vue';
import DeviceCommonCard from './device-common-card.vue'; import DeviceCommonCard from './device-common-card.vue';
import DeviceHardwareCard from './device-hardware-card.vue'; import DeviceHardwareCard from './device-hardware-card.vue';
import DeviceHeaderCard from './device-header-card.vue'; import DeviceHeaderCard from './device-header-card.vue';
import NvrEnvCard from './nvr-env-card.vue';
import NvrDiskCard from './nvr-disk-card.vue'; import NvrDiskCard from './nvr-disk-card.vue';
import NvrRecordCheckCard from './nvr-record-check-card.vue'; import NvrRecordCheckCard from './nvr-record-check-card.vue';
import SecurityBoxCircuitCard from './security-box-circuit-card.vue'; import SecurityBoxCircuitCard from './security-box-circuit-card.vue';
@@ -16,6 +17,7 @@ export {
DeviceCommonCard, DeviceCommonCard,
DeviceHardwareCard, DeviceHardwareCard,
DeviceHeaderCard, DeviceHeaderCard,
NvrEnvCard,
NvrDiskCard, NvrDiskCard,
NvrRecordCheckCard, NvrRecordCheckCard,
SecurityBoxCircuitCard, SecurityBoxCircuitCard,
@@ -0,0 +1,47 @@
<script setup lang="ts">
import type { NdmNvrFanInfo, NdmNvrPowerSupplyInfo } from '@/apis';
import { FanIcon, PlugIcon } from 'lucide-vue-next';
import { NCard, NFlex, NIcon, NTag } from 'naive-ui';
import { computed, toRefs } from 'vue';
const props = defineProps<{
fanInfo?: NdmNvrFanInfo[];
powerSupplyInfo?: NdmNvrPowerSupplyInfo[];
}>();
const { fanInfo, powerSupplyInfo } = toRefs(props);
const showCard = computed(() => {
return Object.values(props).some((value) => !!value);
});
</script>
<template>
<NCard v-if="showCard" hoverable size="small">
<template #header>
<span>录像机环境状态</span>
</template>
<template #default>
<NFlex vertical>
<NTag v-for="info in fanInfo ?? []" :key="info['索引号']">
<template #icon>
<NIcon :component="FanIcon" />
</template>
<template #default>
<span>风扇{{ info['索引号'] }}: {{ info['风扇转速(rpm)'] }} RPM</span>
</template>
</NTag>
<NTag v-for="info in powerSupplyInfo ?? []" :key="info['索引号']">
<template #icon>
<NIcon :component="PlugIcon" />
</template>
<template #default>
<span>电源{{ info['索引号'] }}: {{ info['电源状态'] }}</span>
</template>
</NTag>
</NFlex>
</template>
</NCard>
</template>
<style scoped></style>
@@ -35,21 +35,16 @@ const getStatusTagType = (status: string | null) => {
if (['失效', '开门'].includes(status ?? '')) return 'error'; if (['失效', '开门'].includes(status ?? '')) return 'error';
return 'default'; return 'default';
}; };
const formattedFanSpeeds = computed(() => {
if (!fanSpeeds?.value || fanSpeeds.value.length === 0) return null;
return fanSpeeds.value.map((speed, index) => `风扇${index + 1}: ${speed} RPM`).join(', ');
});
</script> </script>
<template> <template>
<NCard v-if="showCard" hoverable size="small"> <NCard v-if="showCard" hoverable size="small">
<template #header> <template #header>
<span>安防箱状态</span> <span>安防箱环境状态</span>
</template> </template>
<template #default> <template #default>
<NFlex vertical> <NFlex vertical>
<NTag> <NTag v-if="!!temperature">
<template #icon> <template #icon>
<NIcon :component="ThermometerIcon" /> <NIcon :component="ThermometerIcon" />
</template> </template>
@@ -57,7 +52,7 @@ const formattedFanSpeeds = computed(() => {
<span>温度: {{ temperature }}</span> <span>温度: {{ temperature }}</span>
</template> </template>
</NTag> </NTag>
<NTag> <NTag v-if="!!humidity">
<template #icon> <template #icon>
<NIcon :component="DropletIcon" /> <NIcon :component="DropletIcon" />
</template> </template>
@@ -65,15 +60,15 @@ const formattedFanSpeeds = computed(() => {
<span>湿度: {{ humidity }}%</span> <span>湿度: {{ humidity }}%</span>
</template> </template>
</NTag> </NTag>
<NTag> <NTag v-for="(speed, index) in fanSpeeds ?? []" :key="index">
<template #icon> <template #icon>
<NIcon :component="FanIcon" /> <NIcon :component="FanIcon" />
</template> </template>
<template #default> <template #default>
<span>风扇: {{ formattedFanSpeeds }}</span> <span>风扇{{ index + 1 }}: {{ speed }} RPM</span>
</template> </template>
</NTag> </NTag>
<NTag :type="getStatusTagType(accessControlStatus)"> <NTag v-if="!!accessControlStatus" :type="getStatusTagType(accessControlStatus)">
<template #icon> <template #icon>
<NIcon :component="ShieldIcon" /> <NIcon :component="ShieldIcon" />
</template> </template>
@@ -81,7 +76,7 @@ const formattedFanSpeeds = computed(() => {
<span>门禁: {{ accessControlStatus }}</span> <span>门禁: {{ accessControlStatus }}</span>
</template> </template>
</NTag> </NTag>
<NTag :type="getStatusTagType(lightningProtectionStatus)"> <NTag v-if="!!lightningProtectionStatus" :type="getStatusTagType(lightningProtectionStatus)">
<template #icon> <template #icon>
<NIcon :component="ZapIcon" /> <NIcon :component="ZapIcon" />
</template> </template>
@@ -1,6 +1,6 @@
<script setup lang="ts"> <script setup lang="ts">
import type { NdmNvrDiagInfo, NdmNvrResultVO, Station } from '@/apis'; import type { NdmNvrDiagInfo, NdmNvrResultVO, Station } from '@/apis';
import { DeviceCommonCard, DeviceHardwareCard, DeviceHeaderCard, NvrDiskCard, NvrRecordCheckCard, type DeviceCommonCardProps } from '@/components'; import { DeviceCommonCard, DeviceHardwareCard, DeviceHeaderCard, NvrDiskCard, NvrEnvCard, NvrRecordCheckCard, type DeviceCommonCardProps } from '@/components';
import { isNvrCluster } from '@/helpers'; import { isNvrCluster } from '@/helpers';
import destr from 'destr'; import destr from 'destr';
import { NFlex } from 'naive-ui'; import { NFlex } from 'naive-ui';
@@ -21,9 +21,14 @@ const lastDiagInfo = computed(() => {
}); });
const commonInfo = computed<DeviceCommonCardProps['commonInfo']>(() => { const commonInfo = computed<DeviceCommonCardProps['commonInfo']>(() => {
const { stCommonInfo } = lastDiagInfo.value ?? {}; const { ipAddress } = ndmDevice.value;
if (!stCommonInfo) return undefined; const { ethInfo, ipInfo, stCommonInfo } = lastDiagInfo.value ?? {};
const { 设备ID, 软件版本, 生产厂商, 设备别名, 设备型号, 硬件版本 } = stCommonInfo; const { 设备ID, 软件版本, 生产厂商, 设备别名, 设备型号, 硬件版本 } = stCommonInfo ?? {};
let operStatus = '-';
if (!!ethInfo?.operStatus) {
operStatus = ethInfo?.operStatus === '1' ? '正常' : '异常';
}
return [ return [
{ {
@@ -37,6 +42,17 @@ const commonInfo = computed<DeviceCommonCardProps['commonInfo']>(() => {
{ label: '硬件版本', value: 硬件版本 || '-' }, { label: '硬件版本', value: 硬件版本 || '-' },
], ],
}, },
{
title: '设备网卡信息',
items: [
{ label: 'IP地址', value: ipAddress || '-' },
{ label: '子网掩码', value: ipInfo?.mASK || '-' },
{ label: 'MAC地址', value: ethInfo?.macAddress || '-' },
{ label: '连接速率', value: ethInfo?.speed || '-' },
{ label: 'MTU', value: ethInfo?.mTU || '-' },
{ label: '运行状态', value: operStatus },
],
},
]; ];
}); });
@@ -45,6 +61,9 @@ const memUsage = computed(() => lastDiagInfo.value?.stCommonInfo?.内存使用
const diskHealth = computed(() => lastDiagInfo.value?.info?.diskHealth); const diskHealth = computed(() => lastDiagInfo.value?.info?.diskHealth);
const diskArray = computed(() => lastDiagInfo.value?.info?.groupInfoList); const diskArray = computed(() => lastDiagInfo.value?.info?.groupInfoList);
const fanInfo = computed(() => lastDiagInfo.value?.cdFanInfo);
const powerSupplyInfo = computed(() => lastDiagInfo.value?.cdPowerSupplyInfo);
</script> </script>
<template> <template>
@@ -52,6 +71,7 @@ const diskArray = computed(() => lastDiagInfo.value?.info?.groupInfoList);
<DeviceHeaderCard :ndm-device="ndmDevice" :station="station" /> <DeviceHeaderCard :ndm-device="ndmDevice" :station="station" />
<DeviceCommonCard :common-info="commonInfo" /> <DeviceCommonCard :common-info="commonInfo" />
<DeviceHardwareCard :cpu-usage="cpuUsage" :mem-usage="memUsage" /> <DeviceHardwareCard :cpu-usage="cpuUsage" :mem-usage="memUsage" />
<NvrEnvCard :fan-info="fanInfo" :power-supply-info="powerSupplyInfo" />
<NvrDiskCard :disk-health="diskHealth" :disk-array="diskArray" /> <NvrDiskCard :disk-health="diskHealth" :disk-array="diskArray" />
<template v-if="isNvrCluster(ndmDevice)"> <template v-if="isNvrCluster(ndmDevice)">
<NvrRecordCheckCard :ndm-device="ndmDevice" :station="station" /> <NvrRecordCheckCard :ndm-device="ndmDevice" :station="station" />
@@ -35,9 +35,15 @@ const vendor = computed(() => {
}); });
const commonInfo = computed<DeviceCommonCardProps['commonInfo']>(() => { const commonInfo = computed<DeviceCommonCardProps['commonInfo']>(() => {
const { stCommonInfo } = lastDiagInfo.value ?? {}; const { ipAddress } = ndmDevice.value;
const { ethInfo, ipInfo, stCommonInfo } = lastDiagInfo.value ?? {};
const { 设备ID, 软件版本, 设备厂商, 设备别名, 设备型号, 硬件版本 } = stCommonInfo ?? {}; const { 设备ID, 软件版本, 设备厂商, 设备别名, 设备型号, 硬件版本 } = stCommonInfo ?? {};
let operStatus = '-';
if (!!ethInfo?.operStatus) {
operStatus = ethInfo?.operStatus === '1' ? '正常' : '异常';
}
return [ return [
{ {
title: '设备型号信息', title: '设备型号信息',
@@ -50,6 +56,17 @@ const commonInfo = computed<DeviceCommonCardProps['commonInfo']>(() => {
{ label: '硬件版本', value: 硬件版本 || '-' }, { label: '硬件版本', value: 硬件版本 || '-' },
], ],
}, },
{
title: '设备网卡信息',
items: [
{ label: 'IP地址', value: ipAddress || '-' },
{ label: '子网掩码', value: ipInfo?.mASK || '-' },
{ label: 'MAC地址', value: ethInfo?.macAddress || '-' },
{ label: '连接速率', value: ethInfo?.speed || '-' },
{ label: 'MTU', value: ethInfo?.mTU || '-' },
{ label: '运行状态', value: operStatus },
],
},
]; ];
}); });
@@ -1,6 +1,6 @@
<script setup lang="ts"> <script setup lang="ts">
import { type NdmServerDiagInfo, type NdmServerResultVO, type Station } from '@/apis'; import { type NdmServerDiagInfo, type NdmServerResultVO, type Station } from '@/apis';
import { DeviceHardwareCard, DeviceHeaderCard, ServerAlive, ServerHighAvailable, ServerStreamPush } from '@/components'; import { DeviceCommonCard, DeviceHardwareCard, DeviceHeaderCard, ServerAlive, ServerHighAvailable, ServerStreamPush, type DeviceCommonCardProps } from '@/components';
import destr from 'destr'; import destr from 'destr';
import { NFlex } from 'naive-ui'; import { NFlex } from 'naive-ui';
import { computed, toRefs } from 'vue'; import { computed, toRefs } from 'vue';
@@ -19,6 +19,30 @@ const lastDiagInfo = computed(() => {
return result as NdmServerDiagInfo; return result as NdmServerDiagInfo;
}); });
const commonInfo = computed<DeviceCommonCardProps['commonInfo']>(() => {
const { ipAddress } = ndmDevice.value;
const { ethInfo, ipInfo } = lastDiagInfo.value ?? {};
let operStatus = '-';
if (!!ethInfo?.operStatus) {
operStatus = ethInfo?.operStatus === '1' ? '正常' : '异常';
}
return [
{
title: '设备网卡信息',
items: [
{ label: 'IP地址', value: ipAddress || '-' },
{ label: '子网掩码', value: ipInfo?.mASK || '-' },
{ label: 'MAC地址', value: ethInfo?.macAddress || '-' },
{ label: '连接速率', value: ethInfo?.speed || '-' },
{ label: 'MTU', value: ethInfo?.mTU || '-' },
{ label: '运行状态', value: operStatus },
],
},
];
});
const cpuUsage = computed(() => lastDiagInfo.value?.commInfo?.CPU使用率); const cpuUsage = computed(() => lastDiagInfo.value?.commInfo?.CPU使用率);
const memUsage = computed(() => lastDiagInfo.value?.commInfo?.内存使用率); const memUsage = computed(() => lastDiagInfo.value?.commInfo?.内存使用率);
const diskUsage = computed(() => lastDiagInfo.value?.commInfo?.磁盘使用率); const diskUsage = computed(() => lastDiagInfo.value?.commInfo?.磁盘使用率);
@@ -29,6 +53,7 @@ const runningTime = computed(() => lastDiagInfo.value?.commInfo?.系统运行时
<NFlex vertical> <NFlex vertical>
<ServerHighAvailable :ndm-device="ndmDevice" :station="station" /> <ServerHighAvailable :ndm-device="ndmDevice" :station="station" />
<DeviceHeaderCard :ndm-device="ndmDevice" :station="station" /> <DeviceHeaderCard :ndm-device="ndmDevice" :station="station" />
<DeviceCommonCard :common-info="commonInfo" />
<DeviceHardwareCard running-time-label="服务器运行时间" :cpu-usage="cpuUsage" :mem-usage="memUsage" :disk-usage="diskUsage" :running-time="runningTime" /> <DeviceHardwareCard running-time-label="服务器运行时间" :cpu-usage="cpuUsage" :mem-usage="memUsage" :disk-usage="diskUsage" :running-time="runningTime" />
<ServerAlive :ndm-device="ndmDevice" :station="station" /> <ServerAlive :ndm-device="ndmDevice" :station="station" />
<ServerStreamPush :ndm-device="ndmDevice" :station="station" /> <ServerStreamPush :ndm-device="ndmDevice" :station="station" />