Zhangbw 3 місяців тому
батько
коміт
bf0b0d569b

+ 4 - 0
dist/dev/mp-weixin/common/vendor.js

@@ -6790,7 +6790,9 @@ const createHook = (lifecycle) => (hook, target = getCurrentInstance()) => {
   !isInSSRComponentSetup && injectHook(lifecycle, hook, target);
 };
 const onShow = /* @__PURE__ */ createHook(ON_SHOW);
+const onHide = /* @__PURE__ */ createHook(ON_HIDE);
 const onLoad = /* @__PURE__ */ createHook(ON_LOAD);
+const onUnload = /* @__PURE__ */ createHook(ON_UNLOAD);
 exports._export_sfc = _export_sfc;
 exports.createSSRApp = createSSRApp;
 exports.e = e;
@@ -6798,9 +6800,11 @@ exports.f = f;
 exports.index = index;
 exports.n = n;
 exports.o = o;
+exports.onHide = onHide;
 exports.onLoad = onLoad;
 exports.onMounted = onMounted;
 exports.onShow = onShow;
+exports.onUnload = onUnload;
 exports.ref = ref;
 exports.resolveComponent = resolveComponent;
 exports.sr = sr;

+ 48 - 6
dist/dev/mp-weixin/pages/rank/rank.js

@@ -7,32 +7,39 @@ const _sfc_main = {
   setup(__props) {
     const isLoggedIn = common_vendor.ref(false);
     const myStocks = common_vendor.ref([]);
+    let refreshTimer = null;
     const loadMyStocks = async () => {
       if (!isLoggedIn.value) {
         myStocks.value = [];
+        stopAutoRefresh();
         return;
       }
       try {
         const stocks = common_vendor.index.getStorageSync("my_stocks") || [];
         myStocks.value = stocks;
         console.log("[我的股票] 加载股票列表:", stocks.length, "只");
-        if (stocks.length > 0) {
-          await refreshAllQuotes();
+        if (stocks.length === 0) {
+          stopAutoRefresh();
+          return;
         }
+        await refreshAllQuotes();
       } catch (e) {
         console.error("加载股票列表失败:", e);
         myStocks.value = [];
+        stopAutoRefresh();
       }
     };
     const refreshAllQuotes = async () => {
       if (myStocks.value.length === 0) {
+        console.log("[我的股票] 股票列表为空,停止定时刷新");
+        stopAutoRefresh();
         return;
       }
       try {
         const codes = myStocks.value.map((stock) => stock.code).join(",");
-        console.log("[我的股票] 批量刷新行情,股票代码:", codes);
+        console.log("[我的股票] 刷新行情:", codes);
         const quoteRes = await utils_api.getStockQuotes(codes);
-        console.log("[我的股票] 批量行情数据:", quoteRes);
+        console.log("[我的股票] API返回:", JSON.stringify(quoteRes));
         if (quoteRes.code === 200 && quoteRes.data && quoteRes.data.length > 0) {
           quoteRes.data.forEach((quoteData) => {
             const index = myStocks.value.findIndex((stock) => stock.code === quoteData.stockCode);
@@ -43,10 +50,31 @@ const _sfc_main = {
             }
           });
           common_vendor.index.setStorageSync("my_stocks", myStocks.value);
-          console.log("[我的股票] 行情刷新成功");
+          console.log("[我的股票] 刷新成功");
+        } else {
+          console.error("[我的股票] 刷新失败:", quoteRes);
         }
       } catch (e) {
-        console.error("[我的股票] 批量刷新行情失败:", e);
+        console.error("[我的股票] 刷新异常:", e.message);
+      }
+    };
+    const startAutoRefresh = () => {
+      stopAutoRefresh();
+      const scheduleNextRefresh = () => {
+        const delay = 2e3 + Math.random() * 1e3;
+        console.log(`[我的股票] 下次刷新将在 ${Math.round(delay)}ms 后执行`);
+        refreshTimer = setTimeout(async () => {
+          await refreshAllQuotes();
+          scheduleNextRefresh();
+        }, delay);
+      };
+      scheduleNextRefresh();
+    };
+    const stopAutoRefresh = () => {
+      if (refreshTimer) {
+        clearTimeout(refreshTimer);
+        refreshTimer = null;
+        console.log("[我的股票] 停止自动刷新");
       }
     };
     const goToLogin = () => {
@@ -68,6 +96,9 @@ const _sfc_main = {
               title: "删除成功",
               icon: "success"
             });
+            if (myStocks.value.length === 0) {
+              stopAutoRefresh();
+            }
           }
         }
       });
@@ -104,6 +135,17 @@ const _sfc_main = {
       console.log("[我的股票] Token:", common_vendor.index.getStorageSync("user_token"));
       loadMyStocks();
       common_vendor.index.setNavigationBarTitle({ title: "量化交易大师" });
+      if (isLoggedIn.value && myStocks.value.length > 0) {
+        startAutoRefresh();
+      } else {
+        stopAutoRefresh();
+      }
+    });
+    common_vendor.onHide(() => {
+      stopAutoRefresh();
+    });
+    common_vendor.onUnload(() => {
+      stopAutoRefresh();
     });
     return (_ctx, _cache) => {
       return common_vendor.e({

+ 69 - 12
src/pages/rank/rank.vue

@@ -79,18 +79,20 @@
 
 <script setup>
 import { ref } from 'vue'
-import { onLoad, onShow } from '@dcloudio/uni-app'
+import { onLoad, onShow, onHide, onUnload } from '@dcloudio/uni-app'
 import { isLoggedIn as checkLoginStatus } from '../../utils/auth.js'
 import { getStockQuotes } from '../../utils/api.js'
 
 const isLoggedIn = ref(false)
 const myStocks = ref([])
+let refreshTimer = null // 定时刷新定时器
 
 // 加载我的股票列表
 const loadMyStocks = async () => {
   // 只有登录后才加载股票列表
   if (!isLoggedIn.value) {
     myStocks.value = []
+    stopAutoRefresh() // 未登录时停止刷新
     return
   }
   
@@ -99,33 +101,37 @@ const loadMyStocks = async () => {
     myStocks.value = stocks
     console.log('[我的股票] 加载股票列表:', stocks.length, '只')
     
-    // 自动刷新所有股票的实时行情
-    if (stocks.length > 0) {
-      await refreshAllQuotes()
+    // 如果没有股票数据,停止定时刷新
+    if (stocks.length === 0) {
+      stopAutoRefresh()
+      return
     }
+    
+    // 自动刷新所有股票的实时行情
+    await refreshAllQuotes()
   } catch (e) {
     console.error('加载股票列表失败:', e)
     myStocks.value = []
+    stopAutoRefresh() // 加载失败时停止刷新
   }
 }
 
 // 批量刷新所有股票行情
 const refreshAllQuotes = async () => {
   if (myStocks.value.length === 0) {
+    console.log('[我的股票] 股票列表为空,停止定时刷新')
+    stopAutoRefresh()
     return
   }
   
   try {
-    // 收集所有股票代码
     const codes = myStocks.value.map(stock => stock.code).join(',')
-    console.log('[我的股票] 批量刷新行情,股票代码:', codes)
+    console.log('[我的股票] 刷新行情:', codes)
     
-    // 调用批量查询接口
     const quoteRes = await getStockQuotes(codes)
-    console.log('[我的股票] 批量行情数据:', quoteRes)
+    console.log('[我的股票] API返回:', JSON.stringify(quoteRes))
     
     if (quoteRes.code === 200 && quoteRes.data && quoteRes.data.length > 0) {
-      // 更新每只股票的行情数据
       quoteRes.data.forEach(quoteData => {
         const index = myStocks.value.findIndex(stock => stock.code === quoteData.stockCode)
         if (index !== -1) {
@@ -135,12 +141,41 @@ const refreshAllQuotes = async () => {
         }
       })
       
-      // 保存到本地存储
       uni.setStorageSync('my_stocks', myStocks.value)
-      console.log('[我的股票] 行情刷新成功')
+      console.log('[我的股票] 刷新成功')
+    } else {
+      console.error('[我的股票] 刷新失败:', quoteRes)
     }
   } catch (e) {
-    console.error('[我的股票] 批量刷新行情失败:', e)
+    console.error('[我的股票] 刷新异常:', e.message)
+  }
+}
+
+// 启动定时刷新
+const startAutoRefresh = () => {
+  // 清除旧的定时器
+  stopAutoRefresh()
+  
+  const scheduleNextRefresh = () => {
+    // 2秒 + 0-1秒的随机数 = 2000-3000ms
+    const delay = 2000 + Math.random() * 1000
+    console.log(`[我的股票] 下次刷新将在 ${Math.round(delay)}ms 后执行`)
+    
+    refreshTimer = setTimeout(async () => {
+      await refreshAllQuotes()
+      scheduleNextRefresh() // 递归调度下一次刷新
+    }, delay)
+  }
+  
+  scheduleNextRefresh()
+}
+
+// 停止定时刷新
+const stopAutoRefresh = () => {
+  if (refreshTimer) {
+    clearTimeout(refreshTimer)
+    refreshTimer = null
+    console.log('[我的股票] 停止自动刷新')
   }
 }
 
@@ -167,6 +202,11 @@ const removeStock = (index) => {
           title: '删除成功',
           icon: 'success'
         })
+        
+        // 如果删除后列表为空,停止定时刷新
+        if (myStocks.value.length === 0) {
+          stopAutoRefresh()
+        }
       }
     }
   })
@@ -211,6 +251,23 @@ onShow(() => {
   console.log('[我的股票] Token:', uni.getStorageSync('user_token'))
   loadMyStocks()
   uni.setNavigationBarTitle({ title: '量化交易大师' })
+  
+  // 只有登录且有股票数据时才启动定时刷新
+  if (isLoggedIn.value && myStocks.value.length > 0) {
+    startAutoRefresh()
+  } else {
+    stopAutoRefresh()
+  }
+})
+
+// 页面隐藏时停止刷新
+onHide(() => {
+  stopAutoRefresh()
+})
+
+// 页面卸载时停止刷新
+onUnload(() => {
+  stopAutoRefresh()
 })
 </script>