nginx-ui/app/src/views/dashboard/components/NodeAnalyticItem.vue
Jacky cb4977e5ab
refactor: nodes analytics (#847)
* refactor: nodes analytics

* feat(debug): add pprof in debug mode

* refactor: websocket error handler
2025-02-05 18:19:17 +08:00

165 lines
3.8 KiB
Vue

<script setup lang="ts">
import cpu from '@/assets/svg/cpu.svg?component'
import memory from '@/assets/svg/memory.svg?component'
import UsageProgressLine from '@/components/Chart/UsageProgressLine.vue'
import { bytesToSize } from '@/lib/helper'
import Icon, { ArrowDownOutlined, ArrowUpOutlined, DatabaseOutlined, LineChartOutlined } from '@ant-design/icons-vue'
defineProps<{
item: {
avg_load: {
load1: number
load5: number
load15: number
}
network: {
bytesSent: number
bytesRecv: number
}
cpu_percent: number
cpu_num: number
memory_percent: number
memory_total: string
disk_percent: number
disk_total: string
}
}>()
</script>
<template>
<div class="hardware-monitor">
<div class="hardware-monitor-item longer">
<div class="mb-1">
<LineChartOutlined class="mr-1" />
<span class="load-avg-describe">1min:</span>{{ item.avg_load?.load1?.toFixed(2) }} ·
<span class="load-avg-describe">5min:</span>{{ item.avg_load?.load5?.toFixed(2) }} ·
<span class="load-avg-describe">15min:</span>{{ item.avg_load?.load15?.toFixed(2) }}
</div>
<div class="flex">
<div class="sm:text-sm md:text-xs lg:text-sm">
<ArrowUpOutlined />
{{ bytesToSize(item?.network?.bytesSent) }}
</div>
<div class="ml-2 sm:text-sm md:text-xs lg:text-sm">
<ArrowDownOutlined />
{{ bytesToSize(item?.network?.bytesRecv) }}
</div>
</div>
</div>
<div class="hardware-monitor-item">
<UsageProgressLine :percent="item.cpu_percent">
<template #icon>
<Icon :component="cpu" />
</template>
<span>{{ item.cpu_num }} CPU</span>
</UsageProgressLine>
</div>
<div class="hardware-monitor-item">
<UsageProgressLine :percent="item.memory_percent">
<template #icon>
<Icon :component="memory" />
</template>
<span>{{ item.memory_total }}</span>
</UsageProgressLine>
</div>
<div class="hardware-monitor-item">
<UsageProgressLine :percent="item.disk_percent">
<template #icon>
<DatabaseOutlined />
</template>
<span>{{ item.disk_total }}</span>
</UsageProgressLine>
</div>
</div>
</template>
<style scoped lang="less">
.hardware-monitor {
display: flex;
@media (max-width: 1000px) {
display: block;
}
.hardware-monitor-item {
width: 140px;
margin-right: 20px;
@media(min-width: 1800px) {
width: 300px;
margin-bottom: 10px;
margin-right: 50px;
}
@media(min-width: 1600px) and (max-width: 1800px) {
width: 270px;
margin-bottom: 10px;
margin-right: 20px;
}
@media(min-width: 1500px) and (max-width: 1600px) {
width: 230px;
margin-bottom: 10px;
margin-right: 30px;
}
@media(min-width: 1400px) and (max-width: 1500px) {
width: 180px;
margin-bottom: 10px;
margin-right: 25px;
}
@media(min-width: 400px) and (max-width: 1000px) {
width: 280px;
margin-bottom: 10px;
}
@media(max-width: 400px) {
width: 200px;
margin-bottom: 10px;
}
}
.longer {
width: 180px;
}
.load-avg-describe {
margin-right: 2px;
}
@media (max-width: 400px) {
.longer {
width: 180px;
.load-avg-describe {
display: none;
}
}
}
@media (min-width: 400px) and (max-width: 500px) {
.longer {
width: 300px;
}
}
@media (min-width: 1400px) {
.longer {
min-width: 300px;
}
}
@media (min-width: 1200px) {
.longer {
min-width: 270px;
}
}
@media (min-width: 400px) and (max-width: 1000px) {
.longer {
min-width: 250px;
}
}
@media (min-width: 1100px) and (max-width: 1200px) {
.longer {
min-width: 200px;
}
}
}
</style>