refactor: 重构 Community 目录,将公共组件迁移到 src/components/

- 迁移 klineDataCache.js 到 src/utils/stock/(被 StockChart 使用)
- 迁移 InvestmentCalendar 到 src/components/InvestmentCalendar/(被 Navbar、Dashboard 使用)
- 迁移 DynamicNewsDetail 到 src/components/EventDetailPanel/(被 EventDetail 使用)
- 更新所有相关导入路径,使用路径别名
- 保持 Community 目录其余结构不变

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
zdl
2025-12-08 12:09:24 +08:00
parent b4ddccfb92
commit ee33f7ffd7
30 changed files with 56 additions and 43 deletions

View File

@@ -1,4 +1,4 @@
// src/views/Community/components/DynamicNewsDetail/CollapsibleHeader.js
// src/components/EventDetailPanel/CollapsibleHeader.js
// 可折叠模块标题组件
import React from 'react';

View File

@@ -1,4 +1,4 @@
// src/views/Community/components/DynamicNewsDetail/CollapsibleSection.js
// src/components/EventDetailPanel/CollapsibleSection.js
// 通用可折叠区块组件
import React, { useState } from 'react';

View File

@@ -1,4 +1,4 @@
// src/views/Community/components/DynamicNewsDetail/CompactMetaBar.js
// src/components/EventDetailPanel/CompactMetaBar.js
// 精简信息栏组件(无头部模式下右上角显示)
import React from 'react';

View File

@@ -1,4 +1,4 @@
// src/views/Community/components/DynamicNewsDetail/CompactStockItem.js
// src/components/EventDetailPanel/CompactStockItem.js
// 精简模式股票卡片组件(浮动卡片样式)
import React from 'react';

View File

@@ -1,4 +1,4 @@
// src/views/Community/components/DynamicNewsDetail/DynamicNewsDetailPanel.js
// src/components/EventDetailPanel/DynamicNewsDetailPanel.js
// 动态新闻详情面板主组件(组装所有子组件)
import React, { useState, useCallback, useEffect, useReducer } from 'react';
@@ -16,7 +16,7 @@ import {
} from '@chakra-ui/react';
import { getImportanceConfig } from '@constants/importanceLevels';
import { eventService } from '@services/eventService';
import { useEventStocks } from '../StockDetailPanel/hooks/useEventStocks';
import { useEventStocks } from '@views/Community/components/StockDetailPanel/hooks/useEventStocks';
import { toggleEventFollow, selectEventFollowStatus } from '@store/slices/communityDataSlice';
import { useAuth } from '@contexts/AuthContext';
import EventHeaderInfo from './EventHeaderInfo';

View File

@@ -1,4 +1,4 @@
// src/views/Community/components/DynamicNewsDetail/EventDescriptionSection.js
// src/components/EventDetailPanel/EventDescriptionSection.js
// 事件描述区组件
import React from 'react';

View File

@@ -1,4 +1,4 @@
// src/views/Community/components/DynamicNewsDetail/EventHeaderInfo.js
// src/components/EventDetailPanel/EventHeaderInfo.js
// 事件头部信息区组件
import React from 'react';

View File

@@ -1,4 +1,4 @@
// src/views/Community/components/DynamicNewsDetail/MiniKLineChart.js
// src/components/EventDetailPanel/MiniKLineChart.js
import React, { useState, useEffect, useMemo, useRef } from 'react';
import ReactECharts from 'echarts-for-react';
import dayjs from 'dayjs';
@@ -6,7 +6,7 @@ import {
fetchKlineData,
getCacheKey,
klineDataCache
} from '../StockDetailPanel/utils/klineDataCache';
} from '@utils/stock/klineDataCache';
/**
* 迷你K线图组件

View File

@@ -1,4 +1,4 @@
// src/views/Community/components/DynamicNewsDetail/MiniLineChart.js
// src/components/EventDetailPanel/MiniLineChart.js
// Mini 折线图组件(用于股票卡片)
import React from 'react';

View File

@@ -1,4 +1,4 @@
// src/views/Community/components/DynamicNewsDetail/RelatedConceptsSection/ConceptStockItem.js
// src/components/EventDetailPanel/RelatedConceptsSection/ConceptStockItem.js
// 概念股票列表项组件
import React from 'react';

View File

@@ -1,4 +1,4 @@
// src/views/Community/components/DynamicNewsDetail/RelatedConceptsSection/DetailedConceptCard.js
// src/components/EventDetailPanel/RelatedConceptsSection/DetailedConceptCard.js
// 详细概念卡片组件
import React from 'react';

View File

@@ -1,4 +1,4 @@
// src/views/Community/components/DynamicNewsDetail/RelatedConceptsSection/SimpleConceptCard.js
// src/components/EventDetailPanel/RelatedConceptsSection/SimpleConceptCard.js
// 简单概念卡片组件(横向卡片)
import React from 'react';

View File

@@ -1,4 +1,4 @@
// src/views/Community/components/DynamicNewsDetail/RelatedConceptsSection/TradingDateInfo.js
// src/components/EventDetailPanel/RelatedConceptsSection/TradingDateInfo.js
// 交易日期信息提示组件
import React from 'react';

View File

@@ -1,4 +1,4 @@
// src/views/Community/components/DynamicNewsDetail/RelatedConceptsSection/index.js
// src/components/EventDetailPanel/RelatedConceptsSection/index.js
// 相关概念区组件(主组件)
import React, { useState, useEffect } from 'react';

View File

@@ -1,12 +1,12 @@
// src/views/Community/components/DynamicNewsDetail/RelatedStocksSection.js
// src/components/EventDetailPanel/RelatedStocksSection.js
// 相关股票列表区组件(纯内容,不含标题)
import React, { useState, useEffect, useMemo } from 'react';
import { VStack } from '@chakra-ui/react';
import dayjs from 'dayjs';
import StockListItem from './StockListItem';
import { fetchBatchKlineData, klineDataCache, getCacheKey } from '../StockDetailPanel/utils/klineDataCache';
import { logger } from '../../../../utils/logger';
import { fetchBatchKlineData, klineDataCache, getCacheKey } from '@utils/stock/klineDataCache';
import { logger } from '@utils/logger';
/**
* 相关股票列表区组件纯内容部分

View File

@@ -1,4 +1,4 @@
// src/views/Community/components/DynamicNewsDetail/StockListItem.js
// src/components/EventDetailPanel/StockListItem.js
// 股票卡片组件(融合表格功能的卡片样式)
import React, { useState } from 'react';
@@ -20,7 +20,7 @@ import { StarIcon } from '@chakra-ui/icons';
import { Tag } from 'antd';
import { RobotOutlined } from '@ant-design/icons';
import { selectIsMobile } from '@store/slices/deviceSlice';
import MiniTimelineChart from '../StockDetailPanel/components/MiniTimelineChart';
import MiniTimelineChart from '@views/Community/components/StockDetailPanel/components/MiniTimelineChart';
import MiniKLineChart from './MiniKLineChart';
import TimelineChartModal from '@components/StockChart/TimelineChartModal';
import KLineChartModal from '@components/StockChart/KLineChartModal';

View File

@@ -0,0 +1,6 @@
// src/components/EventDetailPanel/index.js
// 统一导出事件详情面板组件
export { default } from './DynamicNewsDetailPanel';
export { default as DynamicNewsDetailPanel } from './DynamicNewsDetailPanel';
export { default as EventDetailPanel } from './DynamicNewsDetailPanel';

View File

@@ -1,4 +1,4 @@
// src/views/Community/components/InvestmentCalendar.js
// src/components/InvestmentCalendar/index.js
import React, { useState, useEffect, useCallback } from 'react';
import {
Card, Calendar, Badge, Modal, Table, Tabs, Tag, Button, List, Spin, Empty,
@@ -10,14 +10,14 @@ import {
} from '@ant-design/icons';
import dayjs from 'dayjs';
import ReactMarkdown from 'react-markdown';
import { eventService, stockService } from '../../../services/eventService';
import KLineChartModal from '../../../components/StockChart/KLineChartModal';
import { useSubscription } from '../../../hooks/useSubscription';
import SubscriptionUpgradeModal from '../../../components/SubscriptionUpgradeModal';
import CitationMark from '../../../components/Citation/CitationMark';
import CitedContent from '../../../components/Citation/CitedContent';
import { processCitationData } from '../../../utils/citationUtils';
import { logger } from '../../../utils/logger';
import { eventService, stockService } from '@services/eventService';
import KLineChartModal from '@components/StockChart/KLineChartModal';
import { useSubscription } from '@hooks/useSubscription';
import SubscriptionUpgradeModal from '@components/SubscriptionUpgradeModal';
import CitationMark from '@components/Citation/CitationMark';
import CitedContent from '@components/Citation/CitedContent';
import { processCitationData } from '@utils/citationUtils';
import { logger } from '@utils/logger';
import './InvestmentCalendar.css';
const { TabPane } = Tabs;

View File

@@ -10,7 +10,7 @@ import {
ModalCloseButton
} from '@chakra-ui/react';
import { FiCalendar } from 'react-icons/fi';
import InvestmentCalendar from '../../../views/Community/components/InvestmentCalendar';
import InvestmentCalendar from '@components/InvestmentCalendar';
/**
* 投资日历按钮组件

View File

@@ -19,7 +19,7 @@ import {
} from '@chakra-ui/react';
import * as echarts from 'echarts';
import dayjs from 'dayjs';
import { klineDataCache, getCacheKey, fetchKlineData } from '@views/Community/components/StockDetailPanel/utils/klineDataCache';
import { klineDataCache, getCacheKey, fetchKlineData } from '@utils/stock/klineDataCache';
import { selectIsMobile } from '@store/slices/deviceSlice';
import { StockInfo } from './types';

View File

@@ -9,7 +9,7 @@ import type { Chart } from 'klinecharts';
import type { ChartType, KLineDataPoint, RawDataPoint } from '../types';
import { processChartData } from '../utils/dataAdapter';
import { stockService } from '@services/eventService';
import { klineDataCache, getCacheKey } from '@views/Community/components/StockDetailPanel/utils/klineDataCache';
import { klineDataCache, getCacheKey } from '@utils/stock/klineDataCache';
export interface UseKLineDataOptions {
/** KLineChart 实例 */

12
src/utils/stock/index.js Normal file
View File

@@ -0,0 +1,12 @@
// src/utils/stock/index.js
// K线数据缓存工具
export {
klineDataCache,
getCacheKey,
fetchKlineData,
fetchBatchKlineData,
preloadBatchKlineData,
clearCache,
clearAllCache,
getCacheStats,
} from './klineDataCache';

View File

@@ -34,7 +34,7 @@ import { useNotification } from '../../../contexts/NotificationContext';
import EventScrollList from './DynamicNewsCard/EventScrollList';
import ModeToggleButtons from './DynamicNewsCard/ModeToggleButtons';
import PaginationControl from './DynamicNewsCard/PaginationControl';
import DynamicNewsDetailPanel from './DynamicNewsDetail';
import DynamicNewsDetailPanel from '@components/EventDetailPanel';
import CompactSearchBox from './CompactSearchBox';
import {
fetchDynamicNews,

View File

@@ -1,5 +0,0 @@
// src/views/Community/components/DynamicNewsDetail/index.js
// 统一导出 DynamicNewsDetailPanel 组件
export { default } from './DynamicNewsDetailPanel';
export { default as DynamicNewsDetailPanel } from './DynamicNewsDetailPanel';

View File

@@ -3,7 +3,7 @@ import { useSelector } from 'react-redux';
import { Drawer } from 'antd';
import { CloseOutlined } from '@ant-design/icons';
import { selectIsMobile } from '@store/slices/deviceSlice';
import DynamicNewsDetailPanel from './DynamicNewsDetail/DynamicNewsDetailPanel';
import DynamicNewsDetailPanel from '@components/EventDetailPanel';
import './EventDetailModal.less';
interface EventDetailModalProps {

View File

@@ -8,7 +8,7 @@ import {
getCacheKey,
klineDataCache,
batchPendingRequests
} from '../utils/klineDataCache';
} from '@utils/stock/klineDataCache';
/**
* 迷你分时图组件

View File

@@ -29,7 +29,7 @@ import type { InvestmentEvent } from '@/types';
import './InvestmentCalendar.less';
// 懒加载投资日历组件
const InvestmentCalendar = lazy(() => import('@/views/Community/components/InvestmentCalendar'));
const InvestmentCalendar = lazy(() => import('@components/InvestmentCalendar'));
dayjs.locale('zh-cn');

View File

@@ -12,7 +12,7 @@ import {
} from '@chakra-ui/react';
import { decodeEventId } from '@/utils/idEncoder';
import { eventService } from '@/services/eventService';
import { DynamicNewsDetailPanel } from '@/views/Community/components/DynamicNewsDetail';
import { DynamicNewsDetailPanel } from '@components/EventDetailPanel';
import { logger } from '@/utils/logger';
import ErrorPage from '@/components/ErrorPage';