2021-02-28 22:24:54 +08:00

254 lines
4.5 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="ct">
<el-row :gutter="20">
<el-col :lg="6" :md="12" :xs="24">
<div class="block">
<p class="label">负载状态</p>
<el-popover width="100" trigger="hover">
<div class="system-perf-progress-popover">
<ul>
<li>CPU{{ cpu.perc | fixed2 }} %</li>
<li>内存{{ mem.perc | fixed2 }} %</li>
</ul>
</div>
<el-progress
slot="reference"
type="circle"
:percentage="lb.perc | fixed2"
:color="lb.perc | status_color"
></el-progress>
</el-popover>
</div>
</el-col>
<el-col :lg="6" :md="12" :xs="24">
<div class="block">
<p class="label">CPU存使用率</p>
<el-progress
type="circle"
:percentage="cpu.perc | fixed2"
:color="cpu.perc | status_color"
></el-progress>
</div>
</el-col>
<el-col :lg="6" :md="12" :xs="24">
<div class="block">
<p class="label">内存使用率</p>
<el-popover width="100" trigger="hover">
<div class="system-perf-progress-popover">
<ul>
<li>总数{{ mem.total | unit_size }}</li>
<li>已使用{{ mem.used | unit_size }}</li>
</ul>
</div>
<el-progress
slot="reference"
type="circle"
:percentage="mem.perc | fixed2"
:color="mem.perc | status_color"
></el-progress>
</el-popover>
</div>
</el-col>
<el-col :lg="6" :md="12" :xs="24" v-for="(item, index) in disk.list" :key="index">
<div class="block">
<p class="label">{{ item.mount }}</p>
<el-popover width="100" trigger="hover">
<div class="system-perf-progress-popover">
<ul>
<li>总数{{ item.size | unit_size }}</li>
<li>已使用{{ item.used | unit_size }}</li>
</ul>
</div>
<el-progress
slot="reference"
type="circle"
:percentage="item.use | fixed2"
:color="item.use | status_color"
></el-progress>
</el-popover>
</div>
</el-col>
</el-row>
</div>
</template>
<script>
import Common from "./common";
export default {
filters: {
status_color(v) {
if (v < 50) {
return "#67C23A";
}
if (v < 70) {
return "#E6A23C";
}
if (v < 100) {
return "#F56C6C";
}
}
},
mixins: [Common],
data() {
return {
lb: {
perc: 0
},
redis: {
options: {},
perc: 0
},
mysql: {
options: {},
number: 0,
perc: 0
},
cpu: {
options: {},
perc: 0
},
mem: {
perc: 0,
total: 0,
used: 0
},
disk: {
list: [],
all: 0
}
};
},
methods: {
refresh(res) {
const { data } = res;
const item = data[data.length - 1];
this.toMysql(res, item.mysql);
this.toRedis(res, item.redis);
this.toCPU(res, item.server.cpu);
this.toDisk(item.server.disk.filter((e) => e.size));
this.toMem(item.server.mem);
this.toLB();
},
toLB() {
let mem = this.mem.perc;
let cpu = this.cpu.perc;
if (mem >= 90) {
this.lb.perc = mem;
} else if (cpu >= 80) {
this.lb.perc = cpu;
} else {
this.lb.perc = mem * 0.4 + cpu * 0.6;
}
},
toCPU(undefined, cpu) {
this.cpu.perc = cpu.currentload;
},
toMem(mem) {
this.mem.perc = (mem.buffcache / mem.total) * 100;
this.mem.total = mem.total;
this.mem.used = mem.buffcache;
},
toDisk(disk) {
this.disk.all = disk.reduce((a, b) => a + b.size, 0);
this.disk.list = disk.map((e) => {
e.use = e.use.toFixed(2);
return e;
});
},
toRedis(undefined, item) {
this.redis.perc = parseFloat(item.Memory.used_memory_dataset_perc);
},
toMysql(undefined, item) {
let free = 0;
let used = 0;
item.mysqlSize.forEach((e) => {
free += parseFloat(e.data_free);
used += parseFloat(e.data_size);
});
this.mysql.number = item.mysqlSize.length;
this.mysql.perc = (used / (free + used)).toFixed(2);
}
}
};
</script>
<style lang="scss">
.system-perf-progress-popover {
ul {
li {
list-style: none;
line-height: 30px;
}
}
}
</style>
<style lang="scss" scoped>
.ct {
background-color: #fff;
.block {
background-color: #fff;
width: 100%;
border-radius: 3px;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
padding: 20px;
box-sizing: border-box;
position: relative;
height: 220px;
cursor: pointer;
.label {
font-size: 16px;
height: 40px;
}
.perc {
position: absolute;
padding: 5px 10px;
background-color: #fff;
}
.c {
height: 50px;
.echarts {
height: 100%;
width: 100%;
}
}
}
}
</style>