From 2b89158d7bf80f2c9a8a4203b4837de92837e7ca Mon Sep 17 00:00:00 2001
From: admin <344137771@qq.com>
Date: Mon, 19 Jan 2026 13:52:48 +0800
Subject: [PATCH] 1

---
 src/components/stock-list.vue |  140 ++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 115 insertions(+), 25 deletions(-)

diff --git a/src/components/stock-list.vue b/src/components/stock-list.vue
index 03e8878..27ef13a 100644
--- a/src/components/stock-list.vue
+++ b/src/components/stock-list.vue
@@ -6,7 +6,12 @@
       <van-col span="8" class="flex-end head_item">{{ $t("Change") }}</van-col>
     </van-row>
 
-    <van-row class="markets_item" v-for="item in stockList" :key="item.id" @click="toDetails(item)">
+    <van-row
+      class="markets_item"
+      v-for="item in stockList"
+      :key="item.id"
+      @click="toDetails(item)"
+    >
       <van-col span="12" class="item_n">
         <div class="flex-start">
           <span class="i_icon">{{ item.stock_type }}</span>
@@ -17,25 +22,43 @@
       <van-col span="4" class="flex-start item_n">{{ item.nowPrice }}</van-col>
 
       <van-col span="8" class="item_n">
-        <div class="flex-end" style="margin-bottom: .15em;" :class="{ red: item.hcrate < 0, green: item.hcrate > 0 }">
+        <div
+          class="flex-end"
+          style="margin-bottom: .15em;"
+          :class="{ red: item.hcrate < 0, green: item.hcrate > 0 }"
+        >
           {{ item.hcrate }}
         </div>
-        <div class="flex-end" :class="{ red: item.hcrate < 0, green: item.hcrate > 0 }">
+        <div
+          class="flex-end"
+          :class="{ red: item.hcrate < 0, green: item.hcrate > 0 }"
+        >
           {{ item.hcrateP }}
         </div>
       </van-col>
 
-      <div class="edit flex-end" v-show="editorShow" @click.stop="deleteStock(item)">
+      <div
+        class="edit flex-end"
+        v-show="editorShow"
+        @click.stop="deleteStock(item)"
+      >
         <span>{{ $t("移除") }}</span>
       </div>
     </van-row>
 
     <!-- 无数据时显示 -->
-    <div class="no_data flex-center" v-show="!stockList || stockList.length == 0">
+    <div
+      class="no_data flex-center"
+      v-show="!stockList || stockList.length == 0"
+    >
       <img src="@/assets/img/zhaobudao2.png" alt="" />
     </div>
 
-    <n-pagination :pageNo.sync="pageNum" :pageSize="pageSize" :total="total"></n-pagination>
+    <n-pagination
+      :pageNo.sync="pageNum"
+      :pageSize="pageSize"
+      :total="total"
+    ></n-pagination>
   </div>
 </template>
 
@@ -54,7 +77,8 @@
       pageNum: 1,
       pageSize: 10,
       total: 1,
-      stockList: []
+      stockList: [],
+      premarketTimer: null // 盘前数据轮询定时器
     };
   },
   props: {
@@ -78,9 +102,16 @@
   watch: {
     propOption: {
       handler(val) {
+        // 根据当前股票类型连接对应的ws
+        if (val.stockType == "US")
+          this.initWebSocket("wss://ws.sceazy.com/websocket-server");
+        else this.initWebSocket("wss://ws.jafco1.cc/websocket-server");
+
         this.pageNum = 1;
         this.getStockList();
-      }
+      },
+      deep: true,
+      immediate: true
     },
     pageNum: {
       handler(val) {
@@ -91,7 +122,9 @@
   },
   mounted() {
     this.getStockList();
-    this.initWebSocket();
+    // this.initWebSocket();
+    this.getPremarketStock();
+    this.startPremarketPolling();
   },
   methods: {
     // 获取数据
@@ -110,6 +143,51 @@
       let data = await this.listApi(opt);
       this.stockList = data.data.list;
       this.total = data.data.total || 1;
+      // 列表更新后,重新应用盘前数据(如果轮询已启动)
+      if (this.premarketTimer) {
+        this.getPremarketStock();
+      }
+    },
+    // 获取后台设置的盘前数据
+    async getPremarketStock() {
+      try {
+        let data = await api.getPremarketStock({});
+        if (data.status === 0) {
+          let list = data.data || [];
+          // 通过code匹配,更新stockList中的nowPrice
+          list.forEach((premarketItem) => {
+            const stockItem = this.stockList.find(
+              (item) => item.code === premarketItem.code
+            );
+            if (stockItem && premarketItem.price) {
+              // 更新价格
+              stockItem.nowPrice = premarketItem.price;
+              stockItem.hcrate = premarketItem.hcrate;
+              stockItem.hcrateP = premarketItem.hcrateP;
+              // 标记该价格已被盘前数据更新,防止WebSocket覆盖
+              this.$set(stockItem, 'isPremarketUpdated', true);
+            }
+          });
+        }
+      } catch (error) {
+        console.error('获取盘前数据失败:', error);
+      }
+    },
+    // 启动盘前数据轮询
+    startPremarketPolling() {
+      // 清除已有定时器
+      this.stopPremarketPolling();
+      // 每3秒轮询一次(可根据需要调整间隔)
+      this.premarketTimer = setInterval(() => {
+        this.getPremarketStock();
+      }, 3000);
+    },
+    // 停止盘前数据轮询
+    stopPremarketPolling() {
+      if (this.premarketTimer) {
+        clearInterval(this.premarketTimer);
+        this.premarketTimer = null;
+      }
     },
     // 点击进入详情
     toDetails(item) {
@@ -142,11 +220,14 @@
       }
     },
     // 连接ws实时监控变动
-    initWebSocket() {
+    initWebSocket(url) {
       console.log("initWebSocket");
+      if (this.Trade) {
+        this.Trade.close();
+      }
       this.Trade = new WhrWebSocket({
-        path: `wss://ws.kuspitai.com/websocket-server `,
-        onmessage: this.getTradeMessage,
+        path: url,
+        onmessage: this.getTradeMessage
       });
 
       this.Trade.init();
@@ -154,20 +235,27 @@
     getTradeMessage({ data }) {
       let result = JSON.parse(data);
       let pid = result.pid;
-      let userToUpdate = this.stockList.find((item) => item.code == pid);
+      let userToUpdate = this.stockList.find(item => item.code == pid);
       if (userToUpdate) {
-        // 更新对象数据
-        userToUpdate.nowPrice = result.last;
-        userToUpdate.hcrateP = result.pcp;
+        // 如果该股票的价格已被盘前数据更新,则不再通过WebSocket覆盖
+        if (!userToUpdate.isPremarketUpdated) {
+          // 更新对象数据
+          userToUpdate.nowPrice = result.last;
+          userToUpdate.hcrateP = result.pcp;
+          userToUpdate.hcrate = result.pc;
+        }
       }
-    },
-  },
-  beforeDestroy() {
-    if (this.Trade) {
-      this.Trade.close();
-      console.log('WebSocket disconnected');
     }
   },
+  beforeDestroy() {
+    // 清除WebSocket连接
+    if (this.Trade) {
+      this.Trade.close();
+      console.log("WebSocket disconnected");
+    }
+    // 清除盘前数据轮询定时器
+    this.stopPremarketPolling();
+  }
 };
 </script>
 
@@ -232,9 +320,11 @@
       position: absolute;
       top: 0;
       left: 0;
-      background: linear-gradient(to right,
-          rgba(0, 0, 0, 0),
-          rgba(0, 0, 0, 0.8));
+      background: linear-gradient(
+        to right,
+        rgba(0, 0, 0, 0),
+        rgba(0, 0, 0, 0.8)
+      );
       text-align: end;
       color: @red;
       padding-right: 0.25em;

--
Gitblit v1.9.3