mirror of
https://github.com/cool-team-official/cool-admin-vue.git
synced 2025-12-14 06:42:51 +00:00
254 lines
4.5 KiB
Vue
254 lines
4.5 KiB
Vue
<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>
|