From 6c75516f1ba668873807cef33aa996d25cdf16c4 Mon Sep 17 00:00:00 2001
From: riku <risaku@163.com>
Date: 星期二, 13 五月 2025 17:43:06 +0800
Subject: [PATCH] 新增动态溯源异常更新列表

---
 src/views/sourcetrace/SourceTrace.vue   |   82 +++++++++++++++++++++++++++
 src/views/historymode/HistoryMode.vue   |    4 +
 src/api/index.js                        |   36 +----------
 src/views/realtimemode/RealtimeMode.vue |    4 +
 4 files changed, 92 insertions(+), 34 deletions(-)

diff --git a/src/api/index.js b/src/api/index.js
index 559cc74..20d329d 100644
--- a/src/api/index.js
+++ b/src/api/index.js
@@ -4,14 +4,17 @@
 const debug = true;
 
 let ip1 = 'http://47.100.191.150:9029/';
+let ws = `47.100.191.150:9030`;
 // console.log(import.meta.env);
 if (import.meta.env.VITE_DATA_MODE == 'jingan') {
   ip1 = 'http://114.215.109.124:8805/';
+  ws = `114.215.109.124:9030`;
 }
 
 if (debug) {
   ip1 = 'http://192.168.0.110:8084/';
   // ip1 = 'http://locahost:8084/';
+  ws = `192.168.0.110:9030`;
 }
 
 const $http = axios.create({
@@ -94,40 +97,9 @@
   );
 });
 
-// const $http = {
-//   get(url) {
-//     const controller = new AbortController();
-//     return {
-//       con: controller,
-//       resp: axiosInstance.get(url, { signal: controller.signal })
-//     };
-//   },
-//   put(url, data) {
-//     const controller = new AbortController();
-//     return {
-//       con: controller,
-//       resp: axiosInstance.put(url, data, { signal: controller.signal })
-//     };
-//   },
-//   post(url, data) {
-//     const controller = new AbortController();
-//     return {
-//       con: controller,
-//       resp: axiosInstance.post(url, data, { signal: controller.signal })
-//     };
-//   },
-//   delete(url) {
-//     const controller = new AbortController();
-//     return {
-//       con: controller,
-//       resp: axiosInstance.delete(url, { signal: controller.signal })
-//     };
-//   }
-// };
-
 function resToData(res) {
   res.resp = res.resp.then((res) => res.data);
   return res;
 }
 
-export { $http, resToData };
+export { $http, resToData, ws };
diff --git a/src/views/historymode/HistoryMode.vue b/src/views/historymode/HistoryMode.vue
index 10673f9..f46d807 100644
--- a/src/views/historymode/HistoryMode.vue
+++ b/src/views/historymode/HistoryMode.vue
@@ -28,6 +28,7 @@
         :factor="factorDatas.factor[factorType]"
         @change="handleLegendTypeChange"
       ></FactorLegend>
+      <SourceTrace></SourceTrace>
     </el-row>
     <el-row class="historical" justify="center">
       <HistoricalTrajectory
@@ -69,6 +70,7 @@
 import { FactorDatas } from '@/model/FactorDatas';
 import TrendAnalysis from './component/TrendAnalysis.vue';
 import DataSheet from './component/DataSheet.vue';
+import SourceTrace from '@/views/sourcetrace/SourceTrace.vue';
 import { ElMessage } from 'element-plus';
 import { fetchHistoryData } from '@/utils/factor/data';
 import dataAnalysisApi from '@/api/dataAnalysisApi';
@@ -76,7 +78,7 @@
 import { useSceneStore } from '@/stores/scene';
 
 export default {
-  components: { TrendAnalysis, DataSheet },
+  components: { TrendAnalysis, DataSheet, SourceTrace },
   setup() {
     // 闄愬畾鍒嗛〉鏁版嵁閲忎负10000
     const { loading, fetchData } = useFetchData(10000);
diff --git a/src/views/realtimemode/RealtimeMode.vue b/src/views/realtimemode/RealtimeMode.vue
index 240930d..af30d78 100644
--- a/src/views/realtimemode/RealtimeMode.vue
+++ b/src/views/realtimemode/RealtimeMode.vue
@@ -14,6 +14,7 @@
         class="m-t-2"
         :factor="factorDatas.factor[factorType]"
       ></FactorLegend>
+      <!-- <SourceTrace></SourceTrace> -->
     </el-row>
     <DashBoard class="dash-board" :factor-datas="factorDatas"></DashBoard>
     <RealTimeTrend
@@ -34,6 +35,7 @@
 import DashBoard from './component/DashBoard.vue';
 import RealTimeTrend from './component/RealTimeTrend.vue';
 import DeviceChange from './component/DeviceChange.vue';
+import SourceTrace from '@/views/sourcetrace/SourceTrace.vue';
 import { realTimeMapAnimation } from '@/utils/map/animation';
 import {
   fetchHistoryData,
@@ -45,7 +47,7 @@
 // const mapAnimation = new MapAnimation();
 
 export default {
-  components: { DashBoard, RealTimeTrend, DeviceChange },
+  components: { DashBoard, RealTimeTrend, DeviceChange, SourceTrace },
   setup() {
     const { loading, fetchData } = useFetchData(10000);
     return { loading, fetchData };
diff --git a/src/views/sourcetrace/SourceTrace.vue b/src/views/sourcetrace/SourceTrace.vue
new file mode 100644
index 0000000..a58da81
--- /dev/null
+++ b/src/views/sourcetrace/SourceTrace.vue
@@ -0,0 +1,82 @@
+<template>
+  <BaseCard>
+    <template #content>
+      <div>
+        <el-input type="text" v-model="inputVal" />
+        <button @click="handleSend">send</button>
+        <button @click="handleLink">link</button>
+      </div>
+      <div>涓氬姟鐘舵�佷腑鎺�</div>
+      <el-scrollbar ref="scrollbarRef" :height="height">
+        <div ref="scrollContentRef">
+          <div v-for="(item, index) in streams" :key="index">
+            <el-text type="primary">[{{ item }}]: </el-text>
+          </div>
+        </div>
+      </el-scrollbar>
+    </template>
+  </BaseCard>
+</template>
+<script setup>
+import { reactive, ref, onMounted, onUnmounted, inject } from 'vue';
+import { ws } from '@/api/index';
+
+const height = `60vh`;
+
+const scrollContentRef = ref();
+const scrollbarRef = ref();
+
+function scrollToBottom() {
+  const h1 = scrollContentRef.value.clientHeight + 100;
+  setTimeout(() => {
+    scrollbarRef.value.setScrollTop(h1);
+  }, 100);
+}
+
+const streams = reactive([]);
+
+let socket;
+
+const inputVal = ref('');
+const handleSend = () => {
+  if (socket) {
+    socket.send(inputVal.value);
+  }
+};
+
+const handleLink = () => {
+  if (socket) {
+    socket.close();
+  }
+  const url = 'ws://' + ws + '/ws';
+  // socket = new WebSocket(`ws://192.168.0.138:8080/workstream`)
+  socket = new WebSocket(url);
+  // 涓庢湇鍔″櫒寤虹珛杩炴帴锛氬彂閫佹秷鎭埌鏈嶅姟鍣�
+  socket.onopen = () => {
+    console.log('connect: ');
+  };
+  // 鏀跺埌鏈嶅姟鍣ㄥ彂閫佺殑娑堟伅锛歟vent澶勭悊鏈嶅姟鍣ㄨ繑鍥炵殑鏁版嵁
+  socket.onmessage = (event) => {
+    console.log('receive: ', event.data);
+    putWorkStream(event.data);
+  };
+  // 杩炴帴鎴栭�氫俊杩囩▼涓彂鐢熼敊璇�
+  socket.onerror = (event) => {
+    console.log('errror: ', event);
+  };
+  // 涓庢湇鍔″櫒鏂紑杩炴帴
+  socket.onclose = (event) => {
+    console.log('close: ', event.code);
+  };
+};
+
+/**
+ * 娣诲姞涓�鏉″伐浣滄祦淇℃伅
+ * @param {*} data
+ */
+function putWorkStream(data) {
+  const obj = JSON.parse(data);
+  streams.push(obj);
+  scrollToBottom();
+}
+</script>

--
Gitblit v1.9.3