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 ? (
-
-
) :
}
-
+
-
-