<template>
|
<Profile :permissions="['system:monitor:query']">
|
<div class="monitor">
|
<div class="toolbar">
|
<el-switch v-model="autoRefresh" @change="changeAutoRefresh"/><label>{{autoRefresh | autoRefreshText}}</label>
|
</div>
|
<ul>
|
<li class="wrap">
|
<h2>CPU<Light v-if="data != null" :warn="data.cpu.useRatio > 60" :danger="data.cpu.useRatio > 80"/></h2>
|
<div>
|
<dl>
|
<dt>物理核数</dt>
|
<dd><Value :data="data" prop="cpu.physicalCount"/></dd>
|
</dl>
|
<dl>
|
<dt>逻辑核数</dt>
|
<dd><Value :data="data" prop="cpu.logicalCount"/></dd>
|
</dl>
|
<dl class="important">
|
<dt>当前使用率</dt>
|
<dd><Value :data="data" prop="cpu.useRatio" :handler="keep2decimals" suffix="%"/></dd>
|
</dl>
|
<dl>
|
<dt>当前空闲率</dt>
|
<dd><Value :data="data" prop="cpu.freeRatio" :handler="keep2decimals" suffix="%"/></dd>
|
</dl>
|
</div>
|
</li>
|
<li class="wrap">
|
<h2>内存<Light v-if="data != null" :warn="data.memory.useRatio > 60" :danger="data.memory.useRatio > 80"/></h2>
|
<div>
|
<dl>
|
<dt>总空间</dt>
|
<dd><Value :data="data" prop="memory.size" suffix="G" :handler="toG"/></dd>
|
</dl>
|
<dl>
|
<dt>空闲空间</dt>
|
<dd><Value :data="data" prop="memory.freeSpace" suffix="G" :handler="toG"/></dd>
|
</dl>
|
<dl class="important">
|
<dt>已用空间</dt>
|
<dd><Value :data="data" prop="memory.usedSpace" suffix="G" :handler="toG"/></dd>
|
</dl>
|
<dl class="important">
|
<dt>使用率</dt>
|
<dd><Value :data="data" prop="memory.useRatio" suffix="%" :handler="keep2decimals"/></dd>
|
</dl>
|
</div>
|
</li>
|
<li class="wrap">
|
<h2>JVM<Light v-if="data != null" :warn="data.jvm.memory.useRatio > 60" :danger="data.jvm.memory.useRatio > 80"/></h2>
|
<div>
|
<dl>
|
<dt>安装路径</dt>
|
<dd><Value :data="data" prop="jvm.home"/></dd>
|
</dl>
|
<dl>
|
<dt>版本</dt>
|
<dd><Value :data="data" prop="jvm.version"/></dd>
|
</dl>
|
<dl>
|
<dt>启动时间</dt>
|
<dd><Value :data="data" prop="jvm.bootTime"/></dd>
|
</dl>
|
<dl>
|
<dt>运行时长</dt>
|
<dd><Value :data="data" prop="jvm.runtime"/></dd>
|
</dl>
|
<dl>
|
<dt>总空间</dt>
|
<dd><Value :data="data" prop="jvm.memory.size" suffix="M" :handler="keep2decimals"/></dd>
|
</dl>
|
<dl>
|
<dt>空闲空间</dt>
|
<dd><Value :data="data" prop="jvm.memory.freeSpace" suffix="M" :handler="keep2decimals"/></dd>
|
</dl>
|
<dl class="important">
|
<dt>已用空间</dt>
|
<dd><Value :data="data" prop="jvm.memory.usedSpace" suffix="M" :handler="keep2decimals"/></dd>
|
</dl>
|
<dl class="important">
|
<dt>使用率</dt>
|
<dd><Value :data="data" prop="jvm.memory.useRatio" suffix="%" :handler="keep2decimals"/></dd>
|
</dl>
|
</div>
|
</li>
|
<li class="wrap">
|
<h2>服务器</h2>
|
<div>
|
<dl>
|
<dt>操作系统</dt>
|
<dd><Value :data="data" prop="osName"/></dd>
|
</dl>
|
<dl>
|
<dt>系统版本</dt>
|
<dd><Value :data="data" prop="osVersion"/></dd>
|
</dl>
|
<dl>
|
<dt>系统架构</dt>
|
<dd><Value :data="data" prop="osArch"/></dd>
|
</dl>
|
<dl class="important">
|
<dt>IP地址</dt>
|
<dd><Value :data="data" prop="ip"/></dd>
|
</dl>
|
<dl>
|
<dt>MAC地址</dt>
|
<dd><Value :data="data" prop="mac"/></dd>
|
</dl>
|
<dl>
|
<dt>服务器时间</dt>
|
<dd><Value :data="data" prop="currentTime"/></dd>
|
</dl>
|
</div>
|
</li>
|
</ul>
|
<div class="wrap">
|
<h2>磁盘信息</h2>
|
<el-table :data="data ? data.disks : []" v-loading="loading">
|
<el-table-column prop="name" label="磁盘名称"/>
|
<el-table-column prop="dir" label="磁盘路径"/>
|
<el-table-column prop="fsType" label="文件系统"/>
|
<el-table-column prop="size" label="总空间">
|
<template slot-scope="{row}">
|
{{toG(row.size)}}G
|
</template>
|
</el-table-column>
|
<el-table-column prop="freeSpace" label="可用空间">
|
<template slot-scope="{row}">
|
{{toG(row.freeSpace)}}G
|
</template>
|
</el-table-column>
|
<el-table-column prop="usedSpace" label="已用空间">
|
<template slot-scope="{row}">
|
<label class="important">{{toG(row.usedSpace)}}G</label>
|
</template>
|
</el-table-column>
|
<el-table-column prop="useRatio" label="已用占比">
|
<template slot-scope="{row}">
|
<label class="important">{{keep2decimals(row.useRatio)}}%</label>
|
</template>
|
</el-table-column>
|
<el-table-column>
|
<template slot-scope="{row}">
|
<Light :warn="row.useRatio > 60" :danger="row.useRatio > 80" :mini="true"/>
|
</template>
|
</el-table-column>
|
</el-table>
|
</div>
|
</div>
|
</Profile>
|
</template>
|
|
<script>
|
import { getSystemInfo } from '@/api/system/monitor'
|
import Value from '@/components/common/Value'
|
import Light from '@/components/common/Light'
|
import Profile from '../../components/common/Profile'
|
|
export default {
|
name: 'SystemMonitor',
|
components: { Profile, Light, Value },
|
data () {
|
return {
|
// 加载中
|
loading: false,
|
// 自动刷新标识
|
autoRefresh: false,
|
// 数据
|
data: null,
|
// 自动刷新定时器
|
interval: null
|
}
|
},
|
filters: {
|
autoRefreshText (value) {
|
if (value) {
|
return '已开启自动刷新'
|
}
|
return '已关闭自动刷新'
|
}
|
},
|
methods: {
|
/**
|
* 切换自动刷新
|
*
|
* @param autoRefresh 是否自动刷新
|
*/
|
changeAutoRefresh (autoRefresh) {
|
if (this.interval != null) {
|
clearInterval(this.interval)
|
}
|
if (autoRefresh) {
|
this.getSystemInfo()
|
this.interval = setInterval(() => {
|
this.getSystemInfo()
|
}, 3000)
|
}
|
},
|
/**
|
* 获取系统信息
|
*/
|
getSystemInfo () {
|
if (this.loading) {
|
return
|
}
|
this.loading = true
|
getSystemInfo()
|
.then(data => {
|
this.data = data
|
})
|
.catch(e => {
|
this.$tip.apiFailed(e)
|
})
|
.finally(() => {
|
this.loading = false
|
})
|
},
|
/**
|
* 单位转为G
|
*
|
* @param value 转换值
|
* @returns {number}
|
*/
|
toG (value) {
|
return Math.round(value / 1024 * 100) / 100
|
},
|
/**
|
* 转为比率
|
*
|
* @param value 转换值
|
* @returns {number}
|
*/
|
keep2decimals (value) {
|
return Math.round(value * 100) / 100
|
}
|
},
|
beforeRouteLeave (from, to, next) {
|
clearInterval(this.interval)
|
next()
|
},
|
created () {
|
this.getSystemInfo()
|
}
|
}
|
</script>
|
|
<style scoped lang="scss">
|
@import "@/assets/style/variables.scss";
|
.monitor {
|
padding: 20px 20px;
|
}
|
// 工具栏
|
.toolbar {
|
margin-bottom: 12px;
|
background: #fff;
|
padding: 8px 16px;
|
label {
|
font-size: 12px;
|
margin-left: 8px;
|
color: #999;
|
}
|
}
|
ul {
|
display: flex;
|
flex-wrap: wrap;
|
justify-content: space-between;
|
li {
|
width: 49.5%;
|
min-height: 200px;
|
flex-shrink: 0;
|
}
|
}
|
// 信息模块
|
.wrap {
|
background: #fff;
|
box-shadow: 2px 2px 10px -5px #999;
|
border-radius: 8px;
|
margin-bottom: 16px;
|
h2 {
|
border-bottom: 1px solid #eee;
|
font-size: 18px;
|
font-weight: normal;
|
line-height: 40px;
|
padding: 0 16px;
|
color: #555;
|
position: relative;
|
.light {
|
position: absolute;
|
top: 12px;
|
right: 12px;
|
}
|
}
|
& > div {
|
padding: 0 16px;
|
font-size: 14px;
|
dl {
|
display: flex;
|
dt {
|
width: 80px;
|
text-align: right;
|
flex-shrink: 0;
|
color: #999;
|
}
|
dd {
|
width: 100%;
|
margin: 0;
|
padding-left: 12px;
|
color: #555;
|
overflow: hidden;
|
}
|
}
|
}
|
}
|
// 重要信息
|
.important {
|
color: $primary-color;
|
font-weight: bold;
|
& > dd > div {
|
color: $primary-color;
|
font-weight: bold;
|
}
|
}
|
</style>
|