dataControl/src/views/Home.vue

320 lines
7.7 KiB
Vue

<template>
<el-card class="content-div">
<div class="all-content">
<div class="time-div">
<span>2023年08月23日 星期三 09:57:11</span>
<el-button type="primary" @click="getTime"></el-button>
<el-button type="primary" @click="getTime"></el-button>
</div>
<div class="top-div">
<div class="left-div">
<h3>设备信息</h3>
<div>
<span class="name">型号</span>
<span class="value">{{ deviceData.basicinfo.model }}</span>
</div>
<div>
<span class="name">序列号</span>
<span class="value">{{ deviceData.basicinfo.sn }}</span>
</div>
<div>
<span class="name">开机时间</span>
<span class="value">{{ deviceData.hostinfo.boottime }}</span>
</div>
<div>
<span class="name">运行时长</span>
<span class="value">{{ deviceData.hostinfo.uptime }}</span>
</div>
</div>
<div class="right-div">
<h3>内存信息</h3>
<div id="echartDiv" class="echartDiv"></div>
</div>
</div>
<div class="bottom-div">
<div class="left-div">
<h3>磁盘信息</h3>
<div class="process-div">
<div v-for="(item, index) in deviceData.diskinfo" :key="index">
<div :id="'echartDiv' + index" class="echartDiv"></div>
</div>
</div>
</div>
<div class="right-div">
<h3>网卡信息</h3>
<div v-for="(item, index) of deviceData.netinfo" :key="index">
<p>网卡{{ item.name }}的使用情况</p>
<div class="data">
<span>
<span class="name">字节</span>
<span class="dataValue">
<span class="recv">{{ item.bytesRecv }}</span>
<span class="sent">{{ item.bytesSent }}</span>
</span>
</span>
<span>
<span class="name"></span>
<span class="dataValue">
<span class="recv">{{ item.packetsRecv }}</span>
<span class="sent">{{ item.packetsSent }}</span>
</span>
</span>
</div>
</div>
</div>
</div>
</div>
</el-card>
</template>
<script>
import { onMounted, reactive, ref, toRefs, nextTick } from "vue";
import infoApi from "@/api/infoApi.js";
import { ElMessage } from "element-plus";
import * as echarts from "echarts";
import { user, token, response, info } from '../proto/data/pd'
export default {
name: "home",
setup() {
const state = reactive({
deviceData: {
basicinfo: {},
hostinfo: {},
diskinfo: [],
netinfo: [],
meminfo: [],
},
});
onMounted(() => {
getSys();
});
const getSys = async () => {
const res = await infoApi.getSys();
// 解析返回数据
const ret = response.decode(new Uint8Array(res));
console.log(ret)
if (ret.code == 0) {
// 解析数据
state.deviceData = info.decode(ret.data);
console.log(44, state.deviceData);
nextTick(() => {
drawEchart();
});
}
};
const drawEchart = () => {
let dom = document.getElementById("echartDiv");
let data = {
name: "内存使用比",
usedPercent: state.deviceData.meminfo.usedPercent.toFixed(2),
used: state.deviceData.meminfo.usedPercent.toFixed(2),
total: 100,
};
getEchart(dom, data);
state.deviceData.diskinfo.forEach((ele, index) => {
let domItem = document.getElementById("echartDiv" + index);
let dataItem = {
name: ele.name.split("/")[2],
usedPercent: ele.usedPercent.toFixed(2),
used: ele.usedPercent.toFixed(2),
total: 100,
};
getEchart(domItem, dataItem);
});
};
const getEchart = (dom, data) => {
if (dom) {
var myChart = echarts.init(dom);
var option = {
tooltip: {
trigger: "item",
show: false
},
graphic: {
elements: [
{
type: "text",
left: "40%",
top: "middle",
style: {
text: data.name + "\n" + " " + data.usedPercent + "%",
fill: "#000",
fontSize: 16,
},
},
],
},
series: [
{
name: data.name,
type: "pie",
radius: ["60%", "70%"],
avoidLabelOverlap: false,
label: {
show: false,
position: "center",
},
emphasis: {
label: {
show: false,
fontSize: 40,
fontWeight: "bold",
},
},
labelLine: {
show: false,
},
data: [
{ value: data.used, name: "使用" },
{ value: data.total - data.used, name: "未使用" },
],
},
],
};
option && myChart.setOption(option);
}
};
return {
...toRefs(state),
};
},
};
</script>
<style lang="scss" scoped>
.all-content {
display: flex;
flex-direction: column;
justify-content: space-between;
}
.time-div {
height: 8%;
width: 100%;
border-radius: 20px;
border: 1px solid #c3c3c3;
display: flex;
align-items: center;
justify-content: flex-end;
padding: 0 15px;
>span {
padding: 0 15px;
}
}
.top-div {
height: 39%;
width: 100%;
display: flex;
justify-content: space-between;
}
.bottom-div {
height: 49%;
width: 100%;
display: flex;
justify-content: space-between;
}
.left-div {
height: 100%;
width: 65%;
border: 1px solid #c3c3c3;
border-radius: 20px;
flex-direction: column;
justify-content: space-around;
display: flex;
padding: 20px;
> div {
height: 50px;
line-height: 50px;
display: flex;
justify-content: space-between;
text-align: center;
}
.name {
width: 25%;
border: 1px solid #c3c3c3;
height: 100%;
}
.value {
width: 73%;
border: 1px solid #c3c3c3;
}
.process {
width: 73%;
padding: 15px 0;
}
.process-div {
height: 100%;
justify-content: space-around;
align-items: center;
> div {
width: 48%;
height: 100%;
}
}
}
.right-div {
height: 100%;
width: 34%;
border: 1px solid #c3c3c3;
flex-direction: column;
justify-content: space-around;
border-radius: 20px;
display: flex;
padding: 25px;
> div {
height: 49%;
flex-direction: column;
justify-content: space-between;
display: flex;
align-items: center;
}
.data {
width: 70%;
height: 80%;
display: flex;
justify-content: space-between;
flex-direction: column;
>span {
height: 45%;
display: flex;
align-items: center;
.name {
width: 20%;
}
.dataValue {
width: 80%;
display: flex;
justify-content: space-between;
align-items: center;
span {
width: 40%;
border: 1px solid #c3c3c3;
text-align: center;
border-radius: 10px;
padding: 10px 0;
color: #098658
}
.recv {
background: #f8cecc;
}
.sent {
background: #dae8fc;
}
}
}
}
}
.echartDiv {
width: 70% !important;
height: 100% !important;
margin: 0 auto;
}
</style>