328 lines
9.2 KiB
Vue
328 lines
9.2 KiB
Vue
|
<template>
|
|||
|
<div id="RealTimeUsed"></div>
|
|||
|
</template>
|
|||
|
|
|||
|
<script>
|
|||
|
import * as echarts from 'echarts'
|
|||
|
import { getRealTimeUtilization } from './api.js'
|
|||
|
export default {
|
|||
|
name: 'UsedTrend',
|
|||
|
data() {
|
|||
|
return {
|
|||
|
myChart: null,
|
|||
|
used: 25.7,
|
|||
|
timer: null
|
|||
|
}
|
|||
|
},
|
|||
|
mounted() {
|
|||
|
const chartDom = document.getElementById('RealTimeUsed')
|
|||
|
this.myChart = echarts.init(chartDom)
|
|||
|
this.getRealTimeUesdView()
|
|||
|
this.timer = setInterval(() => {
|
|||
|
this.getRealTimeData()
|
|||
|
}, 1000)
|
|||
|
},
|
|||
|
unmounted() {
|
|||
|
clearInterval(this.timer)
|
|||
|
},
|
|||
|
methods: {
|
|||
|
// 平台实用利用率
|
|||
|
async getRealTimeData() {
|
|||
|
const res = await getRealTimeUtilization()
|
|||
|
if (res.status !== 'success') return
|
|||
|
this.used = (res.data?.result?.[0]?.value[1] || 25.7).toFixed(2)
|
|||
|
},
|
|||
|
getRealTimeUesdView() {
|
|||
|
let angle = 0
|
|||
|
const value = this.used
|
|||
|
const option = {
|
|||
|
title: {
|
|||
|
text: '{a|' + value + '}{c|%}',
|
|||
|
x: 'center',
|
|||
|
y: 'center',
|
|||
|
textStyle: {
|
|||
|
rich: {
|
|||
|
a: {
|
|||
|
fontSize: 20,
|
|||
|
color: '#29EEF3'
|
|||
|
},
|
|||
|
|
|||
|
c: {
|
|||
|
fontSize: 18,
|
|||
|
color: '#ffffff'
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
},
|
|||
|
series: [
|
|||
|
{
|
|||
|
name: 'ring5',
|
|||
|
type: 'custom',
|
|||
|
coordinateSystem: 'none',
|
|||
|
renderItem: function(params, api) {
|
|||
|
return {
|
|||
|
type: 'arc',
|
|||
|
shape: {
|
|||
|
cx: api.getWidth() / 2,
|
|||
|
cy: api.getHeight() / 2,
|
|||
|
r: (Math.min(api.getWidth(), api.getHeight()) / 2) * 0.6,
|
|||
|
startAngle: ((0 + angle) * Math.PI) / 180,
|
|||
|
endAngle: ((90 + angle) * Math.PI) / 180
|
|||
|
},
|
|||
|
style: {
|
|||
|
stroke: '#0CD3DB',
|
|||
|
fill: 'transparent',
|
|||
|
lineWidth: 1.5
|
|||
|
},
|
|||
|
silent: true
|
|||
|
}
|
|||
|
},
|
|||
|
data: [0]
|
|||
|
},
|
|||
|
{
|
|||
|
name: 'ring5',
|
|||
|
type: 'custom',
|
|||
|
coordinateSystem: 'none',
|
|||
|
renderItem: function(params, api) {
|
|||
|
return {
|
|||
|
type: 'arc',
|
|||
|
shape: {
|
|||
|
cx: api.getWidth() / 2,
|
|||
|
cy: api.getHeight() / 2,
|
|||
|
r: (Math.min(api.getWidth(), api.getHeight()) / 2) * 0.6,
|
|||
|
startAngle: ((180 + angle) * Math.PI) / 180,
|
|||
|
endAngle: ((270 + angle) * Math.PI) / 180
|
|||
|
},
|
|||
|
style: {
|
|||
|
stroke: '#0CD3DB',
|
|||
|
fill: 'transparent',
|
|||
|
lineWidth: 1.5
|
|||
|
},
|
|||
|
silent: true
|
|||
|
}
|
|||
|
},
|
|||
|
data: [0]
|
|||
|
},
|
|||
|
{
|
|||
|
name: 'ring5',
|
|||
|
type: 'custom',
|
|||
|
coordinateSystem: 'none',
|
|||
|
renderItem: function(params, api) {
|
|||
|
return {
|
|||
|
type: 'arc',
|
|||
|
shape: {
|
|||
|
cx: api.getWidth() / 2,
|
|||
|
cy: api.getHeight() / 2,
|
|||
|
r: (Math.min(api.getWidth(), api.getHeight()) / 2) * 0.65,
|
|||
|
startAngle: ((270 + -angle) * Math.PI) / 180,
|
|||
|
endAngle: ((40 + -angle) * Math.PI) / 180
|
|||
|
},
|
|||
|
style: {
|
|||
|
stroke: '#0CD3DB',
|
|||
|
fill: 'transparent',
|
|||
|
lineWidth: 1.5
|
|||
|
},
|
|||
|
silent: true
|
|||
|
}
|
|||
|
},
|
|||
|
data: [0]
|
|||
|
},
|
|||
|
{
|
|||
|
name: 'ring5',
|
|||
|
type: 'custom',
|
|||
|
coordinateSystem: 'none',
|
|||
|
renderItem: function(params, api) {
|
|||
|
return {
|
|||
|
type: 'arc',
|
|||
|
shape: {
|
|||
|
cx: api.getWidth() / 2,
|
|||
|
cy: api.getHeight() / 2,
|
|||
|
r: (Math.min(api.getWidth(), api.getHeight()) / 2) * 0.65,
|
|||
|
startAngle: ((90 + -angle) * Math.PI) / 180,
|
|||
|
endAngle: ((220 + -angle) * Math.PI) / 180
|
|||
|
},
|
|||
|
style: {
|
|||
|
stroke: '#0CD3DB',
|
|||
|
fill: 'transparent',
|
|||
|
lineWidth: 1.5
|
|||
|
},
|
|||
|
silent: true
|
|||
|
}
|
|||
|
},
|
|||
|
data: [0]
|
|||
|
},
|
|||
|
{
|
|||
|
name: 'ring5',
|
|||
|
type: 'custom',
|
|||
|
coordinateSystem: 'none',
|
|||
|
renderItem: function(params, api) {
|
|||
|
const x0 = api.getWidth() / 2
|
|||
|
const y0 = api.getHeight() / 2
|
|||
|
const r = (Math.min(api.getWidth(), api.getHeight()) / 2) * 0.65
|
|||
|
const point = getCirlPoint(x0, y0, r, 90 + -angle)
|
|||
|
return {
|
|||
|
type: 'circle',
|
|||
|
shape: {
|
|||
|
cx: point.x,
|
|||
|
cy: point.y,
|
|||
|
r: 4
|
|||
|
},
|
|||
|
style: {
|
|||
|
stroke: '#0CD3DB', // 粉
|
|||
|
fill: '#0CD3DB'
|
|||
|
},
|
|||
|
silent: true
|
|||
|
}
|
|||
|
},
|
|||
|
data: [0]
|
|||
|
},
|
|||
|
{
|
|||
|
name: 'ring5', // 绿点
|
|||
|
type: 'custom',
|
|||
|
coordinateSystem: 'none',
|
|||
|
renderItem: function(params, api) {
|
|||
|
const x0 = api.getWidth() / 2
|
|||
|
const y0 = api.getHeight() / 2
|
|||
|
const r = (Math.min(api.getWidth(), api.getHeight()) / 2) * 0.65
|
|||
|
const point = getCirlPoint(x0, y0, r, 270 + -angle)
|
|||
|
return {
|
|||
|
type: 'circle',
|
|||
|
shape: {
|
|||
|
cx: point.x,
|
|||
|
cy: point.y,
|
|||
|
r: 4
|
|||
|
},
|
|||
|
style: {
|
|||
|
stroke: '#0CD3DB', // 绿
|
|||
|
fill: '#0CD3DB'
|
|||
|
},
|
|||
|
silent: true
|
|||
|
}
|
|||
|
},
|
|||
|
data: [0]
|
|||
|
},
|
|||
|
{
|
|||
|
type: 'pie',
|
|||
|
radius: ['58%', '45%'],
|
|||
|
silent: true,
|
|||
|
clockwise: true,
|
|||
|
startAngle: 90,
|
|||
|
z: 0,
|
|||
|
zlevel: 0,
|
|||
|
label: {
|
|||
|
normal: {
|
|||
|
position: 'center'
|
|||
|
}
|
|||
|
},
|
|||
|
data: [
|
|||
|
{
|
|||
|
value: value,
|
|||
|
name: '',
|
|||
|
itemStyle: {
|
|||
|
normal: {
|
|||
|
color: {
|
|||
|
// 完成的圆环的颜色
|
|||
|
colorStops: [
|
|||
|
{
|
|||
|
offset: 0,
|
|||
|
color: '#4FADFD' // 0% 处的颜色
|
|||
|
},
|
|||
|
{
|
|||
|
offset: 1,
|
|||
|
color: '#28E8FA' // 100% 处的颜色
|
|||
|
}
|
|||
|
]
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
},
|
|||
|
{
|
|||
|
value: 100 - value,
|
|||
|
name: '',
|
|||
|
label: {
|
|||
|
normal: {
|
|||
|
show: false
|
|||
|
}
|
|||
|
},
|
|||
|
itemStyle: {
|
|||
|
normal: {
|
|||
|
color: '#173164'
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
name: '',
|
|||
|
type: 'gauge',
|
|||
|
radius: '58%',
|
|||
|
center: ['50%', '50%'],
|
|||
|
startAngle: 0,
|
|||
|
endAngle: 359.9,
|
|||
|
splitNumber: 8,
|
|||
|
hoverAnimation: true,
|
|||
|
axisTick: {
|
|||
|
show: false
|
|||
|
},
|
|||
|
splitLine: {
|
|||
|
length: 12,
|
|||
|
lineStyle: {
|
|||
|
width: 5,
|
|||
|
color: '#061740'
|
|||
|
}
|
|||
|
},
|
|||
|
axisLabel: {
|
|||
|
show: false
|
|||
|
},
|
|||
|
pointer: {
|
|||
|
show: false
|
|||
|
},
|
|||
|
axisLine: {
|
|||
|
lineStyle: {
|
|||
|
opacity: 0
|
|||
|
}
|
|||
|
},
|
|||
|
detail: {
|
|||
|
show: false
|
|||
|
},
|
|||
|
data: [
|
|||
|
{
|
|||
|
value: 0,
|
|||
|
name: ''
|
|||
|
}
|
|||
|
]
|
|||
|
}
|
|||
|
]
|
|||
|
}
|
|||
|
|
|||
|
// 获取圆上面某点的坐标(x0,y0表示坐标,r半径,angle角度)
|
|||
|
function getCirlPoint(x0, y0, r, angle) {
|
|||
|
const x1 = x0 + r * Math.cos((angle * Math.PI) / 180)
|
|||
|
const y1 = y0 + r * Math.sin((angle * Math.PI) / 180)
|
|||
|
return {
|
|||
|
x: x1,
|
|||
|
y: y1
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
setInterval(() => {
|
|||
|
angle = angle + 3
|
|||
|
option.title.text = `{a|${this.used}}{c|%}`
|
|||
|
option.series[6].data[0].value = this.used
|
|||
|
option.series[6].data[1].value = 100 - parseFloat(this.used)
|
|||
|
this.myChart.setOption(option, true)
|
|||
|
}, 100)
|
|||
|
|
|||
|
window.addEventListener('resize', () => {
|
|||
|
this.myChart.resize()
|
|||
|
})
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
</script>
|
|||
|
<style scoped>
|
|||
|
#RealTimeUsed {
|
|||
|
height: 100%;
|
|||
|
}
|
|||
|
</style>
|