diff --git a/app/components/Announcement.jsx b/app/components/Announcement.jsx new file mode 100644 index 0000000..292f53c --- /dev/null +++ b/app/components/Announcement.jsx @@ -0,0 +1,82 @@ +'use client'; + +import { useState, useEffect } from 'react'; +import { motion, AnimatePresence } from 'framer-motion'; + +export default function Announcement() { + const [isVisible, setIsVisible] = useState(false); + + useEffect(() => { + const hasClosed = localStorage.getItem('hasClosedAnnouncement_v1'); + if (!hasClosed) { + setIsVisible(true); + } + }, []); + + const handleClose = () => { + localStorage.setItem('hasClosedAnnouncement_v1', 'true'); + setIsVisible(false); + }; + + return ( + + {isVisible && ( + + +
+ + + + + + 公告 +
+ +
+ 已解决并发刷新导致数据错乱问题,遇到有问题的数据可以删除后重新添加,抱歉给您带来的不便。 +
+ +
+ +
+
+
+ )} +
+ ); +} diff --git a/app/page.jsx b/app/page.jsx index 867384f..ff270e9 100644 --- a/app/page.jsx +++ b/app/page.jsx @@ -2,6 +2,7 @@ import { useEffect, useRef, useState } from 'react'; import { motion, AnimatePresence } from 'framer-motion'; +import Announcement from "./components/Announcement"; function PlusIcon(props) { return ( @@ -236,15 +237,15 @@ export default function HomePage() { }; const gzUrl = `https://fundgz.1234567.com.cn/js/${c}.js?rt=${Date.now()}`; - + // 使用更安全的方式处理全局回调,避免并发覆盖 const currentCallback = `jsonpgz_${c}_${Math.random().toString(36).slice(2, 7)}`; - + // 动态拦截并处理 jsonpgz 回调 const scriptGz = document.createElement('script'); // 东方财富接口固定调用 jsonpgz,我们通过修改全局变量临时捕获它 scriptGz.src = gzUrl; - + const originalJsonpgz = window.jsonpgz; window.jsonpgz = (json) => { window.jsonpgz = originalJsonpgz; // 立即恢复 @@ -261,7 +262,7 @@ export default function HomePage() { gztime: json.gztime, gszzl: Number.isFinite(gszzlNum) ? gszzlNum : json.gszzl }; - + // 获取重仓股票列表 const holdingsUrl = `https://fundf10.eastmoney.com/FundArchivesDatas.aspx?type=jjcc&code=${c}&topline=10&year=&month=&rt=${Date.now()}`; loadScript(holdingsUrl).then(async () => { @@ -281,14 +282,14 @@ export default function HomePage() { }); } } - + holdings = holdings.slice(0, 10); - + if (holdings.length) { try { const tencentCodes = holdings.map(h => `s_${getTencentPrefix(h.code)}${h.code}`).join(','); const quoteUrl = `https://qt.gtimg.cn/q=${tencentCodes}`; - + await new Promise((resQuote) => { const scriptQuote = document.createElement('script'); scriptQuote.src = quoteUrl; @@ -317,7 +318,7 @@ export default function HomePage() { console.error('获取股票涨跌幅失败', e); } } - + resolve({ ...gzData, holdings }); }).catch(() => resolve({ ...gzData, holdings: [] })); }; @@ -448,6 +449,7 @@ export default function HomePage() { return (
+
{refreshing &&
}
@@ -510,13 +512,13 @@ export default function HomePage() {
{favorites.size > 0 ? (
- -
) :
} - +
- -
- +
0.05 ? f.estGsz.toFixed(4) : (f.gsz ?? '—')} /> - 0.05 ? `${f.estGszzl > 0 ? '+' : ''}${f.estGszzl.toFixed(2)}%` : (typeof f.gszzl === 'number' ? `${f.gszzl > 0 ? '+' : ''}${f.gszzl.toFixed(2)}%` : f.gszzl ?? '—')} - delta={f.estPricedCoverage > 0.05 ? f.estGszzl : (Number(f.gszzl) || 0)} + 0.05 ? `${f.estGszzl > 0 ? '+' : ''}${f.estGszzl.toFixed(2)}%` : (typeof f.gszzl === 'number' ? `${f.gszzl > 0 ? '+' : ''}${f.gszzl.toFixed(2)}%` : f.gszzl ?? '—')} + delta={f.estPricedCoverage > 0.05 ? f.estGszzl : (Number(f.gszzl) || 0)} />
{f.estPricedCoverage > 0.05 && ( @@ -700,22 +702,22 @@ export default function HomePage() { 基于 {Math.round(f.estPricedCoverage * 100)}% 持仓估算
)} -
toggleCollapse(f.code)} >
前10重仓股票 -
涨跌幅 / 占比 @@ -778,7 +780,7 @@ export default function HomePage() { 设置 配置刷新频率
- +
刷新频率