feat: 重构文件数: 3 个主要页面文件
- 替换 console 调用: 约 18 个 - 移除非关键 toast: 6 个 - 保留关键 toast: 2 个(搜索相关的用户操作反馈) - 添加 logger 日志: 约 15 处
This commit is contained in:
@@ -139,8 +139,7 @@ const Community = () => {
|
||||
|
||||
// 加载事件列表
|
||||
const loadEvents = useCallback(async (page = 1) => {
|
||||
console.log('[Community] loadEvents 被调用,页码:', page);
|
||||
console.log('[Community] 调用栈:', new Error().stack);
|
||||
logger.debug('Community', 'loadEvents 被调用', { page });
|
||||
setLoading(true);
|
||||
try {
|
||||
const filters = getFiltersFromUrl();
|
||||
@@ -176,9 +175,12 @@ const Community = () => {
|
||||
const response = await eventService.getPopularKeywords(20);
|
||||
if (response.success) {
|
||||
setPopularKeywords(response.data);
|
||||
logger.debug('Community', '热门关键词加载成功', {
|
||||
count: response.data?.length || 0
|
||||
});
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Failed to load popular keywords:', error);
|
||||
logger.error('Community', 'loadPopularKeywords', error);
|
||||
}
|
||||
}, []);
|
||||
|
||||
@@ -188,9 +190,12 @@ const Community = () => {
|
||||
const response = await eventService.getHotEvents({ days: 5, limit: 4 });
|
||||
if (response.success) {
|
||||
setHotEvents(response.data);
|
||||
logger.debug('Community', '热点事件加载成功', {
|
||||
count: response.data?.length || 0
|
||||
});
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Failed to load hot events:', error);
|
||||
logger.error('Community', 'loadHotEvents', error);
|
||||
}
|
||||
}, []);
|
||||
|
||||
@@ -256,7 +261,9 @@ const Community = () => {
|
||||
// 这是为了避免 StockDetailPanel 打开时触发不必要的重新加载
|
||||
// 如果未来 loadEvents 添加了新的状态依赖,需要在此处同步更新
|
||||
useEffect(() => {
|
||||
console.log('[Community] useEffect 触发,searchParams 变化:', searchParams.toString());
|
||||
logger.debug('Community', 'useEffect 触发,searchParams 变化', {
|
||||
params: searchParams.toString()
|
||||
});
|
||||
const page = parseInt(searchParams.get('page') || '1', 10);
|
||||
loadEvents(page);
|
||||
loadPopularKeywords();
|
||||
|
||||
@@ -48,6 +48,7 @@ import { AdvancedSearch, SearchResultsModal } from './components/SearchComponent
|
||||
|
||||
// 导入高位股统计组件
|
||||
import HighPositionStocks from './components/HighPositionStocks';
|
||||
import { logger } from '../../utils/logger';
|
||||
|
||||
// 主组件
|
||||
export default function LimitAnalyse() {
|
||||
@@ -109,9 +110,12 @@ export default function LimitAnalyse() {
|
||||
const data = await response.json();
|
||||
if (data.success) {
|
||||
setAvailableDates(data.events);
|
||||
logger.debug('LimitAnalyse', '可用日期加载成功', {
|
||||
count: data.events?.length || 0
|
||||
});
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Failed to fetch available dates:', error);
|
||||
logger.error('LimitAnalyse', 'fetchAvailableDates', error);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -126,22 +130,15 @@ export default function LimitAnalyse() {
|
||||
// 获取词云数据
|
||||
fetchWordCloudData(date);
|
||||
|
||||
toast({
|
||||
title: '数据加载成功',
|
||||
description: `${date} 的数据已加载`,
|
||||
status: 'success',
|
||||
duration: 2000,
|
||||
isClosable: true,
|
||||
logger.debug('LimitAnalyse', '每日分析数据加载成功', {
|
||||
date,
|
||||
totalStocks: data.data?.total_stocks || 0
|
||||
});
|
||||
// ❌ 移除数据加载成功 toast(非关键操作)
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Failed to fetch daily analysis:', error);
|
||||
toast({
|
||||
title: '网络错误',
|
||||
description: '无法加载数据,请稍后重试',
|
||||
status: 'error',
|
||||
duration: 3000,
|
||||
});
|
||||
logger.error('LimitAnalyse', 'fetchDailyAnalysis', error, { date });
|
||||
// ❌ 移除数据加载失败 toast(非关键操作)
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
@@ -153,9 +150,13 @@ export default function LimitAnalyse() {
|
||||
const data = await response.json();
|
||||
if (data.success) {
|
||||
setWordCloudData(data.data);
|
||||
logger.debug('LimitAnalyse', '词云数据加载成功', {
|
||||
date,
|
||||
count: data.data?.length || 0
|
||||
});
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Failed to fetch wordcloud data:', error);
|
||||
logger.error('LimitAnalyse', 'fetchWordCloudData', error, { date });
|
||||
}
|
||||
};
|
||||
|
||||
@@ -188,6 +189,10 @@ export default function LimitAnalyse() {
|
||||
if (data.success) {
|
||||
setSearchResults(data.data);
|
||||
setIsSearchOpen(true);
|
||||
logger.info('LimitAnalyse', '搜索完成', {
|
||||
resultCount: data.data?.total || 0,
|
||||
searchParams
|
||||
});
|
||||
toast({
|
||||
title: '搜索完成',
|
||||
description: `找到 ${data.data.total} 只相关股票`,
|
||||
@@ -196,7 +201,7 @@ export default function LimitAnalyse() {
|
||||
});
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Search failed:', error);
|
||||
logger.error('LimitAnalyse', 'handleSearch', error, { searchParams });
|
||||
toast({
|
||||
title: '搜索失败',
|
||||
description: '请稍后重试',
|
||||
|
||||
@@ -61,6 +61,7 @@ import { FaChartLine, FaFire, FaRocket, FaBrain, FaCalendarAlt, FaChevronRight,
|
||||
import { BsGraphUp, BsLightningFill } from 'react-icons/bs';
|
||||
import { keyframes } from '@emotion/react';
|
||||
import * as echarts from 'echarts';
|
||||
import { logger } from '../../utils/logger';
|
||||
// Navigation bar now provided by MainLayout
|
||||
// import HomeNavbar from '../../components/Navbars/HomeNavbar';
|
||||
|
||||
@@ -132,33 +133,24 @@ const StockOverview = () => {
|
||||
const searchStocks = async (query) => {
|
||||
setIsSearching(true);
|
||||
try {
|
||||
console.log('开始搜索股票:', query);
|
||||
logger.debug('StockOverview', '开始搜索股票', { query });
|
||||
const response = await fetch(`/api/stocks/search?q=${encodeURIComponent(query)}&limit=10`);
|
||||
console.log('API响应状态:', response.status);
|
||||
const data = await response.json();
|
||||
console.log('API返回数据:', data);
|
||||
|
||||
logger.debug('StockOverview', 'API返回数据', {
|
||||
status: response.status,
|
||||
resultCount: data.data?.length || 0
|
||||
});
|
||||
|
||||
if (data.success) {
|
||||
setSearchResults(data.data || []);
|
||||
setShowResults(true);
|
||||
} else {
|
||||
toast({
|
||||
title: '搜索失败',
|
||||
description: data.error || '请稍后重试',
|
||||
status: 'error',
|
||||
duration: 3000,
|
||||
isClosable: true,
|
||||
});
|
||||
logger.warn('StockOverview', '搜索失败', data.error || '请稍后重试', { query });
|
||||
// ❌ 移除搜索失败 toast(非关键操作)
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('搜索股票失败:', error);
|
||||
toast({
|
||||
title: '搜索失败',
|
||||
description: '网络错误,请稍后重试',
|
||||
status: 'error',
|
||||
duration: 3000,
|
||||
isClosable: true,
|
||||
});
|
||||
logger.error('StockOverview', 'searchStocks', error, { query });
|
||||
// ❌ 移除搜索失败 toast(非关键操作)
|
||||
} finally {
|
||||
setIsSearching(false);
|
||||
}
|
||||
@@ -171,13 +163,17 @@ const StockOverview = () => {
|
||||
const url = date ? `/api/concepts/daily-top?limit=6&date=${date}` : '/api/concepts/daily-top?limit=6';
|
||||
const response = await fetch(url);
|
||||
const data = await response.json();
|
||||
|
||||
|
||||
if (data.success) {
|
||||
setTopConcepts(data.data);
|
||||
if (!selectedDate) setSelectedDate(data.trade_date);
|
||||
logger.debug('StockOverview', '热门概念加载成功', {
|
||||
count: data.data?.length || 0,
|
||||
date: data.trade_date
|
||||
});
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('获取概念数据失败:', error);
|
||||
logger.error('StockOverview', 'fetchTopConcepts', error, { date });
|
||||
} finally {
|
||||
setLoadingConcepts(false);
|
||||
}
|
||||
@@ -190,7 +186,7 @@ const StockOverview = () => {
|
||||
const url = date ? `/api/market/heatmap?limit=500&date=${date}` : '/api/market/heatmap?limit=500';
|
||||
const response = await fetch(url);
|
||||
const data = await response.json();
|
||||
|
||||
|
||||
if (data.success) {
|
||||
setHeatmapData(data.data);
|
||||
// 保存统计数据
|
||||
@@ -202,11 +198,15 @@ const StockOverview = () => {
|
||||
}));
|
||||
}
|
||||
if (!selectedDate) setSelectedDate(data.trade_date);
|
||||
logger.debug('StockOverview', '热力图数据加载成功', {
|
||||
count: data.data?.length || 0,
|
||||
date: data.trade_date
|
||||
});
|
||||
// 延迟渲染热力图,确保DOM已经准备好
|
||||
setTimeout(() => renderHeatmap(data.data), 100);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('获取热力图数据失败:', error);
|
||||
logger.error('StockOverview', 'fetchHeatmapData', error, { date });
|
||||
} finally {
|
||||
setLoadingHeatmap(false);
|
||||
}
|
||||
@@ -218,7 +218,7 @@ const StockOverview = () => {
|
||||
const url = date ? `/api/market/statistics?date=${date}` : '/api/market/statistics';
|
||||
const response = await fetch(url);
|
||||
const data = await response.json();
|
||||
|
||||
|
||||
if (data.success) {
|
||||
setMarketStats(prevStats => ({
|
||||
...data.summary,
|
||||
@@ -228,15 +228,14 @@ const StockOverview = () => {
|
||||
}));
|
||||
setAvailableDates(data.available_dates || []);
|
||||
if (!selectedDate) setSelectedDate(data.trade_date);
|
||||
logger.debug('StockOverview', '市场统计数据加载成功', {
|
||||
date: data.trade_date,
|
||||
availableDatesCount: data.available_dates?.length || 0
|
||||
});
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('获取市场统计数据失败:', error);
|
||||
toast({
|
||||
title: '获取统计数据失败',
|
||||
status: 'error',
|
||||
duration: 3000,
|
||||
isClosable: true,
|
||||
});
|
||||
logger.error('StockOverview', 'fetchMarketStats', error, { date });
|
||||
// ❌ 移除统计数据加载失败 toast(非关键操作)
|
||||
}
|
||||
};
|
||||
|
||||
@@ -409,16 +408,12 @@ const StockOverview = () => {
|
||||
}
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('渲染热力图失败:', error);
|
||||
toast({
|
||||
title: '热力图渲染失败',
|
||||
description: '请刷新页面重试',
|
||||
status: 'error',
|
||||
duration: 3000,
|
||||
isClosable: true,
|
||||
logger.error('StockOverview', 'renderHeatmap', error, {
|
||||
dataLength: data?.length || 0
|
||||
});
|
||||
// ❌ 移除热力图渲染失败 toast(非关键操作)
|
||||
}
|
||||
}, [colorMode, goldColor, navigate, toast]);
|
||||
}, [colorMode, goldColor, navigate]); // ✅ 移除 toast 依赖
|
||||
|
||||
// 获取市值区间
|
||||
const getMarketCapRange = (cap) => {
|
||||
|
||||
Reference in New Issue
Block a user