392 lines
9.9 KiB
Vue
Raw Normal View History

<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%;
2022-09-02 17:17:08 +08:00
left: 6.5%;
}
.second-box {
bottom: 30%;
2022-09-02 17:17:08 +08:00
left: 42.5%;
}
.third-box {
bottom: 30%;
2022-09-02 17:17:08 +08:00
left: 80.5%;
}
}
2022-09-02 16:43:10 +08:00
</style>