|
@@ -79,18 +79,20 @@
|
|
|
|
|
|
|
|
<script setup>
|
|
<script setup>
|
|
|
import { ref } from 'vue'
|
|
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 { isLoggedIn as checkLoginStatus } from '../../utils/auth.js'
|
|
|
import { getStockQuotes } from '../../utils/api.js'
|
|
import { getStockQuotes } from '../../utils/api.js'
|
|
|
|
|
|
|
|
const isLoggedIn = ref(false)
|
|
const isLoggedIn = ref(false)
|
|
|
const myStocks = ref([])
|
|
const myStocks = ref([])
|
|
|
|
|
+let refreshTimer = null // 定时刷新定时器
|
|
|
|
|
|
|
|
// 加载我的股票列表
|
|
// 加载我的股票列表
|
|
|
const loadMyStocks = async () => {
|
|
const loadMyStocks = async () => {
|
|
|
// 只有登录后才加载股票列表
|
|
// 只有登录后才加载股票列表
|
|
|
if (!isLoggedIn.value) {
|
|
if (!isLoggedIn.value) {
|
|
|
myStocks.value = []
|
|
myStocks.value = []
|
|
|
|
|
+ stopAutoRefresh() // 未登录时停止刷新
|
|
|
return
|
|
return
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -99,33 +101,37 @@ const loadMyStocks = async () => {
|
|
|
myStocks.value = stocks
|
|
myStocks.value = stocks
|
|
|
console.log('[我的股票] 加载股票列表:', stocks.length, '只')
|
|
console.log('[我的股票] 加载股票列表:', stocks.length, '只')
|
|
|
|
|
|
|
|
- // 自动刷新所有股票的实时行情
|
|
|
|
|
- if (stocks.length > 0) {
|
|
|
|
|
- await refreshAllQuotes()
|
|
|
|
|
|
|
+ // 如果没有股票数据,停止定时刷新
|
|
|
|
|
+ if (stocks.length === 0) {
|
|
|
|
|
+ stopAutoRefresh()
|
|
|
|
|
+ return
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ // 自动刷新所有股票的实时行情
|
|
|
|
|
+ await refreshAllQuotes()
|
|
|
} catch (e) {
|
|
} catch (e) {
|
|
|
console.error('加载股票列表失败:', e)
|
|
console.error('加载股票列表失败:', e)
|
|
|
myStocks.value = []
|
|
myStocks.value = []
|
|
|
|
|
+ stopAutoRefresh() // 加载失败时停止刷新
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// 批量刷新所有股票行情
|
|
// 批量刷新所有股票行情
|
|
|
const refreshAllQuotes = async () => {
|
|
const refreshAllQuotes = async () => {
|
|
|
if (myStocks.value.length === 0) {
|
|
if (myStocks.value.length === 0) {
|
|
|
|
|
+ console.log('[我的股票] 股票列表为空,停止定时刷新')
|
|
|
|
|
+ stopAutoRefresh()
|
|
|
return
|
|
return
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
try {
|
|
try {
|
|
|
- // 收集所有股票代码
|
|
|
|
|
const codes = myStocks.value.map(stock => stock.code).join(',')
|
|
const codes = myStocks.value.map(stock => stock.code).join(',')
|
|
|
- console.log('[我的股票] 批量刷新行情,股票代码:', codes)
|
|
|
|
|
|
|
+ console.log('[我的股票] 刷新行情:', codes)
|
|
|
|
|
|
|
|
- // 调用批量查询接口
|
|
|
|
|
const quoteRes = await getStockQuotes(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) {
|
|
if (quoteRes.code === 200 && quoteRes.data && quoteRes.data.length > 0) {
|
|
|
- // 更新每只股票的行情数据
|
|
|
|
|
quoteRes.data.forEach(quoteData => {
|
|
quoteRes.data.forEach(quoteData => {
|
|
|
const index = myStocks.value.findIndex(stock => stock.code === quoteData.stockCode)
|
|
const index = myStocks.value.findIndex(stock => stock.code === quoteData.stockCode)
|
|
|
if (index !== -1) {
|
|
if (index !== -1) {
|
|
@@ -135,12 +141,41 @@ const refreshAllQuotes = async () => {
|
|
|
}
|
|
}
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
- // 保存到本地存储
|
|
|
|
|
uni.setStorageSync('my_stocks', myStocks.value)
|
|
uni.setStorageSync('my_stocks', myStocks.value)
|
|
|
- console.log('[我的股票] 行情刷新成功')
|
|
|
|
|
|
|
+ console.log('[我的股票] 刷新成功')
|
|
|
|
|
+ } else {
|
|
|
|
|
+ console.error('[我的股票] 刷新失败:', quoteRes)
|
|
|
}
|
|
}
|
|
|
} catch (e) {
|
|
} 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: '删除成功',
|
|
title: '删除成功',
|
|
|
icon: 'success'
|
|
icon: 'success'
|
|
|
})
|
|
})
|
|
|
|
|
+
|
|
|
|
|
+ // 如果删除后列表为空,停止定时刷新
|
|
|
|
|
+ if (myStocks.value.length === 0) {
|
|
|
|
|
+ stopAutoRefresh()
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
})
|
|
})
|
|
@@ -211,6 +251,23 @@ onShow(() => {
|
|
|
console.log('[我的股票] Token:', uni.getStorageSync('user_token'))
|
|
console.log('[我的股票] Token:', uni.getStorageSync('user_token'))
|
|
|
loadMyStocks()
|
|
loadMyStocks()
|
|
|
uni.setNavigationBarTitle({ title: '量化交易大师' })
|
|
uni.setNavigationBarTitle({ title: '量化交易大师' })
|
|
|
|
|
+
|
|
|
|
|
+ // 只有登录且有股票数据时才启动定时刷新
|
|
|
|
|
+ if (isLoggedIn.value && myStocks.value.length > 0) {
|
|
|
|
|
+ startAutoRefresh()
|
|
|
|
|
+ } else {
|
|
|
|
|
+ stopAutoRefresh()
|
|
|
|
|
+ }
|
|
|
|
|
+})
|
|
|
|
|
+
|
|
|
|
|
+// 页面隐藏时停止刷新
|
|
|
|
|
+onHide(() => {
|
|
|
|
|
+ stopAutoRefresh()
|
|
|
|
|
+})
|
|
|
|
|
+
|
|
|
|
|
+// 页面卸载时停止刷新
|
|
|
|
|
+onUnload(() => {
|
|
|
|
|
+ stopAutoRefresh()
|
|
|
})
|
|
})
|
|
|
</script>
|
|
</script>
|
|
|
|
|
|