2022-08-12 10:21:25 +08:00
|
|
|
|
<template>
|
2022-08-31 18:07:01 +08:00
|
|
|
|
<Card title="设备管理">
|
|
|
|
|
|
<div class="container">
|
|
|
|
|
|
<div class="item" ref="firstChart"></div>
|
|
|
|
|
|
<div class="item" ref="secondChart"></div>
|
|
|
|
|
|
<div class="item" ref="thirdChart"></div>
|
|
|
|
|
|
<div class="first-box box">
|
|
|
|
|
|
<div class="box-title">塔吊设备数</div>
|
2022-09-01 17:57:36 +08:00
|
|
|
|
<img class="image" src="../assets/images/command-center/icon-tower.png" alt="">
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="second-box box">
|
|
|
|
|
|
<div class="box-title">升降机设备数</div>
|
|
|
|
|
|
<img class="image" src="../assets/images/command-center/icon-lifter.png" alt="">
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="third-box box">
|
|
|
|
|
|
<div class="box-title">视频设备数</div>
|
|
|
|
|
|
<img class="image" src="../assets/images/command-center/icon-video.png" alt="">
|
2022-08-24 15:52:18 +08:00
|
|
|
|
</div>
|
2022-08-31 18:07:01 +08:00
|
|
|
|
</div>
|
|
|
|
|
|
</Card>
|
2022-08-12 10:21:25 +08:00
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
|
|
<script>
|
2022-08-31 18:07:01 +08:00
|
|
|
|
import echarts from 'echarts4'
|
|
|
|
|
|
|
2022-08-24 15:52:18 +08:00
|
|
|
|
import Card from '../components/Card'
|
2022-08-31 18:07:01 +08:00
|
|
|
|
|
2022-08-12 10:21:25 +08:00
|
|
|
|
export default {
|
2022-08-24 15:52:18 +08:00
|
|
|
|
components: { Card },
|
2022-08-12 10:21:25 +08:00
|
|
|
|
data() {
|
2022-08-24 15:52:18 +08:00
|
|
|
|
return {}
|
2022-08-31 18:07:01 +08:00
|
|
|
|
},
|
|
|
|
|
|
mounted() {
|
|
|
|
|
|
this.initChart('firstChart')
|
|
|
|
|
|
this.initChart('secondChart')
|
|
|
|
|
|
this.initChart('thirdChart')
|
|
|
|
|
|
},
|
|
|
|
|
|
methods: {
|
|
|
|
|
|
initChart(ref) {
|
|
|
|
|
|
const myChart = echarts.init(this.$refs[ref])
|
|
|
|
|
|
|
|
|
|
|
|
let angle = 0 //角度,用来做简单的动画效果的
|
|
|
|
|
|
let value = 7
|
|
|
|
|
|
const option = {
|
|
|
|
|
|
// backgroundColor: '#061740',
|
|
|
|
|
|
title: {
|
|
|
|
|
|
text: value,
|
|
|
|
|
|
x: 'center',
|
|
|
|
|
|
y: 'center',
|
|
|
|
|
|
top: '35%',
|
|
|
|
|
|
textStyle: {
|
|
|
|
|
|
fontSize: 20,
|
|
|
|
|
|
color: '#e5e442'
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
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
|
|
|
|
|
|
},
|
|
|
|
|
|
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
|
|
|
|
|
|
},
|
|
|
|
|
|
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
|
|
|
|
|
|
},
|
|
|
|
|
|
silent: true
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
data: [0]
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
name: 'ring5',
|
|
|
|
|
|
type: 'custom',
|
|
|
|
|
|
coordinateSystem: 'none',
|
|
|
|
|
|
renderItem: function (params, api) {
|
|
|
|
|
|
let x0 = api.getWidth() / 2
|
|
|
|
|
|
let y0 = api.getHeight() / 2
|
|
|
|
|
|
let r = (Math.min(api.getWidth(), api.getHeight()) / 2) * 0.65
|
|
|
|
|
|
let point = getCirlPoint(x0, y0, r, 90 + -angle)
|
|
|
|
|
|
return {
|
|
|
|
|
|
type: 'circle',
|
|
|
|
|
|
shape: {
|
|
|
|
|
|
cx: point.x,
|
|
|
|
|
|
cy: point.y,
|
|
|
|
|
|
r: 2
|
|
|
|
|
|
},
|
|
|
|
|
|
style: {
|
|
|
|
|
|
stroke: '#0CD3DB', // 粉
|
|
|
|
|
|
fill: '#0CD3DB'
|
|
|
|
|
|
},
|
|
|
|
|
|
silent: true
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
data: [0]
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
name: 'ring5', // 绿点
|
|
|
|
|
|
type: 'custom',
|
|
|
|
|
|
coordinateSystem: 'none',
|
|
|
|
|
|
renderItem: function (params, api) {
|
|
|
|
|
|
let x0 = api.getWidth() / 2
|
|
|
|
|
|
let y0 = api.getHeight() / 2
|
|
|
|
|
|
let r = (Math.min(api.getWidth(), api.getHeight()) / 2) * 0.65
|
|
|
|
|
|
let point = getCirlPoint(x0, y0, r, 270 + -angle)
|
|
|
|
|
|
return {
|
|
|
|
|
|
type: 'circle',
|
|
|
|
|
|
shape: {
|
|
|
|
|
|
cx: point.x,
|
|
|
|
|
|
cy: point.y,
|
|
|
|
|
|
r: 2
|
|
|
|
|
|
},
|
|
|
|
|
|
style: {
|
|
|
|
|
|
stroke: '#0CD3DB', // 绿
|
|
|
|
|
|
fill: '#0CD3DB'
|
|
|
|
|
|
},
|
|
|
|
|
|
silent: true
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
data: [0]
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
name: '吃猪肉频率',
|
|
|
|
|
|
type: 'pie',
|
|
|
|
|
|
radius: ['56%', '45%'],
|
|
|
|
|
|
center: ['50%', '50%'],
|
|
|
|
|
|
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: 60,
|
|
|
|
|
|
lineStyle: {
|
|
|
|
|
|
width: 3,
|
|
|
|
|
|
// 分隔线的颜色
|
|
|
|
|
|
color: '#182337'
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
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) {
|
|
|
|
|
|
let x1 = x0 + r * Math.cos((angle * Math.PI) / 180)
|
|
|
|
|
|
let y1 = y0 + r * Math.sin((angle * Math.PI) / 180)
|
|
|
|
|
|
return {
|
|
|
|
|
|
x: x1,
|
|
|
|
|
|
y: y1
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function draw() {
|
|
|
|
|
|
angle = angle + 3
|
|
|
|
|
|
myChart.setOption(option, true)
|
|
|
|
|
|
//window.requestAnimationFrame(draw);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
setInterval(function () {
|
|
|
|
|
|
//用setInterval做动画感觉有问题
|
|
|
|
|
|
draw()
|
|
|
|
|
|
}, 100)
|
|
|
|
|
|
myChart.setOption(option)
|
|
|
|
|
|
}
|
2022-08-12 10:21:25 +08:00
|
|
|
|
}
|
2022-08-24 15:52:18 +08:00
|
|
|
|
}
|
2022-08-12 10:21:25 +08:00
|
|
|
|
</script>
|
|
|
|
|
|
|
2022-08-31 18:07:01 +08:00
|
|
|
|
<style lang="less" scoped>
|
|
|
|
|
|
.container {
|
|
|
|
|
|
position: relative;
|
|
|
|
|
|
width: 100%;
|
|
|
|
|
|
height: 100%;
|
|
|
|
|
|
white-space: nowrap;
|
|
|
|
|
|
transform: translateY(-20px);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.item {
|
|
|
|
|
|
display: inline-block;
|
|
|
|
|
|
width: calc(100% / 2);
|
|
|
|
|
|
height: 100%;
|
|
|
|
|
|
color: transparent;
|
|
|
|
|
|
|
|
|
|
|
|
&:nth-child(1) {
|
2022-09-01 17:57:36 +08:00
|
|
|
|
transform: translateX(-22%);
|
2022-08-31 18:07:01 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
&:nth-child(2) {
|
2022-09-01 17:57:36 +08:00
|
|
|
|
transform: translateX(-48%);
|
2022-08-31 18:07:01 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
&:nth-child(3) {
|
|
|
|
|
|
transform: translateX(-75%);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.box {
|
|
|
|
|
|
position: absolute;
|
|
|
|
|
|
color: #fff;
|
|
|
|
|
|
text-align: center;
|
|
|
|
|
|
font-size: 12px;
|
|
|
|
|
|
|
|
|
|
|
|
.box-title {
|
|
|
|
|
|
margin-bottom: 3px;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.image {
|
|
|
|
|
|
width: 20px;
|
|
|
|
|
|
height: 20px;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.first-box {
|
|
|
|
|
|
bottom: 30%;
|
2022-09-01 17:57:36 +08:00
|
|
|
|
left: 7%;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.first-box {
|
|
|
|
|
|
bottom: 30%;
|
2022-09-02 17:17:08 +08:00
|
|
|
|
left: 6.5%;
|
2022-09-01 17:57:36 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.second-box {
|
|
|
|
|
|
bottom: 30%;
|
2022-09-02 17:17:08 +08:00
|
|
|
|
left: 42.5%;
|
2022-09-01 17:57:36 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.third-box {
|
|
|
|
|
|
bottom: 30%;
|
2022-09-02 17:17:08 +08:00
|
|
|
|
left: 80.5%;
|
2022-08-31 18:07:01 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2022-09-02 16:43:10 +08:00
|
|
|
|
|
2022-08-31 18:07:01 +08:00
|
|
|
|
</style>
|