From 66bae94879a1ef44abe28833627564086d74ee13 Mon Sep 17 00:00:00 2001
From: longyvfengyun <496960745@qq.com>
Date: 星期一, 21 八月 2023 10:19:27 +0800
Subject: [PATCH] 内容提交

---
 .env.development                          |    1 
 src/assets/js/tools/websocket/getWsUrl.js |   25 ++++
 src/views/home/index.vue                  |    6 
 src/views/home/components/homeDetail.vue  |   35 +++++
 src/main.js                               |    7 +
 src/views/home/js/homeInfoModule.js       |  103 ++++++++++++++++
 .env.production                           |    1 
 src/assets/js/tools/websocket/createWs.js |  121 ++++++++++++++++++++
 src/views/video/components/hkVideo.vue    |    5 
 9 files changed, 295 insertions(+), 9 deletions(-)

diff --git a/.env.development b/.env.development
new file mode 100644
index 0000000..e893d4c
--- /dev/null
+++ b/.env.development
@@ -0,0 +1 @@
+VITE_APP_ENV="dev"
diff --git a/.env.production b/.env.production
new file mode 100644
index 0000000..091f0e6
--- /dev/null
+++ b/.env.production
@@ -0,0 +1 @@
+VITE_APP_ENV="prod"
diff --git a/src/assets/js/tools/websocket/createWs.js b/src/assets/js/tools/websocket/createWs.js
new file mode 100644
index 0000000..82f5a81
--- /dev/null
+++ b/src/assets/js/tools/websocket/createWs.js
@@ -0,0 +1,121 @@
+import getWsUrl from "./getWsUrl";
+import {computed, onMounted, onUnmounted, ref} from "vue";
+
+const createWs = (url)=>{
+  const wsUri = getWsUrl(url);
+  // 閲嶈繛鏃堕棿闂撮殧 榛樿10绉�
+  const reConnectDelay = 10 * 1000;
+  let timer = null;
+  let SOCKET = ref(null);
+
+  // 鎵撳紑閾炬帴
+  const openSocket = ()=>{
+    // 鍒濆鍖朩ebSocket 濡傛灉宸茬粡鍒濆鍖� 鍒欎粈涔堥兘涓嶅仛
+    if (SOCKET.value) {
+      return false;
+    }
+    WSClose();
+    WSInit();
+  }
+
+  const WSInit = ()=>{
+    console.log(isWSOpen);
+    // 鏈鍒濆鍖栧垵濮嬪寲
+    if (!isWSOpen.value) {
+      console.log('=====WSinit, url:', wsUri);
+      SOCKET.value = new WebSocket(wsUri);
+      SOCKET.value.onmessage = onWSMessage;
+      SOCKET.value.onopen = onWSOpen;
+      SOCKET.value.onerror = onWSError;
+      SOCKET.value.onclose = WSClose;
+    }
+  }
+
+  const onWSOpen = ()=>{
+  }
+
+  const onWSMessage = ()=>{
+  }
+
+  const onWSError = (Event)=>{
+    console.log('閾炬帴澶辫触', wsUri);
+    WSClose(Event);
+  }
+
+  const WSClose = (Event)=>{
+    if (SOCKET.value) {
+      switch (SOCKET.value.readyState) {
+        case 0:
+          SOCKET.value.onopen = () => {
+            SOCKET.value.close();
+            console.log('閾炬帴鍏抽棴', wsUri, 'close浜嬩欢瀵硅薄:', Event);
+            SOCKET.value = null;
+            // 娌℃湁event瀵硅薄 鍒欎负鎵嬪姩鍏抽棴
+            if (Event) {
+              reConnect();
+            }
+          }
+          break;
+        case 1:
+          SOCKET.value.close();
+          console.log('閾炬帴鍏抽棴', wsUri, 'close浜嬩欢瀵硅薄:', Event);
+          SOCKET.value = null;
+          // 娌℃湁event瀵硅薄 鍒欎负鎵嬪姩鍏抽棴
+          if (Event) {
+            reConnect();
+          }
+          break;
+        case 2:
+          SOCKET.value.onclose = () => {
+            console.log('閾炬帴鍏抽棴', wsUri, 'close浜嬩欢瀵硅薄:', Event);
+            SOCKET.value = null;
+            // 娌℃湁event瀵硅薄 鍒欎负鎵嬪姩鍏抽棴
+            if (Event) {
+              reConnect();
+            }
+          }
+          break;
+        case 3:
+          console.log('閾炬帴鍏抽棴', wsUri, 'close浜嬩欢瀵硅薄:', Event);
+          SOCKET.value = null;
+          // 娌℃湁event瀵硅薄 鍒欎负鎵嬪姩鍏抽棴
+          if (Event) {
+            reConnect();
+          }
+          break;
+      }
+    }
+  }
+
+  // 閲嶈繛
+  const reConnect = ()=>{
+    // 閲嶈繛璁℃椂寮�濮� 灏变笉鍙﹂噸杩�
+    if (timer) {
+      return;
+    }
+    timer = setTimeout(() => {
+      timer = null;
+      WSInit();
+    }, reConnectDelay);
+  }
+
+  const isWSOpen= computed(()=>{
+    return SOCKET.value && 1 === SOCKET.value.readyState;
+  });
+
+  onMounted(()=>{
+    openSocket();
+  })
+
+  onUnmounted(()=>{
+    WSClose();
+  })
+
+  return {
+    SOCKET,
+    onWSOpen,
+    onWSMessage
+  };
+}
+
+export default createWs;
diff --git a/src/assets/js/tools/websocket/getWsUrl.js b/src/assets/js/tools/websocket/getWsUrl.js
new file mode 100644
index 0000000..5087429
--- /dev/null
+++ b/src/assets/js/tools/websocket/getWsUrl.js
@@ -0,0 +1,25 @@
+
+/**
+ * 鑾峰彇Websocket鐨勮繛鎺�
+ * @param action
+ * @returns {string}
+ */
+function getWsUrl(action, port) {
+  let env = import.meta.env.VITE_APP_ENV;
+  let _port = port ? port : 8101;
+  let hostname = window.location.hostname;
+  let wsProtocol = "ws://";
+  if(window.location.protocol == "https:") {
+    wsProtocol = "wss://";
+  }
+  if (env == 'dev') {
+    hostname = "localhost";
+  }else {
+    _port = window.location.port;
+  }
+  // 澶勭悊绔彛涓�80
+  _port = _port == 80?"":":"+_port;
+  return wsProtocol + hostname + _port + '/envir/' + action;
+}
+
+export default getWsUrl;
diff --git a/src/main.js b/src/main.js
index 23168d1..214d721 100644
--- a/src/main.js
+++ b/src/main.js
@@ -17,6 +17,13 @@
 
 const pinia = createPinia()
 
+// 瀵箃oFixed鏁板瓧淇濈暀浣嶆暟浜屾灏佽锛坧s锛歵oFixed杩斿洖鐨勬槸瀛楃涓诧級
+Number.prototype.toHold = function (value) {
+  let hold = this.toFixed(value);
+  hold = Number(hold);
+  return hold;
+};
+
 app.use(ElementPlus);
 app.use(router);
 app.use(pinia);
diff --git a/src/views/home/components/homeDetail.vue b/src/views/home/components/homeDetail.vue
index 9ca4d8a..78ac024 100644
--- a/src/views/home/components/homeDetail.vue
+++ b/src/views/home/components/homeDetail.vue
@@ -1,5 +1,5 @@
 <script setup>
-import image5 from "@/views/home/images/璐ㄦ帶瀹�.jpg";
+import MapPin from "@/components/MapPin.vue";
 
 const props = defineProps({
 	info: {
@@ -12,7 +12,19 @@
 					src: "",
 					width: 100,
 					height: 100
-				}
+				},
+				info: {}
+			}
+		}
+	},
+	vals: {
+		type: Object,
+		default() {
+			return {
+				diff: 0,
+				hum: 48.71,
+				num: 3,
+				tmp: 26.56
 			}
 		}
 	}
@@ -21,6 +33,12 @@
 
 <template>
 	<div class="home-detail">
+		<div class="vals-wrapper">
+			<div class="vals-name">{{info.name}}</div>
+			<div class="vals-item">娓╁害: {{vals.tmp}}鈩�</div>
+			<div class="vals-item">婀垮害: {{vals.hum}}%RH</div>
+			<div class="vals-item">鍘嬪樊: {{vals.diff}}Pa</div>
+		</div>
 		<div class="home-detail-img">
 			<img :src="info.img.src" alt=""/>
 		</div>
@@ -29,9 +47,22 @@
 
 <style lang="less" scoped>
 .home-detail {
+	position: relative;
 	width: 600px;
 	text-align: center;
 	background-color: #ffffff;
+	.vals-wrapper {
+		position: absolute;
+		top: 8px;
+		left: 8px;
+		text-align: left;
+		padding: 8px;
+		background-color: #303133;
+		color: #FFFFFF;
+		.vals-name {
+			text-align: center;
+		}
+	}
 }
 .home-detail-img {
 	display: inline-block;
diff --git a/src/views/home/index.vue b/src/views/home/index.vue
index 2e42cc5..b2f5b74 100644
--- a/src/views/home/index.vue
+++ b/src/views/home/index.vue
@@ -1,5 +1,5 @@
 <script setup>
-import {onMounted, onUnmounted, ref, watch} from "vue";
+import {onMounted, onUnmounted, ref, watch, nextTick} from "vue";
 import MapPin from "@/components/MapPin.vue";
 import slideMenu from "@/views/mainLayout/js/slideMenu";
 import homeContentModule from "@/views/home/js/homeContentModule";
@@ -25,10 +25,12 @@
 const {getHomeDetailInfo} = homeDetailModule();
 const homeItemDialog = ref(false);
 const homeDetailInfo = ref({});
+const homeVals = ref({});
 const handleClick = (info)=>{
 	let rs = getHomeDetailInfo(info.num);
 	if(rs.code === 1) {
 		homeDetailInfo.value = rs.data;
+		homeVals.value = info;
 		homeItemDialog.value = true;
 	}else {
 		ElMessage(rs.msg);
@@ -75,7 +77,7 @@
 			class="center-dialog"
 			modal-class="high-level-dialog"
 			align-center>
-			<home-detail :info="homeDetailInfo"></home-detail>
+			<home-detail :info="homeDetailInfo" :vals="homeVals"></home-detail>
 		</el-dialog>
 	</div>
 
diff --git a/src/views/home/js/homeInfoModule.js b/src/views/home/js/homeInfoModule.js
index 8029a38..e2b4096 100644
--- a/src/views/home/js/homeInfoModule.js
+++ b/src/views/home/js/homeInfoModule.js
@@ -1,6 +1,31 @@
-import {reactive} from "vue";
+import {onMounted, reactive} from "vue";
+import createWs from "@/assets/js/tools/websocket/createWs";
 
 const homeInfoModule = ()=>{
+  const {
+    SOCKET
+  } = createWs("homePageSocket");
+
+  const handleOpen = ()=>{};
+
+  const handleMessage = (res=>{
+    const rs = JSON.parse(res.data);
+    if(rs.code === 1 && rs.data) {
+      const data = rs.data2;
+      for(let i=0; i<data.length;i++) {
+        let iData = data[i];
+        for(let j=0; j<homeInfo.length; j++) {
+          let jData = homeInfo[j];
+          if(iData.roomName === jData.name && iData.devId === 220000001) {
+            jData.info.tmp = iData.envirState.devTemp.toHold(2);
+            jData.info.hum = iData.envirState.devHumid.toHold(2);
+            jData.info.diff = iData.envirState.devPresss.toHold(2);
+          }
+        }
+      }
+    }
+  });
+
   const homeInfo = reactive([
     {
       name: "鏁版嵁鏈烘埧",
@@ -14,7 +39,7 @@
       },
       info: {
         num: 99,
-        tmp: 10,
+        tmp: 0,
         hum: 0,
         diff: 0
       }
@@ -137,8 +162,82 @@
         hum: 0,
         diff: 0
       }
+    },
+    {
+      name: "搴撴埧",
+      temp: 0,
+      hum: 0,
+      diffPre: 0,
+      pos: {
+        visible: true,
+        x: 550,
+        y: 380
+      },
+      info: {
+        num: 99,
+        tmp: 0,
+        hum: 0,
+        diff: 0
+      }
+    },
+    {
+      name: "鐏弻瀹�",
+      temp: 0,
+      hum: 0,
+      diffPre: 0,
+      pos: {
+        visible: true,
+        x: 750,
+        y: 360
+      },
+      info: {
+        num: 99,
+        tmp: 0,
+        hum: 0,
+        diff: 0
+      }
+    },
+    {
+      name: "鐞嗗寲闂�",
+      temp: 0,
+      hum: 0,
+      diffPre: 0,
+      pos: {
+        visible: true,
+        x: 420,
+        y: 700
+      },
+      info: {
+        num: 99,
+        tmp: 0,
+        hum: 0,
+        diff: 0
+      }
+    },
+    {
+      name: "绌鸿皟鏈烘埧",
+      temp: 0,
+      hum: 0,
+      diffPre: 0,
+      pos: {
+        visible: true,
+        x: 420,
+        y: 1100
+      },
+      info: {
+        num: 99,
+        tmp: 0,
+        hum: 0,
+        diff: 0
+      }
     }
   ]);
+
+  onMounted(()=>{
+    SOCKET.value.addEventListener("open", handleOpen, false);
+    SOCKET.value.addEventListener("message", handleMessage, false);
+  });
+
   return {homeInfo};
 };
 export default homeInfoModule;
diff --git a/src/views/video/components/hkVideo.vue b/src/views/video/components/hkVideo.vue
index efb7d0d..249b0e3 100644
--- a/src/views/video/components/hkVideo.vue
+++ b/src/views/video/components/hkVideo.vue
@@ -6,7 +6,7 @@
 		type: Object,
 		default() {
 			return {
-				ip: "192.168.10.5",
+				ip: "192.168.10.10",
 				port: 80,
 				username: "admin",
 				password: "a123456789"
@@ -21,10 +21,9 @@
 	videoInitPlugin, clickLogin
 } = hkModule();
 
-
 onMounted(()=>{
 	videoInitPlugin(()=>{
-		//clickLogin(props.companyVideoData);
+		clickLogin(props.companyVideoData);
 	});
 });
 

--
Gitblit v1.9.1