Files
lc_frontend/src/views/Home/Index3.vue
2025-10-17 10:31:13 +08:00

348 lines
9.6 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div class="w-100%">
<div class="flex justify-between items-center">
<div
class="w-[calc(50%-50px)] py-16px px-20px bg-#fff border-rd-10px b-1px .dark:bg-#1D1E1F .dark:b-#2A2B2C .dark:b-solid"
>
<h5 class="text">服务器基本信息</h5>
<div class="w-100% inline-grid grid-cols-4 gap-4 text-center">
<div class="left-bottom-box" v-for="(item, index) in topLeftData" :key="index">
<p>{{ item.title }}</p>
<div>
<span>{{ item.num }}</span> {{ item.dw }}
</div>
</div>
</div>
</div>
<div
class="flex w-[calc(50%-50px)] px-20px bg-#fff border-rd-10px justify-between items-center b-1px .dark:bg-#1D1E1F .dark:b-#2A2B2C .dark:b-solid"
>
<div class="conter-right-box" v-for="(item, index) in arr" :key="index">
<p class="text-conter">{{ item.title }}</p>
<div class="chart">
<Echart :options="syl_pie_option" width="140px" height="130px"></Echart>
</div>
</div>
<!-- <div class="conter-right-box">
<p class="text-conter">内存使用率</p>
<div class="chart">
<Echart :options="syl_pie_option" width="140px" height="130px"></Echart>
</div>
</div>
<div class="conter-right-box">
<p class="text-conter">系统平均负载1m</p>
<div class="chart">
<Echart :options="syl_pie_option" width="140px" height="130px"></Echart>
</div>
</div> -->
</div>
</div>
<div class="flex justify-between mt-20px">
<div
class="w-[calc(50%-50px)] bg-#fff border-rd-10px p-20px b-1px .dark:bg-#1D1E1F .dark:b-#2A2B2C .dark:b-solid"
>
<Echart :options="cpu_line_option" width="100%" height="350px" />
</div>
<div
class="w-[calc(50%-50px)] bg-#fff border-rd-10px p-20px b-1px .dark:bg-#1D1E1F .dark:b-#2A2B2C .dark:b-solid"
>
<Echart :options="nc_line_option" width="100%" height="350px" />
</div>
</div>
<div class="flex justify-between mt-20px">
<div
class="w-[calc(50%-50px)] bg-#fff border-rd-10px p-20px b-1px .dark:bg-#1D1E1F .dark:b-#2A2B2C .dark:b-solid"
>
<Echart :options="ll_line_option" width="100%" height="350px" />
</div>
<div
class="w-[calc(50%-50px)] bg-#fff border-rd-10px p-20px b-1px .dark:bg-#1D1E1F .dark:b-#2A2B2C .dark:b-solid"
>
<Echart :options="cp_line_option" width="100%" height="350px" />
</div>
</div>
</div>
</template>
<script lang="ts" setup>
import { useAppStore } from '@/store/modules/app'
import { CACHE_KEY, useCache } from '@/hooks/web/useCache'
import { batchGetTableList } from '@/api/design/report'
defineOptions({ name: 'Home3' })
interface TopLeftData {
title: string
dw: string
dictionary: string
num?: number
}
const topLeftData = ref<TopLeftData[]>([
{ title: '系统运行时间', dw: '天', dictionary: 'xtyxsj' },
{ title: 'cpu核心数', dw: '', dictionary: 'cpuhxs' },
{ title: '内存总量', dw: 'G', dictionary: 'nczl' },
{ title: '系统平均负数', dw: '', dictionary: 'xtpjfz' }
])
const arr = ref<any>([
{ title: 'CPU使用率1m', dictionary: 'cpusyl' },
{ title: '内存使用率', dictionary: 'ncsyl' },
{ title: '系统平均负载1m', dictionary: 'xtpjfzl' }
])
const syl_pie_option = ref<any>({
title: { text: '50%', left: 'center', top: 'center' },
series: [
{
type: 'pie',
stillShowZeroSum: false,
label: { show: false },
hoverAnimation: false,
data: [
{ value: 100, name: 'A' },
{ value: 0, name: 'B' }
],
itemStyle: {
normal: {
color: function (params) {
var colors = ['#e9e9e9', '#0099ff', '#51d351']
return colors[params.dataIndex % colors.length]
}
}
},
radius: ['50%', '70%']
}
]
})
const cpuLineXAxis = ref<string[]>([])
const cpuLineSeries = ref<string[]>([])
const cpu_line_option = reactive<any>({
title: {
text: 'CPU使用率',
textStyle: {}
},
tooltip: {},
legend: { data: ['使用率'], x: 'right', selectedMode: false },
xAxis: {
data: cpuLineXAxis.value
},
yAxis: { type: 'value' },
series: [
{
name: '使用率',
data: cpuLineSeries.value,
type: 'line',
stack: 'x',
areaStyle: { color: '#ffd7dc' },
itemStyle: { normal: { color: '#ffd7dc', lineStyle: { color: '#ff7a8c' } } }
}
]
})
const ncLineXAxis = ref<string[]>([])
const ncLineSeries = ref<string[]>([])
const nc_line_option = reactive<any>({
title: {
text: '内存使用率',
textStyle: {}
},
tooltip: {},
legend: { data: ['使用率'], x: 'right', selectedMode: false },
xAxis: {
data: ncLineXAxis.value
},
yAxis: { type: 'value' },
series: [
{
name: '使用率',
data: ncLineSeries.value,
type: 'line',
stack: 'x',
areaStyle: { color: '#b2e0ff' },
itemStyle: { normal: { color: '#b2e0ff', lineStyle: { color: '#0099ff' } } }
}
]
})
const llLineXAxis = ref<string[]>([])
const llLineSeries1 = ref<string[]>([])
const llLineSeries2 = ref<string[]>([])
const ll_line_option = reactive<any>({
title: {
text: '服务器流量',
textStyle: {}
},
tooltip: {},
legend: { data: ['上传', '下载'], x: 'right', selectedMode: false },
xAxis: { data: llLineXAxis.value },
yAxis: { type: 'value' },
series: [
{
name: '上传',
data: llLineSeries1.value,
type: 'line',
// stack: 'x',
areaStyle: { color: '#caf1ca' },
itemStyle: { normal: { color: '#51d351', lineStyle: { color: '#51d351' } } }
},
{
name: '下载',
data: llLineSeries2.value,
type: 'line',
// stack: 'x',
areaStyle: { color: '#ffe5c9' },
itemStyle: { normal: { color: '#ffb465', lineStyle: { color: '#ffb465' } } }
}
]
})
const cpLineXAxis = ref<string[]>([])
const cpLineSeries1 = ref<string[]>([])
const cpLineSeries2 = ref<string[]>([])
const cp_line_option = reactive<any>({
title: {
text: '服务器磁盘IO',
textStyle: {}
},
tooltip: {},
legend: { data: ['输出', '输入'], x: 'right', selectedMode: false },
xAxis: { data: cpLineXAxis.value },
yAxis: { type: 'value' },
series: [
{
name: '输出',
data: cpLineSeries1.value,
type: 'line',
// stack: 'x',
areaStyle: { color: '#bdf1f1' },
itemStyle: { normal: { color: '#78e3e4', lineStyle: { color: '#78e3e4' } } }
},
{
name: '输入',
data: cpLineSeries2.value,
type: 'line',
// stack: 'x',
areaStyle: { color: '#d9d1fc' },
itemStyle: { normal: { color: '#8167f5', lineStyle: { color: '#8167f5' } } }
}
]
})
const textStyle = reactive({
color: ''
})
const appStore = useAppStore()
const init = async () => {
let oneres = await batchGetTableList(
'example_systemmonitor_server_information,example_systemmonitor_cpu_utilization,example_systemmonitor_memory_utilization,example_systemmonitor_server_traffic,example_systemmonitor_disk_io'
)
let serverInformation = oneres.example_systemmonitor_server_information.records[0]
topLeftData.value = topLeftData.value.map((item) => {
return (item = {
...item,
num: serverInformation[item.dictionary]
})
})
arr.value = arr.value.map((item) => {
syl_pie_option.value.title.text = serverInformation[item.dictionary] + '%'
syl_pie_option.value.series[0].data[1].value = serverInformation[item.dictionary]
return item
})
//CPU使用率
let cpuUtilization = oneres.example_systemmonitor_cpu_utilization.records
cpuUtilization.forEach((ele) => {
cpuLineXAxis.value.push(ele.sj)
cpuLineSeries.value.push(ele.syl)
})
//内存使用率
let memoryUtilization = oneres.example_systemmonitor_memory_utilization.records
memoryUtilization.forEach((ele) => {
ncLineXAxis.value.push(ele.sj)
ncLineSeries.value.push(ele.syl)
})
//服务器流量
let serverTraffic = oneres.example_systemmonitor_server_traffic.records
serverTraffic.forEach((ele) => {
llLineXAxis.value.push(ele.sj)
llLineSeries1.value.push(ele.sc)
llLineSeries2.value.push(ele.xz)
})
//服务器磁盘IO
let diskIo = oneres.example_systemmonitor_disk_io.records
diskIo.forEach((ele) => {
cpLineXAxis.value.push(ele.sj)
cpLineSeries1.value.push(ele.sc)
cpLineSeries2.value.push(ele.sr)
})
}
onMounted(async () => {
await init()
// 判断是否为暗色模式
const { wsCache } = useCache()
if (wsCache.get(CACHE_KEY.IS_DARK)) {
textStyle.color = '#E5EAF3'
cpu_line_option.title.textStyle = textStyle
nc_line_option.title.textStyle = textStyle
ll_line_option.title.textStyle = textStyle
cp_line_option.title.textStyle = textStyle
}
})
watch(
() => appStore.isDark,
(val) => {
if (val) {
textStyle.color = '#E5EAF3'
} else {
textStyle.color = 'black'
}
cpu_line_option.title.textStyle = textStyle
nc_line_option.title.textStyle = textStyle
ll_line_option.title.textStyle = textStyle
cp_line_option.title.textStyle = textStyle
}
)
</script>
<style lang="scss" scoped>
h5,
p {
padding: 0;
margin: 0;
}
.conter-right-box {
width: 200px;
text-align: center;
.text-conter {
margin-top: 15px;
font-size: 14px;
}
.chart {
display: flex;
width: 100%;
justify-content: center;
}
}
.left-bottom-box {
margin: 20px 0;
font-size: 12px;
text-align: center;
span {
font-size: 28px;
font-weight: 600;
}
}
.text {
margin-bottom: 20px;
font-size: 14px;
color: #666;
}
</style>