合并dev

This commit is contained in:
Hcat1314
2023-12-17 18:32:13 +08:00
21 changed files with 893 additions and 164 deletions

View File

@@ -1,8 +1,16 @@
import request from '@/utils/request.js' import request from '@/utils/request.js'
//大屏获取设备信息
export const getLargeScreen = (tunnelId) => { export const getLargeScreen = (tunnelId) => {
return request({ return request({
url: `/tunnel/large/screen/equipment/${tunnelId}`, url: `/tunnel/large/screen/equipment/${tunnelId}`,
method: 'get' method: 'get'
}) })
} }
//大屏信息接口
export const getLargeScreenInfo = () => {
return request({
url: '/tunnel/large/screen/info',
method: 'get'
})
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 823 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 916 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 828 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 925 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 925 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 949 B

View File

@@ -6,6 +6,11 @@
background-repeat: no-repeat; background-repeat: no-repeat;
background-size: 100% 100%; background-size: 100% 100%;
background-position: center; background-position: center;
-moz-user-select: none; /*火狐*/
-webkit-user-select: none; /*webkit浏览器*/
-ms-user-select: none; /*IE10*/
-khtml-user-select: none; /*早期浏览器*/
user-select: none;
} }
a { a {
@@ -402,9 +407,13 @@ body,
font-weight: bold; font-weight: bold;
color: #08b7b8; color: #08b7b8;
letter-spacing: 3px; letter-spacing: 3px;
p{
line-height: 40px;
}
} }
} }
.el-message-box__btns { .el-message-box__btns {
margin-top: 20px;
display: flex; display: flex;
justify-content: space-around; justify-content: space-around;
.el-button { .el-button {
@@ -485,3 +494,37 @@ input[type="number"] {
.el-checkbox__input.is-checked .el-checkbox__inner::after { .el-checkbox__input.is-checked .el-checkbox__inner::after {
display: none; display: none;
} }
//取消 确定按钮
.btns {
display: flex;
justify-content: space-around;
margin-top: 80px;
.cancel-btn {
display: flex;
justify-content: center;
cursor: pointer;
width: 220px;
height: 80px;
border-radius: 11px;
border: 2px solid #08B7B8;
color: #08B7B8;
line-height: 80px;
font-size: 38px;
box-sizing: border-box;
}
.sure-btn {
display: flex;
justify-content: center;
cursor: pointer;
width: 220px;
height: 80px;
line-height: 80px;
background: #08B7B8;
border-radius: 11px;
color: #FFFFFF;
font-size: 38px;
}
}

View File

@@ -2,7 +2,7 @@
<div id="air-info"> <div id="air-info">
<div class="fan-speed"> <div class="fan-speed">
<img src="@/assets/images/airInfo/fan-v-icon.png" alt=""/> <img src="@/assets/images/airInfo/fan-v-icon.png" alt=""/>
<div class="fan-info"> <div class="fan-info" @click="handleOpenChart">
<div class="input-fan"><span>风速</span><span>进风{{ windSpeed }}m/s</span></div> <div class="input-fan"><span>风速</span><span>进风{{ windSpeed }}m/s</span></div>
<div class="output-fan"><span>出风{{windSpeed}}m/s</span></div> <div class="output-fan"><span>出风{{windSpeed}}m/s</span></div>
</div> </div>
@@ -14,19 +14,67 @@
:icon="item.icon" :icon="item.icon"
:name="item.name" :name="item.name"
:unit="item.unit" :unit="item.unit"
@click="handleOpenAirChart(item)"
/> />
<div class="digital-tunnel">
<el-dialog v-model="isWindSpeedVisited" :title="'风速监控数据'" width="2175px" :modal="false">
<div class="left-top-icon"></div>
<div class="right-top-icon"></div>
<div class="chat-dialog">
<div id="container"></div>
<div style="width: 1px;"></div>
</div>
<div class="time-select">
<time-range-btn
:buttonList="timeList"
v-model="selectTimeButton"
@select="timeSelect"
/>
</div>
<div class="left-bottom-icon"></div>
<div class="right-bottom-icon"></div>
</el-dialog>
</div>
<div class="digital-tunnel">
<el-dialog v-model="isAirVisited" :title="airTitle+'监控数据'" width="2175px" :modal="false">
<div class="left-top-icon"></div>
<div class="right-top-icon"></div>
<div class="chat-dialog">
<div id="containerEle"></div>
<div style="width: 1px;"></div>
</div>
<div class="time-select">
<time-range-btn
:buttonList="timeList"
v-model="selectTimeButton"
@select="timeSelect"
/>
</div>
<div class="left-bottom-icon"></div>
<div class="right-bottom-icon"></div>
</el-dialog>
</div>
</div> </div>
</template> </template>
<script setup> <script setup>
import ItemInfo from "./childComps/ItemInfo.vue"; import ItemInfo from "./childComps/ItemInfo.vue";
import TimeRangeBtn from "@/components/timeRangeBtn/index.vue"
import * as echarts from 'echarts';
let myEcharts = reactive({});
let myAirEcharts = reactive({});
const props = defineProps({ const props = defineProps({
list: Array, list: Array,
airData: Array airData: Array
}); });
const windSpeed=ref('') const windSpeed=ref('')
const airTitle=ref('')
const airList = ref([]) const airList = ref([])
const timeList = ref(["年", "月", "日"]);
const selectTimeButton = ref(2);
const isWindSpeedVisited = ref(false);
const isAirVisited = ref(false);
watch(() => props.list, (now) => { watch(() => props.list, (now) => {
airList.value.forEach(item=>{ airList.value.forEach(item=>{
now.forEach(newItem=>{ now.forEach(newItem=>{
@@ -39,7 +87,29 @@ watch(() => props.list, (now) => {
watch(() => props.airData, (now) => { watch(() => props.airData, (now) => {
getAirInfo(now.sensorList) getAirInfo(now.sensorList)
}, {deep: true}); }, {deep: true});
const handleOpenChart = () => {
isWindSpeedVisited.value = true
nextTick(() => {
initChart()
})
}
const handleOpenAirChart = (item) => {
isAirVisited.value = true
airTitle.value=item.name
nextTick(() => {
initAirChart()
})
}
const timeSelect = (index) => {
console.log('选择时间', index)
if(index===0){
console.log('--年')
}else if(index===1){
console.log('--月')
}else if(index===2){
console.log('--日')
}
};
const changeData = (item) => { const changeData = (item) => {
return { return {
equipmentId: item.equipmentId, equipmentId: item.equipmentId,
@@ -64,19 +134,172 @@ const changeIcon = (type) => {
} }
} }
const getAirInfo = (now) => { const getAirInfo = (now) => {
let windPressureObj = {} let airObj = {}
let windPressureArr = [] let airArr = []
now.map(item => { now.map(item => {
if (item.equipmentType === "dust" || item.equipmentType === "oxygen" || item.equipmentType === "temperature" || item.equipmentType === "humidness") { if (item.equipmentType === "dust" || item.equipmentType === "oxygen" || item.equipmentType === "temperature" || item.equipmentType === "humidness") {
windPressureObj = changeData(item) airObj = changeData(item)
windPressureArr.push(windPressureObj) airArr.push(airObj)
}else if(item.equipmentType === "windDirection"){ }else if(item.equipmentType === "windDirection"){
windSpeed.value = item.value windSpeed.value = item.value
} }
}) })
windPressureArr.push(windPressureArr.shift()) airArr.push(airArr.shift())
airList.value = windPressureArr airList.value = airArr
} }
const initChart = () => {
//3.初始化container容器
myEcharts = echarts.init(document.getElementById('container'));
//5.传入数据
let option = {
//图例
legend: {
// left: 0,
textStyle: {
color: '#FFFFFF',
fontSize: 40
},
itemWidth: 70,
itemHeight:5,
icon: "rect",
},
//离容器四侧的距离
grid: {
left: 0, // 左边距
right: 20, // 右边距
top: 80, // 顶边距
bottom: 0, // 底边距
containLabel: true,
},
//提示框组件
tooltip: {
show: true,
trigger: 'axis',
textStyle: {
fontSize: 40
}
},
//X轴
xAxis: {
type: 'category',
data: ['00:00', '01:00', '02:00', '03:00', '04:00', '05:00', '06:00','07:00', '08:00', '09:00', '10:00', '11:00', '12:00', '13:00', '14:00', '15:00', '16:00', '17:00', '18:00','19:00', '20:00', '21:00', '22:00', '23:00','24:00'],
axisLabel: {
textStyle: {
fontSize: 45,
color: '#D6F1FA'
},
},
},
//Y轴
yAxis: {
type: 'value',
axisLabel: {
textStyle: {
fontSize: 45,
color: '#D6F1FA'
},
},
},
//配置项
series: [
{
name:'进风口',
data: [56, 12, 89, 34, 71, 43, 67, 20, 98, 72, 19, 61, 3, 85, 47, 92, 17, 76, 69, 25, 31, 49, 81, 63],
type: 'line',
smooth: true,
symbolSize: 24,
lineStyle: {
width: 5
}
},
{
name:'出风口',
data: [3, 85, 47, 92, 17, 76, 69, 25,56, 12, 89, 34, 71, 43, 67, 20, 98, 72, 19, 61, 31, 49, 81, 63],
type: 'line',
smooth: true,
symbolSize: 24,
lineStyle: {
width: 5
}
}
]
}
myEcharts.setOption(option);
//图表大小自适应窗口大小变化
window.onresize = () => {
myEcharts.resize();
}
}
const initAirChart = () => {
//3.初始化container容器
myAirEcharts = echarts.init(document.getElementById('containerEle'));
//5.传入数据
let option = {
//图例
legend: {
// left: 0,
textStyle: {
color: '#FFFFFF',
fontSize: 40
}
},
//离容器四侧的距离
grid: {
left: 0, // 左边距
right: 20, // 右边距
top: 80, // 顶边距
bottom: 0, // 底边距
containLabel: true,
},
//提示框组件
tooltip: {
show: true,
trigger: 'axis',
textStyle: {
fontSize: 40
}
},
//X轴
xAxis: {
type: 'category',
data: ['00:00', '01:00', '02:00', '03:00', '04:00', '05:00', '06:00','07:00', '08:00', '09:00', '10:00', '11:00', '12:00', '13:00', '14:00', '15:00', '16:00', '17:00', '18:00','19:00', '20:00', '21:00', '22:00', '23:00','24:00'],
axisLabel: {
textStyle: {
fontSize: 45,
color: '#D6F1FA'
},
},
},
//Y轴
yAxis: {
type: 'value',
axisLabel: {
textStyle: {
fontSize: 45,
color: '#D6F1FA'
},
},
},
//配置项
series: [
{
data: [56, 12, 89, 34, 71, 43, 67, 20, 98, 72, 19, 61, 3, 85, 47, 92, 17, 76, 69, 25, 31, 49, 81, 63],
type: 'line',
smooth: true,
symbolSize: 24,
lineStyle: {
width: 5
}
}
]
}
myAirEcharts.setOption(option);
//图表大小自适应窗口大小变化
window.onresize = () => {
myAirEcharts.resize();
}
}
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>

View File

@@ -17,7 +17,7 @@
<el-dialog <el-dialog
v-model="isVisited" v-model="isVisited"
title="有害气体监控数据" title="有害气体监控数据"
width="2400px" width="2175px"
:modal="false" :modal="false"
> >
<div class="left-top-icon"></div> <div class="left-top-icon"></div>

View File

@@ -447,7 +447,7 @@ input[type="number"] {
border: 2px solid #0f82af; border: 2px solid #0f82af;
background: transparent; background: transparent;
margin-left: 14px; margin-left: 14px;
outline:none;
font-size: 28px; font-size: 28px;
font-family: MicrosoftYaHei, MicrosoftYaHei; font-family: MicrosoftYaHei, MicrosoftYaHei;
font-weight: bold; font-weight: bold;

View File

@@ -25,7 +25,7 @@
import * as three from "three"; import * as three from "three";
import ThreeDScene from "./sceneClass/demo.js"; import ThreeDScene from "./sceneClass/demo.js";
import DevInfo from "./displayInfoComp/DevInfo.vue"; import DevInfo from "./displayInfoComp/DevInfo.vue";
import editDialog from "./editEquComp/editDialog.vue"; import EditDialog from "./editEquComp/editDialog.vue";
// 导入模模型加载器 // 导入模模型加载器
import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader"; import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader";
@@ -248,7 +248,7 @@ const ThreeConfig = {
</script> </script>
<style lang="scss" scope> <style lang="scss" scoped>
#scene { #scene {
position: relative; position: relative;
height: 100%; height: 100%;

View File

@@ -11,7 +11,7 @@
</div> </div>
</div> </div>
<div class="digital-tunnel"> <div class="digital-tunnel">
<el-dialog v-model="isVisited" width="2400px" :modal="false"> <el-dialog v-model="isVisited" width="2175px" :modal="false">
<div class="left-top-icon"></div> <div class="left-top-icon"></div>
<div class="right-top-icon"></div> <div class="right-top-icon"></div>
<div class="top-tag"> <div class="top-tag">

View File

@@ -5,7 +5,7 @@
<wind-pressure-item v-for="(item,index) in wpList" :key="item.equipmentId" :wp="item" :index="index+1" @click="handleOpenChart(index+1)"/> <wind-pressure-item v-for="(item,index) in wpList" :key="item.equipmentId" :wp="item" :index="index+1" @click="handleOpenChart(index+1)"/>
</div> </div>
<div class="digital-tunnel"> <div class="digital-tunnel">
<el-dialog v-model="isVisited" :title="windSort+'号风压监控数据'" width="2400px" :modal="false"> <el-dialog v-model="isVisited" :title="windSort+'号风压监控数据'" width="2175px" :modal="false">
<div class="left-top-icon"></div> <div class="left-top-icon"></div>
<div class="right-top-icon"></div> <div class="right-top-icon"></div>
<div class="chat-dialog"> <div class="chat-dialog">

View File

@@ -11,24 +11,43 @@
const props = defineProps({ const props = defineProps({
modelValue: { modelValue: {
type: Number, type: Number,
default: 0, default: 0
},
list: {
type: Array,
default: []
}, },
}) })
watch(() => props.list, (now) => {
let newArr=[]
btnList.value.forEach((btnList) => {
now.forEach((item) => {
if (btnList.route==item) {
newArr.push(btnList)
}
})
})
btnList.value=newArr
}, {deep: true});
const emit = defineEmits(["update:modelValue", "select"]); const emit = defineEmits(["update:modelValue", "select"]);
const btnList = ref([ const btnList = ref([
{ {
route: '/site',
icon: 'sp_icon_zdgl.png', icon: 'sp_icon_zdgl.png',
name: '站点管理' name: '站点管理'
}, },
{ {
route: '/tunnel',
icon: 'sp_icon_sdgl.png', icon: 'sp_icon_sdgl.png',
name: '隧道管理' name: '隧道管理'
}, },
{ {
route: '/user',
icon: 'sp_icon_yhgl.png', icon: 'sp_icon_yhgl.png',
name: '用户管理' name: '用户管理'
}, },
{ {
route: '/system',
icon: 'sp_icon_xtgl.png', icon: 'sp_icon_xtgl.png',
name: '系统管理' name: '系统管理'
}, },

View File

@@ -13,11 +13,9 @@
<div class="device-content"> <div class="device-content">
<div class="device-box"> <div class="device-box">
<div class="box-left"> <div class="box-left">
<!-- <div>风机</div>-->
<!-- <div>风压</div>-->
<!-- <div>其他传感器</div>-->
<el-menu <el-menu
default-active="1" default-active="1"
@select="handleChangeMenu"
> >
<el-menu-item index="1"> <el-menu-item index="1">
<span>风机</span> <span>风机</span>
@@ -30,8 +28,185 @@
</el-menu-item> </el-menu-item>
</el-menu> </el-menu>
</div> </div>
<div class="box-right"> <div class="box-right" v-if="changeIndex==1">
<div class="device-title">
<span>风机设备管理</span>
<div class="collection-frequency">
<span>采集频率</span>
<span class="units">
<input
type="number"
min="0"
v-model="collectionFrequency"
/>
</span>
</div>
</div>
<div class="device-table">
<el-table stripe
style="border-bottom: 1px #06e5e5 solid;background-color: #011c29;--el-table-border-color: none;"
:header-cell-style="{backgroundColor: '#064B66',color: '#fff',fontSize: '40px',borderBottom: 'none' }"
:cell-style="{textAlign: 'center',borderBottom: 'none'}" :data="fanData">
<el-table-column prop="name" label="设备名称" align="center"/>
<el-table-column prop="currentA" label="A电流" align="center">
<template #default="scope">
<el-input placeholder="请输入A电流" v-model="scope.row.currentA"></el-input>
</template>
</el-table-column>
<el-table-column prop="currentB" label="B电流" align="center">
<template #default="scope">
<el-input placeholder="请输入B电流" v-model="scope.row.currentB"></el-input>
</template>
</el-table-column>
<el-table-column prop="currentC" label="C电流" align="center">
<template #default="scope">
<el-input placeholder="请输入C电流" v-model="scope.row.currentC"></el-input>
</template>
</el-table-column>
<el-table-column prop="state" label="状态" align="center">
<template #default="scope">
<div class="switch">
<div
:class="{ active: scope.row.state }"
@click=" scope.row.state = true"
>
启动
</div>
<div
:class="{ active: ! scope.row.state }"
@click=" scope.row.state = false"
>
停止
</div>
</div>
</template>
</el-table-column>
</el-table>
</div>
<div class="btns">
<div class="cancel-btn" @click="isVisited=false">
取消
</div>
<div class="sure-btn">
确定
</div>
</div>
</div>
<div class="box-right" v-if="changeIndex==2">
<div class="device-title">
<span>风压设备管理</span>
<div class="collection-frequency">
<span>采集频率</span>
<span class="units">
<input
type="number"
min="0"
v-model="collectionFrequency"
/>
</span>
</div>
</div>
<div class="device-table">
<el-table stripe
style="border-bottom: 1px #06e5e5 solid;background-color: #011c29;--el-table-border-color: none;"
:header-cell-style="{backgroundColor: '#064B66',color: '#fff',fontSize: '40px',borderBottom: 'none' }"
:cell-style="{textAlign: 'center',borderBottom: 'none'}" :data="winData">
<el-table-column prop="name" label="设备名称" align="center"/>
<el-table-column prop="offset" label="偏移量" align="center"/>
<el-table-column prop="unit" label="单位" align="center"/>
<el-table-column prop="thresholdValue" label="阈值" align="center">
<template #default="scope">
<el-input placeholder="请输入阈值" v-model="scope.row.thresholdValue"></el-input>
</template>
</el-table-column>
<el-table-column prop="state" label="状态" align="center">
<template #default="scope">
<div class="switch">
<div
:class="{ active: scope.row.state }"
@click=" scope.row.state = true"
>
启动
</div>
<div
:class="{ active: ! scope.row.state }"
@click=" scope.row.state = false"
>
停止
</div>
</div>
</template>
</el-table-column>
</el-table>
</div>
<div class="btns">
<div class="cancel-btn" @click="isVisited=false">
取消
</div>
<div class="sure-btn">
确定
</div>
</div>
</div>
<div class="box-right" v-if="changeIndex==3">
<div class="device-title">
<span>其他传感器设备管理</span>
<div class="collection-frequency">
<span>采集频率</span>
<span class="units">
<input
type="number"
min="0"
v-model="collectionFrequency"
/>
</span>
</div>
</div>
<div class="device-table">
<el-table stripe
style="border-bottom: 1px #06e5e5 solid;background-color: #011c29;--el-table-border-color: none;"
:header-cell-style="{backgroundColor: '#064B66',color: '#fff',fontSize: '40px',borderBottom: 'none' }"
:cell-style="{textAlign: 'center',borderBottom: 'none'}" :data="otherData">
<el-table-column prop="name" label="设备名称" align="center"/>
<el-table-column prop="offset" label="偏移量" align="center"/>
<el-table-column prop="unit" label="单位" align="center">
<template #default="scope">
<el-input placeholder="请输入单位" v-model="scope.row.unit"></el-input>
</template>
</el-table-column>
<el-table-column prop="thresholdValue" label="阈值" align="center">
<template #default="scope">
<el-input placeholder="请输入阈值" v-model="scope.row.thresholdValue"></el-input>
</template>
</el-table-column>
<el-table-column prop="state" label="状态" align="center">
<template #default="scope">
<div class="switch">
<div
:class="{ active: scope.row.state }"
@click=" scope.row.state = true"
>
启动
</div>
<div
:class="{ active: ! scope.row.state }"
@click=" scope.row.state = false"
>
停止
</div>
</div>
</template>
</el-table-column>
</el-table>
</div>
<div class="btns">
<div class="cancel-btn" @click="isVisited=false">
取消
</div>
<div class="sure-btn" @click="handleSubmit(formInstance)">
确定
</div>
</div>
</div> </div>
</div> </div>
</div> </div>
@@ -40,10 +215,179 @@
<script setup> <script setup>
const router = useRouter() const router = useRouter()
const collectionFrequency = ref(0)
const changeIndex = ref(1)
const fanData = [
{
name: '一号风机',
currentA: '2342',
currentB: '2342',
currentC: '2342',
state: false,
},
{
name: '二号风机',
currentA: '2342',
currentB: '2342',
currentC: '2342',
state: true,
},
{
name: '三号风机',
currentA: '2342',
currentB: '2342',
currentC: '2342',
state: false,
}
]
const winData = [
{
name: '1号风压',
offset: '2342',
unit: 'Pa',
thresholdValue: '2342',
state: false,
},
{
name: '2号风压',
offset: '2342',
unit: 'Pa',
thresholdValue: '2342',
state: false,
},
{
name: '3号风压',
offset: '2342',
unit: 'Pa',
thresholdValue: '2342',
state: false,
},
{
name: '4号风压',
offset: '2342',
unit: 'Pa',
thresholdValue: '2342',
state: false,
},
{
name: '5号风压',
offset: '2342',
unit: 'Pa',
thresholdValue: '2342',
state: false,
},
{
name: '6号风压',
offset: '2342',
unit: 'Pa',
thresholdValue: '2342',
state: false,
},
{
name: '7号风压',
offset: '2342',
unit: 'Pa',
thresholdValue: '2342',
state: false,
},
{
name: '8号风压',
offset: '2342',
unit: 'Pa',
thresholdValue: '2342',
state: false,
},
{
name: '9号风压',
offset: '2342',
unit: 'Pa',
thresholdValue: '2342',
state: false,
},
{
name: '10号风压',
offset: '2342',
unit: 'Pa',
thresholdValue: '2342',
state: false,
},
]
const otherData = [
{
name: '风速',
offset: '2342',
unit: 'm/s',
thresholdValue: '2342',
state: false,
}, {
name: '氧 气',
offset: '2342',
unit: 'm/s',
thresholdValue: '2342',
state: false,
}, {
name: '温 度',
offset: '2342',
unit: 'm/s',
thresholdValue: '2342',
state: false,
}, {
name: '湿 度',
offset: '2342',
unit: 'm/s',
thresholdValue: '2342',
state: false,
}, {
name: '粉 尘',
offset: '2342',
unit: 'm/s',
thresholdValue: '2342',
state: false,
}, {
name: '二氧化碳',
offset: '2342',
unit: 'm/s',
thresholdValue: '2342',
state: false,
}, {
name: '一氧化碳',
offset: '2342',
unit: 'm/s',
thresholdValue: '2342',
state: false,
}, {
name: '二氧化氮',
offset: '2342',
unit: 'm/s',
thresholdValue: '2342',
state: false,
}, {
name: '一氧化氮',
offset: '2342',
unit: 'm/s',
thresholdValue: '2342',
state: false,
}, {
name: '二氧化硫',
offset: '2342',
unit: 'm/s',
thresholdValue: '2342',
state: false,
}, {
name: '硫 化 氢',
offset: '2342',
unit: 'm/s',
thresholdValue: '2342',
state: false,
}
]
const handleChangeMenu = (e) => {
console.log('切换', e)
changeIndex.value = e
}
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.tunnel-bgc { .tunnel-bgc {
padding: 85px 0 0 0; padding: 85px 0 0 0;
width: 100%; width: 100%;
@@ -89,31 +433,189 @@ const router = useRouter()
.device-content { .device-content {
display: flex; display: flex;
justify-content: center; justify-content: center;
padding-top: 246px; padding-top: 220px;
.device-box { .device-box {
display: flex; display: flex;
width: 2194px; width: 2194px;
height: 1321px; height: 1500px;
background: #064B66; background: #064B66;
border-radius: 20px; border-radius: 20px;
border: 2px solid #05FEFF; border: 2px solid #05FEFF;
box-sizing: border-box; box-sizing: border-box;
.box-left { .box-left {
padding-left: 24px;
width: 300px; width: 300px;
height: 1318px; height: 1498px;
background: #0D5A7A; background: #0D5A7A;
border-radius: 20px 0px 0px 20px; border-radius: 20px 0px 0px 20px;
:deep(.el-menu){
:deep(.el-menu) {
border-right: none; border-right: none;
margin-top: 261px; margin-top: 261px;
background-color: #0D5A7A; background-color: #0D5A7A;
.el-menu-item.is-active {
background-image: url(../../assets/images/device/sdgl_xz.png);
}
.el-menu-item {
color: #fff;
height: 90px;
font-size: 40px;
&:hover {
background-color: #0D5A7A;
}
&:first-child {
letter-spacing: 120px;
}
&:nth-child(2) {
letter-spacing: 120px;
}
}
} }
} }
.box-right { .box-right {
flex: 1; flex: 1;
display: flex;
flex-direction: column;
position: relative;
.device-title {
margin-top: 60px;
line-height: 61px;
color: #FFFFFF;
display: flex;
justify-content: center;
> span:first-child {
font-size: 46px;
font-weight: bold;
}
.collection-frequency {
position: absolute;
right: 102px;
> span:first-child {
font-size: 38px !important;
}
.units {
position: relative;
input {
width: 166px;
height: 50px;
border: 1px solid #05FEFF;
background: transparent;
margin-left: 14px;
font-size: 35px;
color: #FFFFFF;
outline: none;
}
}
.units::after {
content: "秒/次";
position: absolute;
right: 6px;
top: 26%;
transform: translateY(-50%);
font-size: 35px;
color: #08B7B8;
}
}
}
}
.btns {
width: 100%;
margin: 0 auto;
position: absolute;
bottom: 70px;
}
.device-table {
margin-top: 50px;
margin-left: 97px;
.active {
color: #FFFFFF;
background: #0f7da9;
}
.switch {
margin-top: 22px;
margin-left: 60px;
display: flex;
width: 200px;
height: 50px;
border-radius: 6px;
border: 1px solid #05FEFF;
overflow: hidden;
color: #51A2B3;
line-height: 40px;
font-size: 36px;
& > div {
flex: 1;
text-align: center;
cursor: pointer;
}
}
:deep(.el-table--fit) {
width: 1700px !important;
}
:deep(.cell) {
height: 80px;
line-height: 80px;
color: #fff;
font-size: 38px;
}
:deep(.el-table tr) {
background-color: #1C5971;
}
:deep(.el-table--enable-row-hover .el-table__body tr:hover>td.el-table__cell) {
background-color: #1C5971;
}
:deep(.el-table__row--striped) {
background-color: #13849C!important;
}
:deep(.el-table--striped .el-table__body tr.el-table__row--striped td.el-table__cell){
background-color: #13849C!important;
}
:deep(.el-table__cell) {
.el-input {
width: 180px;
height: 53px;
}
.el-input__wrapper {
border-radius: 6px;
border: 1px solid #05FEFF;
background-color: transparent;
.el-input__inner {
color: #FFFFFF;
font-size: 40px;
}
}
}
:deep(.el-table__inner-wrapper::before) {
display: none;
}
} }
} }
} }

View File

@@ -30,7 +30,7 @@
<div>隧道数量{{ item.info.tunnelNum }} <div>隧道数量{{ item.info.tunnelNum }}
</div> </div>
<div> <div>
<div class="tunnel" v-if="showFirstTunnel"> <div class="tunnel" v-if="item.info.tunnelName">
<div>{{ item.info.tunnelName }}</div> <div>{{ item.info.tunnelName }}</div>
<div class="tunnel-icon"></div> <div class="tunnel-icon"></div>
<div>施工长度{{ item.info.constructionLength }}</div> <div>施工长度{{ item.info.constructionLength }}</div>
@@ -41,7 +41,7 @@
<div class="add-icon"></div> <div class="add-icon"></div>
</div> </div>
</div> </div>
<div class="more" @click="router.push('/tunnel')" v-if="showFirstTunnel"> <div class="more" @click="goToAddTunnel(item.siteId)" v-if="item.info.tunnelName">
更多 更多
<div class="icon"></div> <div class="icon"></div>
</div> </div>
@@ -105,7 +105,7 @@ const siteIds = ref([])
const siteNameList = ref([]) const siteNameList = ref([])
const info = ref({ const info = ref({
tunnelNum: 0, tunnelNum: 0,
tunnelName: '隧道', tunnelName: '',
constructionLength: 0, constructionLength: 0,
implementationLength: 0 implementationLength: 0
}) })
@@ -114,7 +114,6 @@ const isClick = ref(false);
const isVisited = ref(false); const isVisited = ref(false);
const total = ref(); const total = ref();
const showAddIcon = ref(false) const showAddIcon = ref(false)
const showFirstTunnel = ref(true)
const pageInfo = reactive({ const pageInfo = reactive({
pageNum: 1, pageNum: 1,
pageSize: 6 pageSize: 6
@@ -136,9 +135,10 @@ const getList = () => {
showAddIcon.value = total.value !== 6; showAddIcon.value = total.value !== 6;
res.data.rows.map(item => { res.data.rows.map(item => {
if (item.tunnelList === null || item.tunnelList === []) { if (item.tunnelList === null || item.tunnelList === []) {
showFirstTunnel.value = false item.info = info.value
}else{
item.info=item.tunnelList[0]
} }
item.info = info.value
item.checked = false item.checked = false
}) })
siteList.value = res.data.rows; siteList.value = res.data.rows;
@@ -229,9 +229,9 @@ const handleMoreDelete = () => {
} }
//点击页码进行分页功能 //点击页码进行分页功能
const handleCurrentChange = async (val) => { const handleCurrentChange = (val) => {
pageInfo.pageNum = val pageInfo.pageNum = val
await getList() getList()
} }
</script> </script>
@@ -254,39 +254,6 @@ const handleCurrentChange = async (val) => {
color: #FFFFFF; color: #FFFFFF;
} }
.btns {
display: flex;
justify-content: space-around;
margin-top: 80px;
.cancel-btn {
display: flex;
justify-content: center;
cursor: pointer;
width: 220px;
height: 80px;
border-radius: 11px;
border: 2px solid #08B7B8;
color: #08B7B8;
line-height: 80px;
font-size: 38px;
box-sizing: border-box;
}
.sure-btn {
display: flex;
justify-content: center;
cursor: pointer;
width: 220px;
height: 80px;
line-height: 80px;
background: #08B7B8;
border-radius: 11px;
color: #FFFFFF;
font-size: 38px;
}
}
:deep(.el-dialog) { :deep(.el-dialog) {
border: 2px solid #05FEFF; border: 2px solid #05FEFF;
background: #0D6578; background: #0D6578;
@@ -399,11 +366,14 @@ const handleCurrentChange = async (val) => {
} }
.box-content { .box-content {
height: 1850px;
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
padding-left: 100px; padding-left: 100px;
padding-right: 100px; padding-right: 100px;
justify-content: space-between; justify-content: space-between;
box-sizing: border-box;
overflow: hidden;
.add-box { .add-box {
cursor: pointer; cursor: pointer;
@@ -425,7 +395,7 @@ const handleCurrentChange = async (val) => {
.site-box { .site-box {
margin-top: 122px; margin-top: 122px;
//margin-right: 60px; //margin-right: 1%;
padding: 40px 50px; padding: 40px 50px;
width: 1250px; width: 1250px;
height: 750px; height: 750px;

View File

@@ -7,6 +7,9 @@
</div> </div>
<div class="tunnel-title"></div> <div class="tunnel-title"></div>
<div class="all-del-btn"> <div class="all-del-btn">
<div class="all-btn" style=" margin-right: 40px;" v-if="!showAddIcon" @click="handleAdd">
添加
</div>
<div class="all-btn"> <div class="all-btn">
全选 全选
</div> </div>
@@ -84,7 +87,7 @@
</el-dialog> </el-dialog>
<div class="pagination"> <div class="pagination">
<span>首页</span> <span>首页</span>
<el-pagination background :page-size="6" :total="50" prev-text="上一页" next-text="下一页" layout="prev, pager, next"/> <el-pagination background :page-size="6" :total="50" prev-text="上一页" next-text="下一页" layout="prev, pager, next" />
<span>尾页</span> <span>尾页</span>
</div> </div>
</div> </div>
@@ -92,6 +95,7 @@
<script setup> <script setup>
const router = useRouter() const router = useRouter()
const showAddIcon = ref(true)
const siteId = reactive(router.currentRoute.value.params.siteId) const siteId = reactive(router.currentRoute.value.params.siteId)
const siteList = ref([ const siteList = ref([
{ {
@@ -159,51 +163,49 @@ const siteList = ref([
num: 1, num: 1,
constructionLength: 500, constructionLength: 500,
implementationLength: 10 implementationLength: 10
}, }
]) ])
const iconsList = ref([ const iconsList = ref([
{ {
icon: 'white-state-icon.png', icon: 'sd_icon_fj.png',
name: '风机', name: '风机',
num: 2 num: 2
}, },
{ {
icon: 'white-state-icon.png', icon: 'sd_icon_sd.png',
name: '风机', name: '湿度',
num: 11
},
{
icon: 'white-state-icon.png',
name: '风机',
num: '无' num: '无'
}, },
{ {
icon: 'white-state-icon.png', icon: 'sd_icon_fy.png',
name: '风', name: '风',
num: 2 num: 10
}, },
{ {
icon: 'white-state-icon.png', icon: 'sd_icon_yq.png',
name: '风机', name: '氧气',
num: 11
},
{
icon: 'white-state-icon.png',
name: '风机',
num: '无' num: '无'
}, },
{ {
icon: 'white-state-icon.png', icon: 'sd_icon_fs.png',
name: '风', name: '风',
num: 11 num: 11
}, },
{ {
icon: 'white-state-icon.png', icon: 'sd_icon_fc.png',
name: '风机', name: '粉尘',
num: 1
},
{
icon: 'sd_icon_wd.png',
name: '温度',
num: 11 num: 11
}, },
{
icon: 'sd_icon_qt.png',
name: '有害气体',
num: '无'
},
]) ])
const title = ref('新增隧道') const title = ref('新增隧道')
const isVisited = ref(false); const isVisited = ref(false);
@@ -215,12 +217,13 @@ const form = ref({
tunnelLength: '', tunnelLength: '',
remarks: '' remarks: ''
}); });
const handleEdit = () => { const handleEdit = () => {
title.value = '编辑隧道' title.value = '编辑隧道'
isVisited.value = true isVisited.value = true
} }
const handleEditDevice = () => { const handleEditDevice = () => {
router.push('/device/'+1) router.push('/device/' + 1)
} }
const handleAdd = () => { const handleAdd = () => {
@@ -299,37 +302,6 @@ const handleClickSite = (type) => {
color: #FFFFFF; color: #FFFFFF;
} }
.btns {
display: flex;
justify-content: space-around;
margin-top: 80px;
.cancel-btn {
cursor: pointer;
width: 220px;
height: 80px;
border-radius: 11px;
border: 2px solid #08B7B8;
color: #08B7B8;
line-height: 80px;
padding-left: 67px;
font-size: 38px;
box-sizing: border-box;
}
.sure-btn {
cursor: pointer;
width: 220px;
height: 80px;
line-height: 80px;
background: #08B7B8;
border-radius: 11px;
color: #FFFFFF;
font-size: 38px;
padding-left: 67px;
}
}
.tunnel-bgc { .tunnel-bgc {
background-color: #072348; background-color: #072348;
padding: 85px 0 0 0; padding: 85px 0 0 0;
@@ -393,12 +365,14 @@ const handleClickSite = (type) => {
} }
.box-content { .box-content {
height: 1850px;
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
padding-left: 67px; padding-left: 67px;
padding-right: 70px; padding-right: 70px;
justify-content: space-between; justify-content: space-between;
box-sizing: border-box;
overflow: hidden;
.add-box { .add-box {
cursor: pointer; cursor: pointer;
font-weight: bold; font-weight: bold;
@@ -419,7 +393,7 @@ const handleClickSite = (type) => {
.site-box { .site-box {
margin-top: 50px; margin-top: 50px;
//margin-right: 122px; margin-right: 1.5%;
padding: 40px 30px; padding: 40px 30px;
width: 925px; width: 925px;
height: 550px; height: 550px;
@@ -427,7 +401,7 @@ const handleClickSite = (type) => {
//box-sizing: border-box; //box-sizing: border-box;
position: relative; position: relative;
&:nth-child(3) { &:nth-child(4n) {
margin-right: 0; margin-right: 0;
} }
@@ -474,13 +448,13 @@ const handleClickSite = (type) => {
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: space-between; justify-content: space-between;
margin-right:30px; margin-right: 30px;
} }
} }
.left-img { .left-img {
margin-top: 110px; margin-top: 110px;
margin-right: 70px; margin-right: 50px;
width: 340px; width: 340px;
height: 148px; height: 148px;
background-image: url('@/assets/images/tunnel/sdgl_sdt.png'); background-image: url('@/assets/images/tunnel/sdgl_sdt.png');
@@ -492,7 +466,7 @@ const handleClickSite = (type) => {
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: flex-start; justify-content: flex-start;
font-size: 34px; font-size: 30px;
color: #60DDDE; color: #60DDDE;
//margin-left: 175px; //margin-left: 175px;
@@ -538,10 +512,14 @@ const handleClickSite = (type) => {
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
color: #FFFFFF; color: #FFFFFF;
font-size: 36px; font-size: 34px;
margin-right: 27px; margin-right: 17px;
margin-bottom: 30px; margin-bottom: 30px;
&:first-child {
margin-right: 37px;
}
&:nth-child(2n) { &:nth-child(2n) {
margin-right: 0; margin-right: 0;
} }
@@ -563,7 +541,7 @@ const handleClickSite = (type) => {
align-items: center; align-items: center;
position: absolute; position: absolute;
left: 50%; left: 50%;
transform: translate(-50%,-50%); transform: translate(-50%, -50%);
bottom: 50px; bottom: 50px;
color: #60DDDE; color: #60DDDE;
font-size: 38px; font-size: 38px;

View File

@@ -1,7 +1,7 @@
<template> <template>
<div id="main"> <div id="main">
<div class="box-top"> <div class="box-top">
<manage-btn v-model="selectIndex" @select="manageSelect" /> <manage-btn v-model="selectIndex" @select="manageSelect" :list="routeList" />
<div class="tunnel-title"></div> <div class="tunnel-title"></div>
<manage-length class="tunnel-length"></manage-length> <manage-length class="tunnel-length"></manage-length>
<div class="top-right"> <div class="top-right">
@@ -42,7 +42,7 @@
<el-carousel height="150px" type="card" ref="tunnelBtn" :autoplay="false"> <el-carousel height="150px" type="card" ref="tunnelBtn" :autoplay="false">
<div class="btn"> <div class="btn">
<el-carousel-item v-for="item in tunnelList" :key="item.value"> <el-carousel-item v-for="item in tunnelList" :key="item.value">
{{ item.name }} {{ item.label }}
</el-carousel-item> </el-carousel-item>
</div> </div>
</el-carousel> </el-carousel>
@@ -65,7 +65,7 @@ import { dateFormat } from "@/utils/date.js";
import { onMounted } from "vue"; import { onMounted } from "vue";
import { getToken } from "@/utils/auth"; import { getToken } from "@/utils/auth";
import { useAuthStore } from "@/store/userstore.js"; import { useAuthStore } from "@/store/userstore.js";
import { getLargeScreen } from "@/api/largeScreen"; import { getLargeScreen, getLargeScreenInfo } from "@/api/largeScreen";
import { ElMessageBox } from "element-plus"; import { ElMessageBox } from "element-plus";
const authStore = useAuthStore(); const authStore = useAuthStore();
@@ -78,32 +78,8 @@ const currentSite = ref("松江站");
const currentUser = ref("admin"); const currentUser = ref("admin");
const currentDate = ref(dateFormat()); const currentDate = ref(dateFormat());
const tunnelBtn = ref(); const tunnelBtn = ref();
const tunnelList = ref([ const tunnelList = ref([]);
{ const routeList = ref([]);
value: 0,
name: "一号隧道",
},
{
value: 1,
name: "二号隧道",
},
{
value: 2,
name: "三号隧道",
},
{
value: 3,
name: "四号隧道",
},
{
value: 4,
name: "五号隧道",
},
{
value: 5,
name: "六号隧道",
},
]);
let socket = reactive(""); let socket = reactive("");
const serialNumber = ref("SC00DY00GH00ELBT"); const serialNumber = ref("SC00DY00GH00ELBT");
let token = getToken(); let token = getToken();
@@ -121,9 +97,19 @@ onMounted(() => {
nextTick(() => { nextTick(() => {
showFan.value = true; showFan.value = true;
}); });
getOtherInfo()
getScreenInfo(); getScreenInfo();
}); });
const getOtherInfo = async () => {
await getLargeScreenInfo().then((res) => {
if (res?.code === 1000) {
routeList.value = res.data.routeList
currentSite.value = res.data.siteOption[0].label
tunnelList.value = res.data.tunnelOption
}
});
};
const getScreenInfo = async () => { const getScreenInfo = async () => {
await getLargeScreen(1).then((res) => { await getLargeScreen(1).then((res) => {
if (res?.code === 1000) { if (res?.code === 1000) {