feat:完善功能

This commit is contained in:
zjc
2025-01-16 12:37:23 +08:00
parent ef5cb642ca
commit 2a11f91d36
43 changed files with 2644 additions and 3108 deletions

View File

@@ -0,0 +1,86 @@
<template>
<div class="alarm">
<p class="alarm-title">异常点位告警排名</p>
<ul class="alarm-list">
<li class="alarm-item" v-for="(item, index) in 10" :key="index">
<div class="alarm-item__rank">{{ index + 1 }}</div>
<p class="alarm-item__label">核心监控点1</p>
</li>
</ul>
</div>
</template>
<script setup></script>
<style scoped lang="scss">
.alarm {
&-title {
padding-bottom: vh(10);
font-weight: bold;
font-size: vw(14);
color: #37d8fc;
}
&-list {
width: vw(140);
height: vh(160);
overflow-y: auto;
&::-webkit-scrollbar {
width: vw(4); /* 滚动条的宽度 */
}
/* 滚动条轨道 */
&::-webkit-scrollbar-track {
background: 'transparent'; /* 轨道的背景色 */
}
/* 滚动条滑块 */
&::-webkit-scrollbar-thumb {
background: rgba(0, 150, 255, 0.63); /* 滑块的背景色 */
border-radius: 5px; /* 滑块的圆角 */
}
}
&-item {
margin-bottom: vh(10);
display: flex;
align-items: center;
background: linear-gradient(90deg, #1b5ec7 0%, rgba(27, 94, 199, 0) 100%);
&:nth-child(1) {
background: linear-gradient(90deg, #ffc10b 0%, rgba(255, 209, 44, 0) 100%);
.alarm-item__rank {
background-image: url('@/assets/images/rk-1.png');
background-size: 100% 100%;
}
}
&:nth-child(2) {
background: linear-gradient(90deg, #919191 0%, rgba(175, 175, 175, 0) 100%);
.alarm-item__rank {
background-image: url('@/assets/images/rk-2.png');
background-size: 100% 100%;
}
}
&:nth-child(3) {
background: linear-gradient(90deg, #919191 0%, rgba(175, 175, 175, 0) 100%);
.alarm-item__rank {
background-image: url('@/assets/images/rk-3.png');
background-size: 100% 100%;
}
}
}
&-item__rank {
width: vw(24);
height: vw(24);
font-weight: bold;
font-size: vw(14);
color: #fff;
display: flex;
align-items: center;
justify-content: center;
background-image: url('@/assets/images/rk-4.png');
background-size: 100% 100%;
}
&-item__label {
font-weight: 400;
font-size: vw(14);
color: #ffffff;
}
}
</style>

View File

@@ -0,0 +1,106 @@
<template>
<div class="alarmRate" :id="id" />
</template>
<script setup>
import { fitChartSize } from '@/utils/dataUtil'
import { useEchart } from '@/hooks/echart'
const props = defineProps({
config: {
type: Object,
default: () => {
return {}
}
},
dataList: {
type: Array,
default: () => []
},
total: {
type: Number,
default: () => 123456
},
colors: {
type: Array,
default: () => ['#FDC40A', '#FF5232', '#50F0A6', '#5FDFFA']
}
})
const { id, setOption } = useEchart()
var defaultCofig = {
color: [],
legend: {
orient: 'vertical',
bottom: 'center',
left: '50%',
itemWidth: fitChartSize(12),
itemHeight: fitChartSize(12),
itemGap: fitChartSize(10),
textStyle: {
color: '#ffffff',
fontSize: fitChartSize(16)
}
},
series: [
{
type: 'pie',
center: ['30%', '50%'],
radius: ['30%', '40%'],
itemStyle: {
borderWidth: fitChartSize(4),
borderColor: '#093672'
},
label: {
show: true,
position: 'center',
fontWeight: 'bold',
rich: {
value: {
color: '#fff',
fontSize: fitChartSize(16),
fontWeight: 'bold',
padding: [0, 0, 5, 0]
},
name: {
color: '#7894A8',
fontSize: fitChartSize(12)
}
}
},
labelLine: {
show: false
},
data: []
}
]
}
watch(
() => props.dataList,
(newVal) => {
if (newVal.length > 0) {
nextTick(() => {
defaultCofig.color = props.colors
defaultCofig.series[0].data = props.dataList
defaultCofig.series[0].label.formatter = () => {
return `{value|${props.total}}` + '\n' + `{name|工单总数}`
}
setOption({
...defaultCofig,
...props.config
})
})
}
},
{ immediate: true }
)
</script>
<style scoped lang="scss">
.alarmRate {
width: vw(240);
height: vh(200);
}
</style>

View File

@@ -0,0 +1,398 @@
<template>
<div class="box-1">
<Title1 title="交通信息" />
<div class="traffic">
<div class="traffic-item">
<span class="traffic-item__title">总核心监控点位</span>
<countup class="traffic-item__value--primary" end-val="895" />
</div>
<div class="traffic-item">
<span class="traffic-item__title">总核心监控点位</span>
<countup class="traffic-item__value--success" end-val="895" />
</div>
<div class="traffic-item">
<span class="traffic-item__title">总核心监控点位</span>
<countup class="traffic-item__value--error" end-val="895" />
</div>
</div>
<Title1 title="景区信息" />
<div class="scenic">
<div class="scenic-item">
<span class="scenic-item__label">核心路段监控点位</span>
<countup class="scenic-item__value" end-val="895" />
</div>
<div class="scenic-item">
<span class="scenic-item__label">核心景区分析点位</span>
<countup class="scenic-item__value" end-val="895" />
</div>
<div class="scenic-item">
<span class="scenic-item__label">异常点位</span>
<countup class="scenic-item__value" end-val="895" />
</div>
<div class="scenic-item">
<span class="scenic-item__label">异常告警</span>
<countup class="scenic-item__value" end-val="895" />
</div>
<div class="scenic-item">
<span class="scenic-item__label">已处理</span>
<countup class="scenic-item__value" end-val="895" />
</div>
</div>
<div class="flex pt-20">
<div class="box">
<Title3 title="异常告警" />
<Line
:width="370"
:height="180"
:config="{ legend: false }"
:data="[
{
name: '企业数',
data: [64, 159, 112, 86, 151, 131, 118, 232, 23, 64, 159, 112, 86, 151, 131, 118]
}
]"
:xAxisData="[
'12-16 10:00',
'12-16 14:00',
'12-16 16:00',
'12-16 22:00',
'12-17 02:00',
'12-17 06:00',
'12-17 10:00',
'12-17 14:00',
'12-17 16:00',
'12-16 22:00',
'12-18 02:00',
'12-18 06:00',
'12-8 10:00',
'12-18 14:00',
'12-18 16:00',
'12-18 20:00'
]"
/>
</div>
<div class="box">
<Title3 title="异常告警占比" />
<div class="flex">
<alarmRate :dataList="dataList" />
<alarmList />
</div>
</div>
</div>
<Title1 title="交通信息" />
<div class="scenic">
<div class="scenic-item">
<span class="scenic-item__label">核心路段监控点位</span>
<countup class="scenic-item__value" end-val="895" />
</div>
<div class="scenic-item">
<span class="scenic-item__label">核心景区分析点位</span>
<countup class="scenic-item__value" end-val="895" />
</div>
<div class="scenic-item">
<span class="scenic-item__label">拥堵路段</span>
<countup class="scenic-item__value" end-val="895" />
</div>
<div class="scenic-item">
<span class="scenic-item__label">拥堵告警</span>
<countup class="scenic-item__value" end-val="895" />
</div>
<div class="scenic-item">
<span class="scenic-item__label">已处理</span>
<countup class="scenic-item__value" end-val="895" />
</div>
</div>
<div class="flex pt-20">
<div class="box">
<Title3 title="异常告警" />
<Line
:width="370"
:height="180"
:config="{ legend: false }"
:data="[
{
name: '企业数',
data: [64, 159, 112, 86, 151, 131, 118, 232, 23, 64, 159, 112, 86, 151, 131, 118]
}
]"
:xAxisData="[
'12-16 10:00',
'12-16 14:00',
'12-16 16:00',
'12-16 22:00',
'12-17 02:00',
'12-17 06:00',
'12-17 10:00',
'12-17 14:00',
'12-17 16:00',
'12-16 22:00',
'12-18 02:00',
'12-18 06:00',
'12-8 10:00',
'12-18 14:00',
'12-18 16:00',
'12-18 20:00'
]"
/>
</div>
<div class="box">
<Title3 title="异常告警占比" />
<div class="flex">
<alarmRate :dataList="dataList" />
<alarmList />
</div>
</div>
</div>
</div>
</template>
<script setup>
import countup from 'vue-countup-v3'
import alarmRate from './alarmRate'
import alarmList from './alarmList'
const dataList = ref([
{
name: '云阳',
value: 20
},
{
name: '奉节',
value: 10
},
{
name: '巫山',
value: 70
}
])
</script>
<style scoped lang="scss">
:deep(.el-select__wrapper) {
background: linear-gradient(270deg, rgba(8, 41, 86, 0.16) 0%, #0b61b4 100%);
border: none;
box-shadow: none;
border-top-left-radius: vh(30);
border-bottom-left-radius: vh(30);
font-size: vw(14);
color: #fff;
}
.line-chart {
width: 100%;
height: vh(200);
}
.box-1 {
margin-top: vh(120);
width: vw(800);
height: vh(950);
padding: vw(8);
box-sizing: border-box;
background-image: url('@/assets/images/bg-2.png');
background-size: 100% 100%;
.traffic {
margin-top: vh(20);
height: vh(72);
display: flex;
align-items: center;
justify-content: space-evenly;
&-item {
width: vw(229);
height: vw(72);
font-weight: 400;
font-size: vw(14);
color: #fff;
padding-left: vw(84);
display: flex;
flex-direction: column;
justify-content: center;
&:nth-child(1) {
background-image: url('@/assets/images/m-t-1.png');
background-size: 100% 100%;
}
&:nth-child(2) {
background-image: url('@/assets/images/m-t-2.png');
background-size: 100% 100%;
}
&:nth-child(3) {
background-image: url('@/assets/images/m-t-3.png');
background-size: 100% 100%;
}
}
&-item__title {
margin-bottom: vh(6);
font-weight: 400;
font-size: vw(14);
color: #ffffff;
}
&-item__value--primary {
font-weight: bold;
font-size: vw(24);
color: #12b5fd;
}
&-item__value--success {
font-weight: bold;
font-size: vw(24);
color: #02f9fa;
}
&-item__value--error {
font-weight: bold;
font-size: vw(24);
color: #f15a25;
}
}
.scenic {
display: flex;
align-items: center;
height: vh(106);
gap: vw(20);
&-item {
width: vw(142);
height: vw(106);
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
&:nth-child(1) {
background-image: url('/src/assets/images/four-t-1.png');
background-size: 100% 100%;
.scenic-item__value {
color: #02f9fa;
}
}
&:nth-child(2) {
background-image: url('/src/assets/images/four-t-1.png');
background-size: 100% 100%;
.scenic-item__value {
color: #02f9fa;
}
}
&:nth-child(3) {
background-image: url('/src/assets/images/four-t-2.png');
background-size: 100% 100%;
.scenic-item__value {
color: #f15a25;
}
}
&:nth-child(4) {
background-image: url('/src/assets/images/four-t-3.png');
background-size: 100% 100%;
.scenic-item__value {
color: #f15a25;
}
}
&:nth-child(5) {
background-image: url('/src/assets/images/four-t-4.png');
background-size: 100% 100%;
.scenic-item__value {
color: #12b5fd;
}
}
}
&-item__label {
font-weight: 400;
font-size: vw(14);
color: #fff;
}
&-item__value {
font-weight: bold;
font-size: vw(24);
margin-top: vh(10);
}
}
.unit {
color: #02f9fa;
font-size: vw(14);
margin-bottom: vh(4);
}
.box {
width: vw(394);
height: vh(220);
background-image: url('@/assets/images/bg-3.png');
background-size: 100% 100%;
&:nth-child(1) {
margin-right: vw(10);
}
.title-2 {
width: vw(253);
height: vh(28);
display: flex;
align-items: center;
background-image: url('@/assets/images/title-5.png');
background-size: 100% 100%;
& > span {
padding-left: vw(22);
font-weight: bold;
font-size: vw(15);
background-image: linear-gradient(to bottom, #ffffff 0%, #75c1ff 100%);
-webkit-background-clip: text;
background-clip: text;
-webkit-text-fill-color: transparent; /* 兼容WebKit内核浏览器 */
color: transparent; /* 兼容其他浏览器 */
}
}
.statistic {
display: flex;
margin-top: vh(12);
width: 100%;
height: vh(88);
background-image: url('@/assets/images/bg-4.png');
background-size: 100% 100%;
&-item {
flex: 1;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
&-title {
font-size: vw(14);
color: rgba(255, 255, 255, 0.9);
}
&-value {
margin-top: vh(10);
font-weight: bold;
font-size: vw(24);
color: #02f9fa;
}
.count {
font-weight: bold;
font-size: vw(28);
color: #ff4400 !important;
}
.prefix,
.suffix {
color: #ff4400;
font-size: vw(12);
}
}
.title-3 {
position: relative;
width: vw(344);
height: vh(12);
margin-top: vh(20);
background-image: url('@/assets/images/title-6.png');
background-size: 100% 100%;
& > span {
position: absolute;
bottom: vh(4);
left: vw(20);
font-size: vw(15);
font-weight: bold;
background-image: linear-gradient(to bottom, #ffffff 0%, #0096ff 100%);
-webkit-background-clip: text;
background-clip: text;
-webkit-text-fill-color: transparent; /* 兼容WebKit内核浏览器 */
color: transparent; /* 兼容其他浏览器 */
}
}
}
}
</style>

View File

@@ -1,692 +1,33 @@
<template>
<!-- 视频 -->
<div class="box-2">
<div class="header">
<div class="title"> <span>交通信息</span> </div>
</div>
<div class="flex pt-20 p-box">
<div class="item core">
<span class="title-1">总核心监控点位</span>
<div class="flex align-end color1"> <countup endVal="895" /><span class="unit"></span></div>
</div>
<div class="item queue">
<span class="title-1">总核心分析点位</span>
<div class="flex align-end color2"> <countup endVal="895" /><span class="unit"></span></div>
</div>
<div class="item congestion">
<span class="title-1">总异常点位</span>
<div class="flex align-end color3"> <countup endVal="895" /><span class="unit"></span></div>
</div>
</div>
<div class="header">
<div class="title"> <span>景区信息</span> </div>
</div>
<div class="flex-four">
<div class="item item1">
<div class="box1">
核心路段监控点位
<div class="item-num color1"> <countup endVal="895" /><span class="unit"></span></div>
</div>
</div>
<div class="item item2">
<div class="box1">
核心景区分析点位
<div class="item-num color1"> <countup endVal="895" /><span class="unit"></span></div>
</div>
</div>
<div class="item item3">
<div class="box1">
异常点位
<div class="item-num color2"> <countup endVal="895" /><span class="unit"></span></div>
</div>
</div>
<div class="item item4">
<div class="box1">
异常告警
<div class="item-num color3"> <countup endVal="895" /><span class="unit"></span></div>
</div>
</div>
<div class="item item5">
<div class="box1">
已处理
<div class="item-num color4"> <countup endVal="895" /><span class="unit"></span></div>
</div>
</div>
</div>
<div class="flex pt-20 p-box">
<div class="box">
<div class="title-3"><span>异常告警</span></div>
<div class="pt-20 chart-p">
<Line
:width="370"
:height="180"
:config="{ legend: false }"
:data="[
{
name: '企业数',
data: [64, 159, 112, 86, 151, 131, 118, 232, 23, 64, 159, 112, 86, 151, 131, 118]
}
]"
:xAxisData="[
'12-16 10:00',
'12-16 14:00',
'12-16 16:00',
'12-16 22:00',
'12-17 02:00',
'12-17 06:00',
'12-17 10:00',
'12-17 14:00',
'12-17 16:00',
'12-16 22:00',
'12-18 02:00',
'12-18 06:00',
'12-8 10:00',
'12-18 14:00',
'12-18 16:00',
'12-18 20:00'
]"
/>
</div>
</div>
<div class="box">
<div class="title-3"><span>异常告警占比</span></div>
<div class="pt-20 h-flex">
<div class="left">
<v-chart class="chart" :option="option1" autoresize />
</div>
<div class="right">
<div class="li li-1"><span class="rk-img">1</span> 核心监控1</div>
<div class="li li-2"><span class="rk-img">1</span>核心监控1</div>
<div class="li li-3"><span class="rk-img">1</span>核心监控1</div>
<div class="li"><span class="rk-img">1</span>核心监控1</div>
<div class="li"><span class="rk-img">1</span>核心监控1</div>
<div class="li"><span class="rk-img">1</span>核心监控</div>
</div>
</div>
</div>
</div>
<div class="header">
<div class="title"> <span>交通信息</span> </div>
</div>
<div class="flex-four">
<div class="item item1">
<div class="box1">
核心路段监控点位
<div class="item-num color1"> <countup endVal="895" /><span class="unit"></span></div>
</div>
</div>
<div class="item item2">
<div class="box1">
核心景区分析点位
<div class="item-num color1"> <countup endVal="895" /><span class="unit"></span></div>
</div>
</div>
<div class="item item3">
<div class="box1">
异常点位
<div class="item-num color2"> <countup endVal="895" /><span class="unit"></span></div>
</div>
</div>
<div class="item item4">
<div class="box1">
异常告警
<div class="item-num color3"> <countup endVal="895" /><span class="unit"></span></div>
</div>
</div>
<div class="item item5">
<div class="box1">
已处理
<div class="item-num color4"> <countup endVal="895" /><span class="unit"></span></div>
</div>
</div>
</div>
<div class="flex pt-20 p-box">
<div class="box">
<div class="title-3"><span>异常告警</span></div>
<div class="pt-20 chart-p">
<Line
:width="370"
:height="180"
:config="{ legend: false }"
:data="[
{
name: '企业数',
data: [64, 159, 112, 86, 151, 131, 118, 232, 23, 64, 159, 112, 86, 151, 131, 118]
}
]"
:xAxisData="[
'12-16 10:00',
'12-16 14:00',
'12-16 16:00',
'12-16 22:00',
'12-17 02:00',
'12-17 06:00',
'12-17 10:00',
'12-17 14:00',
'12-17 16:00',
'12-16 22:00',
'12-18 02:00',
'12-18 06:00',
'12-8 10:00',
'12-18 14:00',
'12-18 16:00',
'12-18 20:00'
]"
/>
</div>
</div>
<div class="box">
<div class="title-3"><span>异常告警占比</span></div>
<div class="pt-20 h-flex">
<div class="left">
<v-chart class="chart" :option="option1" autoresize />
</div>
<div class="right">
<div class="li li-1"><span class="rk-img">1</span> 核心监控1</div>
<div class="li li-2"><span class="rk-img">1</span>核心监控1</div>
<div class="li li-3"><span class="rk-img">1</span>核心监控1</div>
<div class="li"><span class="rk-img">1</span>核心监控1</div>
<div class="li"><span class="rk-img">1</span>核心监控1</div>
<div class="li"><span class="rk-img">1</span>核心监控</div>
</div>
</div>
</div>
</div>
<Nav />
<!-- 视频 -->
<Monitor />
</div>
</template>
<script setup>
import * as echarts from 'echarts'
import countup from 'vue-countup-v3'
import { use } from 'echarts/core'
import { CanvasRenderer } from 'echarts/renderers'
import { GaugeChart } from 'echarts/charts'
import { PieChart } from 'echarts/charts'
import { LineChart } from 'echarts/charts'
import { fitChartSize } from '@/utils/dataUtil'
import { TitleComponent, TooltipComponent, LegendComponent } from 'echarts/components'
import VChart, { THEME_KEY } from 'vue-echarts'
import { ref, provide } from 'vue'
import Nav from '@/components/Nav/index.vue'
import Monitor from '@/components/Monitor/index.vue'
import { getVideoListApi, postRefreshApi } from '@/api/home'
use([
LineChart,
GaugeChart,
CanvasRenderer,
PieChart,
TitleComponent,
TooltipComponent,
LegendComponent
])
const getVideoList = async () => {
let res = await getVideoListApi({
businessVideoDisplayPosition: ''
})
console.log(res, 'res')
}
provide(THEME_KEY, 'dark')
let selectSpot = ref('')
const option1 = ref({
backgroundColor: 'transparent',
tooltip: {
trigger: 'item'
},
legend: {
type: 'scroll',
orient: 'vertical',
right: -10,
top: 0,
bottom: 20,
itemWidth: 5,
itemHeight: 5,
textStyle: {
fontSize: fitChartSize(12)
}
},
series: [
{
name: 'Access From',
type: 'pie',
left: -25,
top: -20,
width: fitChartSize(230),
height: fitChartSize(230),
radius: ['40%', '50%'],
avoidLabelOverlap: false,
padAngle: 5,
itemStyle: {
borderRadius: 2
},
label: {
show: false,
position: 'center'
},
emphasis: {
label: {
show: true,
fontSize: fitChartSize(10),
fontWeight: 'bold',
color: '#fff'
}
},
labelLine: {
show: true
},
data: [
{ value: 200, name: '异常状况1' },
{ value: 500, name: '异常状况2' },
{ value: 234, name: '异常状况3' },
{ value: 135, name: '异常状况4' },
{ value: 100, name: '异常状况5' },
{ value: 777, name: '异常状况6' },
{ value: 777, name: '其他' }
]
}
]
onMounted(() => {
getVideoList()
})
const optionLine = ref({
backgroundColor: 'transparent',
grid: {
top: '50',
bottom: '20',
left: '4%',
containLabel: true
},
xAxis: {
nameLocation: 'middle',
type: 'category',
boundaryGap: false,
axisLabel: {
fontSize: fitChartSize(10),
interval: 0, // 显示所有标签
rotate: 0 // 旋转标签45度
},
data: ['10:00', '10:00', '10:00', '10:00', '10:00', '10:00', '10:00', '10:00'],
axisTisk: {
show: true,
// 设置刻度长度
length: 1,
lineStyle: {
type: 'dashed', // 设置为虚线
width: 0
}
},
axisLine: {
lineStyle: {
color: '#0096FF' // 设置横线颜色
}
}
},
yAxis: {
type: 'value',
min: 0,
max: 45,
interval: 15,
axisLabel: {
fontSize: fitChartSize(12), // 设置Y轴刻度字体大小
color: 'rgba(255,255,255,0.9)'
},
splitLine: {
show: true,
lineStyle: {
type: 'dashed',
color: '#00D0FF'
}
}
},
series: [
{
data: [0, 23, 30, 24, 40, 30, 45, 26],
type: 'line',
smooth: true,
label: {
show: false //隐藏坐标点
},
itemStyle: {
color: 'transparent'
},
markLine: {
symbol: ['none', 'none'],
label: { show: false }
},
lineStyle: {
color: new echarts.graphic.LinearGradient(0, 0, 1, 0, [
{
offset: 0,
color: '#7DE7FF'
},
{
offset: 0.5,
color: '#02F9FA'
},
{
offset: 1,
color: '#009DFF'
}
]),
width: 3
}
}
]
})
onMounted(() => {})
</script>
<style scoped lang="scss">
:deep(.el-select__wrapper) {
background: linear-gradient(270deg, rgba(8, 41, 86, 0.16) 0%, #0b61b4 100%);
border: none;
box-shadow: none;
border-top-left-radius: vh(30);
border-bottom-left-radius: vh(30);
font-size: vw(14);
color: #fff;
}
.line-chart {
width: 100%;
height: vh(200);
}
<style lang="scss" scoped>
.box-2 {
width: vw(2356);
height: vh(965);
margin-top: vh(120);
width: vw(800);
height: vh(950);
padding: vw(8);
box-sizing: border-box;
// background-image: url('@/assets/images/bg-2.png');
background-size: 100% 100%;
.p-box {
padding-top: vh(5) !important;
justify-content: space-between;
.chart-p {
position: relative;
.check-box {
position: absolute;
right: vw(30);
top: vh(10);
width: vw(120);
z-index: 19;
}
}
}
.h-flex {
display: flex;
justify-content: space-between;
.left {
flex: 1;
width: vw(260);
}
.right {
margin-left: vw(20);
width: vw(120);
.li {
position: relative;
font-weight: 400;
font-size: vw(14);
color: #ffffff;
line-height: 16px;
text-align: left;
font-style: normal;
text-transform: none;
position: relative;
padding-left: vw(30);
padding: 0 vw(10);
padding-left: vw(15);
background: linear-gradient(90deg, #1b5ec7 0%, rgba(27, 94, 199, 0) 100%);
border-radius: 0px 0px 0px 0px;
height: vh(24);
line-height: vh(24);
margin-bottom: vh(8);
// opacity: 0.4;
.rk-img {
position: absolute;
width: vw(24);
height: vh(24);
line-height: vh(24);
left: vw(-12);
top: 50%;
display: block;
background-image: url('/src/assets/images/rk-4.png');
background-size: 100% 100%;
transform: translateY(-50%);
text-align: center;
}
}
.li-1 {
background: linear-gradient(90deg, #ffc10b 0%, rgba(255, 209, 44, 0) 100%);
.rk-img {
background-image: url('/src/assets/images/rk-1.png');
}
}
.li-2 {
background: linear-gradient(90deg, #919191 0%, rgba(175, 175, 175, 0) 100%);
.rk-img {
background-image: url('/src/assets/images/rk-2.png');
}
}
.li-3 {
background: linear-gradient(90deg, #919191 0%, rgba(175, 175, 175, 0) 100%);
.rk-img {
background-image: url('/src/assets/images/rk-3.png');
}
}
}
}
.flex-four {
display: flex;
justify-content: center;
align-items: center;
.item {
margin: vw(10);
width: vw(142);
height: vh(106);
font-weight: 400;
font-size: vw(14);
color: rgba(255, 255, 255, 0.9);
line-height: 16px;
text-align: center;
font-style: normal;
text-transform: none;
display: flex;
justify-content: center;
align-items: center;
padding: 0;
margin-top: 0;
.box1 {
width: vw(142);
}
.item-num {
margin-top: vh(10);
}
.color1 {
color: #02f9fa;
}
.color2 {
color: #f15a25;
}
.color3 {
color: #e21b1b;
}
.color4 {
color: #12b5fd;
}
}
.item1,
.item2 {
background-image: url('/src/assets/images/four-t-1.png');
background-size: 100% 100%;
}
.item3 {
background-image: url('/src/assets/images/four-t-2.png');
}
.item4 {
background-image: url('/src/assets/images/four-t-3.png');
}
.item5 {
background-image: url('/src/assets/images/four-t-4.png');
}
}
.header {
position: relative;
.title {
margin: vh(5) auto;
width: vw(468);
height: vh(32);
font-weight: 800;
font-size: vw(16);
color: #fff;
display: flex;
align-items: center;
justify-content: center;
background-image: url('@/assets/images/title-4.png');
background-size: 100% 100%;
span {
font-weight: 800;
color: transparent;
-webkit-background-clip: text;
background-clip: text;
-webkit-text-fill-color: transparent;
background-image: linear-gradient(to bottom, #ffffff 0%, #87c9ff 100%);
}
}
.more {
position: absolute;
top: vh(0);
right: vw(20);
cursor: pointer;
width: vw(60);
height: vh(24);
background-image: url('@/assets/images/more.png');
background-size: 100% 100%;
}
}
.item {
position: relative;
flex: 1;
padding-left: vw(100);
width: vw(230);
height: vh(70);
display: flex;
align-items: center;
background-size: 100% 100%;
.align-end {
margin-top: vh(10);
}
.color1 {
color: #12b5fd;
}
.color2 {
color: #02f9fa;
}
.color3 {
color: #f15a25;
}
}
.title-1 {
position: absolute;
top: vh(10);
font-weight: 400;
font-size: vw(14);
color: rgba(255, 255, 255, 0.7);
}
.countup-wrap {
font-size: vw(28);
font-weight: bold;
}
.unit {
color: #02f9fa;
font-size: vw(14);
margin-bottom: vh(4);
}
.core {
background-image: url('@/assets/images/m-t-1.png');
background-size: 100% 100%;
}
.queue {
background-image: url('@/assets/images/m-t-2.png');
background-size: 100% 100%;
}
.congestion {
background-image: url('@/assets/images/m-t-2.png');
background-size: 100% 100%;
}
.box {
width: vw(384);
// height: vh(360);
background-image: url('@/assets/images/bg-3.png');
background-size: 100% 100%;
&:nth-child(1) {
margin-right: vw(10);
}
.title-2 {
width: vw(253);
height: vh(28);
display: flex;
align-items: center;
background-image: url('@/assets/images/title-5.png');
background-size: 100% 100%;
& > span {
padding-left: vw(22);
font-weight: bold;
font-size: vw(15);
background-image: linear-gradient(to bottom, #ffffff 0%, #75c1ff 100%);
-webkit-background-clip: text;
background-clip: text;
-webkit-text-fill-color: transparent; /* 兼容WebKit内核浏览器 */
color: transparent; /* 兼容其他浏览器 */
}
}
.statistic {
display: flex;
margin-top: vh(12);
width: 100%;
height: vh(88);
background-image: url('@/assets/images/bg-4.png');
background-size: 100% 100%;
&-item {
flex: 1;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
&-title {
font-size: vw(14);
color: rgba(255, 255, 255, 0.9);
}
&-value {
margin-top: vh(10);
font-weight: bold;
font-size: vw(24);
color: #02f9fa;
}
.count {
font-weight: bold;
font-size: vw(28);
color: #ff4400 !important;
}
.prefix,
.suffix {
color: #ff4400;
font-size: vw(12);
}
}
.title-3 {
position: relative;
width: vw(344);
height: vh(12);
margin-top: vh(20);
background-image: url('@/assets/images/title-6.png');
background-size: 100% 100%;
& > span {
position: absolute;
bottom: vh(4);
left: vw(20);
font-size: vw(15);
font-weight: bold;
background-image: linear-gradient(to bottom, #ffffff 0%, #0096ff 100%);
-webkit-background-clip: text;
background-clip: text;
-webkit-text-fill-color: transparent; /* 兼容WebKit内核浏览器 */
color: transparent; /* 兼容其他浏览器 */
}
}
}
display: flex;
}
</style>

View File

@@ -1,28 +0,0 @@
<template>
<!-- 视频 -->
<div class="box-3-content">
<navLeft></navLeft>
<!-- 视频 -->
<monitor></monitor>
</div>
</template>
<script setup>
import { fitChartSize } from '@/utils/dataUtil'
import navLeft from '@/components/navLeft/index.vue'
import monitor from '@/components/monitor/index.vue'
</script>
<style lang="scss" scoped>
.box-3-content{
width:vw(2356);
height:vh(965);
margin-top: vh(120);
display: flex;
}
</style>

View File

@@ -1,10 +1,10 @@
<template>
<box1 />
<box2 />
<box3 />
</template>
<script setup>
import box3 from './components/box-3.vue'
import box1 from './components/box-1.vue'
import box2 from './components/box-2.vue'
onMounted(() => {})