Luck-Xiaomi 02a680f7a6 ,
2022-09-02 16:43:10 +08:00

392 lines
9.9 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>
<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>
<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="">
</div>
</div>
</Card>
</template>
<script>
import echarts from 'echarts4'
import Card from '../components/Card'
export default {
components: { Card },
data() {
return {}
},
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)
}
}
}
</script>
<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) {
transform: translateX(-22%);
}
&:nth-child(2) {
transform: translateX(-48%);
}
&: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%;
left: 7%;
}
.first-box {
bottom: 30%;
left: 8%;
}
.second-box {
bottom: 30%;
left: 43.5%;
}
.third-box {
bottom: 30%;
left: 81.5%;
}
}
</style>