From 77539495356f5bf0bc69c7a72c09dd5490e66c00 Mon Sep 17 00:00:00 2001 From: zmj <1493694146@qq.com> Date: Fri, 15 Dec 2023 18:20:02 +0800 Subject: [PATCH] yemain1iuyd --- src/api.js | 22 +- src/components/areaMap.vue | 21 +- src/components/detail/centerBottom.vue | 99 ++++++ src/components/detail/leftCenter.vue | 44 +++ src/components/detail/leftTop.vue | 67 ++++ src/components/detail/rightBottom.vue | 79 +++++ src/components/detail/rightTop.vue | 117 +++++++ src/components/index/centerBottom.vue | 53 +++ src/components/index/leftBottom.vue | 59 ++++ src/components/index/leftCenter.vue | 429 ++++++++++++++++++++++--- src/components/index/leftTop.vue | 1 - src/components/index/rightTop.vue | 88 +++++ src/components/index/version.js | 1 - src/components/scrollTable.vue | 4 +- src/components/videoFlv.vue | 2 +- src/components/warnPop.vue | 330 +++++++++++++++++-- src/view/detail.vue | 399 +---------------------- src/view/home.vue | 299 ++--------------- src/view/login.vue | 1 - src/view/option.js | 2 +- 20 files changed, 1380 insertions(+), 737 deletions(-) create mode 100644 src/components/detail/centerBottom.vue create mode 100644 src/components/detail/leftCenter.vue create mode 100644 src/components/detail/leftTop.vue create mode 100644 src/components/detail/rightBottom.vue create mode 100644 src/components/detail/rightTop.vue create mode 100644 src/components/index/centerBottom.vue create mode 100644 src/components/index/leftBottom.vue create mode 100644 src/components/index/rightTop.vue delete mode 100644 src/components/index/version.js diff --git a/src/api.js b/src/api.js index f3acd75..00604ce 100644 --- a/src/api.js +++ b/src/api.js @@ -40,8 +40,22 @@ export function deviceAlarmCountApi(params) { return instacne.get('/api/dataview.device/deviceAlarmCount', { params }) } +export function deviceCountApi(params) { + return instacne.get('/api/dataview.device/deviceCount', { params }) +} +export function plantProductCountApi(params) { + return instacne.get('/api/dataview.land/plantProductCount', { params }) +} - -// -//api/dataview/merchant?mer_id=36&areaCode=510524&streetCode=510524100 -// } +export function landCollectionListApi(params) { + return instacne.get('/api/dataview.land/landCollectionList', { params }) +} +export function landMonitorAlarmHistoryApi(params) { + return instacne.get('/api/dataview.land/landMonitorAlarmHistory', { params }) +} +export function landListApi(params) { + return instacne.get('/api/dataview.land/landList', { params }) +} +export function productListApi(params) { + return instacne.get('/api/dataview.land/productList', { params }) +} diff --git a/src/components/areaMap.vue b/src/components/areaMap.vue index 6c227f6..dfe2c9b 100644 --- a/src/components/areaMap.vue +++ b/src/components/areaMap.vue @@ -41,12 +41,15 @@ <script setup> import { ref, onMounted } from "vue" -import axios from "axios"; + import * as echarts from 'echarts'; import "echarts-gl" -import iconbg from '/static/index/mapicon.png' + import geoJson from "/static/jsonData/xuantan.js" -const u = 'https:\/\/ceshi-worker-task.lihaink.cn\/uploads\/images\/20231129\/202311291816106120a4034.png' +import {useRouter} from "vue-router" + + +const router=useRouter() const icon = "https:\/\/ceshi-worker-task.lihaink.cn\/uploads\/images\/20231204\/202312041608529c9e21252.png" const lx="https:\/\/ceshi-worker-task.lihaink.cn\/uploads\/images\/20231205\/20231205092709cfe148712.png" @@ -55,9 +58,6 @@ const pointerFn = () => { // console.log() let list = [] geoJson.center.forEach((item, index) => { - - - list.push({ coord: item, symbol: index==geoJson.center.length-1?('image://'+lx): ('image://' + icon),// 自定义图片路径 @@ -284,11 +284,18 @@ onMounted(() => { const bg = echarts.init(myChart) bg.setOption(option); + bg.on('click', function (params) { + mapClick() + + }); + }) - +const mapClick=()=>{ + router.push("/detail") +} diff --git a/src/components/detail/centerBottom.vue b/src/components/detail/centerBottom.vue new file mode 100644 index 0000000..de34ac0 --- /dev/null +++ b/src/components/detail/centerBottom.vue @@ -0,0 +1,99 @@ +<template> + + +<div class="bottom-li" :class="(item.flag) ? 'act' : ''" v-for="(item, index) in environmentData"> + +<span class="color-font">{{ item.name }}</span> +<span>{{ item.value }}{{ item.unit }}</span> +<span v-if="item.flag">状态正常</span> +<span v-else>状态正常</span> + +</div> + + + +</template> +<script setup> + + +import {ref,reactive} from "vue" +const environmentData = reactive([ + + { + name: "风速", + value: 10, + unit: "m/s", + flag: true + }, + { + name: "风向", + value: 10, + unit: "", + flag: false + }, + { + name: "环境湿度", + value: 10, + unit: "%", + flag: false + }, + { + name: "环境温度", + value: 10, + unit: "℃", + flag: false + }, + { + name: "二氧化碳", + value: 10, + unit: "ppm", + flag: true + }, + { + name: "环境气压", + value: 10, + unit: "pa", + flag: true + }, + { + name: "雨量", + value: 10, + unit: "mm/h", + flag: false + }, + { + name: "环境光照", + value: 10, + unit: "%", + flag: true + }, +]) +</script> +<style lang="scss"> + + +.bottom-li { + // background-color: #fff; + width: 49%; + height: 4vh; + display: flex; + box-sizing: border-box; + justify-content: space-between; + // border: 1px solid red; + background-image: url('/static/detail/ZC.png'); + background-size: 100% 100%; + align-items: center; + font-size: 16px; + color: #E5EFFF; + font-family: FZCYJ; + padding: 0 1VW; + + } + + .act { + background-image: url('/static/detail/YC.png'); + color: #C65956; + + + } +</style> \ No newline at end of file diff --git a/src/components/detail/leftCenter.vue b/src/components/detail/leftCenter.vue new file mode 100644 index 0000000..bd7aa2e --- /dev/null +++ b/src/components/detail/leftCenter.vue @@ -0,0 +1,44 @@ +<template> + <warnDetail v-if="showWarnDeatil" @off="showWarnDeatil = false"></warnDetail> + <scrollTable @click="hdClick3" :config="config3" style="width:100%;height:100%"></scrollTable> +</template> +<script setup> +import { ref, reactive } from "vue" +import warnDetail from "@/components/warnDetail.vue" + +const showWarnDeatil = ref(false) +import scrollTable from "@/components/scrollTable.vue" + +const hdClick3 = (e) => { + if (e.ceil) { + if (e.columnIndex == 3) { + showWarnDeatil.value = true + } + } +} +const alignFn = (num) => { + let arr = [] + for (let i = 0; i < num; i++) { + arr.push('center') + } + return arr +} + +const config3 = reactive({ + header: ['产品名称', '溯源码', '产品名称', '溯源码',], + headerBGC: "#092757", + oddRowBGC: "#0C2045", + headerStyle: "background-image: url('/static/index/SBGJBG.png');font-family: FZCYJ;background-size: 100% 100%;", + align: alignFn(4), + data: [ + ['行1列1', '行1列2', '行1列3', `<span style="color:#2562AD"> 详情 </span>`,], + ['行1列1', '行1列2', '行1列3', `<span style="color:#2562AD"> 详情 </span>`,], + ['行1列1', '行1列2', '行1列3', `<span style="color:#2562AD"> 详情 </span>`,], + ['行1列1', '行1列2', '行1列3', `<span style="color:#2562AD"> 详情 </span>`,], + ['行1列1', '行1列2', '行1列3', `<span style="color:#2562AD"> 详情 </span>`,], + ['行1列1', '行1列2', '行1列3', `<span style="color:#2562AD"> 详情 </span>`,], + ['行1列1', '行1列2', '行1列3', `<span style="color:#2562AD"> 详情 </span>`,], + + ] +}) +</script> \ No newline at end of file diff --git a/src/components/detail/leftTop.vue b/src/components/detail/leftTop.vue new file mode 100644 index 0000000..ea9b824 --- /dev/null +++ b/src/components/detail/leftTop.vue @@ -0,0 +1,67 @@ +<template> + <div style="display: flex;justify-content: space-between;align-items: center;"> + <span>种植总面积:</span> + <div> + <span class="area-num "><span class="color-font">2</span> </span> + <span class="area-num "><span class="color-font">2</span> </span> + <span class="area-num "><span class="color-font">2</span> </span> + <span class="area-num "><span class="color-font">2</span> </span> + </div> + </div> + <div style="">种植种类:</div> + <div> + <div class="lands"> + <div class="land" v-for="(item, index) in 33" :key="index">地块</div> + </div> + </div> +</template> +<style lang="scss"> +.area-num { + margin-right: 10px; + width: 35px; + height: 40px; + background-image: url("/static/detail/numbg.png"); + display: inline-block; + background-size: 100% 100%; + font-size: 30px; + text-align: center; +} + + +.lands { + display: flex; + flex-wrap: wrap; + height: 100%; + justify-content: space-between; + font-size: 14px; + overflow-y: auto; + margin-top: 1vh; + height: 15vh; + + .land { + width: 5vw; + height: 3vh; + // background-color: #fff; + background-image: url('/static/detail/ZL.png'); + background-size: 100% 100%; + color: white; + text-align: center; + line-height: 3vh; + + } +} + +.lands::-webkit-scrollbar { + width: 10px; + background-color: #153041; +} + +.lands::-webkit-scrollbar-track { + background-color: #153041; +} + +::-webkit-scrollbar-thumb { + background-color: #15A1DC; + border-radius: 5px; +} +</style> \ No newline at end of file diff --git a/src/components/detail/rightBottom.vue b/src/components/detail/rightBottom.vue new file mode 100644 index 0000000..d552432 --- /dev/null +++ b/src/components/detail/rightBottom.vue @@ -0,0 +1,79 @@ +<template> + <div class="r-b-li" :class="item.flag ? '' : 'act'" v-for="(item, index) in MoistureData" :key="index"> + <span style="color: azure;">{{ item.name }}</span> + <span>{{ item.value }} {{ item.unit }}</span> + <span v-if="item.flag">状态正常</span> + <span v-else>状态异常</span> + </div> +</template> + + +<script setup> +import {reactive} from "vue" + + +const MoistureData = reactive([ + { + name: "土壤温度", + value: 12, + unit: "℃", + flag: true + }, { + name: "土壤湿度", + value: 12, + unit: "℃", + flag: false + }, { + name: "土壤电导率", + value: 12, + unit: "ps/cm", + flag: true + }, { + name: "土壤PH值", + value: 4, + unit: "", + flag: true + }, { + name: "土壤含氮量", + value: 12, + unit: "", + flag: false + }, { + name: "土壤含磷量", + value: 12, + unit: "", + flag: false + }, + { + name: "土壤含钾量", + value: 12, + unit: "", + flag: true + }, + + + +]) + +</script> + +<style lang="scss"> +.r-b-li { + width: 95%; + height: 7.5vh; + background-image: url('/static/detail/SQBG.png'); + background-size: 100% 100%; + color: white; + font-family: FZCYJ; + display: flex; + justify-content: space-between; + align-items: center; + box-sizing: border-box; + padding: 0 1.5VW; + font-size: 14PX; +} + +.act { + color: #C55956; +} +</style> \ No newline at end of file diff --git a/src/components/detail/rightTop.vue b/src/components/detail/rightTop.vue new file mode 100644 index 0000000..8639fb3 --- /dev/null +++ b/src/components/detail/rightTop.vue @@ -0,0 +1,117 @@ +<template> + <div>监控设备总数: <span class="num">1528</span> 台</div> + <div class="cont"> + <div style="display: flex;justify-content: space-between;align-items: center;margin-top: 3vh;"> + <img src="/static/index/JYZ.png" style="width: 2.8vw; height: 4vw;" alt=""> + + <div class="circle"> + <img src="/static/detail/bk.png" class="act-img" alt=""> + <div style="width: 110px;height: 110px;" class="online" id="online"></div> + </div> + <div class="circle"> + <img src="/static/detail/bk.png" class="act-img" alt=""> + <div style="width: 110px;height: 110px;" class="online" id="offline"></div> + </div> + + <img src="/static/index/JTY.png" style="width: 2.8vw; height: 4vw;" alt=""> + </div> + + <div class="eqNum"> + <div> + <img src="/static/index/Q.png" alt="" style="transform: translateY(2px);"> 在线设备统计:<span class="num" + style="margin-left: 10px;">1418</span> 台 + </div> + <div> + <img src="/static/index/Q.png" style="transform: translateY(2px);"> 离线设备统计:<span class="num" + style="margin-left: 10px;">1418</span> + 台 + </div> + </div> + </div> +</template> +<script setup> +import {ref,reactive,onMounted} from "vue" +import * as echarts from 'echarts'; +import options from "@/view/option.js" + + +// 图表 +const initCharts = (tag, option) => { + var chartDom = document.getElementById(tag); + var myChart = echarts.init(chartDom); + myChart.setOption(option); +} + + +onMounted(() => { + document.getElementById("online").removeAttribute('_echarts_instance_'); + document.getElementById("offline").removeAttribute('_echarts_instance_'); + initCharts('online', options.onLine) + initCharts('offline', options.offLine) + +}) + +</script> + + +<style lang="scss"> +.num { + font-size: 20px; + font-family: FZCYJ; + color: #E5EFFF; + background: linear-gradient(to bottom, #DAE8FE 30%, #53A0FF 100%); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + margin-left: 30px; +} + + + +.cont { + height: 70%; + + .eqNum { + margin-top: 2vh; + display: flex; + justify-content: space-around; + font-size: 11px; + background-image: url('/static/index/BTBG.png'); + background-size: 100% 100%; + + } + + .circle { + width: 120px; + height: 120px; + position: relative; + + @keyframes spin { + 0% { + transform: rotate(0deg); + } + + 100% { + transform: rotate(360deg); + } + } + + .act-img { + position: absolute; + width: 100%; + height: 100%; + animation: spin 2s linear infinite; + left: -0%; + top: 0%; + } + + } + + .online { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + + } +} +</style> \ No newline at end of file diff --git a/src/components/index/centerBottom.vue b/src/components/index/centerBottom.vue new file mode 100644 index 0000000..2a18474 --- /dev/null +++ b/src/components/index/centerBottom.vue @@ -0,0 +1,53 @@ +<template> + <warnPop v-if="showWarnPop" ref="ChildsDom" @off="showWarnPop = false"></warnPop> + <scrollTable v-if="config.data.length" :config="config" @click="hdClick" style="width:100%;height:100%"></scrollTable> +</template> +<script setup> +import {ref,reactive} from "vue" +import scrollTable from "@/components/scrollTable.vue" +import warnPop from "@/components/warnPop.vue" +import {landCollectionListApi} from "@/api.js" +const showWarnPop = ref(false) +const ChildsDom = ref(null); +const hdClick = (e) => { + // console.log(e) + if (e.ceil) { + if (e.columnIndex == 9) { + showWarnPop.value = true + } + } +} +const alignFn = (num) => { + let arr = [] + for (let i = 0; i < num; i++) { + arr.push('center') + } + return arr +} +const config = reactive({ + header: ['地块名称', '土壤温度(℃)', '土壤湿度', '土壤PH值', '土壤氮磷钾', '风速(m/s)', '环境温度(℃)', '环境湿度', '二氧化碳(ppm)', '历史预警数据'], + headerBGC: "#092757", + font:'10px', + headerStyle: "background-image: url('/static/index/tableHead.png');font-family: FZCYJ;background-size: 100% 100%;", + oddRowBGC: "#0C2045", + align: alignFn(10), + data: [ ] +}) + + +landCollectionListApi( +{ + areaCode:510521, + streetCode:510521100 +} + +).then(res=>{ + res.data.list.forEach(item => { + config.data.push( + [item.title, item.soil_temperature,item.soil_moisture, item.soil_PH,item.soil_potassium_phosphate_nitrogen+'/'+item.soil_potassium_phosphate_phosphorus+'/'+item.soil_potassium_phosphate_potassium, item.wind_speed, item.ambient_temperature, item.ambient_humidity, item.carbon_dioxide, `<span style='color:#2562AD' > 查看<span>`] + ) + + }); +}) + +</script> \ No newline at end of file diff --git a/src/components/index/leftBottom.vue b/src/components/index/leftBottom.vue new file mode 100644 index 0000000..49916b4 --- /dev/null +++ b/src/components/index/leftBottom.vue @@ -0,0 +1,59 @@ +<template> + <scrollTable :config="config2" style="width:100%;height:100%" v-if="config2.data.length"></scrollTable> +</template> +<script setup> +import scrollTable from "@/components/scrollTable.vue" +import { ref, reactive, onMounted } from "vue" +import { plantProductCountApi } from "@/api.js" + +const alignFn = (num) => { + let arr = [] + for (let i = 0; i < num; i++) { + arr.push('center') + } + return arr +} +const config2 = reactive({ + header: ['产品名称', '溯源码', '产品名称', '溯源码',], + headerBGC: "#092757", + oddRowBGC: "#0C2045", + headerStyle: "background:#0E316B", + + align: alignFn(4), + data: [ ] +}) + + +const correctionListFn = (list) => { + const originalArray = list; + const transformedArray = originalArray.reduce((acc, curr, index) => { + if (index % 2 === 0) { + acc.push([curr]); + } else { + acc[acc.length - 1].push(curr); + } + return acc; + }, []); + + return transformedArray + + + +} + +plantProductCountApi( + { + areaCode: 510521, + streetCode: 510521100 + + } +).then(res => { + correctionListFn(res.data.list).forEach(item => { + config2.data.push( + [item[0].kind, `<img src=${ item[0].qr_code} style='width:25px;height:25px;transform: translateY(5PX);'/>` , item[1].kind,`<img src=${ item[1].qr_code} style='width:25px;height:25px;transform: translateY(5PX);'/>` ] + ) + }) +}) + + +</script> diff --git a/src/components/index/leftCenter.vue b/src/components/index/leftCenter.vue index 721b9dd..8a70a77 100644 --- a/src/components/index/leftCenter.vue +++ b/src/components/index/leftCenter.vue @@ -1,5 +1,5 @@ <template> - <div>监控设备总数: <span class="num color-font">1528</span> 台</div> + <div>监控设备总数: <span class="num color-font">{{ totalNum }}</span> 台</div> <div class="cont"> <div style="display: flex;justify-content: space-between;align-items: center;margin-top: 3vh;"> <img src="/static/index/JYZ.png" style="width: 2.8vw; height: 4vw;" alt=""> @@ -16,72 +16,409 @@ <div class="eqNum"> <div> <img src="/static/index/Q.png" alt="" style="transform: translateY(2px);"> 在线设备统计:<span - class="num color-font" style="margin-left: 10px;">1418</span> 台 + class="num color-font" style="margin-left: 10px;">{{ onlineNum }}</span> 台 </div> <div> <img src="/static/index/Q.png" style="transform: translateY(2px);"> 离线设备统计:<span class="num color-font" - style="margin-left: 10px;">1418</span> + style="margin-left: 10px;">{{ offlineNum }}</span> 台 </div> </div> </div> </template> -<style lang="scss"> + +<script setup> +import * as echarts from 'echarts'; +import { ref, reactive, onMounted } from "vue" +import { deviceCountApi } from "@/api.js" +const totalNum = ref(0) +const onlineNum = ref(0) +const offlineNum = ref(0) +const setOnlineFn = (data) => { + const onLine = reactive( + { + title: [ + + { + text: (data.value / data.total * 100) + '%', + x: 'center', + top: '42%', + textStyle: { + fontSize: 13, + color: '#00f0ff', + foontWeight: '500', + }, + }, + ], + polar: { + radius: ['44%', '50%'], + center: ['50%', '50%'], + }, + angleAxis: { + max: 100, + show: false, + }, + radiusAxis: { + type: 'category', + show: true, + axisLabel: { + show: false, + }, + axisLine: { + show: false, + }, + axisTick: { + show: false, + }, + }, + series: [ + { + type: 'pie', + startAngle: 90, + radius: ['60%', '80%'], + center: ['50%', '50%'], + data: [ + { + name: '数量', + value: data.value, + itemStyle: { + normal: { + color: "#1598DC", + }, + }, + }, + { + name: '剩下', + value: (data.total - data.value), + itemStyle: { + normal: { + color: 'rgba(31, 110, 255, 0)', + }, + }, + }, + ], + hoverAnimation: false, + label: { + show: false, + }, + }, + { + type: 'pie', + startAngle: (90 + (1 - data.rate) * 360), + radius: ['62%', '77%'], + center: ['50%', '50%'], + data: [ + { + name: '数量', + value: (data.total - data.value), + itemStyle: { + normal: { + color: '#1C3C65', + }, + }, + }, + { + name: '剩下', + value: data.value, + itemStyle: { + normal: { + color: '#1598DC', + }, + }, + }, + ], + hoverAnimation: false, + label: { + show: false, + }, + }, + { + name: '', + type: 'pie', + startAngle: 90, + radius: '45%', + animation: false, + hoverAnimation: false, + center: ['50%', '50%'], + itemStyle: { + normal: { + labelLine: { + show: false, + }, + color: new echarts.graphic.RadialGradient(0.5, 0.5, 1, [ + { + offset: 1, + color: 'rgba(50,171,241, 1)', + }, + { + offset: 0, + color: 'rgba(55,70,130, 0)', + }, + ]), + shadowBlur: 10, + }, + }, + data: [ + { + value: 100, + }, + ], + }, + ], + } + + ) + + return onLine +} +const setOffLineFn = (data) => { + const offLine = reactive( + { + // backgroundColor: '#0F141B', + title: [ + + { + text: (data.value / data.total * 100).toFixed(2) + '%', + x: 'center', + top: '42%', + textStyle: { + fontSize: 13, + color: '#35BFCA', + foontWeight: '500', + }, + }, + ], + polar: { + radius: ['44%', '50%'], + center: ['50%', '50%'], + }, + angleAxis: { + max: 100, + show: false, + }, + radiusAxis: { + type: 'category', + show: true, + axisLabel: { + show: false, + }, + axisLine: { + show: false, + }, + axisTick: { + show: false, + }, + }, + series: [ + { + type: 'pie', + startAngle: 90, + radius: ['60%', '80%'], + center: ['50%', '50%'], + data: [ + { + name: '数量', + value: data.value, + itemStyle: { + normal: { + color: "#35BFCA", + }, + }, + }, + { + name: '剩下', + value: (data.total - data.value), + itemStyle: { + normal: { + color: '#1C3D69', + }, + }, + }, + ], + hoverAnimation: false, + label: { + show: false, + }, + }, + { + type: 'pie', + startAngle: (90 + (1 - data.rate) * 360), + radius: ['62%', '77%'], + center: ['50%', '50%'], + data: [ + { + name: '数量', + value: (data.total - data.value), + itemStyle: { + normal: { + color: '#1C3D69', + }, + }, + }, + { + name: '剩下', + value: data.value, + itemStyle: { + normal: { + color: '#35BFCA', + }, + }, + }, + ], + hoverAnimation: false, + label: { + show: false, + }, + }, + { + name: '', + type: 'pie', + startAngle: 90, + radius: '45%', + animation: false, + hoverAnimation: false, + center: ['50%', '50%'], + itemStyle: { + normal: { + labelLine: { + show: false, + }, + color: new echarts.graphic.RadialGradient(0.5, 0.5, 1, [ + { + offset: 1, + color: 'rgba(50,171,241, 1)', + }, + { + offset: 0, + color: 'rgba(55,70,130, 0)', + }, + ]), + shadowBlur: 10, + }, + }, + data: [ + { + value: 100, + }, + ], + }, + ], + } + ) + + + + return offLine +} + +// 图表 +const initCharts = (tag, option) => { + var chartDom = document.getElementById(tag); + var myChart = echarts.init(chartDom); + myChart.setOption(option); +} +deviceCountApi({ + areaCode: 510521, streetCode: 510521100 +}).then(res => { + totalNum.value = res.data.total + onlineNum.value = res.data.online + offlineNum.value = res.data.offline + let result = {} + result.total = res.data.total + result.value = res.data.online + result.rate = result.value / result.total.toFixed(4); + initCharts('online', setOnlineFn(result)) + let result2 = {} + result2.total = res.data.total + result2.value = res.data.offline + result2.rate = result2.value / result2.total.toFixed(4); + initCharts('offline', setOffLineFn(result2)) +}) + + + + + +onMounted(() => { + document.getElementById("online").removeAttribute('_echarts_instance_'); + document.getElementById("offline").removeAttribute('_echarts_instance_'); + // scrollTableFn() + +}) + + + +</script> + + + + + + + + + + + + + + + +<style lang="scss"> .num { -font-size: 20px; + font-size: 20px; } .cont { -height: 70%; + height: 70%; -.eqNum { - margin-top: 2vh; - display: flex; - justify-content: space-around; - font-size: 11px; - background-image: url('/static/index/BTBG.png'); - background-size: 100% 100%; + .eqNum { + margin-top: 2vh; + display: flex; + justify-content: space-around; + font-size: 11px; + background-image: url('/static/index/BTBG.png'); + background-size: 100% 100%; - // text-align: ; + // text-align: ; -} - -.circle { - width: 120px; - height: 120px; - position: relative; - - @keyframes spin { - 0% { - transform: rotate(0deg); - } - - 100% { - transform: rotate(360deg); - } } - .act-img { + .circle { + width: 120px; + height: 120px; + position: relative; + + @keyframes spin { + 0% { + transform: rotate(0deg); + } + + 100% { + transform: rotate(360deg); + } + } + + .act-img { + position: absolute; + width: 100%; + height: 100%; + animation: spin 2s linear infinite; + left: -0%; + top: 0%; + } + + } + + .online { position: absolute; - width: 100%; - height: 100%; - animation: spin 2s linear infinite; - left: -0%; - top: 0%; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + } - } - -.online { - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - -} -} - </style> \ No newline at end of file diff --git a/src/components/index/leftTop.vue b/src/components/index/leftTop.vue index 47b5e71..8d6cfec 100644 --- a/src/components/index/leftTop.vue +++ b/src/components/index/leftTop.vue @@ -54,7 +54,6 @@ onMounted( ()=>{ } ).then(res=>{ - console.log(res.data) res.data.list.forEach(item => { config3.data.push( [item.device_name, item.device_code, item.update_time, `<span style="color:#2562AD"> 详情 </span>`,], diff --git a/src/components/index/rightTop.vue b/src/components/index/rightTop.vue new file mode 100644 index 0000000..e2247ab --- /dev/null +++ b/src/components/index/rightTop.vue @@ -0,0 +1,88 @@ +<template> + <div class="content" id="eq"> + <div class="eq" v-for="item in productList" :key="item"> + <img :src="item.image" style="width:8vw;height: 100%;border-radius: 1vh;" alt=""> + <div + style="display: flex;flex-direction: column;justify-content: space-between;margin-left: 1vw;color: #CAD5E5;"> + <div style="display: flex;align-items: center;"> + <img src="/static/index/MC.png" style="width:1.7vw;height: 1.5vw;margin-right: 5px; " alt=""> + {{ item.name }} + </div> + <div style="display: flex;align-items: center;"> + <img src="/static/index/JS.png" style="width:1.7vw;height: 1.5vw;margin-right: 5px; " alt=""> + {{ item.desc }} + </div> + </div> + </div> + </div> +</template> +<style lang="scss"> +.content { + width: 100%; + height: 100%; + transition: 1s; + // background-color: #fff; + overflow-y: auto; + font-size: 14px; + + .eq { + width: 100%; + height: 10vh; + // background-color: #fff; + margin-bottom: 1vh; + background-color: #092049; + box-sizing: border-box; + padding: 1vh; + display: flex; + } + +} + +.content::-webkit-scrollbar { + width: 10px; + background-color: #153041; +} + +.content::-webkit-scrollbar-track { + background-color: #153041; +} + +::-webkit-scrollbar-thumb { + background-color: #1581DC; + border-radius: 5px; +} +</style> +<script setup> +import {ref,reactive,onMounted} from "vue" +import {productListApi} from "@/api.js" +const scrollTableFn = () => { + const tag = document.getElementById('eq') + const height = tag.scrollHeight + setInterval(() => { + tag.scrollTop += 1 + if ((tag.scrollTop + tag.clientHeight) >= height - 50) { + tag.scrollTop = 0 + + } + }, 50) + + +} + +const productList=reactive([]) +productListApi( + { + areaCode:510521, + streetCode:510521100 + + } +).then(res=>{ + res.data.list.forEach(item => { + productList.push(item) + }); +}) + +onMounted( ()=>{ + scrollTableFn() +}) +</script> \ No newline at end of file diff --git a/src/components/index/version.js b/src/components/index/version.js deleted file mode 100644 index 0e66498..0000000 --- a/src/components/index/version.js +++ /dev/null @@ -1 +0,0 @@ -export const VERSION = '#VERSION#' \ No newline at end of file diff --git a/src/components/scrollTable.vue b/src/components/scrollTable.vue index 8188587..05196d7 100644 --- a/src/components/scrollTable.vue +++ b/src/components/scrollTable.vue @@ -2,12 +2,12 @@ <div class="dv-scroll-board" :ref="ref"> <div class="header" v-if="header.length && mergedConfig" :style="mergedConfig.headerStyle"> <div class="header-item" v-for="(headerItem, i) in header" :key="`${headerItem}${i}`" :style="` - height: ${mergedConfig.headerHeight}px; + height: ${mergedConfig.headerHeight}px;font-size: ${mergedConfig.font||'12px'}; ${headerStyle} line-height: ${mergedConfig.headerHeight}px; width: ${widths[i]}px; - `" :align="aligns[i]" v-html="headerItem" /> + `" :align="aligns[i]" v-html="headerItem" /> </div> <div v-if="mergedConfig" class="rows" :style="`height: ${height - (header.length ? mergedConfig.headerHeight : 0) diff --git a/src/components/videoFlv.vue b/src/components/videoFlv.vue index dd9e26b..07c7ba9 100644 --- a/src/components/videoFlv.vue +++ b/src/components/videoFlv.vue @@ -28,7 +28,7 @@ type="input" autocomplete="on" ref="playUrl" - value="http://192.168.1.27/live/test.live.flv?secret=gqig2yfkkdpimic1uwzy1l5msio0eflm" + value="http://rtsp.lihaink.cn/live/lihai_lot_walnutpi_dev_1.live.flv?secret=YwDtp2llj80HA19JhMXL4Po99nsMAyNT" /> <button v-if="!playing" @click="play">播放</button> <button v-else @click="pause">停止</button> diff --git a/src/components/warnPop.vue b/src/components/warnPop.vue index d7cd13a..f0ed632 100644 --- a/src/components/warnPop.vue +++ b/src/components/warnPop.vue @@ -5,22 +5,21 @@ <div class="l"> <div style="position: relative;padding-top: 5px;"> <div style="position: absolute;top: 0;"> - 土壤温度(℃)已预警 <span style="color: #B7555A;">10</span> (次) + 土壤温度(℃)已预警 <span style="color: #B7555A;">{{ data.soil_temperature?.alarmCount }}</span> (次) </div> <div class="t" style="width: 15vw;" id="l_t"></div> </div> <div style="position: relative;padding-top: 5px;"> <div style="position: absolute;top: 0;"> - 土壤湿度(℃)已预警 <span style="color: #B7555A;">10</span> (次) + 土壤湿度(℃)已预警 <span style="color: #B7555A;">{{data.soil_moisture?.alarmCount }}</span> (次) </div> <div class="t" id="l_c"></div> </div> - <!-- <div class="l-c"></div> --> <div style="position: relative;padding-top: 5px;"> <div style="position: absolute;top: 0;"> - 土壤PH值 已预警 <span style="color: #B7555A;">10</span> (次) + 土壤PH值 已预警 <span style="color: #B7555A;">{{data.soil_PH?.alarmCount }}</span> (次) </div> <div class="t" id="l_b"></div> </div> @@ -29,7 +28,7 @@ <div> <div style="position: absolute;top: 0;"> - 土壤氮磷钾 已预警 <span style="color: #B7555A;">10</span> (次) + 土壤氮磷钾 已预警 <span style="color: #B7555A;">{{data.soil_potassium_phosphate_nitrogen?.alarmCount }}</span> (次) </div> <div class="c-t" id="c_t"></div> </div> @@ -37,7 +36,7 @@ <div class="c-b"> <div style="position: absolute;top: 0;left: 5vw;"> - 土壤PH值 已预警 <span style="color: #B7555A;">10</span> (次) + 风速(m/s) 已预警 <span style="color: #B7555A;">{{ data.wind_speed?.alarmCount }}</span> (次) </div> <div id="c_b" style="width: 100%;height: 100%;"></div> </div> @@ -45,14 +44,14 @@ <div class="l"> <div style="position: relative;padding-top: 5px;"> <div style="position: absolute;top: 0;"> - 环境温度(℃)已预警 <span style="color: #B7555A;">10</span> (次) + 环境温度(℃)已预警 <span style="color: #B7555A;">{{ data.ambient_temperature?.alarmCount }}</span> (次) </div> <div class="t" style="width: 14vw;" id="r_t"></div> </div> <div style="position: relative;padding-top: 5px;"> <div style="position: absolute;top: 0;"> - 环境湿度(℃)已预警 <span style="color: #B7555A;">10</span> (次) + 环境湿度(℃)已预警 <span style="color: #B7555A;">{{ data.ambient_humidity?.alarmCount }}</span> (次) </div> <div class="t" id="r_c"></div> </div> @@ -60,7 +59,7 @@ <div style="position: relative;padding-top: 5px;"> <div style="position: absolute;top: 0;"> - 二氧化碳 已预警 <span style="color: #B7555A;">10</span> (次) + 二氧化碳 已预警 <span style="color: #B7555A;">{{ data.carbon_dioxide?.alarmCount }}</span> (次) </div> <div class="t" id="r_b"></div> </div> @@ -138,6 +137,9 @@ import options from "@/view/option" import * as echarts from 'echarts'; import { ref, reactive, onMounted, defineEmits } from "vue" +import { landMonitorAlarmHistoryApi } from "@/api.js" + +const data=reactive({}) const emit = defineEmits(['off']) const off = () => { @@ -152,6 +154,305 @@ const initCharts = (tag, option) => { myChart.setOption(option); } + + + +const setoptionsFn = (X, Y) => { + + let data = { + color: ["#ffc20e", "#00ae9d"], + grid: { + top: "5%", + left: "2%", + right: "5%", + bottom: "5%", + containLabel: true + }, + tooltip: { + trigger: "axis", + backgroundColor: "rgba(61, 85, 102, 0.2)", + borderWidth: 1, + borderColor: "#9DBAE1", // 边框颜色 + // 选中线颜色 + axisPointer: { + lineStyle: { + color: "#9DBAE1" + } + }, + // 字体颜色 + textStyle: { + color: "#fff", + fontSize: 10 + } + }, + legend: { + right: "3%", + icon: "circle", + itemWidth: 8, + itemGap: 20, + textStyle: { + padding: [0, 0, 0, 5] + } + }, + xAxis: [ + { + show: false, + type: "category", + boundaryGap: false, + axisLabel: { + color: "#33a3dc", + fontSize: 14 + }, + axisLine: { + lineStyle: { + color: "rgba(255,255,255,.1)" + } + }, + data: X + } + ], + yAxis: [ + { + show: false, + type: "value", + name: "", + axisLabel: { + color: "#33a3dc", + fontSize: 14 + }, + splitLine: { + lineStyle: { + type: "solid", + color: "rgba(255,255,255,.1)", + width: 1 + } + } + } + ], + series: [ + { + name: "", + type: "line", + smooth: true, // 是否平滑曲线显示 + // symbol:'circle', // 默认是空心圆(中间是白色的),改成实心圆 + symbolSize: 0, + lineStyle: { + normal: { + color: "white" // 线条颜色 + } + }, + areaStyle: { + // 区域填充样式 + normal: { + // 线性渐变,前4个参数分别是x0,y0,x2,y2(范围0~1);相当于图形包围盒中的百分比。如果最后一个参数是‘true’,则该四个值是绝对像素位置。 + color: new echarts.graphic.LinearGradient(0, 0, 0, 1, + [ + { offset: 0, color: "rgba(22,84,158, 0.8)" }, + { offset: 1, color: "rgba(22,84,158, 0.8)" } + ], + false + ) + // shadowColor: "rgba(53,142,215, 0.9)", // 阴影颜色 + // shadowBlur: 20 // shadowBlur设图形阴影的模糊大小。配合shadowColor,shadowOffsetX/Y, 设置图形的阴影效果。 + } + }, + data: Y + }, + + ] + } + return data +} + +const CKP = { + // backgroundColor: "#21263A", + // color: ["#ffc20e", "#00ae9d",'red'], + grid: { + top: "5%", + left: "2%", + right: "5%", + bottom: "5%", + containLabel: true + }, + tooltip: { + trigger: "axis", + backgroundColor: "rgba(61, 85, 102, 0.2)", + borderWidth: 1, + borderColor: "#9DBAE1", // 边框颜色 + // 选中线颜色 + axisPointer: { + lineStyle: { + color: "#9DBAE1" + } + }, + // 字体颜色 + textStyle: { + color: "#fff", + fontSize: 10 + } + }, + legend: { + right: "3%", + icon: "circle", + itemWidth: 8, + itemGap: 20, + show:false, + textStyle: { + padding: [0, 0, 0, 5] + } + }, + xAxis: [ + { + show: false, + type: "category", + boundaryGap: false, + axisLabel: { + color: "#33a3dc", + fontSize: 14 + }, + axisLine: { + lineStyle: { + color: "rgba(255,255,255,.1)" + } + }, + data: ["4月", "5月", "6月", "7月", "8月", "9月", "10月"] + } + ], + yAxis: [ + { + show: false, + type: "value", + name: "", + axisLabel: { + color: "#33a3dc", + fontSize: 14 + }, + splitLine: { + lineStyle: { + type: "solid", + color: "rgba(255,255,255,.1)", + width: 1 + } + } + } + ], + series: [ + { + name: "氮", + type: "line", + smooth: true, // 是否平滑曲线显示 + symbolSize: 0, + lineStyle: { + normal: { + color: "white" // 线条颜色 + } + }, + areaStyle: { + // 区域填充样式 + normal: { + // 线性渐变,前4个参数分别是x0,y0,x2,y2(范围0~1);相当于图形包围盒中的百分比。如果最后一个参数是‘true’,则该四个值是绝对像素位置。 + color: new echarts.graphic.LinearGradient(0, 0, 0, 1, + [ + { offset: 0, color: "rgba(22,84,156, 0.8)" }, + { offset: 1, color: "rgba(22,84,156, 0)" } + ], + false + ) + // shadowColor: "rgba(53,142,215, 0.9)", // 阴影颜色 + // shadowBlur: 20 // shadowBlur设图形阴影的模糊大小。配合shadowColor,shadowOffsetX/Y, 设置图形的阴影效果。 + } + }, + data: [] + }, + { + name: "磷", + type: "line", + smooth: true, // 是否平滑曲线显示 + // symbol:'circle', // 默认是空心圆(中间是白色的),改成实心圆 + symbolSize: 0, + lineStyle: { + normal: { + color: "white" // 线条颜色 + } + }, + areaStyle: { + // 区域填充样式 + normal: { + // 线性渐变,前4个参数分别是x0,y0,x2,y2(范围0~1);相当于图形包围盒中的百分比。如果最后一个参数是‘true’,则该四个值是绝对像素位置。 + color: new echarts.graphic.LinearGradient(0, 0, 0, 1, + [ + { offset: 0, color: "rgba(22,84,156, 0.8)" }, + { offset: 1, color: "rgba(22,84,156, 0)" } + ], + false + ) + // shadowColor: "rgba(53,142,215, 0.9)", // 阴影颜色 + // shadowBlur: 20 // shadowBlur设图形阴影的模糊大小。配合shadowColor,shadowOffsetX/Y, 设置图形的阴影效果。 + } + }, + data: [] + }, { + name: "钾", + type: "line", + smooth: true, // 是否平滑曲线显示 + // symbol:'circle', // 默认是空心圆(中间是白色的),改成实心圆 + symbolSize: 0, + lineStyle: { + normal: { + color: "white" // 线条颜色 + } + }, + areaStyle: { + // 区域填充样式 + normal: { + // 线性渐变,前4个参数分别是x0,y0,x2,y2(范围0~1);相当于图形包围盒中的百分比。如果最后一个参数是‘true’,则该四个值是绝对像素位置。 + color: new echarts.graphic.LinearGradient(0, 0, 0, 1, + [ + { offset: 0, color: "rgba(22,84,156, 0.8)" }, + { offset: 1, color: "rgba(22,84,156, 0)" } + ], + false + ) + // shadowColor: "rgba(53,142,215, 0.9)", // 阴影颜色 + // shadowBlur: 20 // shadowBlur设图形阴影的模糊大小。配合shadowColor,shadowOffsetX/Y, 设置图形的阴影效果。 + } + }, + data: [] + } + ] +} + + + + +landMonitorAlarmHistoryApi({ + areaCode: 510521, + streetCode: 510521100, + land_id: 18 +}).then(res => { + + + for (let key in res.data.list){ + data[key]=res.data.list[key] + } + console.log(data,5656) + + initCharts('l_t', setoptionsFn(res.data.list.soil_temperature.historyList[0].time, res.data.list.soil_temperature.historyList[1].value)) + initCharts('l_c', setoptionsFn(res.data.list.soil_moisture.historyList[0].time, res.data.list.soil_moisture.historyList[1].value)) + initCharts('l_b', setoptionsFn(res.data.list.soil_PH.historyList[0].time, res.data.list.soil_PH.historyList[1].value)) + initCharts('c_b', setoptionsFn(res.data.list.wind_speed.historyList[0].time, res.data.list.wind_speed.historyList[1].value)) + initCharts('r_t', setoptionsFn(res.data.list.ambient_temperature.historyList[0].time, res.data.list.ambient_temperature.historyList[1].value)) + initCharts('r_c', setoptionsFn(res.data.list.ambient_humidity.historyList[0].time, res.data.list.ambient_humidity.historyList[1].value)) + initCharts('r_b', setoptionsFn(res.data.list.carbon_dioxide.historyList[0].time, res.data.list.carbon_dioxide.historyList[1].value)) + CKP.xAxis[0].data = res.data.list.soil_potassium_phosphate_nitrogen.historyList[0].time + let value = res.data.list.soil_potassium_phosphate_nitrogen.historyList[1].value + value.forEach(item => { + CKP.series[0].data.push(item.soil_potassium_phosphate_nitrogen) + CKP.series[1].data.push(item.soil_potassium_phosphate_phosphorus) + CKP.series[2].data.push(item.soil_potassium_phosphate_potassium) + }) + initCharts('c_t', CKP) +}) onMounted(() => { document.getElementById("l_t").removeAttribute('_echarts_instance_'); document.getElementById("l_c").removeAttribute('_echarts_instance_'); @@ -161,15 +462,6 @@ onMounted(() => { document.getElementById("r_t").removeAttribute('_echarts_instance_'); document.getElementById("r_c").removeAttribute('_echarts_instance_'); document.getElementById("r_b").removeAttribute('_echarts_instance_'); - initCharts('l_t', options.plant_temp) - initCharts('l_c', options.plant_temp) - initCharts('l_b', options.plant_temp) - initCharts('c_t', options.CKP) - initCharts('c_b', options.plant_temp) - initCharts('r_t', options.plant_temp) - initCharts('r_c', options.plant_temp) - initCharts('r_b', options.plant_temp) - // initCharts('offline', options.offLine) - + }) </script> \ No newline at end of file diff --git a/src/view/detail.vue b/src/view/detail.vue index 0fe473f..18f4ea9 100644 --- a/src/view/detail.vue +++ b/src/view/detail.vue @@ -2,26 +2,10 @@ <div class="box"> <div class="l"> <div class="top"> - <div style="display: flex;justify-content: space-between;align-items: center;"> - <span>种植总面积:</span> - <div> - <span class="area-num "><span class="color-font">2</span> </span> - <span class="area-num "><span class="color-font">2</span> </span> - <span class="area-num "><span class="color-font">2</span> </span> - <span class="area-num "><span class="color-font">2</span> </span> - </div> - </div> - <div style="">种植种类:</div> - <div> - <div class="lands"> - <div class="land" v-for="(item, index) in 33" :key="index">地块</div> - </div> - </div> + <leftTop></leftTop> </div> - <div class="bottom top"> - <warnDetail v-if="showWarnDeatil" @off="showWarnDeatil = false"></warnDetail> - <scrollTable @click="hdClick3" :config="config3" style="width:100%;height:100%"></scrollTable> + <leftCenter></leftCenter> </div> <div class="top center"> <video style="margin-top: 1vh;width: 100%;height: 100%;" autoplay muted @@ -34,78 +18,19 @@ <div style="display: flex;justify-content: space-between;"> <div class=" c-top-tits"><span class="color-font" @click="router.push('/')">返回首页</span></div> <div class=" c-top-tits"><span class="color-font">同谭政地块</span> </div> - - - <!-- <img src="/static/detail/FHSY.png" alt=""> --> </div> - <farmerMap></farmerMap> - </div> <div class="bottom"> - - <div class="bottom-li" :class="(item.flag) ? 'act' : ''" v-for="(item, index) in environmentData"> - - <span class="color-font">{{ item.name }}</span> - <span>{{ item.value }}{{ item.unit }}</span> - <span v-if="item.flag">状态正常</span> - <span v-else>状态正常</span> - - </div> - + <centerBottom></centerBottom> </div> </div> <div class="r"> - <div class="center top"> - <div>监控设备总数: <span class="num">1528</span> 台</div> - <div class="cont"> - <div style="display: flex;justify-content: space-between;align-items: center;margin-top: 3vh;"> - <img src="/static/index/JYZ.png" style="width: 2.8vw; height: 4vw;" alt=""> - - <div class="circle"> - <img src="/static/detail/bk.png" class="act-img" alt=""> - <div style="width: 110px;height: 110px;" class="online" id="online"></div> - </div> - <div class="circle"> - <img src="/static/detail/bk.png" class="act-img" alt=""> - <div style="width: 110px;height: 110px;" class="online" id="offline"></div> - </div> - - <img src="/static/index/JTY.png" style="width: 2.8vw; height: 4vw;" alt=""> - </div> - - <div class="eqNum"> - <div> - <img src="/static/index/Q.png" alt="" style="transform: translateY(2px);"> 在线设备统计:<span - class="num" style="margin-left: 10px;">1418</span> 台 - </div> - <div> - <img src="/static/index/Q.png" style="transform: translateY(2px);"> 离线设备统计:<span class="num" - style="margin-left: 10px;">1418</span> - 台 - </div> - </div> - </div> + <rightTop></rightTop> </div> - - - - - - - <div class="bottom"> - <div class="r-b-li" :class="item.flag ? '' : 'act'" v-for="(item, index) in MoistureData" :key="index"> - - <span style="color: azure;">{{ item.name }}</span> - <span>{{ item.value }} {{ item.unit }}</span> - <span v-if="item.flag">状态正常</span> - <span v-else>状态异常</span> - - - </div> - + <rightBottom></rightBottom> </div> </div> </div> @@ -113,179 +38,14 @@ <script setup> import { ref, reactive, onMounted } from "vue" -import scrollTable from "@/components/scrollTable.vue" -import options from "./option" -import * as echarts from 'echarts'; -import warnDetail from "@/components/warnDetail.vue" - -import { useRouter } from "vue-router"; - import farmerMap from "../components/farmerMap.vue"; - - - - -const router = useRouter() - - -const u = ref('https:\/\/ceshi-worker-task.lihaink.cn\/uploads\/images\/20231129\/202311291816106120a4034.png') -const alignFn = (num) => { - let arr = [] - for (let i = 0; i < num; i++) { - arr.push('center') - } - return arr -} - - - - - -const environmentData = reactive([ - - { - name: "风速", - value: 10, - unit: "m/s", - flag: true - }, - { - name: "风向", - value: 10, - unit: "", - flag: false - }, - { - name: "环境湿度", - value: 10, - unit: "%", - flag: false - }, - { - name: "环境温度", - value: 10, - unit: "℃", - flag: false - }, - { - name: "二氧化碳", - value: 10, - unit: "ppm", - flag: true - }, - { - name: "环境气压", - value: 10, - unit: "pa", - flag: true - }, - { - name: "雨量", - value: 10, - unit: "mm/h", - flag: false - }, - { - name: "环境光照", - value: 10, - unit: "%", - flag: true - }, -]) - -const MoistureData = reactive([ - { - name: "土壤温度", - value: 12, - unit: "℃", - flag: true - }, { - name: "土壤湿度", - value: 12, - unit: "℃", - flag: false - }, { - name: "土壤电导率", - value: 12, - unit: "ps/cm", - flag: true - }, { - name: "土壤PH值", - value: 4, - unit: "", - flag: true - }, { - name: "土壤含氮量", - value: 12, - unit: "", - flag: false - }, { - name: "土壤含磷量", - value: 12, - unit: "", - flag: false - }, - { - name: "土壤含钾量", - value: 12, - unit: "", - flag: true - }, - - - -]) - - -const config3 = reactive({ - header: ['产品名称', '溯源码', '产品名称', '溯源码',], - headerBGC: "#092757", - oddRowBGC: "#0C2045", - headerStyle: "background-image: url('/static/index/SBGJBG.png');font-family: FZCYJ;background-size: 100% 100%;", - align: alignFn(4), - data: [ - ['行1列1', '行1列2', '行1列3', `<span style="color:#2562AD"> 详情 </span>`,], - ['行1列1', '行1列2', '行1列3', `<span style="color:#2562AD"> 详情 </span>`,], - ['行1列1', '行1列2', '行1列3', `<span style="color:#2562AD"> 详情 </span>`,], - ['行1列1', '行1列2', '行1列3', `<span style="color:#2562AD"> 详情 </span>`,], - ['行1列1', '行1列2', '行1列3', `<span style="color:#2562AD"> 详情 </span>`,], - ['行1列1', '行1列2', '行1列3', `<span style="color:#2562AD"> 详情 </span>`,], - ['行1列1', '行1列2', '行1列3', `<span style="color:#2562AD"> 详情 </span>`,], - - ] -}) -const showWarnDeatil = ref(false) -const hdClick3 = (e) => { - if (e.ceil) { - if (e.columnIndex == 3) { - showWarnDeatil.value = true - } - } -} - - -// 图表 -const initCharts = (tag, option) => { - var chartDom = document.getElementById(tag); - var myChart = echarts.init(chartDom); - myChart.setOption(option); -} - - - - -const test = () => { - router.replace('/detail') - -} - -onMounted(() => { - document.getElementById("online").removeAttribute('_echarts_instance_'); - document.getElementById("offline").removeAttribute('_echarts_instance_'); - initCharts('online', options.onLine) - initCharts('offline', options.offLine) - -}) +import leftTop from "../components/detail/leftTop.vue"; +import leftCenter from "../components/detail/leftCenter.vue"; +import centerBottom from "../components/detail/centerBottom.vue"; +import rightTop from "../components/detail/rightTop.vue"; +import rightBottom from "../components/detail/rightBottom.vue"; +import {useRouter} from "vue-router" +const router=useRouter() </script> <style lang="scss"> @@ -310,56 +70,6 @@ onMounted(() => { box-sizing: border-box; padding: 6vh 2vh 1vh 2vh; color: #E5EFFF; - - .area-num { - margin-right: 10px; - width: 35px; - height: 40px; - background-image: url("/static/detail/numbg.png"); - display: inline-block; - background-size: 100% 100%; - font-size: 30px; - text-align: center; - } - - - .lands { - display: flex; - flex-wrap: wrap; - height: 100%; - justify-content: space-between; - font-size: 14px; - overflow-y: auto; - margin-top: 1vh; - height: 15vh; - - .land { - width: 5vw; - height: 3vh; - // background-color: #fff; - background-image: url('/static/detail/ZL.png'); - background-size: 100% 100%; - color: white; - text-align: center; - line-height: 3vh; - - } - } - - .lands::-webkit-scrollbar { - width: 10px; - background-color: #153041; - } - - .lands::-webkit-scrollbar-track { - background-color: #153041; - } - - ::-webkit-scrollbar-thumb { - background-color: #15A1DC; - border-radius: 5px; - } - } @@ -414,30 +124,7 @@ onMounted(() => { flex-wrap: wrap; justify-content: space-between; - .bottom-li { - // background-color: #fff; - width: 49%; - height: 4vh; - display: flex; - box-sizing: border-box; - justify-content: space-between; - // border: 1px solid red; - background-image: url('/static/detail/ZC.png'); - background-size: 100% 100%; - align-items: center; - font-size: 16px; - color: #E5EFFF; - font-family: FZCYJ; - padding: 0 1VW; - - } - - .act { - background-image: url('/static/detail/YC.png'); - color: #C65956; - - - } + } } @@ -494,65 +181,7 @@ onMounted(() => { .center { background-image: url('/static/index/JCSBSLTJ.png'); - .num { - font-size: 20px; - font-family: FZCYJ; - color: #E5EFFF; - background: linear-gradient(to bottom, #DAE8FE 30%, #53A0FF 100%); - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; - margin-left: 30px; - } - - - - .cont { - height: 70%; - - .eqNum { - margin-top: 2vh; - display: flex; - justify-content: space-around; - font-size: 11px; - background-image: url('/static/index/BTBG.png'); - background-size: 100% 100%; - - } - - .circle { - width: 120px; - height: 120px; - position: relative; - - @keyframes spin { - 0% { - transform: rotate(0deg); - } - - 100% { - transform: rotate(360deg); - } - } - - .act-img { - position: absolute; - width: 100%; - height: 100%; - animation: spin 2s linear infinite; - left: -0%; - top: 0%; - } - - } - - .online { - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - - } - } + } } diff --git a/src/view/home.vue b/src/view/home.vue index f68c902..1278566 100644 --- a/src/view/home.vue +++ b/src/view/home.vue @@ -2,40 +2,13 @@ <div class="box"> <div class="l"> <div class="top"> - <!-- <warnDetail v-if="showWarnDeatil" @off="showWarnDeatil = false"></warnDetail> - <scrollTable @click="hdClick3" :config="config3" style="width:100%;height:100%"></scrollTable> --> <leftTop></leftTop> </div> <div class="center top"> - <div>监控设备总数: <span class="num color-font">1528</span> 台</div> - <div class="cont"> - <div style="display: flex;justify-content: space-between;align-items: center;margin-top: 3vh;"> - <img src="/static/index/JYZ.png" style="width: 2.8vw; height: 4vw;" alt=""> - <div class="circle"> - <img src="/static/detail/bk.png" class="act-img" alt=""> - <div style="width: 110px;height: 110px;" class="online" id="online"></div> - </div> - <div class="circle"> - <img src="/static/detail/bk.png" class="act-img" alt=""> - <div style="width: 110px;height: 110px;" class="online" id="offline"></div> - </div> - <img src="/static/index/JTY.png" style="width: 2.8vw; height: 4vw;" alt=""> - </div> - <div class="eqNum"> - <div> - <img src="/static/index/Q.png" alt="" style="transform: translateY(2px);"> 在线设备统计:<span - class="num color-font" style="margin-left: 10px;">1418</span> 台 - </div> - <div> - <img src="/static/index/Q.png" style="transform: translateY(2px);"> 离线设备统计:<span - class="num color-font" style="margin-left: 10px;">1418</span> - 台 - </div> - </div> - </div> + <leftCenter></leftCenter> </div> <div class="bottom top"> - <scrollTable :config="config2" style="width:100%;height:100%"></scrollTable> + <leftBottom></leftBottom> </div> </div> <div class="c"> @@ -53,41 +26,22 @@ </div> </div> <div class="bottom"> - <warnPop v-if="showWarnPop" ref="ChildsDom" @off="showWarnPop = false"></warnPop> - <scrollTable :config="config" @click="hdClick" style="width:100%;height:100%"></scrollTable> + <centerBottom></centerBottom> </div> </div> <div class="r"> <div class="top"> - <div class="content" id="eq"> - <div class="eq" v-for="item in 10" :key="item"> - <img :src="u" style="width:8vw;height: 100%;border-radius: 1vh;" alt=""> - <div - style="display: flex;flex-direction: column;justify-content: space-between;margin-left: 1vw;color: #CAD5E5;"> - <div style="display: flex;align-items: center;"> - <img src="/static/index/MC.png" style="width:1.7vw;height: 1.5vw;margin-right: 5px; " - alt=""> - 张伟 - </div> - <div style="display: flex;align-items: center;"> - <img src="/static/index/JS.png" style="width:1.7vw;height: 1.5vw;margin-right: 5px; " - alt=""> - 这是一名后端开发 - </div> - </div> - </div> - </div> + <rightTop></rightTop> </div> - <div class="bottom"> + <div class="bottoms"> <div style="height: 35%;"> - <div class="lands"> - <div class="land" v-for="(item, index) in 16" @click="test" :key="index">地块</div> + <div class="landa"> + <div class="land-li" v-for="(item, index) in landlist" :key="index">{{ item.title }}</div> </div> </div> <div class="video" style="height: 65%;"> <div class="video-tit"> 实时监测影像 </div> - <!-- <JessibucaDemo style="height: 80%;" :url="a"></JessibucaDemo> --> - + </div> </div> </div> @@ -95,132 +49,35 @@ </template> <script setup> -// import flvjs from "flv.js" import { ref, reactive, onMounted } from "vue" import leftTop from "@/components/index/leftTop.vue" -import scrollTable from "@/components/scrollTable.vue" -import options from "./option" -import * as echarts from 'echarts'; -import warnPop from "@/components/warnPop.vue" +import leftCenter from "../components/index/leftCenter.vue" +import leftBottom from "../components/index/leftBottom.vue" +import centerBottom from "../components/index/centerBottom.vue" import JessibucaDemo from "@/components/videoFlv.vue" import { useRouter } from "vue-router"; import areaMap from "@/components/areaMap.vue" -const a=ref( 'http://192.168.1.27/live/test.live.flv?secret=gqig2yFKkDpIMic1uWZY1L5MsIo0eflm') +import {landListApi} from "@/api.js" +import rightTop from "../components/index/rightTop.vue" -const router = useRouter() -const u = ref('https:\/\/ceshi-worker-task.lihaink.cn\/uploads\/images\/20231129\/202311291816106120a4034.png') -const alignFn = (num) => { - let arr = [] - for (let i = 0; i < num; i++) { - arr.push('center') - } - return arr -} -const config = reactive({ - header: ['地块名称', '土壤温度', '土壤湿度', '土壤PH值', '土壤氮磷钾', '风速', '环境温度', '环境湿度', '二氧化碳', '历史预警数据'], - headerBGC: "#092757", - headerStyle: "background-image: url('/static/index/tableHead.png');font-family: FZCYJ;background-size: 100% 100%;", - oddRowBGC: "#0C2045", - align: alignFn(10), - data: [ - ['行1列1', '行1列2', '行1列3', '行1列1', '行1列2', '行1列3', '行1列1', '行1列2', '行1列3', `<span style='color:#2562AD' > 查看<span>`], - ['行1列1', '行1列2', '行1列3', '行1列1', '行1列2', '行1列3', '行1列1', '行1列2', '行1列3', `<span style='color:#2562AD' > 查看<span>`], - ['行1列1', '行1列2', '行1列3', '行1列1', '行1列2', '行1列3', '行1列1', '行1列2', '行1列3', `<span style='color:#2562AD' > 查看<span>`], - ['行1列1', '行1列2', '行1列3', '行1列1', '行1列2', '行1列3', '行1列1', '行1列2', '行1列3', `<span style='color:#2562AD' > 查看<span>`], - ['行1列1', '行1列2', '行1列3', '行1列1', '行1列2', '行1列3', '行1列1', '行1列2', '行1列3', `<span style='color:#2562AD' > 查看<span>`], - ['行1列1', '行1列2', '行1列3', '行1列1', '行1列2', '行1列3', '行1列1', '行1列2', '行1列3', `<span style='color:#2562AD' > 查看<span>`], - ['行1列1', '行1列2', '行1列3', '行1列1', '行1列2', '行1列3', '行1列1', '行1列2', '行1列3', `<span style='color:#2562AD' > 查看<span>`], - ] -}) -const config2 = reactive({ - header: ['产品名称', '溯源码', '产品名称', '溯源码',], - headerBGC: "#092757", - oddRowBGC: "#0C2045", - headerStyle: "background:#0E316B", - align: alignFn(4), - data: [ - ['行1列1', '行1列2', '行1列3', '行1列1',], - ['行1列1', '行1列2', '行1列3', '行1列1',], - ['行1列1', '行1列2', '行1列3', '行1列1',], - ['行1列1', '行1列2', '行1列3', '行1列1',], - ['行1列1', '行1列2', '行1列3', '行1列1',], - ['行1列1', '行1列2', '行1列3', '行1列1',], - ['行1列1', '行1列2', '行1列3', '行1列1',], +// 地块 +const landlist=reactive([]) + +landListApi( { + areaCode:510521, + streetCode:510521100 +}).then(res=>{ + res.data.list.forEach( item=>{ landlist.push(item) }) - ] }) -const config3 = reactive({ - header: ['设备名称', '设备编号', '告警时间', '操作',], - headerBGC: "#092757", - oddRowBGC: "#0C2045", - headerStyle: "background-image: url('/static/index/SBGJBG.png');font-family: FZCYJ;background-size: 100% 100%;", - align: alignFn(4), - data: [ - ['行1列1', '行1列2', '行1列3', `<span style="color:#2562AD"> 详情 </span>`,], - ['行1列1', '行1列2', '行1列3', `<span style="color:#2562AD"> 详情 </span>`,], - ['行1列1', '行1列2', '行1列3', `<span style="color:#2562AD"> 详情 </span>`,], - ['行1列1', '行1列2', '行1列3', `<span style="color:#2562AD"> 详情 </span>`,], - ['行1列1', '行1列2', '行1列3', `<span style="color:#2562AD"> 详情 </span>`,], - ['行1列1', '行1列2', '行1列3', `<span style="color:#2562AD"> 详情 </span>`,], - ['行1列1', '行1列2', '行1列3', `<span style="color:#2562AD"> 详情 </span>`,], - - ] -}) -// 图表 -const initCharts = (tag, option) => { - var chartDom = document.getElementById(tag); - var myChart = echarts.init(chartDom); - myChart.setOption(option); -} -const ChildsDom = ref(null); -const showWarnPop = ref(false) -const hdClick = (e) => { - // console.log(e) - if (e.ceil) { - if (e.columnIndex == 9) { - showWarnPop.value = true - } - } -} -const showWarnDeatil = ref(false) -const hdClick3 = (e) => { - if (e.ceil) { - if (e.columnIndex == 3) { - // showWarnPop.value = true - showWarnDeatil.value = true - } - } -} - -const test = () => { - router.replace('/detail') -} -const scrollTableFn = () => { - const tag = document.getElementById('eq') - const height = tag.scrollHeight - setInterval(() => { - tag.scrollTop += 1 - if ((tag.scrollTop + tag.clientHeight) >= height - 50) { - tag.scrollTop = 0 - - } - }, 50) -} -onMounted(() => { - document.getElementById("online").removeAttribute('_echarts_instance_'); - document.getElementById("offline").removeAttribute('_echarts_instance_'); - scrollTableFn() - initCharts('online', options.onLine) - initCharts('offline', options.offLine) - // liveFn() -}) + </script> <style lang="scss"> @@ -253,66 +110,7 @@ onMounted(() => { .center { background-image: url('/static/index/JCSBSLTJ.png'); - .num { - - font-size: 20px; - // font-family: FZCYJ; - // color: #E5EFFF; - // background: linear-gradient(to bottom, #DAE8FE 30%, #53A0FF 100%); - // -webkit-background-clip: text; - // -webkit-text-fill-color: transparent; - // margin-left: 30px; - } - - .cont { - height: 70%; - - .eqNum { - margin-top: 2vh; - display: flex; - justify-content: space-around; - font-size: 11px; - background-image: url('/static/index/BTBG.png'); - background-size: 100% 100%; - - // text-align: ; - - } - - .circle { - width: 120px; - height: 120px; - position: relative; - - @keyframes spin { - 0% { - transform: rotate(0deg); - } - - 100% { - transform: rotate(360deg); - } - } - - .act-img { - position: absolute; - width: 100%; - height: 100%; - animation: spin 2s linear infinite; - left: -0%; - top: 0%; - } - - } - - .online { - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - - } - } + } @@ -379,7 +177,7 @@ onMounted(() => { width: 25vw; height: 93vh; - .bottom { + .bottoms { width: 25vw; box-sizing: border-box; padding-top: 6vh; @@ -390,18 +188,15 @@ onMounted(() => { background-image: url('/static/index/MQ.png'); margin-top: 1vh; - .lands { + .landa { display: flex; - // justify-content: ; flex-wrap: wrap; - height: 100%; - justify-content: space-between; font-size: 14px; - - .land { - width: 5vw; - height: 3vh; - // background-color: #fff; + flex-wrap: wrap; + .land-li { + + padding: 2px 20px; + margin-right: 10px; background-image: url('/static/index/DK.png'); background-size: 100% 100%; color: white; @@ -436,40 +231,6 @@ onMounted(() => { margin-top: 1vh; padding-top: 6vh; - .content { - width: 100%; - height: 100%; - transition: 1s; - // background-color: #fff; - overflow-y: auto; - font-size: 14px; - - .eq { - width: 100%; - height: 10vh; - // background-color: #fff; - margin-bottom: 1vh; - background-color: #092049; - box-sizing: border-box; - padding: 1vh; - display: flex; - } - - } - - .content::-webkit-scrollbar { - width: 10px; - background-color: #153041; - } - - .content::-webkit-scrollbar-track { - background-color: #153041; - } - - ::-webkit-scrollbar-thumb { - background-color: #1581DC; - border-radius: 5px; - } diff --git a/src/view/login.vue b/src/view/login.vue index ef9974d..73a3acc 100644 --- a/src/view/login.vue +++ b/src/view/login.vue @@ -99,7 +99,6 @@ <script setup> import { ref, reactive } from "vue" import { useRouter } from "vue-router"; -import { loginAPI } from "@/api.js" const router = useRouter() const show = ref(false) const account = ref('') diff --git a/src/view/option.js b/src/view/option.js index cf83309..407b0c4 100644 --- a/src/view/option.js +++ b/src/view/option.js @@ -397,7 +397,7 @@ const options = { // 氮钾磷 CKP: { // backgroundColor: "#21263A", - color: ["#ffc20e", "#00ae9d"], + color: ["#ffc20e", "#00ae9d",'red'], grid: { top: "5%", left: "2%",