hldy_app/pages/NursingNew/component/equipment.vue

2339 lines
58 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view class="index-content-other" :style="transition?{opacity: `1`}:{opacity: `0`}">
<view class="zhezhao" v-show="openqingling || openlahzha || openbaoxiu || openhehzha || openchaobiao"
@click="closeall()">
<view class="neuro-box" @click.stop v-if="openqingling">
<view class="button-father">
<view :class="!buttonposition?`buttontarget button`:`button-white` " @click="openqingling=false">
取消</view>
<view :class="buttonposition?`buttontarget button`:`button-white` " @click="qingling()">确定</view>
</view>
<view class="card-font">
确定要清零吗
</view>
</view>
<view class="neuro-box-chaobiao" @click.stop v-if="openchaobiao">
<view class="button-father">
<view :class="!buttonposition?`buttontarget button`:`button-white` " @click="openchaobiao=false">
取消</view>
<view :class="buttonposition?`buttontarget button`:`button-white` " @click="chaobiao()">确定</view>
</view>
<view class="card-font">
确定要抄表吗
</view>
</view>
<view class="neuro-box-lazha" @click.stop v-if="openlahzha">
<view class="button-father">
<view :class="!buttonposition?`buttontarget button`:`button-white` " @click="openlahzha=false">取消
</view>
<view :class="buttonposition?`buttontarget button`:`button-white` " @click="kongzha(`10`)">确定</view>
</view>
<view class="card-font">
确定要{{ typeNow===1?'拉闸' : typeNow===2?'开阀' :"" }}吗
</view>
</view>
<view class="neuro-box-baoxiu" @click.stop v-if="openbaoxiu">
<view class="button-father">
<view :class="!buttonposition?`buttontarget button`:`button-white` " @click="openbaoxiu=false">取消
</view>
<view :class="buttonposition?`buttontarget button`:`button-white` " @click="baoxiu()">确定</view>
</view>
<view class="card-font">
确定要报修吗
</view>
</view>
<view class="neuro-box-lazha" @click.stop v-if="openhehzha">
<view class="button-father">
<view :class="!buttonposition?`buttontarget button`:`button-white` " @click="openhehzha=false">取消
</view>
<view :class="buttonposition?`buttontarget button`:`button-white` " @click="kongzha(`11`)">确定</view>
</view>
<view class="card-font">
确定要{{ typeNow===1?'合闸' : typeNow===2?'关阀' :"" }}吗
</view>
</view>
</view>
<view class="right-container-title-nav">
<text style="margin-left: 30rpx;">
NUID{{ uni.getStorageSync('nuId')}}
</text>
<text class="new-weight">
{{ uni.getStorageSync('nuName')}}
</text>
<view class="right-icons">
<view class="right-container-tem">
<image class="right-container-tem-img" src="/static/index/newindex/wendu/0.png" />
<text class="right-container-tem-text">23°C</text>
<image class="right-container-tem-img" src="/static/index/newindex/wendu/1.png" />
<text class="right-container-tem-text">39%</text>
</view>
<image class="right-icons-img" :src="`/static/index/undericons/man.png`" />
<view>{{name}}</view>
</view>
</view>
<view class="scroll-vi">
<view class="zhezhao-left"></view>
<view class="zhezhao-right"></view>
<scroll-view scroll-x="true" style="width: 1800rpx;height: 100%;" :scroll-left="scrollLeft">
<view style="display: flex;align-items: center;">
<view style="width: 100rpx;"></view>
<view v-for="(item,index) in allArray" :key="index"
:class="{zerotarget: movetype===0 && zeroIndex===index}" class="menu"
:style="{backgroundColor: movetype===0 && zeroIndex===index?`#ddf0ff`:``}"
@click="typeNowtarget=index;zeroIndex=index;clean();movetype=0;changeallmessage()">
<donghua :links="item.donghuapian" :playing="typeNowtarget===index" />
<text class="menu-font" :class="{ zoom: typeNowtarget===index }"
:style="typeNowtarget===index?{color:`#008FF5`}:{}">
{{item.lookName}}
</text>
</view>
<view style="width: 100rpx;">
</view>
</view>
</scroll-view>
</view>
<!-- <view class="right-right" v-show="!typeNow"> -->
<!-- <view class="bottom-view">
<view class="shebei">
设备名称:{{ rightmessage.deviceName }}
<view class="status-button" style="margin-top: 20rpx;margin-bottom: 10rpx;">
{{rightmessage.deviceStatus=='1'?'在线':'离线'}}
</view>
</view>
<view v-for="(item,index) in cameraArray" class="small-button-father" @click="clickcamera(index)">
<view class="bottom-button" :style="{backgroundColor:cameratarget.includes(index)?`#DDE9F0`:`` }">
<image style="width: 70%;height: 70%"
:src="`/static/index/camera/${index>4 ? index +1 :index}${cameratarget.includes(index)?1:0}.png`" />
</view>
<view style="font-size: 25rpx;" :style="{color:cameratarget.includes(index)?`#0E86EA`:`` }">
{{item}}
</view>
</view>
<view class="jump-white" v-show="rightjumpopen">
<view
style="display: flex;justify-content: space-around;height: 100rpx;width: 100%;align-items: center;">
<view class="">
翻转
</view>
<image style="width: 40rpx;height: 40rpx" src="/static/index/camera/back.png"
@click="rightjumpopen=false" />
</view>
<view class="jump-item" v-for="(item,index) in where" :key="index" @click="clickjump(index)"
:style="{backgroundColor:wheretarget===index?'#E5E8EE':''}">
<image style="width: 50rpx;height: 50rpx;margin-right: 10rpx;margin-left:-10rpx"
:src="wheretarget===index?item.target:item.url" />
<view :style="{color:wheretarget===index?'#0E86EA':''}">
{{item.name}}
</view>
</view>
</view>
</view> -->
<!-- </view> -->
<!-- <view class="" v-show="!typeNow"> -->
<!-- <view class="big-bgc" v-show="!typeNow">
<view
style="width: 100%;height: 100%;z-index: 1;display: flex;justify-content: center;align-items: center;background-color: rgba(226, 227, 231, 0.5);">
<view style="position: relative;">
<image style="width: 600rpx;height: 600rpx;margin-top: -150rpx;" src="/static/nocamera.png" />
<view
style="color: #4D5561;font-size: 32rpx;position: absolute;left: 50%;bottom: 100rpx;transform: translateX(-50%);">
暂无视频内容显示
</view>
</view>
</view>
</view> -->
<!-- <view class="picture" v-show="!typeNow">
<view class="picture-card" v-for="(item,index) in downpicture" :key="index"
:style="{color:downtarget===index?'#1486EB':''}" @click="clickDownCard(index)">
<view class="bgc-card" :style="{background:downtarget===index?'#E2EDFC':''}"
:class="{target: index === bottomTargetIndex}">
<image style="width: 90rpx;height: 90rpx;"
:src="`/static/index/picture/${index}${downtarget===index?1:0}.png`" />
</view>
{{item}}
</view>
</view> -->
<!-- </view> -->
<view class="index-father" v-show="typeNow===0">
<view class="photo-father">
<view class="juzhong" style="margin-left: -50rpx;">
<donghua :width="`1500rpx`" :height="`1000rpx`" :links="blueArray" :playing="photoplay" :loop="true"
:interval="120" />
</view>
<!-- <view class="donghua-number">
{{ randomValue }}
</view> -->
<view class="weight-time" style="font-size: 55rpx;">
NUID{{rightmessage.nuId?rightmessage.nuId:''}}
</view>
<view class="gray-bgc">
{{rightmessage.nuName?rightmessage.nuName:''}}
</view>
<image class="big-img-shexiang" :src="`/static/index/newindex/wendu/6.png`" />
<view class="bottom-father">
<view class="status-button">
{{rightmessage.deviceStatus=='1'?'在线':'离线'}}
</view>
<view class="status-font">
SN{{rightmessage.sn}}
</view>
<view class="status-time">
设备名称:{{rightmessage.deviceName?rightmessage.deviceName:''}}
</view>
</view>
</view>
<!-- <view class="left-menu">
<view v-for="(item,index) in leftArray" :key="index" class="buttons-father"
@click="clickLeftMenu(index)">
<view class="left-ball" :class="{firsttarget: movetype===1 && zeroIndex===index}"
:style="{backgroundColor: movetype===1 && zeroIndex===index?`#ddf0ff`:``}">
<donghua :width="`50rpx`" :height="`50rpx`" :links="item" style="width: 50rpx;height: 50rpx;"
:playing="movetype===1 && zeroIndex===index" :loop="false" :interval="120" />
</view>
<view class="">
{{ buttonName[index] }}
</view>
</view>
</view> -->
<view class="right-menu">
<view v-for="(item,index) in rightArray" :key="index" class="buttons-father"
@click="clickRightMenu(index)">
<view class="left-ball" :class="{firsttarget: movetype===2 && zeroIndex===index}"
:style="{backgroundColor: movetype===2 && zeroIndex===index?`#ddf0ff`:``}">
<image v-show="!index" style="width: 50rpx;height: 50rpx;"
src="/static/index/newindex/wendu/yulan.png" />
<donghua v-show="index" :width="`50rpx`" :height="`50rpx`" :links="item"
style="width: 50rpx;height: 50rpx;" :playing="movetype===2 && zeroIndex===index"
:loop="false" :interval="120" />
</view>
<view style="position: relative;">
{{ shexiangbuttonName[index] }}
<!-- <image v-if="!index" class="biga-img" src="/static/index/newindex/leftmenu/biga.png" /> -->
</view>
</view>
</view>
</view>
<view class="index-father" v-show="typeNow===1">
<view class="photo-father">
<view class="juzhong" style="margin-left: -50rpx;">
<donghua :width="`1500rpx`" :height="`1000rpx`" :links="blueArray" :playing="photoplay" :loop="true"
:interval="120" />
</view>
<view class="donghua-number">
{{ randomValue }}
</view>
<view class="weight-time">
{{indexmessage.eleValue?indexmessage.eleValue:'0.00'}}
<view class="big-font-right">
<view class="font-top">
KWH
</view>
<view class="right-kuai">
用电量
</view>
</view>
</view>
<image class="big-img" :src="`/static/index/newindex/wendu/3.png`" />
<view class="bottom-father">
<view class="status-button">
{{indexmessage.relayState=='1'?'合闸':'拉闸'}}
</view>
<view class="status-font">
SN{{indexmessage.address}}
</view>
<view class="status-time">
上次抄表时间:{{indexmessage.readTime?indexmessage.readTime:'未抄表'}}
</view>
</view>
</view>
<view class="left-menu">
<view v-for="(item,index) in leftArray" :key="index" class="buttons-father"
@click="clickLeftMenu(index)">
<view class="left-ball" :class="{firsttarget: movetype===1 && zeroIndex===index}"
:style="{backgroundColor: movetype===1 && zeroIndex===index?`#ddf0ff`:``}">
<donghua :width="`50rpx`" :height="`50rpx`" :links="item" style="width: 50rpx;height: 50rpx;"
:playing="movetype===1 && zeroIndex===index" :loop="false" :interval="120" />
</view>
<view class="">
{{ buttonName[index] }}
</view>
</view>
</view>
<view class="right-menu">
<view v-for="(item,index) in rightArray" :key="index" class="buttons-father"
@click="clickRightMenu(index)">
<view class="left-ball" :class="{firsttarget: movetype===2 && zeroIndex===index}"
:style="{backgroundColor: movetype===2 && zeroIndex===index?`#ddf0ff`:``}">
<donghua :width="`50rpx`" :height="`50rpx`" :links="item" style="width: 50rpx;height: 50rpx;"
:playing="movetype===2 && zeroIndex===index" :loop="false" :interval="120" />
</view>
<view style="position: relative;">
{{ index==1 ? buttonName[5] : indexmessage.relayState === '1'? buttonName[3] : buttonName[4]}}
<image v-if="!index" class="biga-img" src="/static/index/newindex/leftmenu/biga.png" />
</view>
</view>
</view>
</view>
<view class="index-father" v-show="typeNow===2">
<view class="photo-father">
<view class="juzhong" style="margin-left: -50rpx;">
<donghua :width="`1500rpx`" :height="`1000rpx`" :links="blueArray" :playing="photoplay" :loop="true"
:interval="120" />
</view>
<view class="water-donghua-number">
{{ randomValue }}
</view>
<view class="weight-time">
{{watermessage.waterValue?watermessage.waterValue:'0.00'}}
<view class="big-font-right">
<view class="font-top">
</view>
<view class="right-kuai">
用水量
</view>
</view>
</view>
<image class="big-img" :src="`/static/index/newindex/wendu/4.png`" />
<view class="bottom-father">
<view class="status-button">
{{watermessage.relayState=='1'?'关阀':'开阀'}}
</view>
<view class="status-font">
SN{{watermessage.address}}
</view>
<view class="status-time">
上次抄表时间:{{watermessage.readTime?watermessage.readTime:'未抄表'}}
</view>
</view>
</view>
<view class="left-menu">
<view v-for="(item,index) in leftArray" :key="index" class="buttons-father"
@click="clickLeftMenu(index)">
<view class="left-ball" :class="{firsttarget: movetype===1 && zeroIndex===index}"
:style="{backgroundColor: movetype===1 && zeroIndex===index?`#ddf0ff`:``}">
<donghua :width="`50rpx`" :height="`50rpx`" :links="item" style="width: 50rpx;height: 50rpx;"
:playing="movetype===1 && zeroIndex===index" :loop="false" :interval="120" />
</view>
<view class="">
{{ waterbuttonName[index] }}
</view>
</view>
</view>
<view class="right-menu">
<view v-for="(item,index) in rightArray" :key="index" class="buttons-father"
@click="clickRightMenu(index)">
<view class="left-ball" :class="{firsttarget: movetype===2 && zeroIndex===index}"
:style="{backgroundColor: movetype===2 && zeroIndex===index?`#ddf0ff`:``}">
<donghua :width="`50rpx`" :height="`50rpx`" :links="item" style="width: 50rpx;height: 50rpx;"
:playing="movetype===2 && zeroIndex===index" :loop="false" :interval="120" />
</view>
<view style="position: relative;">
{{ index==1 ? waterbuttonName[5] : watermessage.relayState === '1'? waterbuttonName[3] : waterbuttonName[4]}}
<image v-if="!index" class="biga-img" src="/static/index/newindex/leftmenu/biga.png" />
</view>
</view>
</view>
</view>
<view class="index-father" v-show="typeNow===3">
<view class="photo-father">
<view class="juzhong" style="margin-left: -50rpx;">
<donghua :width="`1500rpx`" :height="`1000rpx`" :links="blueArray" :playing="photoplay" :loop="true"
:interval="120" />
</view>
<view class="wendu-juzhong">
<view class="wendu-top">
<view class="wendu-top-left">
{{ randomValue?splitParts(randomValue).intPart:'-' }}
</view>
<view class="wendu-top-right">
<view class="">
</view>
<view class="">
.{{ randomValue?splitParts(randomValue).fracDigits:'-' }}
</view>
</view>
</view>
<view class="wendu-heng"></view>
<view class="wendu-bottom">
{{tempmessage.humidity?tempmessage.humidity:'-'}} %
</view>
</view>
<view class="weight-time">
{{tempmessage.temperature?tempmessage.temperature:'-'}}
<view class="big-font-right">
<view class="font-top">
</view>
<view class="right-kuai">
温度
</view>
</view>
<view class="zhongjian-shu"></view>
{{tempmessage.humidity?tempmessage.humidity:'-'}}
<view class="big-font-right">
<view class="font-top">
%
</view>
<view class="right-kuai">
湿度
</view>
</view>
</view>
<image class="big-img" :src="`/static/index/newindex/wendu/5.png`" />
<view class="bottom-father">
<view class="status-button">
{{ tempmessage.maintainStatus == 0 ? '正常' : tempmessage.maintainStatus == 1 ? '维修中' : tempmessage.maintainStatus == 2 ? '报废' : '' }}
</view>
<view class="status-font">
SN{{tempmessage.sn}}
</view>
<view class="status-time">
上次抄表时间:{{tempmessage.reportingTime?tempmessage.reportingTime:'未抄表'}}
</view>
</view>
</view>
<view class="left-menu">
<view v-for="(item,index) in wenduleftArray" :key="index" class="buttons-father"
@click="clickLeftMenu(index)">
<view class="left-ball" :class="{firsttarget: movetype===1 && zeroIndex===index}"
:style="{backgroundColor: movetype===1 && zeroIndex===index?`#ddf0ff`:``}">
<donghua :width="`50rpx`" :height="`50rpx`" :links="item" style="width: 50rpx;height: 50rpx;"
:playing="movetype===1 && zeroIndex===index" :loop="false" :interval="120" />
</view>
<view class="">
{{ wendubuttonName[index] }}
</view>
</view>
</view>
<view class="right-menu">
<view v-for="(item,index) in wendurightArray" :key="index" class="buttons-father"
@click="clickRightMenu(index)">
<view class="left-ball" :class="{firsttarget: movetype===2 && zeroIndex===index}"
:style="{backgroundColor: movetype===2 && zeroIndex===index?`#ddf0ff`:``}">
<donghua :width="`50rpx`" :height="`50rpx`" :links="item" style="width: 50rpx;height: 50rpx;"
:playing="movetype===2 && zeroIndex===index" :loop="false" :interval="120" />
</view>
<view style="position: relative;">
{{ index==1 ? wendubuttonName[1] : wendubuttonName[2]}}
<image v-if="!index" class="biga-img" src="/static/index/newindex/leftmenu/biga.png" />
</view>
</view>
</view>
</view>
<!-- <joysticknew @movecard="movecamera" v-show="!typeNow" /> -->
</view>
</template>
<script setup lang="ts">
import { ref, onMounted, onBeforeUnmount, computed, nextTick, defineProps, watch, onUnmounted } from 'vue';
import {
electricityMeterlist, electricityMetereleReset, electricityMetereleControl, electricityMeterbaoxiu, electricityMeteleRead,
waterwaterReset, waterwaterControl, waterbaoxiu, waterwaterRead, humidDevicebaoxiu, updateDeviceRealTime,cameraInfobaoxiu
} from "./api.js"
import { movedirection, queryPadPageList } from '@/pages/watch/api/lunpan.js'
import joysticknew from '@/component/public/newgame/joysticknew.vue';
const props = defineProps({
isShow: {
type: Boolean,
required: true,
},
propsmove: {
type: Number
},
isMain: {
type: Boolean
}
});
const movetype = ref(-1);
const buttonposition = ref(false);
const base = genPaths(
'/static/index/newindex/curve',
'curve_',
9,
'png',
1,
false
)
const blueArray = ref([
...base,
...[...base].reverse() // 先拷贝一份再反转,避免修改原 base
])
// 绑定到 scroll-view 的 scroll-left
const scrollLeft = ref(0)
// const downpicture = [
// "原图",
// "全景拉伸",
// "四分屏",
// "180°全景",
// "360°全景"
// ]
// const bottomTargetIndex = ref(-1);
// const downtarget = ref(-1);
// const second = ref(0);
// const cameraArray = ref([
// "截图",
// "录制",
// "对讲",
// "静音",
// "预警",
// // "返回",
// "图片",
// "视频",
// "清晰度",
// "翻转",
// ])
// const cameratarget = ref([]);
// const wheelRef = ref(null);
// const movecamera = (type : number) => {
// handleKey(type)
// }
// // 对 moveFirstUp / moveFirstDown 包装防抖
// const moveUpDebounced = useThrottle(() => wheelRef.value?.moveFirstUp(), 400)
// const moveDownDebounced = useThrottle(() => wheelRef.value?.moveFirstDown(), 400)
// const moveUpsecond = useThrottle(() => wheelRef.value?.moveSecondUp(), 400)
// const moveDownsecond = useThrottle(() => wheelRef.value?.moveSecondDown(), 400)
// const clickDownsecond = useThrottle(() => doSomething(), 700)
// function doSomething() {
// wheelRef.value?.startchange()
// if (first.value === 0) {
// if (second.value) {
// uni.$emit('smallmonitor:toggleVolume');
// } else {
// uni.$emit('smallmonitor:toggleVolume');
// }
// }
// if (first.value === 1) {
// if (second.value) {
// uni.$emit('smallmonitor:stopTalk');
// } else {
// uni.$emit('smallmonitor:openTalk');
// }
// }
// if (first.value === 2) {
// uni.$emit('smallmonitor:doSnapshot');
// }
// if (first.value === 3) {
// if (second.value) {
// uni.$emit('smallmonitor:stopRecord');
// } else {
// uni.$emit('smallmonitor:startRecord');
// }
// }
// if (first.value === 4) {
// if (!second.value) {
// savefirst.value = first.value
// first.value = -1;
// yuntai.value = true;
// } else {
// }
// }
// if (first.value === 5) {
// if (gaoqing.value !== second.value) {
// gaoqing.value = second.value
// uni.$emit('smallmonitor:changeQuality'); // 发起截图请求,不关心回调
// }
// }
// if (first.value === 6) {
// uni.$emit('smallmonitor:switchDisplay', second.value)
// }
// if (first.value === 7) {
// if (second.value === 3) {
// uni.$emit('smallmonitor:flipImage', 6)
// } else {
// uni.$emit('smallmonitor:flipImage', second.value)
// }
// }
// if (first.value === 8) {
// if (second.value) {
// uni.$emit('smallmonitor:stopAlarm')
// } else {
// uni.$emit('smallmonitor:startAlarm')
// }
// }
// }
// function useThrottle(fn : () => void, delay = 1000) {
// let throttling = false
// return () => {
// if (throttling) return
// fn()
// throttling = true
// setTimeout(() => {
// throttling = false
// }, delay)
// }
// }
// const gaoqing = ref(0);
// const yuntai = ref(false);
// const savefirst = ref(-1);
// const first = ref(5);
// // 核心逻辑
// function handleKey(type : number) {
// switch (type) {
// case 0: runDirection(1, 0); break // 上
// case 1: runDirection(5, 1); break // 右
// case 2: runDirection(7, 2); break // 下
// case 3: runDirection(3, 3); break // 左
// case 4: // 确定
// first.value = savefirst.value
// yuntai.value = false
// savefirst.value = -1
// moveUpsecond()
// clickDownsecond()
// break
// case 5: // 取消
// first.value = savefirst.value
// yuntai.value = false
// savefirst.value = -1
// moveUpsecond()
// clickDownsecond()
// break
// }
// }
// // 当前活跃的方向0,1,2,3
// // -1 表示没有活跃方向
// let activeDir = -1
// // 定时器 mapkey = 方向
// const stopTimers : Record<number, any> = {}
// // 管理方向的开始/停止
// function runDirection(dirCode : number, type : number) {
// // 如果换方向,先停掉旧的
// if (activeDir !== -1 && activeDir !== type) {
// stopDirection(activeDir)
// }
// activeDir = type
// // 执行开始
// movedirection(dirCode, 1)
// // 重置 stop 计时器
// if (stopTimers[type]) clearTimeout(stopTimers[type])
// stopTimers[type] = setTimeout(() => {
// stopDirection(type)
// }, 550) // 如果 550ms 内没有新指令 → 自动停止
// }
// // 停止动作
// function stopDirection(type : number) {
// if (type === -1) return
// let dirCode = 0
// switch (type) {
// case 0: dirCode = 1; break
// case 1: dirCode = 5; break
// case 2: dirCode = 7; break
// case 3: dirCode = 3; break
// }
// movedirection(dirCode, 0).then((res : any) => { })
// clearTimeout(stopTimers[type])
// stopTimers[type] = null
// if (activeDir === type) activeDir = -1
// }
// // 简单的宽松解析函数
// function parseDateFlexible(s) {
// if (s instanceof Date) return s
// if (typeof s !== 'string') throw new Error('birth must be string or Date')
// // 支持 "YYYY-MM-DD" 或 "YYYY年MM月DD日" 或 "YYYY/MM/DD"
// const m = s.match(/(\d{4})\D+(\d{1,2})\D+(\d{1,2})/)
// if (!m) throw new Error('无法解析的日期格式')
// return new Date(Number(m[1]), Number(m[2]) - 1, Number(m[3]))
// }
// const removeIndexOnce = (index : number) => {
// const pos = cameratarget.value.indexOf(index)
// if (pos !== -1) {
// cameratarget.value.splice(pos, 1) // 从 pos 开始删除 1 个元素
// }
// }
// const wheretarget = ref(3);
// const where = [
// {
// name: "左右翻转",
// url: "/static/index/camera/800.png",
// target: "/static/index/camera/801.png",
// },
// {
// name: "上下翻转",
// url: "/static/index/camera/810.png",
// target: "/static/index/camera/811.png",
// },
// {
// name: "中心翻转",
// url: "/static/index/camera/820.png",
// target: "/static/index/camera/821.png",
// },
// {
// name: "不翻转",
// url: "/static/index/camera/830.png",
// target: "/static/index/camera/831.png",
// },
// ]
// const jumpopen = ref(false);
// const rightjumpopen = ref(false);
// const clickcamera = (index : number) => {
// switch (index) {
// case 0:
// // 触发快照事件
// uni.$emit('smallmonitor:doSnapshot')
// // 如果数组里不存在就 push避免重复
// if (!cameratarget.value.includes(index)) {
// cameratarget.value.push(index)
// }
// // 如果之前有定时器,先清掉(实现“重新计时”)
// if (removeTimers.has(index)) {
// clearTimeout(removeTimers.get(index)!)
// }
// // 新建一个 1s 后移除的定时器
// const timerId = setTimeout(() => {
// const pos = cameratarget.value.indexOf(index)
// if (pos !== -1) {
// cameratarget.value.splice(pos, 1)
// }
// removeTimers.delete(index)
// }, 500)
// removeTimers.set(index, timerId)
// break
// case 1:
// if (cameratarget.value.includes(index)) {
// uni.$emit('smallmonitor:stopRecord');
// removeIndexOnce(index)
// } else {
// uni.$emit('smallmonitor:startRecord');
// cameratarget.value.push(index)
// }
// break
// case 2:
// if (cameratarget.value.includes(index)) {
// uni.$emit('smallmonitor:stopTalk');
// removeIndexOnce(index)
// } else {
// uni.$emit('smallmonitor:openTalk');
// cameratarget.value.push(index)
// }
// break
// case 3:
// if (cameratarget.value.includes(index)) {
// uni.$emit('smallmonitor:toggleVolume');
// removeIndexOnce(index)
// } else {
// uni.$emit('smallmonitor:toggleVolume');
// cameratarget.value.push(index)
// }
// break
// case 4:
// if (cameratarget.value.includes(index)) {
// uni.$emit('smallmonitor:stopAlarm')
// removeIndexOnce(index)
// } else {
// uni.$emit('smallmonitor:startAlarm')
// cameratarget.value.push(index)
// }
// break
// // case 5:
// // jumpopen.value = false;
// // uni.navigateBack()
// // break
// case 5:
// if (cameratarget.value.includes(index)) {
// removeIndexOnce(index)
// } else {
// cameratarget.value.push(index)
// }
// break
// case 6:
// if (cameratarget.value.includes(index)) {
// removeIndexOnce(index)
// } else {
// cameratarget.value.push(index)
// }
// break
// case 7:
// if (cameratarget.value.includes(index)) {
// uni.$emit('smallmonitor:changeQuality');
// removeIndexOnce(index)
// } else {
// uni.$emit('smallmonitor:changeQuality');
// cameratarget.value.push(index)
// }
// break
// case 8:
// rightjumpopen.value = true
// break
// }
// }
// const clickjump = (index : number) => {
// wheretarget.value = index;
// if (index === 3) {
// uni.$emit('smallmonitor:flipImage', 6)
// removeIndexOnce(9)
// } else {
// uni.$emit('smallmonitor:flipImage', index)
// cameratarget.value.push(9)
// }
// }
// const clickDownCard = (index : number) => {
// // cleanandopen()
// bottomTargetIndex.value = index;
// // clickDownCard(0)
// downtarget.value = index;
// switch (index) {
// case 0:
// uni.$emit('smallmonitor:switchDisplay', 0)
// break
// case 1:
// uni.$emit('smallmonitor:switchDisplay', 4)
// break
// case 2:
// uni.$emit('smallmonitor:switchDisplay', 1)
// break
// case 3:
// uni.$emit('smallmonitor:switchDisplay', 2)
// break
// case 4:
// uni.$emit('smallmonitor:switchDisplay', 3)
// break
// }
// }
// 监听 isMain 的变化,但只在 isShow 为 true 时响应
watch(
() => props.isMain,
(newVal, oldVal) => {
// 如果不是从一个明确的布尔值变到另一个(例如首次 undefined -> 布尔),可以按需忽略
if (typeof oldVal !== 'boolean') return
if (!props.isShow) return
if (lanjie.value) {
lanjie.value = false
return
}
if (oldVal === true && newVal === false) {
movetype.value = 0;
zeroIndex.value = 0;
typeNowtarget.value = zeroIndex.value;
changeallmessage()
} else if (oldVal === false && newVal === true) {
movetype.value = -1
zeroIndex.value = -1
typeNowtarget.value = 0;
changeallmessage()
}
// console.log("?????",typeNowtarget.value)
}
)
const zeroIndex = ref(-1)
const emit = defineEmits(['back', 'cleanmain', `canback`])
const savetopindex = ref(0)
const removeTimers = new Map<number, ReturnType<typeof setTimeout>>();
onBeforeUnmount(() => {
for (const t of removeTimers.values()) {
clearTimeout(t)
}
removeTimers.clear()
})
watch(
() => props.propsmove,
() => {
if (movetype.value != -1) {
if (openqingling.value || openlahzha.value || openbaoxiu.value || openhehzha.value || openchaobiao.value) {
switch (props.propsmove) {
case 0:
break;
case 1:
buttonposition.value = !buttonposition.value
break;
case 2:
break;
case 3:
buttonposition.value = !buttonposition.value
break;
case 4:
if (buttonposition.value) {
if (openqingling.value) {
qingling()
}
if (openlahzha.value) {
kongzha(`10`)
}
if (openbaoxiu.value) {
baoxiu()
}
if (openhehzha.value) {
kongzha(`11`)
}
if (openchaobiao.value) {
chaobiao()
}
} else {
closeall()
}
break;
case 5:
closeall()
default:
}
return
}
switch (movetype.value) {
case 0:
switch (props.propsmove) {
case 0:
movetype.value = -1
zeroIndex.value = -1
emit("back")
break;
case 1:
if (zeroIndex.value < allArray.value.length - 1) {
zeroIndex.value++
typeNowtarget.value = zeroIndex.value;
scrollLeft.value = zeroIndex.value * 130
changeallmessage()
}
break;
case 2:
if (typeNow.value) {
savetopindex.value = zeroIndex.value;
movetype.value = 1
zeroIndex.value = 0
} else {
savetopindex.value = zeroIndex.value;
movetype.value = 2
zeroIndex.value = 0
}
break;
case 3:
if (zeroIndex.value) {
zeroIndex.value--
typeNowtarget.value = zeroIndex.value;
scrollLeft.value = zeroIndex.value * 130
changeallmessage()
} else {
movetype.value = -1
zeroIndex.value = -1
emit("back")
}
break;
case 4:
typeNowtarget.value = zeroIndex.value;
break;
default:
}
break;
case 1:
switch (props.propsmove) {
case 0:
if (zeroIndex.value) {
zeroIndex.value--
} else {
movetype.value = 0
zeroIndex.value = savetopindex.value
typeNowtarget.value = savetopindex.value;
}
break;
case 1:
zeroIndex.value = 0
movetype.value = 2
break;
case 2:
if (typeNow.value != 3) {
if (zeroIndex.value < 2) {
zeroIndex.value++
}
} else {
if (zeroIndex.value < 1) {
zeroIndex.value++
}
}
break;
case 3:
movetype.value = -1
zeroIndex.value = -1
emit("back")
break;
case 4:
if (typeNow.value != 3) {
if (!zeroIndex.value) {
openqingling.value = true;
emit("canback", true)
} else if (zeroIndex.value == 1) {
openchaobiao.value = true
emit("canback", true)
}
} else {
if (!zeroIndex.value) {
openchaobiao.value = true;
emit("canback", true)
} else if (zeroIndex.value == 1) {
// openchaobiao.value = true
// emit("canback", true)
}
}
break;
default:
}
break;
case 2:
switch (props.propsmove) {
case 0:
if (zeroIndex.value) {
zeroIndex.value--
} else {
movetype.value = 0
zeroIndex.value = savetopindex.value
typeNowtarget.value = savetopindex.value;
}
break;
case 1:
break;
case 2:
if (typeNow.value != 3) {
if (zeroIndex.value < 1) {
zeroIndex.value++
}
} else {
}
break;
case 3:
if (typeNow.value) {
zeroIndex.value = 0
movetype.value = 1
}
break;
case 4:
if (typeNow.value != 3) {
if (!typeNow.value && !zeroIndex.value) {
uni.navigateTo({
url: "/pages/watch/full"
})
return
}
if (!zeroIndex.value) {
if (indexmessage.value.relayState === '1') {
openlahzha.value = true
emit("canback", true)
} else {
openhehzha.value = true
emit("canback", true)
}
} else {
openbaoxiu.value = true;
emit("canback", true)
}
}
else {
openbaoxiu.value = true;
emit("canback", true)
}
break;
default:
}
break;
}
}
}
)
const typeNow = ref(-1);
const typeNowtarget = ref(-1);
const photoplay = ref(false)
const downArray = ref()
const scrollTop = ref(0);
const openqingling = ref(false);
const openlahzha = ref(false);
const openhehzha = ref(false);
const openbaoxiu = ref(false);
const openchaobiao = ref(false);
const qingling = () => {
closeall()
if (typeNow.value == 1) {
electricityMetereleReset(indexmessage.value.cid, indexmessage.value.address).then((res : any) => {
uni.showToast({
title: res.message,
icon: 'none', // 'success' | 'none' (小程序还有 'loading'
duration: 1500,
mask: false
})
setTimeout(() => {
init()
}, 4000)
})
} else if (typeNow.value == 2) {
waterwaterReset(watermessage.value.cid, watermessage.value.address).then((res : any) => {
uni.showToast({
title: res.message,
icon: 'none', // 'success' | 'none' (小程序还有 'loading'
duration: 1500,
mask: false
})
setTimeout(() => {
init()
}, 4000)
})
}
}
const kongzha = (type : string) => {
closeall()
if (typeNow.value == 1) {
electricityMetereleControl(indexmessage.value.cid, indexmessage.value.address, type).then((res : any) => {
uni.showToast({
title: res.message,
icon: 'none', // 'success' | 'none' (小程序还有 'loading'
duration: 1500,
mask: false
})
setTimeout(() => {
init()
}, 4000)
})
} else if (typeNow.value == 2) {
if (type == '10') {
type = '43'
} else {
type = '53'
}
waterwaterControl(watermessage.value.cid, watermessage.value.address, type).then((res : any) => {
uni.showToast({
title: res.message,
icon: 'none', // 'success' | 'none' (小程序还有 'loading'
duration: 1500,
mask: false
})
setTimeout(() => {
init()
}, 4000)
})
}
}
const chaobiao = () => {
closeall()
if (typeNow.value == 1) {
electricityMeteleRead(indexmessage.value.cid, indexmessage.value.address).then((res : any) => {
uni.showToast({
title: res.message,
icon: 'none', // 'success' | 'none' (小程序还有 'loading'
duration: 1500,
mask: false
})
setTimeout(() => {
init()
}, 4000)
})
} else if (typeNow.value == 2) {
waterwaterRead(watermessage.value.cid, watermessage.value.address).then((res : any) => {
uni.showToast({
title: res.message,
icon: 'none', // 'success' | 'none' (小程序还有 'loading'
duration: 1500,
mask: false
})
setTimeout(() => {
init()
}, 4000)
})
} else if (typeNow.value == 3) {
updateDeviceRealTime(tempmessage.value.sn).then((res : any) => {
uni.showToast({
title: res.message,
icon: 'none', // 'success' | 'none' (小程序还有 'loading'
duration: 1500,
mask: false
})
setTimeout(() => {
init()
}, 4000)
})
}
}
const baoxiu = () => {
closeall()
if (typeNow.value == 1) {
electricityMeterbaoxiu(indexmessage.value.id).then((res : any) => {
uni.showToast({
title: res.message,
icon: 'none', // 'success' | 'none' (小程序还有 'loading'
duration: 1500,
mask: false
})
console.log("!1", res)
setTimeout(() => {
init()
}, 4000)
})
} else if (typeNow.value == 2) {
waterbaoxiu(watermessage.value.id).then((res : any) => {
uni.showToast({
title: res.message,
icon: 'none', // 'success' | 'none' (小程序还有 'loading'
duration: 1500,
mask: false
})
console.log("!1", res)
setTimeout(() => {
init()
}, 4000)
})
} else if (typeNow.value == 3) {
humidDevicebaoxiu(tempmessage.value.id).then((res : any) => {
uni.showToast({
title: res.message,
icon: 'none', // 'success' | 'none' (小程序还有 'loading'
duration: 1500,
mask: false
})
// console.log("!1", res)
setTimeout(() => {
init()
}, 4000)
})
}else if (typeNow.value == 0) {
cameraInfobaoxiu(tempmessage.value.id).then((res : any) => {
uni.showToast({
title: res.message,
icon: 'none', // 'success' | 'none' (小程序还有 'loading'
duration: 1500,
mask: false
})
// console.log("!1", res)
setTimeout(() => {
init()
}, 4000)
})
}
}
const closeall = () => {
openqingling.value = false;
openlahzha.value = false;
openbaoxiu.value = false;
openhehzha.value = false;
openchaobiao.value = false;
buttonposition.value = false;
emit("canback", false)
}
const clickLeftMenu = (index : number) => {
zeroIndex.value = index;
clean();
movetype.value = 1;
if (typeNow.value != 3) {
if (movetype.value === 1 && !index) {
openqingling.value = true;
emit("canback", true)
} else if (index == 1) {
openchaobiao.value = true;
emit("canback", true)
}
} else {
if (!index) {
openchaobiao.value = true;
emit("canback", true)
}
}
}
const clickRightMenu = (index : number) => {
if (!typeNow.value && !index) {
uni.navigateTo({
url: "/pages/watch/full"
})
return
}
zeroIndex.value = index;
clean();
movetype.value = 2;
if (typeNow.value != 3) {
if (!index) {
if (indexmessage.value.relayState === '1') {
openlahzha.value = true
emit("canback", true)
} else {
openhehzha.value = true
emit("canback", true)
}
} else {
openbaoxiu.value = true;
emit("canback", true)
}
} else {
openbaoxiu.value = true;
emit("canback", true)
}
}
function onScroll(e) {
scrollTop.value = e.detail.scrollTop
}
// 通用的生成函数
function genPaths(base, prefix, count, ext = 'png', startIndex = 0, pad = false) {
return Array.from({ length: count }, (_, i) => {
const idx = pad
? String(i + startIndex).padStart(2, '0')
: i + startIndex
return `${base}/${prefix}${idx}.${ext}`
})
}
const leftArray = ref([genPaths(
'/static/index/newindex/leftmenu',
'zero',
11, // 张数
'png',
0, // 起始索引
false // 不补零
),
genPaths(
'/static/index/newindex/leftmenu',
'read',
8, // 张数
'png',
1, // 起始索引
false // 不补零
),
genPaths(
'/static/index/newindex/leftmenu',
'Log',
10, // 张数
'png',
0, // 起始索引
false // 不补零
)],
)
const wenduleftArray = ref([
genPaths(
'/static/index/newindex/leftmenu',
'read',
8, // 张数
'png',
1, // 起始索引
false // 不补零
),
genPaths(
'/static/index/newindex/leftmenu',
'Log',
10, // 张数
'png',
0, // 起始索引
false // 不补零
)],
)
const wendurightArray = ref([
genPaths(
'/static/index/newindex/rightmenu',
'service',
5, // 张数
'png',
0, // 起始索引
false // 不补零
)],
)
const rightArray = ref([])
const waterrightArray = ref([])
const mobanrightArray = ref([genPaths(
'/static/index/newindex/rightmenu',
'closes',
12, // 张数
'png',
0, // 起始索引
false // 不补零
),
genPaths(
'/static/index/newindex/rightmenu',
'switch',
7, // 张数
'png',
0, // 起始索引
false // 不补零
),
genPaths(
'/static/index/newindex/rightmenu',
'service',
5, // 张数
'png',
0, // 起始索引
false // 不补零
)],
)
const buttonName = ref(['清零', "抄表", "日志", "拉闸", "合闸", "报修"])
const shexiangbuttonName = ref(["预览", "报修"])
const waterbuttonName = ref(['清零', "抄表", "日志", "开阀", "关阀", "报修"])
const wendubuttonName = ref(["抄表", "日志", "报修"])
const typeArray = ref([
{
url: genPaths(
'/static/index/newindex/shebei',
'Camera',
9, // 张数
'png',
0, // 起始索引为 1
false // 不补零
), name: '摄像头'
},
{
url: genPaths(
'/static/index/newindex/shebei',
'cable',
10, // 张数
'png',
0, // 起始索引为 1
false // 不补零
), name: '智能电表'
},
{
url: genPaths(
'/static/index/newindex/shebei',
'river',
13, // 张数
'png',
0, // 起始索引为 1
false // 不补零
), name: '智能水表'
},
{
url: genPaths(
'/static/index/newindex/shebei',
'humiture',
9, // 张数
'png',
0, // 起始索引为 1
false // 不补零
), name: '温湿度计'
},
])
// 使用watch监听isShow变化
const transition = ref(false);
//取小数点前后
function splitParts(num) {
const s = String(num);
if (!s.includes('.')) return { intPart: s, fracDigits: '' }; // 没有小数点
const [intPart, fracDigits] = s.split('.');
return { intPart, fracDigits };
}
watch(
() => props.isShow,
(newVal, oldVal) => {
// 当旧值为false新值为true时延迟0.2秒调用方法
if (!oldVal && newVal) {
transition.value = false;
// console.log("????",transition.value)
setTimeout(() => {
transition.value = true;
}, 50)
} else {
transition.value = false;
}
}
)
const name = ref("");
const randomValue = ref(0)
let startValue = 0
let targetValue = 0
let startTime = 0
let duration = 300
let animating = false
// 兼容处理performance.now() 不存在时用 Date.now()
function nowTime() {
return (typeof performance !== 'undefined' && performance.now)
? performance.now()
: Date.now()
}
function rollTo(target) {
animating = false // 立即停止上一个动画
startValue = randomValue.value
targetValue = target
startTime = nowTime()
duration = 300
animating = true
requestAnimationFrameCompat(animate)
}
function animate() {
if (!animating) return
const now = nowTime()
const elapsed = now - startTime
let progress = elapsed / duration
if (progress > 1) progress = 1
// 缓动函数 easeOutCubic
const eased = 1 - Math.pow(1 - progress, 3)
randomValue.value = Number((startValue + (targetValue - startValue) * eased).toFixed(2))
if (progress < 1) {
requestAnimationFrameCompat(animate)
} else {
animating = false
}
}
// 通用 requestAnimationFrame 兼容
function requestAnimationFrameCompat(cb) {
if (typeof requestAnimationFrame !== 'undefined') {
requestAnimationFrame(cb)
} else {
// UniApp 里一般没有 raf用 setTimeout 模拟
setTimeout(cb, 16) // 约 60fps
}
}
const indexmessage = ref({
eleValue: "",
address: "",
readTime: "",
relayState: `0`,
cid: 0,
id: 0,
})
const watermessage = ref({
waterValue: "",
address: "",
readTime: "",
relayState: `0`,
cid: 0,
id: 0,
})
const tempmessage = ref({
temperature: "",
humidity: "",
maintainStatus: "",
sn: "",
reportingTime: "",
id: 0,
})
onMounted(() => {
name.value = uni.getStorageSync('realname')
typeNow.value = 0;
photoplay.value = true;
init();
yulan();
})
const changeallmessage = () => {
uni.$emit('smallmonitor:isshow', false)
typeNow.value = allArray.value[typeNowtarget.value].typeNumber;
if (typeNow.value === 1) {
indexmessage.value = allArray.value[typeNowtarget.value]
const firstTarget = indexmessage.value.eleValue;
if (indexmessage.value.relayState === '1') {
rightArray.value = [mobanrightArray.value[1], mobanrightArray.value[2]]
} else {
rightArray.value = [mobanrightArray.value[0], mobanrightArray.value[2]]
}
rollTo(Number(firstTarget))
} else if (typeNow.value === 2) {
watermessage.value = allArray.value[typeNowtarget.value]
const secondTarget = watermessage.value.waterValue
if (watermessage.value.relayState === '1') {
waterrightArray.value = [mobanrightArray.value[1], mobanrightArray.value[2]]
} else {
waterrightArray.value = [mobanrightArray.value[0], mobanrightArray.value[2]]
}
rollTo(Number(secondTarget))
} else if (typeNow.value === 3) {
tempmessage.value = allArray.value[typeNowtarget.value]
const thirdTarget = tempmessage.value.temperature
rollTo(Number(thirdTarget))
}
else if (!typeNow.value) {
rightmessage.value = allArray.value[typeNowtarget.value]
rightArray.value = [mobanrightArray.value[0], mobanrightArray.value[2]]
}
}
const rightmessage = ref({
deviceName: "",
deviceStatus: "1",
nuId: "",
nuName: "",
sn: "",
reportingTime: "",
id: 0,
// maintainStatus: "",
});
const allArray = ref([]);
const yulan = () => {
console.log("?????")
setTimeout(() => {
typeNowtarget.value = 0
changeallmessage()
}, 500)
}
const init = () => {
allArray.value = [];
// console.log("????", uni.getStorageSync('serverUrl'), uni.getStorageSync('nuId'))
electricityMeterlist().then((res : any) => {
console.log("!!!", res.result)
if (res.result.cameraInfoEntityList.length && res.result.cameraInfoEntityList != null) {
res.result.cameraInfoEntityList.forEach((element : any, index : number) => {
element.typeNumber = 0
element.lookName = "摄像头" + index;
element.donghuapian = typeArray.value[0].url
allArray.value.push(element)
})
}
if (res.result.electricityMeterEntityList.length && res.result.electricityMeterEntityList != null) {
res.result.electricityMeterEntityList.forEach((element : any, index : number) => {
element.typeNumber = 1
element.lookName = "电表" + index
element.donghuapian = typeArray.value[1].url
allArray.value.push(element)
})
}
if (res.result.waterMeterEntityList.length && res.result.waterMeterEntityList != null) {
res.result.waterMeterEntityList.forEach((element : any, index : number) => {
element.typeNumber = 2
element.lookName = "水表" + index
element.donghuapian = typeArray.value[2].url
allArray.value.push(element)
})
}
if (res.result.humidDeviceEntityList.length && res.result.humidDeviceEntityList != null) {
res.result.humidDeviceEntityList.forEach((element : any, index : number) => {
element.typeNumber = 3
element.lookName = "温度计" + index
element.donghuapian = typeArray.value[3].url
allArray.value.push(element)
})
}
// rightmessage.value = res.result.cameraInfoEntityList[0]
// //温度计
// tempmessage.value = res.result.humidDeviceEntityList[0];
// // 这个是电表
// indexmessage.value = res.result.electricityMeterEntityList[0]
// // 这个是水表
// watermessage.value = res.result.waterMeterEntityList[0]
})
}
const lanjie = ref(false);
const clean = () => {
if (movetype.value == -1) {
lanjie.value = true;
emit("cleanmain")
}
}
</script>
<style scoped lang="less">
.index-content-other {
width: calc(100% - 407rpx);
height: 100%;
transition: opacity 1s ease;
position: relative;
.index-father {
width: 100%;
height: 1100rpx;
}
.abs-time {
position: absolute;
right: 20rpx;
top: 150rpx;
.big-time {
font-size: 90rpx;
font-weight: 600;
width: 100%;
justify-content: center;
}
}
}
.right-container-title-nav {
margin-top: 60rpx;
display: flex;
align-items: center;
height: 60rpx;
position: relative;
font-size: 28rpx;
.new-weight {
margin-left: 30rpx;
font-weight: 600;
}
.right-icons {
position: absolute;
right: 30rpx;
top: 0;
display: flex;
align-items: center;
height: 60rpx;
}
.right-icons-img {
width: 60rpx;
height: 60rpx;
margin-left: 20rpx;
margin-right: 20rpx;
}
}
.scroll-vi {
height: 120rpx;
width: 95%;
margin-left: 20rpx;
margin-top: 20rpx;
position: relative;
margin-bottom: 80rpx;
.menu {
margin-top: 15rpx;
flex: 0 0 auto; // 👈 关键点
height: 90rpx;
width: 240rpx;
border-radius: 50rpx;
margin-right: 20rpx;
background-color: #fff;
display: flex;
justify-content: center;
align-items: center;
padding-top: 9rpx;
.menu-img {
width: 55rpx;
height: 55rpx;
margin-right: 15rpx;
}
.menu-font {
margin-top: 18rpx;
font-size: 25rpx;
}
}
}
.date {
display: flex;
justify-content: space-around;
margin-top: 10rpx;
}
.right-container-tem {
display: flex;
.right-container-tem-text {
font-size: 30rpx;
margin-right: 20rpx;
}
.right-container-tem-img {
width: 38rpx;
height: 38rpx;
}
}
.photo-father {
width: 100%;
height: 1100rpx;
display: flex;
flex-direction: column;
align-items: center;
position: relative;
}
.juzhong {
position: absolute;
top: 0%;
left: 50%;
transform: translate(-50%, -10%);
}
.weight-time {
font-weight: 800;
font-size: 100rpx;
margin-bottom: 0rpx;
margin-left: -50rpx;
display: flex;
align-items: center;
.big-font-right {
font-size: 35rpx;
font-weight: 500;
color: black;
margin-left: 30rpx;
display: flex;
flex-direction: column;
align-items: flex-start;
.font-top {
margin-left: 5rpx;
}
.right-kuai {
display: flex;
justify-content: center;
align-items: center;
background-color: #42A5F6;
color: #fff;
width: 110rpx;
height: 50rpx;
border-radius: 15rpx;
font-size: 25rpx;
}
}
}
.big-img {
width: 600rpx;
height: 600rpx;
margin: 50rpx 0;
}
.big-img-shexiang {
width: 600rpx;
height: 650rpx;
margin-bottom: 35.5rpx;
}
.left-menu {
position: absolute;
top: 50%;
left: 150rpx;
transform: translateY(-50%);
}
.zoom {
transform: scale(1.2);
transform-origin: bottom left;
transition: transform 1s ease;
}
.left-ball {
width: 100rpx;
height: 100rpx;
border-radius: 50%;
display: flex;
justify-content: center;
align-items: center;
background-color: #fff;
margin-bottom: 15rpx;
}
.right-menu {
position: absolute;
top: 50%;
right: 150rpx;
transform: translateY(-50%);
.right-scroll {
width: 100%;
height: 750rpx;
}
.white-circle {
height: 200rpx;
border-radius: 60rpx;
background-color: #fff;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
text-align: center;
.right-menu-img {
width: 80rpx;
height: 80rpx;
}
.right-menu-name {
width: 80rpx;
}
}
}
.zhezhao-left {
position: absolute;
top: 0rpx;
left: 0%;
height: 100%;
width: 120rpx;
background: linear-gradient(to right,
rgba(239, 240, 244, 1) 0%,
/* #eff0f4 全不透明 */
rgba(239, 240, 244, 0) 100%
/* #eff0f4 完全透明 */
);
z-index: 4;
}
.zhezhao-right {
position: absolute;
top: 0rpx;
right: 0%;
height: 100%;
width: 120rpx;
background: linear-gradient(to left,
rgba(239, 240, 244, 1) 0%,
/* #eff0f4 全不透明 */
rgba(239, 240, 244, 0) 100%
/* #eff0f4 完全透明 */
);
z-index: 4;
}
.zerotarget {
--color: #99C9FD;
--thick: 2px;
--radius: 50rpx;
--outline-offset: 0rpx;
/* 外扩多少 */
/* 内层虚线你现在用的 */
border-radius: var(--radius);
background-color: white;
/* 内部背景 */
animation: scalePulse 360ms cubic-bezier(.2, .8, .2, 1);
/* 外层虚线放在 outline不会影响元素尺寸 */
outline: var(--thick) dashed var(--color);
outline-offset: var(--outline-offset);
/* 保证文本 / 子元素在最上层 */
position: relative;
z-index: 0;
}
.firsttarget {
--color: #99C9FD;
--thick: 2px;
--radius: 50%;
--outline-offset: 0rpx;
/* 外扩多少 */
/* 内层虚线你现在用的 */
border-radius: var(--radius);
background-color: white;
/* 内部背景 */
animation: scalePulse 360ms cubic-bezier(.2, .8, .2, 1);
/* 外层虚线放在 outline不会影响元素尺寸 */
outline: var(--thick) dashed var(--color);
outline-offset: var(--outline-offset);
/* 保证文本 / 子元素在最上层 */
position: relative;
z-index: 0;
}
.buttontarget {
--color: #99C9FD;
--thick: 2px;
--radius: 30rpx;
--outline-offset: 0rpx;
/* 外扩多少 */
/* 内层虚线你现在用的 */
border-radius: var(--radius);
background-color: white;
/* 内部背景 */
animation: scalePulse 360ms cubic-bezier(.2, .8, .2, 1);
/* 外层虚线放在 outline不会影响元素尺寸 */
outline: var(--thick) dashed var(--color);
outline-offset: var(--outline-offset);
/* 保证文本 / 子元素在最上层 */
position: relative;
z-index: 0;
}
@keyframes scalePulse {
0% {
transform: scale(1);
}
25% {
/* 先收缩一点点 */
transform: scale(0.94);
}
65% {
/* 再放大到略超出的感觉 */
transform: scale(1.08);
}
100% {
transform: scale(1);
}
}
.buttons-father {
margin: 30rpx 0;
text-align: center;
position: relative;
}
.biga-img {
position: absolute;
right: -15rpx;
top: 50%;
transform: translateY(-50%);
width: 28rpx;
height: 28rpx;
}
.status-button {
color: #fff;
width: 120rpx;
height: 50rpx;
border-radius: 30rpx;
display: flex;
justify-content: center;
align-items: center;
background-color: #47ADF5;
}
.bottom-father {
width: 100%;
padding-left: 160rpx;
padding-top: 50rpx;
.status-font {
font-weight: 600;
font-size: 38rpx;
margin-top: 20rpx;
}
.status-time {
color: #666666;
margin-top: 20rpx;
}
}
.donghua-number {
position: absolute;
right: 1010rpx;
top: 265rpx;
z-index: 3;
font-size: 35rpx;
font-weight: 600;
}
.water-donghua-number {
position: absolute;
right: 980rpx;
top: 285rpx;
z-index: 3;
font-size: 32rpx;
font-weight: 600;
}
/* 拟态框 固定尺寸 + 阴影样式 + 相对定位于 wrapper */
.neuro-box {
position: absolute;
left: 700rpx;
top: 500rpx;
width: 400rpx;
height: 270rpx;
border-radius: 30rpx;
background-color: #fff;
display: flex;
flex-direction: column;
align-items: center;
z-index: 1;
padding: 0 10%;
z-index: 999;
}
.neuro-box-chaobiao {
position: absolute;
left: 700rpx;
top: 680rpx;
width: 400rpx;
height: 270rpx;
border-radius: 30rpx;
background-color: #fff;
display: flex;
flex-direction: column;
align-items: center;
z-index: 1;
padding: 0 10%;
z-index: 999;
}
.neuro-box-lazha {
position: absolute;
right: 300rpx;
top: 600rpx;
width: 400rpx;
height: 270rpx;
border-radius: 30rpx;
background-color: #fff;
display: flex;
flex-direction: column;
align-items: center;
z-index: 1;
padding: 0 10%;
z-index: 999;
}
.neuro-box-baoxiu {
position: absolute;
right: 300rpx;
top: 770rpx;
width: 400rpx;
height: 270rpx;
border-radius: 30rpx;
background-color: #fff;
display: flex;
flex-direction: column;
align-items: center;
z-index: 1;
padding: 0 10%;
z-index: 999;
}
.button {
width: 40%;
background-color: #ddf0ff;
display: flex;
justify-content: center;
align-items: center;
color: #007CFF;
border: 1rpx solid #007CFF;
font-size: 25rpx;
border-radius: 30rpx;
}
.card-font {
margin-top: 70rpx;
width: 600rpx;
justify-content: center;
display: flex;
}
.button-white {
width: 40%;
border: 2rpx solid #c3cacd;
background: linear-gradient(to bottom, #f3f3f5, #dee4e9);
display: flex;
justify-content: center;
align-items: center;
font-size: 25rpx;
border-radius: 30rpx;
}
.button-father {
position: absolute;
bottom: 60rpx;
left: 50%;
transform: translateX(-50%);
width: 100%;
height: 60rpx;
display: flex;
justify-content: space-around;
padding: 0 50rpx;
}
.zhezhao {
position: fixed;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
z-index: 5;
}
.zhongjian-shu {
background-color: #E1E4E6;
width: 3rpx;
height: 70%;
margin: auto 70rpx;
}
.wendu-juzhong {
position: absolute;
top: 270rpx;
right: 900rpx;
width: 270rpx;
height: 270rpx;
z-index: 1;
display: flex;
align-items: flex-end;
flex-direction: column;
.wendu-top {
display: flex;
align-items: center;
justify-content: flex-end;
height: 140rpx;
// background-color: red;
width: 100%;
.wendu-top-left {
font-size: 110rpx;
font-weight: 600;
}
.wendu-top-right {
font-size: 45rpx;
font-weight: 600;
// height: 100%;
width: 80rpx;
}
}
.wendu-heng {
width: 80%;
height: 2rpx;
margin: 20rpx auto;
background-color: #333333;
}
.wendu-bottom {
width: 100%;
font-size: 45rpx;
font-weight: 600;
padding-right: 50rpx;
display: flex;
justify-content: flex-end;
}
}
.gray-bgc {
background-color: #E8E9ED;
padding: 10rpx 30rpx;
font-size: 30rpx;
border-radius: 15rpx;
margin-top: 15rpx;
}
</style>