Files
fastbee/vue/src/views/index.vue
2022-06-12 12:13:23 +08:00

1066 lines
43 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="app-container home">
<el-row :gutter="40" style="margin-bottom:10px;">
<el-col :xs="24" :sm="24" :md="24" :lg="14" :xl="14">
<el-card shadow="hover" style="margin:-10px;margin-bottom:20px;font-size:14px;min-height:170px;background-color:#fafafa;">
<div style="font-size:16px;font-weight:bold;margin-bottom:18px;">物美智能生活物联网平台</div>
<div style="display:table;margin-bottom:10px;">
<div style="width:70px;font-weight: bold;display:table-cell;">个人用户</div>
<div style="display:table-cell;line-height:22px;"><b style="color:#F56C6C">可用于个人学习和使用非商业用途</b>不提供移动端源码后期可以通过两种方式使用移动端1.免费托管设备到平台2.使用移动端开放的接口连接自己搭建的系统</div>
</div>
<div style="display:table;">
<div style="width:70px;font-weight: bold;display:table-cell;">企业用户</div>
<div style="display:table-cell;line-height:22px;"><b style="color:#F56C6C">可用于商业用途并提供移动端源码通过赞助方式获取企业授权</b>但是不能低价或批量转售源码不能随意分发源码目前赞助费为2000元项目不断完善后会对应增加费用</div>
</div>
</el-card>
</el-col>
<el-col :xs="24" :sm="24" :md="24" :lg="10" :xl="10">
<el-card shadow="hover" style="margin:-10px;margin-bottom:20px;font-size:14px;min-height:170px;background-color:#fafafa;">
<div style="float:left;width:170px;">
<el-image style="width:154px;" :src="require('@/assets/images/code.jpg')"></el-image>
</div>
<div style="float:left;">
<div style="font-size:16px;font-weight:bold;margin:16px 0;">微信扫一扫查看小程序端</div>
<div style="display:table;margin-bottom:10px;">
<div style="width:70px;font-weight: bold;display:table-cell;">官方网站</div>
<div style="display:table-cell;">
<span>www.wumei.live</span>
</div>
</div>
<div style="display:table;margin-bottom:10px;">
<div style="width:70px;font-weight: bold;display:table-cell;">联系作者</div>
<div style="display:table-cell;">
<span>QQ 164770707</span>
</div>
</div>
<div style="display:table;margin-bottom:15px;">
<div style="width:70px;font-weight: bold;display:table-cell;">系统源码</div>
<div style="display:table-cell;">
<el-link target="_blank" href="https://gitee.com/kerwincui/wumei-smart" type="danger">Gitee源码</el-link>
<el-link target="_blank" href="https://github.com/kerwincui/wumei-smart" style="margin-left:20px;">Github源码</el-link>
</div>
</div>
</div>
</el-card>
</el-col>
</el-row>
<el-row :gutter="40" style="margin-bottom:100px;">
<el-col :xs="24" :sm="24" :md="24" :lg="14" :xl="14">
<el-card style="margin:-10px;" shadow="hover" body-style="background-color:#eee;">
<div ref="map" style="height:651px;margin:-17px;margin-top:-12px;"></div>
</el-card>
</el-col>
<el-col :xs="24" :sm="24" :md="24" :lg="10" :xl="10">
<el-card style="margin:-10px;background-color:#fafafa;" shadow="never">
<h3 style="font-weight:bold">设备统计</h3>
<el-row :gutter="40" class="panel-group">
<el-col :span="12" class="card-panel-col">
<div class="card-panel">
<div class="card-panel-icon-wrapper icon-blue">
<svg-icon icon-class="device" class-name="card-panel-icon" />
</div>
<div class="card-panel-description">
<div class="card-panel-text">
设备数量
</div>
<count-to :start-val="0" :end-val="deviceStatistic.deviceCount" :duration="3000" class="card-panel-num" />
</div>
</div>
</el-col>
<el-col :span="12" class="card-panel-col">
<div class="card-panel">
<div class="card-panel-icon-wrapper icon-red">
<svg-icon icon-class="monitor-a" class-name="card-panel-icon" />
</div>
<div class="card-panel-description">
<div class="card-panel-text">
监测数据
</div>
<count-to :start-val="0" :end-val="deviceStatistic.monitorCount" :duration="3000" class="card-panel-num" />
</div>
</div>
</el-col>
<el-col :span="12" class="card-panel-col">
<div class="card-panel">
<div class="card-panel-icon-wrapper icon-blue">
<svg-icon icon-class="model" class-name="card-panel-icon" />
</div>
<div class="card-panel-description">
<div class="card-panel-text">
产品数量
</div>
<count-to :start-val="0" :end-val="deviceStatistic.productCount" :duration="1000" class="card-panel-num" />
</div>
</div>
</el-col>
<el-col :span="12" class="card-panel-col">
<div class="card-panel">
<div class="card-panel-icon-wrapper icon-red">
<svg-icon icon-class="alert" class-name="card-panel-icon" />
</div>
<div class="card-panel-description">
<div class="card-panel-text">
告警数量
</div>
<count-to :start-val="0" :end-val="deviceStatistic.alertCount" :duration="1000" class="card-panel-num" />
</div>
</div>
</el-col>
<el-col :span="12" class="card-panel-col">
<div class="card-panel">
<div class="card-panel-icon-wrapper icon-blue">
<svg-icon icon-class="log-a" class-name="card-panel-icon" />
</div>
<div class="card-panel-description">
<div class="card-panel-text">
操作记录
</div>
<count-to :start-val="0" :end-val="deviceStatistic.functionCount" :duration="2000" class="card-panel-num" />
</div>
</div>
</el-col>
<el-col :span="12" class="card-panel-col">
<div class="card-panel">
<div class="card-panel-icon-wrapper icon-red">
<svg-icon icon-class="event-a" class-name="card-panel-icon" />
</div>
<div class="card-panel-description">
<div class="card-panel-text">
上报事件
</div>
<count-to :start-val="0" :end-val="deviceStatistic.eventCount" :duration="2000" class="card-panel-num" />
</div>
</div>
</el-col>
</el-row>
</el-card>
<el-card style="margin:-10px;margin-top:40px;height:300px;background-color:#fafafa;" shadow="hover">
<h3 style="font-weight:bold">信息栏</h3>
<div style="line-height:36px;">
<div style="cursor:pointer;display:table;width:100%;" @click="openDetail(item.noticeId)" v-for="item in noticeList" :key="item.noticeId">
<div style="display:table-cell;padding-right:10px;">
<el-tag size="mini" effect="dark" type="warning" v-if="item.noticeType==2">公告</el-tag>
<el-tag size="mini" effect="dark" v-else>信息</el-tag>
{{item.noticeTitle}}
</div>
<div style="display:table-cell;width:90px;font-size:14px;"><i class="el-icon-time"></i> {{ parseTime(item.createTime, '{y}-{m}-{d}') }}</div>
</div>
</div>
</el-card>
</el-col>
</el-row>
<el-row :gutter="40" v-if="isAdmin" style="margin-bottom:50px;">
<el-col :xs="24" :sm="24" :md="24" :lg="14" :xl="14">
<el-card style="margin:-10px;background-color:#fafafa;height:320px;" shadow="never">
<h3 style="font-weight:bold">Mqtt 统计指标</h3>
<el-row :gutter="20" class="panel-group">
<el-col :span="12" class="card-panel-col">
<div class="card-panel">
<div class="card-panel-icon-wrapper icon-orange">
<svg-icon icon-class="guide" class-name="card-panel-icon" />
</div>
<div class="card-panel-description">
<div class="card-panel-text">
发送字节
</div>
<count-to :start-val="0" :end-val="this.static['bytes.sent']" :duration="3000" class="card-panel-num" />
</div>
</div>
</el-col>
<el-col :span="12" class="card-panel-col">
<div class="card-panel">
<div class="card-panel-icon-wrapper icon-green">
<svg-icon icon-class="receiver" class-name="card-panel-icon" />
</div>
<div class="card-panel-description">
<div class="card-panel-text">
接收字节
</div>
<count-to :start-val="0" :end-val="this.static['bytes.received']" :duration="3000" class="card-panel-num" />
</div>
</div>
</el-col>
<el-col :span="12" class="card-panel-col">
<div class="card-panel">
<div class="card-panel-icon-wrapper icon-orange">
<svg-icon icon-class="authenticate" class-name="card-panel-icon" />
</div>
<div class="card-panel-description">
<div class="card-panel-text">
认证次数
</div>
<count-to :start-val="0" :end-val="this.static['client.authenticate']" :duration="1000" class="card-panel-num" />
</div>
</div>
</el-col>
<el-col :span="12" class="card-panel-col">
<div class="card-panel">
<div class="card-panel-icon-wrapper icon-green">
<svg-icon icon-class="connect" class-name="card-panel-icon" />
</div>
<div class="card-panel-description">
<div class="card-panel-text">
连接次数
</div>
<count-to :start-val="0" :end-val="this.static['client.connected']" :duration="1000" class="card-panel-num" />
</div>
</div>
</el-col>
<el-col :span="12" class="card-panel-col">
<div class="card-panel">
<div class="card-panel-icon-wrapper icon-orange">
<svg-icon icon-class="subscribe1" class-name="card-panel-icon" />
</div>
<div class="card-panel-description">
<div class="card-panel-text">
订阅次数
</div>
<count-to :start-val="0" :end-val="this.static['client.subscribe']" :duration="2000" class="card-panel-num" />
</div>
</div>
</el-col>
<el-col :span="12" class="card-panel-col">
<div class="card-panel">
<div class="card-panel-icon-wrapper icon-green">
<svg-icon icon-class="message" class-name="card-panel-icon" />
</div>
<div class="card-panel-description">
<div class="card-panel-text">
接收消息
</div>
<count-to :start-val="0" :end-val="this.static['messages.received']" :duration="2000" class="card-panel-num" />
</div>
</div>
</el-col>
</el-row>
</el-card>
</el-col>
<el-col :xs="24" :sm="24" :md="24" :lg="10" :xl="10">
<el-card style="margin:-10px;background-color:#fafafa;" shadow="hover">
<div ref="statsChart" style="height:283px;"></div>
</el-card>
</el-col>
</el-row>
<el-row :gutter="40" v-if="isAdmin">
<el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="6">
<el-card style="margin:-10px;height:218px;margin-bottom:30px;background-color:#fafafa;" shadow="hover">
<table class="description">
<tr>
<td><strong>服务器名称 </strong></td>
<td>{{server.sys.computerName}}</td>
</tr>
<tr>
<td><strong>服务器IP </strong></td>
<td>{{server.sys.computerIp}}</td>
</tr>
<tr>
<td><strong>操作系统 </strong></td>
<td>{{server.sys.osName}}</td>
</tr>
<tr>
<td><strong>系统架构 </strong></td>
<td>{{server.sys.osArch}}</td>
</tr>
<tr>
<td><strong>CPU核心 </strong></td>
<td>{{server.cpu.cpuNum}}</td>
</tr>
<tr>
<td><strong>总内存 </strong></td>
<td>{{server.mem.total}}</td>
</tr>
</table>
</el-card>
</el-col>
<el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4">
<el-card style="margin:-10px;height:218px;margin-bottom:30px;background-color:#fafafa;" shadow="hover">
<div ref="pieCpu" style="height:200px;margin-bottom:-20px;"></div>
</el-card>
</el-col>
<el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4">
<el-card style="margin:-10px;height:218px;margin-bottom:30px;background-color:#fafafa;" shadow="hover">
<div ref="pieMemery" style="height:200px;margin-bottom:-20px;"></div>
</el-card>
</el-col>
<el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4">
<el-card style="margin:-10px;height:218px;margin-bottom:30px;background-color:#fafafa;" shadow="hover">
<div ref="pieDisk" style="height:200px;margin-bottom:-20px;"></div>
</el-card>
</el-col>
<el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="6">
<el-card style="margin:-10px;height:218px;margin-bottom:30px;background-color:#fafafa;" shadow="hover">
<table class="description">
<tr>
<td><strong>Java名称 </strong></td>
<td>{{server.jvm.name}}</td>
</tr>
<tr>
<td><strong>启动时间 </strong></td>
<td>{{server.jvm.startTime}}</td>
</tr>
<tr>
<td><strong>Java版本 </strong></td>
<td>{{server.jvm.version}}</td>
</tr>
<tr>
<td><strong>运行时长 </strong></td>
<td>{{server.jvm.runTime}}</td>
</tr>
<tr>
<td><strong>占用内存 </strong></td>
<td>{{server.jvm.used}}</td>
</tr>
<tr>
<td><strong>JVM总内存 </strong></td>
<td>{{server.jvm.total}}</td>
</tr>
</table>
</el-card>
</el-col>
</el-row>
<!--通知公告详情 -->
<el-dialog :title="notice.noticeTitle" :visible.sync="open" width="800px" append-to-body>
<div style="margin-top:-20px;margin-bottom:10px;">
<el-tag size="mini" effect="dark" type="warning" v-if="notice.noticeType==2">公告</el-tag>
<el-tag size="mini" effect="dark" v-else>信息</el-tag>
<span style="margin-left:20px;">{{notice.createTime}}</span>
</div>
<div v-loading="loading" style="line-height:24px;padding:10px;border:1px solid #eee;border-radius:10px;">
<div v-html="notice.noticeContent"></div>
</div>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="closeDetail"> </el-button>
</div>
</el-dialog>
<div style="width:100%;text-align:center;font-size:14px;color:#666;line-height:32px;margin-top:150px;">
<span>Copyright © 2021-2022 <a href="https://wumei.live/" target="_blank">Wumei Smart</a> | <a href="https://wumei.live/" target="_blank">物美智能</a> | Apache License</span><br />
<span>项目文档<a href="https://wumei.live/doc/" target="_blank"> https://wumei.live/doc/</a></span>
</div>
</div>
</template>
<script>
import {
getDeviceStatistic,
} from "@/api/iot/device";
import {
listNotice,
getNotice,
} from "@/api/system/notice";
import CountTo from 'vue-count-to'
import * as echarts from 'echarts';
require('echarts/theme/macarons') // echarts theme
import {
loadBMap
} from './iot/map.js'
//安装的是echarts完整包里面包含百度地图扩展路径为 echarts/extension/bmap/bmap.js将其引入
//ECharts的百度地图扩展可以在百度地图上展现点图线图热力图等可视化
require('echarts/extension/bmap/bmap')
import {
getServer
} from "@/api/monitor/server";
import {
getMqttStats,
statisticMqtt
} from "@/api/iot/emqx";
import {
listAllDeviceShort,
} from "@/api/iot/device";
export default {
name: "Index",
components: {
CountTo
},
data() {
return {
// 遮罩层
loading: true,
// 是否显示弹出层
open: false,
// 信息列表
noticeList: [],
// 信息详情
notice: {},
// 是否为管理员
isAdmin: false,
// 设备列表
deviceList: [],
// 设备统计信息
deviceStatistic: {},
// 设备总数
deviceCount: 0,
// emqx状态数据
stats: {},
// emqx统计信息
static: {},
// 版本号
version: "3.8.0",
// 服务器信息
server: {
jvm: {
name: "",
version: "",
startTime: "",
runTime: "",
used: "",
total: 100
},
sys: {
computerName: "",
osName: "",
computerIp: "",
osArch: ""
},
cpu: {
cpuNum: 1
},
mem: {
total: 2
}
}
};
},
created() {
this.init();
this.getAllDevice();
this.getNoticeList();
this.getDeviceStatistic();
},
methods: {
init() {
if (this.$store.state.user.roles.indexOf("tenant") === -1 && this.$store.state.user.roles.indexOf("general") === -1) {
this.isAdmin = true
this.getServer();
this.getMqttStats();
this.statisticMqtt();
}
},
/** 查询设备统计信息 */
getDeviceStatistic() {
getDeviceStatistic().then(response => {
this.deviceStatistic = response.data;
});
},
/** 查询公告列表 */
getNoticeList() {
let queryParams = {
pageNum: 1,
pageSize: 6,
};
listNotice(queryParams).then(response => {
this.noticeList = response.rows;
});
},
// 打开信息详情
openDetail(id) {
this.open = true;
this.loading = true;
getNotice(id).then(response => {
this.notice = response.data;
this.open = true;
this.loading = false;
});
},
// 取消按钮
closeDetail() {
this.title = "";
this.open = false;
},
/**查询所有设备 */
getAllDevice() {
listAllDeviceShort(this.queryParams).then(response => {
this.deviceList = response.rows;
this.deviceCount = response.total;
this.$nextTick(() => {
loadBMap().then(() => {
this.getmap();
});
})
})
},
/** 查询emqx统计*/
statisticMqtt() {
statisticMqtt().then(response => {
this.static = response.data.data[0].metrics;
})
},
/** 查询emqx状态数据*/
getMqttStats() {
getMqttStats().then(response => {
this.stats = response.data.data[0].stats;
this.drawStats();
})
},
/** 查询服务器信息 */
getServer() {
getServer().then(response => {
this.server = response.data;
this.$nextTick(() => {
this.drawPieCpu();
this.drawPieMemery();
this.drawPieDisk();
})
});
},
/** 地图 */
getmap() {
var myChart = echarts.init(this.$refs.map);
var option;
// 单击事件
myChart.on('click', (params) => {
if (params.data.deviceId) {
this.$router.push({
path: '/iot/device-edit',
query: {
t: Date.now(),
deviceId: params.data.deviceId,
}
});
}
});
// 格式化数据
let convertData = function (data, status) {
var res = [];
for (var i = 0; i < data.length; i++) {
var geoCoord = [data[i].longitude, data[i].latitude];
if (geoCoord && data[i].status == status) {
res.push({
name: data[i].deviceName,
value: geoCoord,
serialNumber: data[i].serialNumber,
status: data[i].status,
isShadow: data[i].isShadow,
firmwareVersion: data[i].firmwareVersion,
networkAddress: data[i].networkAddress,
productName: data[i].productName,
activeTime: data[i].activeTime == null ? '' : data[i].activeTime,
deviceId: data[i].deviceId,
serialNumber:data[i].serialNumber,
});
}
}
return res;
};
option = {
title: {
text: '设备分布和状态(数量 ' + this.deviceCount + '',
subtext: 'wumei-smart open source living iot platform',
sublink: 'https://iot.wumei.live',
target: "_blank",
textStyle: {
color: '#333',
textBorderColor: '#fff',
textBorderWidth: 10,
},
top: 10,
left: 'center'
},
tooltip: {
trigger: 'item',
formatter: function (params) {
var htmlStr = '<div style="padding:5px;line-height:28px;">';
htmlStr += "设备名称: <span style='color:#409EFF'>" + params.data.name + "</span><br />";
htmlStr += "设备编号: " + params.data.serialNumber + "<br />";
htmlStr += "设备状态: ";
if (params.data.status == 1) {
htmlStr += "<span style='color:#E6A23C'>未激活</span>" + "<br />";
} else if (params.data.status == 2) {
htmlStr += "<span style='color:#F56C6C'>禁用</span>" + "<br />";
} else if (params.data.status == 3) {
htmlStr += "<span style='color:#67C23A'>在线</span>" + "<br />";
} else if (params.data.status == 4) {
htmlStr += "<span style='color:#909399'>离线</span>" + "<br />";
}
if (params.data.isShadow == 1) {
htmlStr += "设备影子: " + "<span style='color:#67C23A'>启用</span>" + "<br />";
} else {
htmlStr += "设备影子: " + "<span style='color:#909399'>未启用</span>" + "<br />";
}
htmlStr += "产品名称: " + params.data.productName + "<br />";
htmlStr += "固件版本: Version " + params.data.firmwareVersion + "<br />";
htmlStr += "激活时间: " + params.data.activeTime + "<br />";
htmlStr += "所在地址: " + params.data.networkAddress + "<br />";
htmlStr += '</div>';
return htmlStr;
}
},
bmap: {
center: [133, 38],
zoom: 5,
roam: true,
mapStyle: {
styleJson: [{
featureType: 'water',
elementType: 'all',
stylers: {
color: '#a0cfff'
}
},
{
featureType: 'land',
elementType: 'all',
stylers: {
color: '#fafafa' // #fffff8 淡黄色
}
},
{
featureType: 'railway',
elementType: 'all',
stylers: {
visibility: 'off'
}
},
{
featureType: 'highway',
elementType: 'all',
stylers: {
color: '#fdfdfd'
}
},
{
featureType: 'highway',
elementType: 'labels',
stylers: {
visibility: 'off'
}
},
{
featureType: 'arterial',
elementType: 'geometry',
stylers: {
color: '#fefefe'
}
},
{
featureType: 'arterial',
elementType: 'geometry.fill',
stylers: {
color: '#fefefe'
}
},
{
featureType: 'poi',
elementType: 'all',
stylers: {
visibility: 'off'
}
},
{
featureType: 'green',
elementType: 'all',
stylers: {
visibility: 'off'
}
},
{
featureType: 'subway',
elementType: 'all',
stylers: {
visibility: 'off'
}
},
{
featureType: 'manmade',
elementType: 'all',
stylers: {
color: '#d1d1d1'
}
},
{
featureType: 'local',
elementType: 'all',
stylers: {
color: '#d1d1d1'
}
},
{
featureType: 'arterial',
elementType: 'labels',
stylers: {
visibility: 'off'
}
},
{
featureType: 'boundary',
elementType: 'all',
stylers: {
color: '#999999'
}
},
{
featureType: 'building',
elementType: 'all',
stylers: {
color: '#d1d1d1'
}
},
{
featureType: 'label',
elementType: 'labels.text.fill',
stylers: {
color: '#999999'
}
}
]
}
},
series: [{
type: 'scatter',
coordinateSystem: 'bmap',
data: convertData(this.deviceList, 1),
symbolSize: 15,
itemStyle: {
color: '#E6A23C'
}
},
{
type: 'scatter',
coordinateSystem: 'bmap',
data: convertData(this.deviceList, 2),
symbolSize: 15,
itemStyle: {
color: '#F56C6C'
}
}, {
type: 'scatter',
coordinateSystem: 'bmap',
data: convertData(this.deviceList, 4),
symbolSize: 15,
itemStyle: {
color: '#909399'
}
}, {
type: 'effectScatter',
coordinateSystem: 'bmap',
data: convertData(this.deviceList, 3),
symbolSize: 15,
showEffectOn: 'render',
rippleEffect: {
brushType: 'stroke',
scale: 5
},
label: {
formatter: '{b}',
position: 'right',
show: false
},
itemStyle: {
color: '#67C23A',
shadowBlur: 100,
shadowColor: '#333'
},
zlevel: 1
}
]
};
option && myChart.setOption(option);
},
/** EMQX状态统计 */
drawStats() {
// 基于准备好的dom初始化echarts实例
let myChart = echarts.init(this.$refs.statsChart);
var option;
option = {
title: {
text: 'Mqtt 状态数据'
},
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'shadow'
}
},
legend: {},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true
},
xAxis: {
type: 'value',
boundaryGap: [0, 0.01]
},
yAxis: {
type: 'category',
axisLabel: {
fontSize: 14
},
data: ['连接数量', '会话数量', '主题数量', '订阅数量', '路由数量', '保留消息']
},
series: [{
name: '历史最大数',
type: 'bar',
data: [this.stats["connections.max"], this.stats["sessions.max"], this.stats["topics.max"], this.stats["subscribers.max"], this.stats["routes.max"], this.stats["retained.max"]],
itemStyle: {
color: '#409EFF'
}
},
{
name: '当前数量',
type: 'bar',
data: [this.stats["connections.count"], this.stats["sessions.count"], this.stats["topics.count"], this.stats["subscribers.count"], this.stats["routes.count"], this.stats["retained.count"]],
itemStyle: {
color: '#67C23A'
}
}
]
};
option && myChart.setOption(option);
},
drawPieCpu() {
// 基于准备好的dom初始化echarts实例
let myChart = echarts.init(this.$refs.pieCpu);
var option;
option = {
title: {
text: 'CPU使用率 %',
left: 'left'
},
tooltip: {
trigger: 'item',
},
legend: {
orient: 'vertical',
left: 'right'
},
color: ['#E6A23C', '#F56C6C', '#DDD'],
series: [{
name: 'CPU使用率 %',
type: 'pie',
radius: '55%',
label: {
show: false
},
labelLine: {
normal: {
position: "inner",
show: false
}
},
data: [{
value: this.server.cpu.used,
name: '用户'
},
{
value: this.server.cpu.sys,
name: '系统'
},
{
value: this.server.cpu.free,
name: '空闲'
}
],
}]
};
option && myChart.setOption(option);
},
drawPieMemery() {
// 基于准备好的dom初始化echarts实例
let myChart = echarts.init(this.$refs.pieMemery);
var option;
option = {
title: {
text: '内存使用 G',
left: 'left'
},
tooltip: {
trigger: 'item'
},
legend: {
orient: 'vertical',
left: 'right'
},
color: ['#F56C6C', '#DDD'],
series: [{
name: '内存使用率 G',
type: 'pie',
radius: '55%',
label: {
show: false
},
labelLine: {
normal: {
position: "inner",
show: false
}
},
data: [{
value: this.server.mem.used,
name: '已用'
},
{
value: this.server.mem.free,
name: '剩余'
}
]
}]
};
option && myChart.setOption(option);
},
drawPieDisk() {
// 基于准备好的dom初始化echarts实例
let myChart = echarts.init(this.$refs.pieDisk);
var option;
let one = this.server.sysFiles[0].used.replace("GB", "");
let two = this.server.sysFiles[0].free.replace("GB", "");;
option = {
title: {
text: 'C盘状态 G',
left: 'left'
},
tooltip: {
trigger: 'item'
},
legend: {
orient: 'vertical',
left: 'right'
},
color: ['#F56C6C', '#DDD'],
series: [{
name: '磁盘状态 G',
type: 'pie',
radius: '55%',
label: {
show: false
},
labelLine: {
normal: {
position: "inner",
show: false
}
},
data: [{
value: one,
name: '已用'
},
{
value: two,
name: '可用'
}
]
}]
};
option && myChart.setOption(option);
}
},
};
</script>
<style lang="scss" scoped>
.description {
font-size: 14px;
tr {
line-height: 26px;
}
}
.panel-group {
.card-panel-col {
margin-bottom: 10px;
}
.card-panel {
height: 68px;
cursor: pointer;
position: relative;
overflow: hidden;
color: #666;
border: 1px solid #eee;
border-radius: 5px;
//box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.08);
background-color: #fff;
&:hover {
.card-panel-icon-wrapper {
color: #fff;
}
.icon-blue {
background: #36a3f7;
}
.icon-green {
background: #34bfa3
}
.icon-red {
background: #F56C6C;
}
.icon-orange {
background: #E6A23C;
}
}
.icon-blue {
color: #36a3f7;
}
.icon-green {
color: #34bfa3
}
.icon-red {
color: #F56C6C;
}
.icon-orange {
color: #E6A23C;
}
.card-panel-icon-wrapper {
float: left;
margin: 10px;
padding: 10px;
transition: all 0.38s ease-out;
border-radius: 6px;
}
.card-panel-icon {
float: left;
font-size: 30px;
}
.card-panel-description {
float: right;
font-weight: bold;
margin: 15px;
margin-left: 0px;
.card-panel-text {
line-height: 14px;
color: rgba(0, 0, 0, 0.45);
font-size: 14px;
margin-bottom: 12px;
text-align: right;
}
.card-panel-num {
font-size: 18px;
}
}
}
}
</style>