New file |
| | |
| | | import {ref} from "vue"; |
| | | |
| | | /** |
| | | * websocketå
¬ç¨æ¹æ³ |
| | | */ |
| | | const socket = ()=>{ |
| | | let timer = null; |
| | | let ws = null; |
| | | let isConnect = ref(false); |
| | | let count = 0; |
| | | |
| | | // WebSocketè¿æ¥ |
| | | const connectWebsocket = (url) => { |
| | | if (count > 5) { |
| | | connectError() |
| | | return |
| | | } |
| | | try { // æ£å¨å»ºç«è¿æ¥ |
| | | ws = new WebSocket(URL) |
| | | initWebSocket() // åå§åWebSocketè¿æ¥ |
| | | } catch { // 建ç«è¿æ¥åºéï¼éæ°è¿æ¥ |
| | | connect() |
| | | } |
| | | } |
| | | |
| | | // éæ°è¿æ¥WebSocket |
| | | const connect = ()=>{ |
| | | if(isConnect.value) return |
| | | console.info('å°è¯éæ°è¿æ¥WebSocket'); |
| | | if(timer) clearTimeout(timer) |
| | | timer = setTimeout(()=>{ |
| | | count++; |
| | | connectWebsocket() |
| | | }, 5000); |
| | | } |
| | | |
| | | // åå§åWebSocketè¿æ¥ |
| | | const initWebSocket = ()=>{ |
| | | ws.onopen = function () { // WebSocketè¿æ¥æå |
| | | isConnect.value = true; |
| | | console.success('WebSocketè¿æ¥æå') |
| | | } |
| | | ws.onerror = function () { // WebSocketè¿æ¥åçé误 |
| | | isConnect = false; |
| | | connect() |
| | | console.error('WebSocketè¿æ¥åçé误,æ£å¨å°è¯éæ°è¿æ¥') |
| | | } |
| | | ws.onclose = function (e) { // å·²å
³éWebSocketè¿æ¥ |
| | | isConnect.value = false |
| | | console.warn('å·²å
³éWebSocketè¿æ¥') |
| | | } |
| | | ws.onmessage = function (data) { // æ¥æ¶å°æå¡ç«¯åéçæ°æ® |
| | | receive(data) |
| | | } |
| | | } |
| | | |
| | | const connectError = () => { |
| | | console.log('WebSocketè¿æ¥å¤±è´¥') |
| | | clearTimeout(timer) |
| | | } |
| | | |
| | | |
| | | return { |
| | | ws, |
| | | connectWebsocket, |
| | | }; |
| | | }; |
| | | export default socket; |
| | |
| | | justify-content: center; |
| | | align-items: center; |
| | | } |
| | | |
| | | .el-overlay.high-level-dialog { |
| | | z-index: 9990 !important; |
| | | } |
| | | .el-dialog.center-dialog { |
| | | background-color: transparent; |
| | | } |
| | | .el-dialog.center-dialog .el-dialog__header { |
| | | padding-top: 8px; |
| | | padding-bottom: 8px; |
| | | background-color: #0b388a; |
| | | margin-right: 0; |
| | | } |
| | | .el-dialog.center-dialog .el-dialog__header .el-dialog__title { |
| | | font-weight: bold; |
| | | font-size: 14px; |
| | | color: #ffffff; |
| | | } |
| | | |
| | | .el-dialog.center-dialog .el-dialog__body { |
| | | padding: 0; |
| | | } |
| | | |
| | | .el-dialog.center-dialog .el-dialog__header .el-dialog__headerbtn { |
| | | top: 12px; |
| | | right: 8px; |
| | | width: auto; |
| | | height: auto; |
| | | } |
| | |
| | | <script setup> |
| | | import {computed, onMounted} from "vue"; |
| | | import {computed} from "vue"; |
| | | |
| | | const props = defineProps({ |
| | | visible: { |
| | |
| | | type: Object, |
| | | default() { |
| | | return { |
| | | num: 99, |
| | | tmp: 0, |
| | | hum: 0, |
| | | diff: 0 |
| | |
| | | } |
| | | }); |
| | | |
| | | const emits = defineEmits(["click"]); |
| | | |
| | | const handleClick = ()=>{ |
| | | emits('click', props.info); |
| | | } |
| | | |
| | | const posStyle = computed(()=>{ |
| | | return { |
| | | left: props.x*props.cWidth/props.dWidth+'px', |
| | | top: props.y*props.cHeight/props.dHeight+'px' |
| | | } |
| | | }); |
| | | |
| | | </script> |
| | | |
| | | <template> |
| | | <div class="map-pin" :style="posStyle"> |
| | | <div class="map-pin-wrapper"> |
| | | <el-tooltip placement="top" :visible="visible"> |
| | | <template #content> |
| | | <div class="home-info name">{{name}}</div> |
| | |
| | | <div class="home-info">湿度ï¼{{ info.hum }} %RH</div> |
| | | <div class="home-info">åå·®ï¼{{ info.diff }} Pa</div> |
| | | </template> |
| | | <div class="map-pin-content"> |
| | | <div class="map-pin-content" @click="handleClick"> |
| | | <div class="pin"></div> |
| | | <div class="pulse"></div> |
| | | </div> |
| | | </el-tooltip> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | |
| | | <style lang="less" scoped> |
| | | @size: 24px; |
| | | .map-pin-wrapper { |
| | | position: relative; |
| | | z-index: 0; |
| | | } |
| | | .map-pin { |
| | | position: absolute; |
| | | cursor: pointer; |
| | | z-index: 1; |
| | | .map-pin-content { |
| | | position: relative; |
| | | top: -@size - @size*0.1; |
New file |
| | |
| | | <script setup> |
| | | import image5 from "@/views/home/images/è´¨æ§å®¤.jpg"; |
| | | |
| | | const props = defineProps({ |
| | | info: { |
| | | type: Object, |
| | | default() { |
| | | return { |
| | | num: 99, |
| | | name: "", |
| | | img: { |
| | | src: "", |
| | | width: 100, |
| | | height: 100 |
| | | } |
| | | } |
| | | } |
| | | } |
| | | }); |
| | | </script> |
| | | |
| | | <template> |
| | | <div class="home-detail"> |
| | | <div class="home-detail-img"> |
| | | <img :src="info.img.src" alt=""/> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | |
| | | <style lang="less" scoped> |
| | | .home-detail { |
| | | width: 600px; |
| | | text-align: center; |
| | | background-color: #ffffff; |
| | | } |
| | | .home-detail-img { |
| | | display: inline-block; |
| | | width: 500px; |
| | | img { |
| | | height: auto; |
| | | width: 100%; |
| | | } |
| | | } |
| | | </style> |
| | |
| | | import slideMenu from "@/views/mainLayout/js/slideMenu"; |
| | | import homeContentModule from "@/views/home/js/homeContentModule"; |
| | | import homeInfoModule from "@/views/home/js/homeInfoModule"; |
| | | import homeDetailModule from "@/views/home/js/homeDetailModule"; |
| | | import HomeDetail from "@/views/home/components/homeDetail.vue"; |
| | | import {ElMessage} from "element-plus"; |
| | | |
| | | const isShowMapPin = ref(true); |
| | | |
| | |
| | | } = homeContentModule(); |
| | | |
| | | const {homeInfo} = homeInfoModule(); |
| | | const {getHomeDetailInfo} = homeDetailModule(); |
| | | const homeItemDialog = ref(false); |
| | | const homeDetailInfo = ref({}); |
| | | const handleClick = (info)=>{ |
| | | let rs = getHomeDetailInfo(info.num); |
| | | if(rs.code === 1) { |
| | | homeDetailInfo.value = rs.data; |
| | | homeItemDialog.value = true; |
| | | }else { |
| | | ElMessage(rs.msg); |
| | | } |
| | | |
| | | } |
| | | |
| | | watch(isCollapse, ()=>{ |
| | | isShowMapPin.value = false; |
| | |
| | | :c-width="cWidth" :c-height="cHeight" |
| | | :d-width="dWidth" :d-height="dHeight" |
| | | :x="item.pos.x" :y="item.pos.y" |
| | | :info="item.info"></map-pin> |
| | | <div class="card-box-list"> |
| | | :info="item.info" @click="handleClick"></map-pin> |
| | | <el-dialog |
| | | v-model="homeItemDialog" |
| | | title="æºæ¿è¯¦æ
" |
| | | width="auto" |
| | | class="center-dialog" |
| | | modal-class="high-level-dialog" |
| | | align-center> |
| | | <home-detail :info="homeDetailInfo"></home-detail> |
| | | </el-dialog> |
| | | </div> |
| | | |
| | | </div> |
| | | </div> |
| | | </template> |
| | | |
| | | <style scoped> |
New file |
| | |
| | | import image1 from "../images/æåºæ©å¢å®¤.jpg"; |
| | | import image2 from "../images/æ ·åå¶å¤å®¤.jpg"; |
| | | import image3 from "../images/æµåºå®¤.jpg"; |
| | | import image4 from "../images/è¯å室.jpg"; |
| | | import image5 from "../images/è´¨æ§å®¤.jpg"; |
| | | import {reactive} from "vue"; |
| | | const homeDetailModule = ()=>{ |
| | | const homeInfos = [ |
| | | { |
| | | num: 1, |
| | | name: "æåºæ©å¢å®¤", |
| | | img: { |
| | | src: image1, |
| | | width: 799, |
| | | height: 1356 |
| | | } |
| | | }, |
| | | { |
| | | num: 2, |
| | | name: "æ ·åå¶å¤å®¤", |
| | | img: { |
| | | src: image2, |
| | | width: 1656, |
| | | height: 1280 |
| | | } |
| | | }, |
| | | { |
| | | num: 3, |
| | | name: "æµåºå®¤", |
| | | img: { |
| | | src: image3, |
| | | width: 1446, |
| | | height: 1280 |
| | | } |
| | | }, |
| | | { |
| | | num: 4, |
| | | name: "è¯å室", |
| | | img: { |
| | | src: image4, |
| | | width: 1406, |
| | | height: 1280 |
| | | } |
| | | }, |
| | | { |
| | | num: 5, |
| | | name: "è´¨æ§å®¤", |
| | | img: { |
| | | src: image5, |
| | | width: 799, |
| | | height: 1356 |
| | | } |
| | | }, |
| | | ]; |
| | | |
| | | const getHomeDetailInfo = (num)=>{ |
| | | let rs = { |
| | | code: 0, |
| | | data: {}, |
| | | msg: "æªæ¾å°å¯¹åºæºæ¿ä¿¡æ¯" |
| | | }; |
| | | |
| | | for(let i=0; i<homeInfos.length; i++) { |
| | | let item = homeInfos[i]; |
| | | if(item.num === num) { |
| | | rs.code = 1; |
| | | rs.data = item; |
| | | rs.msg = "åå¨ä¿¡æ¯"; |
| | | break; |
| | | } |
| | | } |
| | | return rs; |
| | | } |
| | | |
| | | return { |
| | | getHomeDetailInfo |
| | | }; |
| | | } |
| | | |
| | | export default homeDetailModule; |
| | |
| | | y: 690 |
| | | }, |
| | | info: { |
| | | num: 99, |
| | | tmp: 10, |
| | | hum: 0, |
| | | diff: 0 |
| | |
| | | y: 690 |
| | | }, |
| | | info: { |
| | | num: 99, |
| | | tmp: 0, |
| | | hum: 0, |
| | | diff: 0 |
| | |
| | | y: 690 |
| | | }, |
| | | info: { |
| | | num: 3, |
| | | tmp: 0, |
| | | hum: 0, |
| | | diff: 0 |
| | |
| | | y: 690 |
| | | }, |
| | | info: { |
| | | num: 5, |
| | | tmp: 0, |
| | | hum: 0, |
| | | diff: 0 |
| | |
| | | y: 650 |
| | | }, |
| | | info: { |
| | | num: 1, |
| | | tmp: 0, |
| | | hum: 0, |
| | | diff: 0 |
| | |
| | | y: 337 |
| | | }, |
| | | info: { |
| | | num: 99, |
| | | tmp: 0, |
| | | hum: 0, |
| | | diff: 0 |
| | |
| | | y: 355 |
| | | }, |
| | | info: { |
| | | num: 4, |
| | | tmp: 0, |
| | | hum: 0, |
| | | diff: 0 |
| | |
| | | y: 378 |
| | | }, |
| | | info: { |
| | | num: 99, |
| | | tmp: 0, |
| | | hum: 0, |
| | | diff: 0 |
| | |
| | | type: Object, |
| | | default() { |
| | | return { |
| | | ip: "192.168.10.6", |
| | | ip: "192.168.10.5", |
| | | port: 80, |
| | | username: "admin", |
| | | password: "a123456789" |
| | |
| | | |
| | | onMounted(()=>{ |
| | | videoInitPlugin(()=>{ |
| | | clickLogin(props.companyVideoData); |
| | | //clickLogin(props.companyVideoData); |
| | | }); |
| | | }); |
| | | |