524451ef93534fdfc7084501ddd4a1d649859783..c1e2ec17485606ba8d2d6de9520396e55248ff6d
2025-03-25 web
feat:添加界面,接入设备数据
c1e2ec 对比 | 目录
2025-03-25 elkers
删除监控点类型
a852f6 对比 | 目录
2025-03-25 web
fix:修改返回菜单按钮
0ba6a1 对比 | 目录
已修改11个文件
已删除1个文件
已添加7个文件
已重命名1个文件
462 ■■■■ 文件已修改
.env.development 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.env.production 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/facility/index.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/facility/point.js 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/screen/shebei/index.js 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/images/exit.png 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/images/flow-bg.png 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/images/map-bg.png 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/images/messageInfo-left.png 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/images/messageInfo-right.png 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/images/tempture-bg.png 补丁 | 查看 | 原始文档 | blame | 历史
src/components/Menu/MenuItem.vue 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/Menu/index.vue 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/screen/flow.vue 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/screen/temp.vue 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/facility/facilityList/index.vue 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/facility/monitorList/index.vue 64 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/screen/flow/home/index.vue 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/screen/flow/shebei/index.vue 119 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/screen/temperature/home/index.vue 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.env.development
@@ -1,10 +1,13 @@
n
# 页面标题
VITE_APP_TITLE = 后台管理系统
# 开发环境配置
VITE_APP_ENV = 'development'
# 图片地址
VITE_APP_IMG_BASEURL = 'http://192.168.0.200:8036/upload'
# 金川接口
  # VITE_APP_PUBLIC_REQUEST_API = 'http://113.250.189.120:8030'
  # VITE_APP_PUBLIC_REQUEST_API = 'http://113.250.189.120:8036'
.env.production
@@ -5,8 +5,10 @@
# 开发环境配置
VITE_APP_ENV = 'production'
# 图片地址
VITE_APP_IMG_BASEURL = 'http://113.250.189.120:8036/upload'
# 金川管理系统/开发环境
#VITE_APP_PUBLIC_REQUEST_API = 'https://wise.huiwuyuntong.com/farming-api'
 VITE_APP_PUBLIC_REQUEST_API = 'http://113.250.189.120:8036'
# 是否在打包时开启压缩,支持 gzip 和 brotli
VITE_BUILD_COMPRESS = gzip
src/api/facility/index.js
@@ -37,5 +37,13 @@
                data,
            });
        },
        get: (params) => {
            return publicRequest({
                url: '/waterFacility/get',
                method: 'get',
                params
            });
        },
    };
}
src/api/facility/point.js
@@ -36,5 +36,11 @@
                data
            });
        },
        getParentPoint: () => {
            return publicRequest({
                url: 'waterMonitoryPoint/getListTree',
                method: 'get',
            })
        }
    };
}
src/api/screen/shebei/index.js
对比新文件
@@ -0,0 +1,22 @@
import {publicRequest} from '@/utils/request'
/**
 * 获取水温设备菜单
 */
export const getTemperatureMenu = () => {
    return publicRequest({
        url: 'waterTemperature/getFacilityList',
        method: 'get',
    })
}
/**
 * 获取流量设备菜单
 */
export const getFlowMenu = () => {
    return publicRequest({
        url: 'waterFlow/getFacilityList',
        method: 'get',
    })
}
src/assets/images/exit.png
src/assets/images/flow-bg.png
src/assets/images/map-bg.png
Binary files differ
src/assets/images/messageInfo-left.png

src/assets/images/messageInfo-right.png
src/assets/images/tempture-bg.png
src/components/Menu/MenuItem.vue
对比新文件
@@ -0,0 +1,35 @@
<script setup>
const props = defineProps({
    item: {
        type: Object,
        default: () => {}
    }
})
</script>
<template>
    <template v-if="!item?.hidden">
        <!-- 只有一个子菜单的情况 -->
        <template v-if="props.item?.children?.length === 0">
            <el-menu-item :index="props.item?.id">{{props.item?.name}}</el-menu-item>
        </template>
        <!-- 多个子菜单的情况 -->
        <el-sub-menu v-else :index="props.item?.id" popper-append-to-body>
            <template #title>
                <span>{{props.item?.name}}</span>
            </template>
            <MenuItem
                v-for="(item, index) in props.item?.children"
                :key="index"
                :item="item"
            ></MenuItem>
        </el-sub-menu>
    </template>
</template>
<style scoped lang="scss">
</style>
src/components/Menu/index.vue
对比新文件
@@ -0,0 +1,21 @@
<script setup>
import MenuItem from "./MenuItem.vue";
const props = defineProps({
    menuList: {
        type: Array,
        default: () => []
    }
})
</script>
<template>
    <el-menu class="el-menu">
        <MenuItem v-for="(item, index) in props.menuList" :key="index" :item="item" />
    </el-menu>
</template>
<style scoped lang="scss">
</style>
src/screen/flow.vue
@@ -2,6 +2,10 @@
    <div class="main">
        <div class="header">
            <div class="top">
                <div class="top-exit" v-if="userType === '1'" @click="() => { router.push('/screen') }">
                    <img src="@/assets/images/exit.png" alt="" />
                    <span>选择系统</span>
                </div>
                <div class="top-name">金川水电站生态流量监测系统</div>
                <div class="top-modal">
                    公告弹窗提示
@@ -27,6 +31,7 @@
import{ useRouter,useRoute } from 'vue-router'
import useUserStore from '@/store/modules/user.js'
import {onMounted, ref, watch} from "vue";
import { getUserType } from '@/utils/auth'
const userStore = useUserStore()
@@ -40,6 +45,7 @@
    {name:'报警管理',url:'/flow/warning'},
    {name:'报表管理',url:'/flow/report'},
])
const userType = ref(getUserType())
const openWarn = ref(false)
const text = ref('新扎沟口流量监测点水位到达下限值, 金川水电站生态流量监测点水位到达下限值,流量监测点水位到达下限值')
@@ -91,6 +97,17 @@
            color: #fff;
            position: relative;
            z-index: 100;
            .top-exit{
                position: absolute;
                left: 100px;
                cursor: pointer;
                font-size: 20px;
                img{
                    width: 30px;
                    vertical-align: top;
                    margin-right: 10px;
                }
            }
            .top-name{
                font-size: 48px;
            }
@@ -125,11 +142,10 @@
    .content{
        width: 100%;
        height: 86%;
        position: relative;
        .warningBox{
            position: absolute;
            left: 0;
            top: 2%;
            top: 15.5%;
            z-index: 100;
            width: 100%;
            padding: 0 150px;
src/screen/temp.vue
@@ -1,7 +1,15 @@
<template>
    <div class="main">
        <div class="header">
            <div class="top">金川水电站水温监测系统 </div>
            <div class="top">
                <div class="top-exit" @click="() => { router.push('/screen') }">
                    <img src="@/assets/images/exit.png" alt="" />
                    <span>选择系统</span>
                </div>
                <div class="top-name">
                    金川水电站水温监测系统
                </div>
            </div>
            <div class="nav">
                <div v-for="(item,index) in btnList" :key="index" @click="navTo(item)" class="plain" :class="item.url === route.path ? 'active' : ''">{{ item.name }}</div>
            </div>
@@ -50,6 +58,17 @@
            color: #fff;
            position: relative;
            z-index: 100;
            .top-exit{
                position: absolute;
                left: 100px;
                cursor: pointer;
                font-size: 20px;
                img{
                    width: 30px;
                    vertical-align: top;
                    margin-right: 10px;
                }
            }
        }
        .nav{
            display: flex;
src/views/facility/facilityList/index.vue
@@ -81,9 +81,10 @@
});
//查询监控点
const pointList = ref();
const cascaderOption = { label: 'pointName', value: 'id', children: 'childrenList', checkStrictly: true, expandTrigger: 'hover', emitPath: false }; //级联选择器配置
const getPoint = async () => {
    await pointApi().search({limit: 100, page: 1}).then((res) => {
        pointList.value = res.data.list
    await pointApi().getParentPoint().then((res) => {
        pointList.value = res.data
    })
}
@@ -359,14 +360,7 @@
                    </el-select>
                </el-form-item>
                <el-form-item label="选择监控点" prop="pointId">
                    <el-select v-model="form.pointId" :placeholder="inpTip+formLabel.pointId">
                        <el-option
                                v-for="(item,index) in pointList"
                                :label="item.pointName"
                                :value="item.id"
                                :key="index"
                        ></el-option>
                    </el-select>
                    <el-cascader v-model="form.pointId" :options="pointList" :show-all-levels="false" :props="cascaderOption" />
                </el-form-item>
                <el-form-item label="安装日期" prop="installDate">
                    <el-date-picker
@@ -424,6 +418,9 @@
}
.form-box{
    justify-content: normal;
    :deep(.el-cascader){
        flex-grow: 1;
    }
}
</style>
 
src/views/facility/monitorList/index.vue
@@ -8,7 +8,7 @@
-->
<script setup>
import pointApi from "@/api/facility/point";
import {ref} from "vue";
import {ref, onMounted} from "vue";
import setPostParams from "@/utils/searchParams.js";
const route = useRoute();
@@ -42,6 +42,7 @@
let tableHeader = ref({
    pointName: '监控点名称',
    pointCode: '监控点编号',
    pointType: '监控类型',
    address: '详细地址',
    createTimeView: '创建时间',
    imageUrl: '图片',
@@ -52,7 +53,7 @@
async function getList(val) {
    loading.value = true;
    let postParam = setPostParams(val)
    await pointApi().search(postParam).then((res) => {
    await pointApi().search({...postParam, ...searchParams.value}).then((res) => {
        tableData.value = res.data.list
        pageParam.value.total = res.data.total
        pageParam.value.limit = res.data.limit
@@ -67,17 +68,22 @@
const formLabel = ({
    pointName: '监控点名称',
    pointCode: '监控点编号',
    pointType: '监控点类型',
    parentId: '父级监控点',
    address: '详细地址',
    imageUrl: '图片',
    remark: '备注'
})
const rules = ref({
    pointName: [{required: true, message: `请输入${ formLabel.pointName}`, trigger: "blur"}],
    pointCode: [{required: true, message: `请输入${ formLabel.address}`, trigger: "blur"}],
    pointName: [{required: true, message: `请输入${formLabel.pointName}`, trigger: "blur"}],
    pointCode: [{required: true, message: `请输入${formLabel.address}`, trigger: "blur"}],
    pointType: [{required: true, message: `请输入${formLabel.pointType}`, trigger: "blur"}],
});
const form = ref({
    pointName: '',
    pointCode: '',
    pointType: '',
    parentId: '',
    address: '',
    imageUrl: '',
    remark: ''
@@ -85,6 +91,15 @@
const searchParams = ref({
    keywords: '',
});
// 监控点列表
const monityList = ref([]);
// 监控点类型
const monityTypeList = [
    {id: 1, name: '水温监测点'},
    {id: 2, name: '生态流量监测点'}
];
const cascaderOption = { label: 'pointName', value: 'id', children: 'childrenList', checkStrictly: true, expandTrigger: 'hover', emitPath: false }; //级联选择器配置
/** 新增按钮操作 */
async function handleAdd() {
    reset();
@@ -108,7 +123,7 @@
/** 删除按钮操作 */
function handleDelete(row) {
    proxy.$modal.confirm('是否确认删除名称为"' + row.contact + '"的数据项?').then(function () {
        return pointApi().remove(row.id);
        // return pointApi().remove(row.id);
    }).then(() => {
        getList();
        proxy.$modal.msgSuccess("删除成功");
@@ -116,6 +131,13 @@
    });
}
// 获取监控点列表
const getMonitryList = () => {
    pointApi().getParentPoint().then(res => {
        monityList.value = res.data;
    })
}
/**
 *  新增/修改弹窗Form表单相关
@@ -165,8 +187,10 @@
/** 表单重置 */
function reset() {
    form.value = {
        parentId: '',
        pointName: '',
        pointCode: '',
        pointType: '',
        address: '',
        imageUrl: '',
        remark: ''
@@ -174,14 +198,17 @@
    proxy.resetForm("formRef");
}
getList();
onMounted(() => {
    getList();
    getMonitryList();
})
</script>
<template>
    <div class="app-container">
        <el-form :model="searchParams" ref="queryRef" :inline="true">
            <el-form-item label="" prop="">
                <el-input
                    v-model="searchParams.pointName"
                    v-model="searchParams.keywords"
                    placeholder="请输入搜索信息"
                    clearable
                    style="width: 200px"
@@ -218,6 +245,9 @@
                    <div v-if="key === 'imageUrl'">
                        <img :src="scope.row.headImg" class="table-headImg"/>
                    </div>
                    <div v-else-if="key === 'pointType'">
                        {{ scope.row.pointType === 1 ? '水温监测点' : '生态流量监测点' }}
                    </div>
                </template>
            </el-table-column>
            <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
@@ -241,10 +271,22 @@
        <!-- 添加/修改表单 -->
        <el-dialog :title="title" v-model="open" append-to-body center>
            <el-form class="form-box" ref="formRef" :model="form" :rules="rules" label-width='auto'>
                <el-form-item :label="formLabel.parentId" prop="parentId">
                    <el-cascader v-model="form.parentId" :options="monityList" :show-all-levels="false" :props="cascaderOption" />
                </el-form-item>
                <el-form-item :label="formLabel.pointType" prop="pointType">
                    <el-select v-model="form.pointType" :placeholder="'请输入'+formLabel.pointType">
                        <el-option
                            v-for="(item,index) in monityTypeList"
                            :label="item.name"
                            :value="item.id"
                            :key="index"
                        ></el-option>
                    </el-select>
                </el-form-item>
                <el-form-item :label="formLabel.pointName" prop="pointName">
                    <el-input v-model="form.pointName" :placeholder="'请输入'+formLabel.pointName"/>
                </el-form-item>
                <el-form-item :label="formLabel.pointCode" prop="pointCode">
                    <el-input v-model="form.pointCode" :placeholder="'请输入'+formLabel.pointCode"/>
                </el-form-item>
@@ -254,6 +296,7 @@
                <el-form-item :label="formLabel.remark" prop="address">
                    <el-input v-model="form.remark" :placeholder="'请输入'+formLabel.remark"/>
                </el-form-item>
                <!--        <el-form-item></el-form-item>-->
                <el-form-item label="图片" prop="imageUrl" style="flex: 1">
                    <upload-icons @uploadData="uploadData" :imageList="form.imageUrl" :limit="1"></upload-icons>
                    <span style="display: block;">(请上传1张设备图片)</span>
@@ -270,7 +313,10 @@
</template>
<style lang="scss" scoped>
.form-box{
.form-box {
    justify-content: normal;
    :deep(.el-cascader){
        flex-grow: 1;
    }
}
</style>
src/views/screen/flow/home/index.vue
@@ -2,17 +2,17 @@
    <div class="home">
        <div class="home-bg"></div>
        <div class="home-c">
            <div class="point">
            <div class="point" v-for="(item, index) in pointList" :key="index" :style="{left: item.left, top: item.top}">
                <div class="point-address"></div>
                <div class="point-message">
                    <div class="video-box">
                        <el-icon><VideoPlay /></el-icon>
                    </div>
                    <div class="info-box">
                        <div class="info-t">水电站流量监测点</div>
                        <div class="info-sw">水位:<span>500</span>m</div>
                        <div class="info-ls">流速:<span>15</span>m/s</div>
                        <div class="info-ssls">瞬时流速:<span>150</span>m/s</div>
                        <div class="info-t">{{ item.name }}</div>
                        <div class="info-sw">水位:<span>{{ item.shuiwei }}</span>m</div>
                        <div class="info-ls">流速:<span>{{item.liushu}}</span>m/s</div>
                        <div class="info-ssls">瞬时流速:<span>{{ item.ssls }}</span>m/s</div>
                        <div class="info-ljll">
                            累计流量:
                            <el-select
@@ -23,13 +23,13 @@
                                style="width: 240px"
                            >
                                <el-option
                                    v-for="(item, idx) in liuliangOptions"
                                    v-for="(item, idx) in item.liuliangOptions"
                                    :key="idx"
                                    :label="item.label"
                                    :value="idx"
                                />
                            </el-select>
                            <span>{{ liuliangOptions[selectll].value }}</span>m/s
                            <span>{{ item.liuliangOptions[selectll].value }}</span>m/s
                        </div>
                    </div>
                </div>
@@ -40,17 +40,29 @@
<script setup>
import {ref} from "vue";
const selectll = ref(0)
const liuliangOptions = [
    { label: '总计流量', value: 500 },
    { label: '日累计流量', value: 1000 },
    { label: '周累计流量', value: 10000 },
    { label: '月累计流量', value: 300000 },
    { label: '年累计流量', value: 3600000 },
const pointList = [
    { name: '电站尾水出口水温监测点', liushu: 22, ssls: '38', shuiwei: 1000, device: 1, left: '46%', top: '70%',
        liuliangOptions: [
            { label: '总计流量', value: 500 },
            { label: '日累计流量', value: 1000 },
            { label: '周累计流量', value: 10000 },
            { label: '月累计流量', value: 300000 },
            { label: '年累计流量', value: 3600000 },
        ]
    },
    { name: '电站尾水出口水温监测点', liushu: 22, ssls: '38', shuiwei: 1000, device: 2, left: '55%', top: '10%',
        liuliangOptions: [
            { label: '总计流量', value: 500 },
            { label: '日累计流量', value: 1000 },
            { label: '周累计流量', value: 10000 },
            { label: '月累计流量', value: 300000 },
            { label: '年累计流量', value: 3600000 },
        ]
    },
]
</script>
@@ -65,7 +77,7 @@
        top: 0;
        width: 100%;
        height: 100%;
        background: url("@/assets/images/map-bg.png") no-repeat;
        background: url("@/assets/images/flow-bg.png") no-repeat;
        background-size: 100% 100%;
        z-index: 11;
    }
@@ -76,8 +88,6 @@
        z-index: 20;
        .point{
            position: absolute;
            left: 58%;
            top: 30%;
            .point-address{
                width: 35px;
                height: 40px;
@@ -87,7 +97,7 @@
            .point-message{
                width: 600px;
                height: 200px;
                background: url("@/assets/images/messageInfo-box.png") no-repeat;
                background: url("@/assets/images/messageInfo-left.png") no-repeat;
                background-size: 100% 100%;
                position: absolute;
                left: -600px;
src/views/screen/flow/shebei/index.vue
@@ -1,7 +1,15 @@
<script setup>
import {ref} from "vue";
import {ref, onMounted} from "vue";
import {getUserType} from '@/utils/auth.js'
import facilityApi from "@/api/facility/index";
import { getFlowMenu } from '@/api/screen/shebei/index.js'
import setPostParams from "@/utils/searchParams.js";
import { useRouter } from "vue-router";
const router = useRouter();
const menuList = ref([])
const deviceList = ref([])
const userType = ref(getUserType())
const monitorRef = ref()
const searchVal = ref('')
@@ -12,50 +20,57 @@
    { label: '1个', value: 1 },
])
const shebeiData = ref([
    { name: '雷达水位计', code: 'SWY001', image: '', online: true, time: '2025-02-15', address: '上游灌木丛' },
    { name: '雷达水位计', code: 'SWY001', image: '', online: true, time: '2025-02-15', address: '上游灌木丛' },
    { name: '雷达水位计', code: 'SWY001', image: '', online: true, time: '2025-02-15', address: '上游灌木丛' },
    { name: '雷达水位计', code: 'SWY001', image: '', online: true, time: '2025-02-15', address: '上游灌木丛' },
    { name: '雷达水位计', code: 'SWY001', image: '', online: true, time: '2025-02-15', address: '上游灌木丛' },
    { name: '雷达水位计', code: 'SWY001', image: '', online: true, time: '2025-02-15', address: '上游灌木丛' },
    { name: '雷达水位计', code: 'SWY001', image: '', online: true, time: '2025-02-15', address: '上游灌木丛' },
    { name: '雷达水位计', code: 'SWY001', image: '', online: true, time: '2025-02-15', address: '上游灌木丛' },
])
// 获取菜单列表
const getMenu = () => {
    getFlowMenu().then(res => {
        menuList.value = res.data
    })
}
// 获取设备
const getDataList = () => {
    let postParam = setPostParams()
    facilityApi().search({ ...postParam, keywords: searchVal.value }).then(res => {
        deviceList.value = res.data.list
    })
}
// 全屏操作
const handleFullScreen = () => {
    monitorRef.value.requestFullscreen()
}
// 选择菜单
const handleSelectMenu = (id) => {
    facilityApi().get({ id }).then(res => {
        deviceList.value = [res.data]
    })
}
onMounted(() => {
    getMenu()
    getDataList()
})
</script>
<template>
    <div class="shebei">
        <div class="shebei-menu">
            <div class="menu-t">设备列表</div>
            <el-menu class="el-menu">
                <el-sub-menu index="1">
                    <template #title>
                        <span>雷达水位计</span>
            <el-menu class="el-menu-vertical-demo" @select="handleSelectMenu">
                <template v-for="(item, index) in menuList" :key="index+1">
                    <template v-if="item?.facilityPOList?.length === 0">
                        <el-menu-item :index="item.id">{{item.name}}</el-menu-item>
                    </template>
                    <el-menu-item index="1-1">SWY001</el-menu-item>
                    <el-menu-item index="1-2">SWY002</el-menu-item>
                </el-sub-menu>
                <el-sub-menu index="2">
                    <template #title>
                        <span>雷达测速仪</span>
                    <template v-else>
                        <el-sub-menu :index="item.id">
                            <template #title>
                                <span>{{item.name}}</span>
                            </template>
                            <el-menu-item v-for="(child, cidx) in item.facilityPOList" :key="cidx" :index="child.id">{{child.facilityName}}</el-menu-item>
                        </el-sub-menu>
                    </template>
                    <el-menu-item index="2-1">CY001</el-menu-item>
                    <el-menu-item index="2-2">CY002</el-menu-item>
                </el-sub-menu>
                <el-sub-menu index="3">
                    <template #title>
                        <span>雷达流量计</span>
                    </template>
                    <el-menu-item index="3-1">LJL001</el-menu-item>
                    <el-menu-item index="3-2">LJL002</el-menu-item>
                </el-sub-menu>
                </template>
            </el-menu>
        </div>
        <div class="shebei-monitor">
@@ -75,9 +90,9 @@
                            :value="item.value"
                        />
                    </el-select>
                    <el-input v-model="searchVal" style="width: 20rem" placeholder="请输入监测点名称" />
                    <el-button><el-icon><Search /></el-icon>搜索</el-button>
                    <el-button style="margin-left: 0" v-if="userType === '1'"><el-icon><Plus /></el-icon>新增</el-button>
                    <el-input v-model="searchVal" style="width: 20rem" placeholder="请输入设备名称" />
                    <el-button @click="getDataList"><el-icon><Search /></el-icon>搜索</el-button>
                    <el-button style="margin-left: 0" v-if="userType === '1'" @click="router.push('/facilityList')"><el-icon><Plus /></el-icon>新增</el-button>
                </div>
                <div class="tool-r" @click="handleFullScreen">
                    <img src="@/assets/images/flow/fullscreen.png" />
@@ -86,49 +101,49 @@
            </div>
            <div class="monitor-box" ref="monitorRef">
                <div class="list-six list" v-if="selectNum === 6">
                    <div class="item" v-for="(item, index) in shebeiData" :key="index">
                    <div class="item" v-for="(item, index) in deviceList" :key="index">
                        <div class="item-t">
                            <div>{{item.name}}</div>
                            <div>{{item.code}}</div>
                            <div>{{item.facilityName}}</div>
                            <div>{{item.facilityCode}}</div>
                        </div>
                        <div class="item-img">
                            <img v-if="item.image" :src="item.image" />
                            <img v-if="item.image" :src="VITE_APP_IMG_BASEURL + item.image" alt="" />
                        </div>
                        <div class="item-info">
                            <div class="online">设备在线状态: <span :style="{color: item.online ? '#56d12c' : '#bababa'}">{{item.online ? '在线' : '掉线'}}</span></div>
                            <div class="time">安装时间: <span>{{item.time}}</span></div>
                            <div class="online">设备在线状态: <span :style="{color: item.isOnline ? '#56d12c' : '#bababa'}">{{item.isOnline ? '在线' : '掉线'}}</span></div>
                            <div class="time">安装时间: <span>{{item.installDate}}</span></div>
                            <div class="address">安装位置: <span>{{item.address}}</span></div>
                        </div>
                    </div>
                </div>
                <div class="list-two list" v-else-if="selectNum === 2">
                    <div class="item" v-for="(item, index) in shebeiData" :key="index">
                    <div class="item" v-for="(item, index) in deviceList" :key="index">
                        <div class="item-t">
                            <div>{{item.name}}</div>
                            <div>{{item.code}}</div>
                            <div>{{item.facilityName}}</div>
                            <div>{{item.facilityCode}}</div>
                        </div>
                        <div class="item-img">
                            <img v-if="item.image" :src="item.image" />
                            <img v-if="item.image" :src="VITE_APP_IMG_BASEURL + item.image" alt="" />
                        </div>
                        <div class="item-info">
                            <div class="online">设备在线状态: <span :style="{color: item.online ? '#56d12c' : '#bababa'}">{{item.online ? '在线' : '掉线'}}</span></div>
                            <div class="time">安装时间: <span>{{item.time}}</span></div>
                            <div class="online">设备在线状态: <span :style="{color: item.isOnline ? '#56d12c' : '#bababa'}">{{item.isOnline ? '在线' : '掉线'}}</span></div>
                            <div class="time">安装时间: <span>{{item.installDate}}</span></div>
                            <div class="address">安装位置: <span>{{item.address}}</span></div>
                        </div>
                    </div>
                </div>
                <div class="list-one list" v-else-if="selectNum === 1">
                    <div class="item" v-for="(item, index) in shebeiData" :key="index">
                    <div class="item" v-for="(item, index) in deviceList" :key="index">
                        <div class="item-t">
                            <div>{{item.name}}</div>
                            <div>{{item.code}}</div>
                            <div>{{item.facilityName}}</div>
                            <div>{{item.facilityCode}}</div>
                        </div>
                        <div class="item-img">
                            <img v-if="item.image" :src="item.image" />
                            <img v-if="item.image" :src="VITE_APP_IMG_BASEURL + item.image" alt="" />
                        </div>
                        <div class="item-info">
                            <div class="online">设备在线状态: <span :style="{color: item.online ? '#56d12c' : '#bababa'}">{{item.online ? '在线' : '掉线'}}</span></div>
                            <div class="time">安装时间: <span>{{item.time}}</span></div>
                            <div class="online">设备在线状态: <span :style="{color: item.isOnline ? '#56d12c' : '#bababa'}">{{item.isOnline ? '在线' : '掉线'}}</span></div>
                            <div class="time">安装时间: <span>{{item.installDate}}</span></div>
                            <div class="address">安装位置: <span>{{item.address}}</span></div>
                        </div>
                    </div>
src/views/screen/temperature/home/index.vue
@@ -2,23 +2,27 @@
    <div class="home">
        <div class="home-bg"></div>
        <div class="home-c">
            <div class="point">
                <div class="point-address"></div>
                <div class="point-message">
                    <div class="msg-t">电站尾水出口水温监测点</div>
                    <div class="num">
                        <div class="item">
                            <div class="item-t">水温:</div>
                            <div class="item-num"><span>10</span>°C</div>
                        </div>
                        <div class="item">
                            <div class="item-t">水位:</div>
                            <div class="item-num"><span>1000</span>m</div>
                        </div>
                    </div>
                    <div class="shebei">
                        监测设备: <span>监测设备运行正常(点击跳转)</span>
                    </div>
            <div class="point" v-for="(item, index) in pointList" :key="index" :style="{left: item.left, top: item.top}">
                <div class="point-address" @click="handleShow(index)"></div>
                <div class="point-message" v-show="item.showMsg">
                   <div class="msg-box">
                       <div class="msg-t">{{ item.name }}</div>
                       <div class="num">
                           <div class="item">
                               <div class="item-t">水温:</div>
                               <div class="item-num"><span>{{item.temputer}}</span>°C</div>
                           </div>
                           <div class="item">
                               <div class="item-t">水位:</div>
                               <div class="item-num"><span>{{ item.shuiwei }}</span>m</div>
                           </div>
                       </div>
                       <div class="shebei">
                           监测设备:
                           <span v-if="item.device === 1" style="color: #1ab394">监测设备运行正常(点击跳转)</span>
                           <span v-else style="color: #ff0a0a">设备异常</span>
                       </div>
                   </div>
                </div>
            </div>
        </div>
@@ -27,6 +31,15 @@
<script setup>
const pointList = reactive([
    { name: '电站尾水出口水温监测点', temputer: 22, shuiwei: 1000, device: 1, left: '17%', top: '50%', showMsg: false },
    { name: '电站尾水出口水温监测点', temputer: 22, shuiwei: 1000, device: 2, left: '25%', top: '40%', showMsg: false },
])
const handleShow = (index) => {
    pointList[index].showMsg = !pointList[index].showMsg;
}
</script>
@@ -40,7 +53,7 @@
        top: 0;
        width: 100%;
        height: 100%;
        background: url("@/assets/images/map-bg.png") no-repeat;
        background: url("@/assets/images/tempture-bg.png") no-repeat;
        background-size: 100% 100%;
        z-index: 11;
    }
@@ -51,8 +64,6 @@
        z-index: 20;
        .point{
            position: absolute;
            left: 58%;
            bottom: 10%;
            .point-address{
                width: 35px;
                height: 40px;
@@ -61,17 +72,21 @@
            }
            .point-message{
                width: 500px;
                height: 200px;
                background: url("@/assets/images/messageInfo-box.png") no-repeat;
                height: 180px;
                background: url("@/assets/images/messageInfo-right.png") no-repeat;
                background-size: 100% 100%;
                position: absolute;
                left: -500px;
                top: -100px;
                left: 30px;
                top: -60px;
                padding: 30px 50px;
                color: #fff;
                display: flex;
                flex-direction: column;
                justify-content: space-between;
                .msg-box{
                    width: 100%;
                    height: 100%;
                    display: flex;
                    flex-direction: column;
                    justify-content: space-between;
                }
                .msg-t{
                    font-size: 26px;
                    font-weight: bold;
@@ -89,11 +104,6 @@
                            font-size: 22px;
                            font-weight: bold;
                        }
                    }
                }
                .shebei{
                    span{
                        color: #1ab394;
                    }
                }
            }