|
@@ -16,33 +16,52 @@
|
|
|
</div>
|
|
|
</div>
|
|
|
<div class="right_spection">
|
|
|
- <div class="operation_spection">
|
|
|
- <HeadlineTag value="运行统计"></HeadlineTag>
|
|
|
+ <div class="flex_spection">
|
|
|
+ <HeadlineTag value="设备排名"></HeadlineTag>
|
|
|
<div class="box_arch">
|
|
|
- <div class="image_tubbiness">
|
|
|
- <div class="work_num">3714<span>个</span></div>
|
|
|
- <div class="work_title">今日总数</div>
|
|
|
- </div>
|
|
|
- <div class="right_content">
|
|
|
- <div class="work_week">
|
|
|
- <div class="color_line_xj" style="background-color: rgb(21, 213, 21);"></div>
|
|
|
- <span>巡检点数:</span>20
|
|
|
- </div>
|
|
|
- <div class="work_week">
|
|
|
- <div class="color_line_xj" style="background-color: rgb(196, 127, 19);"></div>
|
|
|
- <span>巡检计划:</span>10
|
|
|
- </div>
|
|
|
- <div class="work_week">
|
|
|
- <div class="color_line_xj" style="background-color: rgb(195, 56, 56);"></div>
|
|
|
- <span>巡检线路:</span>15
|
|
|
- </div>
|
|
|
- </div>
|
|
|
+ <div ref="chartRouting" style="width: 100%;height: 100%;"></div>
|
|
|
</div>
|
|
|
</div>
|
|
|
- <div class="flex_spection">
|
|
|
+ <div class="operation_spection">
|
|
|
<HeadlineTag value="监控设备"></HeadlineTag>
|
|
|
<div class="box_arch">
|
|
|
- <div ref="chartRouting" style="width: 100%;height: 100%;"></div>
|
|
|
+ <dv-border-box-1>
|
|
|
+ <div class="box_monitoring">
|
|
|
+ <div class="flex_spection box_tion_zx">
|
|
|
+ <div class="line_blue">
|
|
|
+ <div class="blue_dot"></div>
|
|
|
+ </div>
|
|
|
+ <div class="monit_title">在线</div>
|
|
|
+ <span class="monit_num">83</span>
|
|
|
+ </div>
|
|
|
+ <div class="camera">
|
|
|
+ <div class="entry-box">
|
|
|
+ <div class="entry-box-item">
|
|
|
+ <div class="item-center-line"></div>
|
|
|
+ <div class="item-center-pie"></div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="img_camera">
|
|
|
+ <svg class="camera_box_icon" aria-hidden="true">
|
|
|
+ <defs>
|
|
|
+ <linearGradient id="myGradientil" x1="0%" y1="100%" x2="0%" y2="0%">
|
|
|
+ <stop offset="0%" stop-color="rgb(46, 139, 221)" />
|
|
|
+ <stop offset="100%" stop-color="rgb(4, 223, 247)" />
|
|
|
+ </linearGradient>
|
|
|
+ </defs>
|
|
|
+ <use xlink:href="#icon-camera" fill="url('#myGradientil')" />
|
|
|
+ </svg>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="flex_spection box_tion_lx">
|
|
|
+ <div class="line_green">
|
|
|
+ <div class="green_dot"></div>
|
|
|
+ </div>
|
|
|
+ <div class="monit_title">离线</div>
|
|
|
+ <span class="monit_num">23</span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </dv-border-box-1>
|
|
|
</div>
|
|
|
</div>
|
|
|
<div class="flex_spection">
|
|
@@ -52,9 +71,9 @@
|
|
|
</div>
|
|
|
</div>
|
|
|
<div class="flex_spection">
|
|
|
- <HeadlineTag value="出入统计"></HeadlineTag>
|
|
|
+ <HeadlineTag value="出入人员统计"></HeadlineTag>
|
|
|
<div class="box_arch">
|
|
|
- <div ref="chartAccess" style="width: 100%;height: 100%;"></div>
|
|
|
+ <Personnel></Personnel>
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
@@ -63,6 +82,7 @@
|
|
|
|
|
|
<script setup>
|
|
|
import HeadlineTag from '@/components/HeadlineTag'
|
|
|
+import Personnel from './Personnel.vue'
|
|
|
import Empty from '@/components/Empty'
|
|
|
import * as echarts from 'echarts'
|
|
|
const total = ref(0);
|
|
@@ -196,13 +216,13 @@ const initChart = () => {
|
|
|
series: [{
|
|
|
name: '标准化',
|
|
|
type: 'bar',
|
|
|
- barWidth: 10, // 柱子宽度
|
|
|
+ barWidth: 14, // 柱子宽度
|
|
|
label: {
|
|
|
show: true,
|
|
|
position: 'right', // 位置
|
|
|
color: '#fff',
|
|
|
fontSize: 14,
|
|
|
- distance: 5 // 距离
|
|
|
+ distance: 20 // 距离
|
|
|
}, // 柱子上方的数值
|
|
|
itemStyle: {
|
|
|
barBorderRadius: [20, 20, 20, 20],
|
|
@@ -219,131 +239,13 @@ const initChart = () => {
|
|
|
);
|
|
|
};
|
|
|
|
|
|
-const chartAccess = ref(null);
|
|
|
-let chartAcces = null;
|
|
|
-const initAccess = () => {
|
|
|
- var data = [
|
|
|
- {
|
|
|
- name: '正常占比',
|
|
|
- value: 12,
|
|
|
- percent: '58',
|
|
|
- },
|
|
|
- {
|
|
|
- name: '故障占比',
|
|
|
- value: 5,
|
|
|
- percent: '58',
|
|
|
- },
|
|
|
- ];
|
|
|
-
|
|
|
- var titleArr = [];
|
|
|
- var seriesArr = [];
|
|
|
- var colors = [
|
|
|
- 'rgba(6, 254, 188, 1)',
|
|
|
- 'rgba(255, 164, 3, 1)',
|
|
|
- 'rgba(6, 254, 188, 0.1)',
|
|
|
- 'rgba(255, 164, 3, 0.1)',
|
|
|
- 'rgba(255, 255, 255, 0.38)',
|
|
|
- 'rgba(255, 255, 255, 1)',
|
|
|
- ];
|
|
|
- data.forEach(function (item, index) {
|
|
|
- let i = index;
|
|
|
- if (i % 2 === 1) {
|
|
|
- i = i + 1;
|
|
|
- }
|
|
|
- titleArr.push({
|
|
|
- text: '{b|正常个数}' + ' ' + '{a|' + item.value + '}' + ' ' + '{a|' + item.percent + '%}',
|
|
|
- left: '50%',
|
|
|
- top: (i + 1) * 20 + '%',
|
|
|
- textAlign: 'center',
|
|
|
- textStyle: {
|
|
|
- fontWeight: 'normal',
|
|
|
- fontSize: '16',
|
|
|
- color: colors[4],
|
|
|
- textAlign: 'center',
|
|
|
- rich: {
|
|
|
- a: {
|
|
|
- color: colors[5],
|
|
|
- fontSize: '14',
|
|
|
- fontWeight: 'bold',
|
|
|
- },
|
|
|
- b: {
|
|
|
- colors: colors[4],
|
|
|
- fontSize: '14',
|
|
|
- fontWeight: 'bold',
|
|
|
- },
|
|
|
- },
|
|
|
- },
|
|
|
- });
|
|
|
- seriesArr.push({
|
|
|
- name: item.name,
|
|
|
- type: 'pie',
|
|
|
- clockWise: false,
|
|
|
- radius: ['25%', '30%'],
|
|
|
- itemStyle: {
|
|
|
- normal: {
|
|
|
- color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
|
|
|
- { offset: 0, color: colors[index + 2] },
|
|
|
- { offset: 1, color: colors[index] },
|
|
|
- ]),
|
|
|
- shadowColor: colors[index],
|
|
|
- shadowBlur: 0,
|
|
|
- label: {
|
|
|
- show: false,
|
|
|
- },
|
|
|
- labelLine: {
|
|
|
- show: false,
|
|
|
- },
|
|
|
- },
|
|
|
- },
|
|
|
- hoverAnimation: false,
|
|
|
- center: ['25%', (i + 1) * 20 + '%'],
|
|
|
- data: [
|
|
|
- {
|
|
|
- value: item.percent,
|
|
|
- label: {
|
|
|
- normal: {
|
|
|
- formatter: function (params) {
|
|
|
- return params.seriesName;
|
|
|
- },
|
|
|
- position: 'center',
|
|
|
- show: true,
|
|
|
- textStyle: {
|
|
|
- fontSize: '14',
|
|
|
- color: colors[4],
|
|
|
- },
|
|
|
- },
|
|
|
- },
|
|
|
- },
|
|
|
- {
|
|
|
- value: 100 - item.percent,
|
|
|
- name: 'invisible',
|
|
|
- itemStyle: {
|
|
|
- normal: {
|
|
|
- color: 'rgba(104, 104, 104, 0.3)',
|
|
|
- },
|
|
|
- emphasis: {
|
|
|
- color: 'rgba(104, 104, 104, 0.3)',
|
|
|
- },
|
|
|
- },
|
|
|
- },
|
|
|
- ],
|
|
|
- });
|
|
|
- });
|
|
|
- chartAcces = echarts.init(chartAccess.value);
|
|
|
- chartAcces.setOption({
|
|
|
- title: titleArr,
|
|
|
- series: seriesArr,
|
|
|
- });
|
|
|
-};
|
|
|
// 生命周期
|
|
|
onMounted(() => {
|
|
|
initChart()
|
|
|
- initAccess()
|
|
|
});
|
|
|
// 窗口自适应
|
|
|
window.addEventListener('resize', () => {
|
|
|
chartInstance?.resize();
|
|
|
- chartAcces?.resize();
|
|
|
});
|
|
|
</script>
|
|
|
|
|
@@ -458,6 +360,179 @@ window.addEventListener('resize', () => {
|
|
|
height: 6px;
|
|
|
margin-right: 10px;
|
|
|
}
|
|
|
+
|
|
|
+.box_tion_zx {
|
|
|
+ padding-left: 20px;
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ align-items: center;
|
|
|
+}
|
|
|
+
|
|
|
+.box_tion_lx {
|
|
|
+ padding-right: 20px;
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ align-items: center;
|
|
|
+}
|
|
|
+
|
|
|
+.box_monitoring {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ height: 100%;
|
|
|
+}
|
|
|
+
|
|
|
+.line_blue {
|
|
|
+ position: relative;
|
|
|
+ height: 5px;
|
|
|
+ width: 70%;
|
|
|
+ background-color: rgba(5, 125, 230, .5);
|
|
|
+ margin-bottom: 10px;
|
|
|
+}
|
|
|
+
|
|
|
+.blue_dot {
|
|
|
+ position: absolute;
|
|
|
+ left: 5px;
|
|
|
+ top: 0;
|
|
|
+ bottom: 0;
|
|
|
+ width: 20px;
|
|
|
+ border-left: 5px solid #000;
|
|
|
+ border-right: 5px solid #000;
|
|
|
+ background-color: rgba(5, 125, 230, 1);
|
|
|
+}
|
|
|
+
|
|
|
+.line_green {
|
|
|
+ position: relative;
|
|
|
+ height: 5px;
|
|
|
+ width: 70%;
|
|
|
+ background-color: rgba(5, 227, 227, .5);
|
|
|
+ margin-bottom: 10px;
|
|
|
+}
|
|
|
+
|
|
|
+.green_dot {
|
|
|
+ position: absolute;
|
|
|
+ left: 5px;
|
|
|
+ top: 0;
|
|
|
+ bottom: 0;
|
|
|
+ width: 20px;
|
|
|
+ border-left: 5px solid #000;
|
|
|
+ border-right: 5px solid #000;
|
|
|
+ background-color: rgba(5, 227, 227, 1);
|
|
|
+}
|
|
|
+
|
|
|
+.img_camera {
|
|
|
+ position: absolute;
|
|
|
+ width: 120px;
|
|
|
+ height: 120px;
|
|
|
+ top: calc(50% - 60px);
|
|
|
+ left: calc(50% - 60px);
|
|
|
+ border-radius: 50%;
|
|
|
+ border: 1px solid rgb(15, 39, 66);
|
|
|
+ box-shadow: inset 0px 0px 20px 2px rgb(78, 207, 220);
|
|
|
+}
|
|
|
+
|
|
|
+.camera_box_icon {
|
|
|
+ width: 70px;
|
|
|
+ height: 70px;
|
|
|
+ position: absolute;
|
|
|
+ top: calc(50% - 35px);
|
|
|
+ left: calc(50% - 35px);
|
|
|
+ vertical-align: -2px;
|
|
|
+}
|
|
|
+
|
|
|
+.camera {
|
|
|
+ width: 190px;
|
|
|
+ height: 100%;
|
|
|
+ display: flex;
|
|
|
+ position: relative;
|
|
|
+
|
|
|
+ .entry-box {
|
|
|
+ width: 100%;
|
|
|
+ height: 100%;
|
|
|
+ object-fit: fill;
|
|
|
+ position: absolute;
|
|
|
+ top: 0;
|
|
|
+ left: 0;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+ }
|
|
|
+
|
|
|
+ .entry-box-item {
|
|
|
+ width: 100%;
|
|
|
+ height: 180px;
|
|
|
+ color: #fff;
|
|
|
+ display: flex;
|
|
|
+ justify-content: center;
|
|
|
+ align-items: center;
|
|
|
+ position: relative;
|
|
|
+ background: radial-gradient(circle,
|
|
|
+ rgba(51, 149, 233, 0) 100px,
|
|
|
+ rgba(51, 149, 233, 0) 100px);
|
|
|
+
|
|
|
+ .item-center-line {
|
|
|
+ width: 180px;
|
|
|
+ height: 180px;
|
|
|
+ background-color: transparent;
|
|
|
+ border-top: 3px solid rgb(22, 110, 191);
|
|
|
+ border-bottom: 3px solid rgb(22, 110, 191);
|
|
|
+ border-radius: 50%;
|
|
|
+ box-sizing: border-box;
|
|
|
+ position: absolute;
|
|
|
+ top: calc(50% - 90px);
|
|
|
+ left: calc(50% - 90px);
|
|
|
+ animation: rotate 8s infinite linear;
|
|
|
+ }
|
|
|
+
|
|
|
+ .item-center-pie {
|
|
|
+ width: 150px;
|
|
|
+ height: 150px;
|
|
|
+ background-color: transparent;
|
|
|
+ border-top: 2px solid rgb(22, 110, 191);
|
|
|
+ border-bottom: 2px solid rgb(22, 110, 191);
|
|
|
+ border-radius: 50%;
|
|
|
+ box-sizing: border-box;
|
|
|
+ position: absolute;
|
|
|
+ top: calc(50% - 75px);
|
|
|
+ left: calc(50% - 75px);
|
|
|
+ animation: rotate1 8s infinite linear;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/* 定义中间球体顺时针转动 */
|
|
|
+@keyframes rotate {
|
|
|
+ from {
|
|
|
+ transform: rotate(0deg);
|
|
|
+ }
|
|
|
+
|
|
|
+ to {
|
|
|
+ transform: rotate(360deg);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/* 定义中间圆逆时针转动 */
|
|
|
+@keyframes rotate1 {
|
|
|
+ from {
|
|
|
+ transform: rotate(0deg);
|
|
|
+ }
|
|
|
+
|
|
|
+ to {
|
|
|
+ transform: rotate(-360deg);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.monit_title {
|
|
|
+ font-size: 16px;
|
|
|
+ background-image: -webkit-linear-gradient(bottom, rgb(120, 173, 221), rgb(229, 232, 236));
|
|
|
+ -webkit-background-clip: text;
|
|
|
+ -webkit-text-fill-color: transparent;
|
|
|
+ padding: 6px 0px;
|
|
|
+}
|
|
|
+
|
|
|
+.monit_num {
|
|
|
+ font-size: 30px;
|
|
|
+ font-weight: bold;
|
|
|
+}
|
|
|
</style>
|
|
|
<style lang="scss" scoped>
|
|
|
.point_box :deep(.el-input__wrapper) {
|