diff --git a/src/views/Company/STRUCTURE.md b/src/views/Company/STRUCTURE.md index 2eebdfd7..75fb13ae 100644 --- a/src/views/Company/STRUCTURE.md +++ b/src/views/Company/STRUCTURE.md @@ -1,231 +1,291 @@ # Company 目录结构说明 -> 最后更新:2025-12-17(API 接口清单梳理) +> **最后更新**:2025-12-26 ## 目录结构 ``` src/views/Company/ -├── index.js # 页面入口(纯组合层) +├── index.tsx # 页面入口(TypeScript,纯组合层) +├── config.ts # 页面配置(主题、Tab 配置) +├── types.ts # 页面级类型定义 ├── STRUCTURE.md # 本文档 +├── ForecastReport.js # 盈利预测页面(旧版入口) +├── MarketDataView.js # 行情数据页面(旧版入口) │ -├── components/ # UI 组件 -│ │ -│ ├── LoadingState.tsx # 通用加载状态组件 -│ │ -│ ├── CompanyHeader/ # 页面头部 -│ │ ├── index.js # 组合导出 -│ │ └── SearchBar.js # 股票搜索栏 -│ │ -│ ├── CompanyTabs/ # Tab 切换容器 -│ │ └── index.js # Tab 容器(状态管理 + 内容渲染) -│ │ -│ ├── StockQuoteCard/ # 股票行情卡片(TypeScript,数据已下沉) -│ │ ├── index.tsx # 主组件(Props 从 11 个精简为 4 个) -│ │ ├── types.ts # 类型定义 -│ │ ├── mockData.ts # Mock 数据 -│ │ ├── hooks/ # 内部数据 Hooks(2025-12-17 新增) -│ │ │ ├── index.ts # hooks 导出索引 -│ │ │ ├── useStockQuoteData.ts # 行情数据+基本信息获取 -│ │ │ └── useStockCompare.ts # 股票对比逻辑 -│ │ └── components/ # 子组件 -│ │ ├── index.ts # 组件导出 -│ │ ├── theme.ts # 主题配置 -│ │ ├── formatters.ts # 格式化工具 -│ │ ├── StockHeader.tsx # 股票头部(名称、代码、收藏按钮) -│ │ ├── PriceDisplay.tsx # 价格显示组件 -│ │ ├── CompanyInfo.tsx # 公司信息(行业、市值等) -│ │ ├── KeyMetrics.tsx # 关键指标(PE、PB、换手率等) -│ │ ├── MainForceInfo.tsx # 主力资金信息 -│ │ ├── SecondaryQuote.tsx # 副行情(对比股票) -│ │ ├── CompareStockInput.tsx # 对比股票输入 -│ │ └── StockCompareModal.tsx # 股票对比弹窗 -│ │ -│ ├── CompanyOverview/ # Tab: 公司概览(TypeScript) -│ │ ├── index.tsx # 主组件(组合层) -│ │ ├── types.ts # 类型定义 -│ │ ├── utils.ts # 格式化工具 -│ │ ├── NewsEventsTab.js # 新闻事件 Tab -│ │ │ -│ │ ├── hooks/ # 数据 Hooks -│ │ │ ├── useBasicInfo.ts # 基本信息 Hook -│ │ │ ├── useShareholderData.ts # 股权结构 Hook(4 APIs) -│ │ │ ├── useManagementData.ts # 管理团队 Hook -│ │ │ ├── useAnnouncementsData.ts # 公告数据 Hook -│ │ │ ├── useBranchesData.ts # 分支机构 Hook -│ │ │ ├── useDisclosureData.ts # 披露日程 Hook -│ │ │ └── useCompanyOverviewData.ts # [已废弃] 原合并 Hook -│ │ │ -│ │ ├── components/ # 股权结构子组件 -│ │ │ └── shareholder/ -│ │ │ ├── index.ts # 导出 -│ │ │ ├── ActualControlCard.tsx # 实控人卡片 -│ │ │ ├── ConcentrationCard.tsx # 股权集中度卡片 -│ │ │ └── ShareholdersTable.tsx # 股东表格 -│ │ │ -│ │ ├── BasicInfoTab/ # 基本信息 Tab(可配置化) -│ │ │ ├── index.tsx # 主组件(可配置) -│ │ │ ├── config.ts # Tab 配置 + 黑金主题 -│ │ │ ├── utils.ts # 格式化工具函数 -│ │ │ └── components/ # 子组件 -│ │ │ ├── index.ts # 组件统一导出 -│ │ │ ├── LoadingState.tsx # 加载状态组件 -│ │ │ ├── ShareholderPanel.tsx # 股权结构面板 -│ │ │ ├── AnnouncementsPanel.tsx # 公告信息面板 -│ │ │ ├── BranchesPanel.tsx # 分支机构面板 -│ │ │ ├── BusinessInfoPanel.tsx # 工商信息面板 -│ │ │ ├── DisclosureSchedulePanel.tsx # 披露日程面板 -│ │ │ └── management/ # 管理团队模块 -│ │ │ ├── index.ts # 模块导出 -│ │ │ ├── types.ts # 类型定义 -│ │ │ ├── ManagementPanel.tsx # 主组件(useMemo) -│ │ │ ├── CategorySection.tsx # 分类区块(memo) -│ │ │ └── ManagementCard.tsx # 人员卡片(memo) -│ │ │ -│ │ └── DeepAnalysisTab/ # 深度分析 Tab(原子设计模式) -│ │ ├── index.tsx # 主入口组件 -│ │ ├── types.ts # 类型定义 -│ │ ├── atoms/ # 原子组件 -│ │ │ ├── index.ts -│ │ │ ├── DisclaimerBox.tsx # 免责声明 -│ │ │ ├── ScoreBar.tsx # 评分进度条 -│ │ │ ├── BusinessTreeItem.tsx # 业务树形项 -│ │ │ ├── KeyFactorCard.tsx # 关键因素卡片 -│ │ │ ├── ProcessNavigation.tsx # 流程导航 -│ │ │ └── ValueChainFilterBar.tsx # 产业链筛选栏 -│ │ ├── components/ # Card 组件 -│ │ │ ├── index.ts -│ │ │ ├── CorePositioningCard/ # 核心定位卡片(含 atoms) -│ │ │ │ ├── index.tsx -│ │ │ │ ├── theme.ts -│ │ │ │ └── atoms/ -│ │ │ ├── CompetitiveAnalysisCard.tsx -│ │ │ ├── BusinessStructureCard.tsx -│ │ │ ├── BusinessSegmentsCard.tsx -│ │ │ ├── ValueChainCard.tsx -│ │ │ ├── KeyFactorsCard.tsx -│ │ │ ├── TimelineCard.tsx -│ │ │ └── StrategyAnalysisCard.tsx -│ │ ├── organisms/ # 复杂交互组件 -│ │ │ ├── ValueChainNodeCard/ -│ │ │ │ ├── index.tsx -│ │ │ │ └── RelatedCompaniesModal.tsx -│ │ │ └── TimelineComponent/ -│ │ │ ├── index.tsx -│ │ │ └── EventDetailModal.tsx -│ │ ├── tabs/ # Tab 面板 -│ │ │ ├── index.ts -│ │ │ ├── BusinessTab.tsx -│ │ │ ├── DevelopmentTab.tsx -│ │ │ ├── StrategyTab.tsx -│ │ │ └── ValueChainTab.tsx -│ │ └── utils/ -│ │ └── chartOptions.ts -│ │ -│ ├── MarketDataView/ # Tab: 股票行情(TypeScript) -│ │ ├── index.tsx # 主组件入口 -│ │ ├── types.ts # 类型定义 -│ │ ├── constants.ts # 主题配置(含黑金主题 darkGoldTheme) -│ │ ├── services/ -│ │ │ └── marketService.ts # API 服务层 -│ │ ├── hooks/ -│ │ │ └── useMarketData.ts # 数据获取 Hook -│ │ ├── utils/ -│ │ │ ├── formatUtils.ts # 格式化工具函数 -│ │ │ └── chartOptions.ts # ECharts 图表配置 -│ │ └── components/ -│ │ ├── index.ts # 组件导出 -│ │ ├── ThemedCard.tsx # 主题化卡片 -│ │ ├── MarkdownRenderer.tsx # Markdown 渲染 -│ │ ├── AnalysisModal.tsx # 涨幅分析模态框 -│ │ ├── StockSummaryCard/ # 股票概览卡片(黑金主题 4 列布局) -│ │ │ ├── index.tsx -│ │ │ ├── StockHeaderCard.tsx -│ │ │ ├── MetricCard.tsx -│ │ │ ├── utils.ts -│ │ │ └── atoms/ -│ │ │ ├── index.ts -│ │ │ ├── DarkGoldCard.tsx -│ │ │ ├── CardTitle.tsx -│ │ │ ├── MetricValue.tsx -│ │ │ ├── PriceDisplay.tsx -│ │ │ └── StatusTag.tsx -│ │ └── panels/ # Tab 面板组件 -│ │ ├── index.ts -│ │ ├── TradeDataPanel/ -│ │ │ ├── index.tsx -│ │ │ └── KLineModule.tsx -│ │ ├── FundingPanel.tsx -│ │ ├── BigDealPanel.tsx -│ │ ├── UnusualPanel.tsx -│ │ └── PledgePanel.tsx -│ │ -│ ├── DeepAnalysis/ # Tab: 深度分析(入口) -│ │ └── index.js -│ │ -│ ├── DynamicTracking/ # Tab: 动态跟踪 -│ │ ├── index.js # 主组件 -│ │ └── components/ -│ │ ├── index.js # 组件导出 -│ │ ├── NewsPanel.js # 新闻面板 -│ │ └── ForecastPanel.js # 业绩预告面板 -│ │ -│ ├── FinancialPanorama/ # Tab: 财务全景(TypeScript 模块化) -│ │ ├── index.tsx # 主组件入口 -│ │ ├── types.ts # TypeScript 类型定义 -│ │ ├── constants.ts # 常量配置(颜色、指标定义) -│ │ ├── hooks/ -│ │ │ ├── index.ts -│ │ │ └── useFinancialData.ts -│ │ ├── utils/ -│ │ │ ├── index.ts -│ │ │ ├── calculations.ts -│ │ │ └── chartOptions.ts -│ │ ├── tabs/ # Tab 面板组件 -│ │ │ ├── index.ts -│ │ │ ├── BalanceSheetTab.tsx -│ │ │ ├── CashflowTab.tsx -│ │ │ ├── FinancialMetricsTab.tsx -│ │ │ ├── IncomeStatementTab.tsx -│ │ │ └── MetricsCategoryTab.tsx -│ │ └── components/ -│ │ ├── index.ts -│ │ ├── StockInfoHeader.tsx -│ │ ├── FinancialTable.tsx # 通用财务表格 -│ │ ├── FinancialOverviewPanel.tsx # 财务概览面板 -│ │ ├── KeyMetricsOverview.tsx # 关键指标概览 -│ │ ├── PeriodSelector.tsx # 期数选择器 -│ │ ├── BalanceSheetTable.tsx -│ │ ├── IncomeStatementTable.tsx -│ │ ├── CashflowTable.tsx -│ │ ├── FinancialMetricsTable.tsx -│ │ ├── MainBusinessAnalysis.tsx -│ │ ├── IndustryRankingView.tsx -│ │ ├── StockComparison.tsx -│ │ └── ComparisonAnalysis.tsx -│ │ -│ └── ForecastReport/ # Tab: 盈利预测(TypeScript,已模块化) -│ ├── index.tsx # 主组件入口 -│ ├── types.ts # 类型定义 -│ ├── constants.ts # 配色、图表配置常量 -│ └── components/ -│ ├── index.ts -│ ├── ChartCard.tsx # 图表卡片容器 -│ ├── IncomeProfitGrowthChart.tsx # 营收与利润趋势图 -│ ├── IncomeProfitChart.tsx # 营收利润图(备用) -│ ├── GrowthChart.tsx # 增长率图(备用) -│ ├── EpsChart.tsx # EPS 趋势图 -│ ├── PePegChart.tsx # PE/PEG 分析图 -│ └── DetailTable.tsx # 详细数据表格 +├── theme/ # FUI 主题系统 +│ ├── index.ts # 主题导出 +│ ├── fui.ts # FUI 主题配置 +│ ├── fui-animations.css # FUI 动画样式 +│ ├── components/ # 主题组件 +│ │ ├── index.ts # 组件导出 +│ │ ├── FUIElements.tsx # FUI 元素组件 +│ │ └── GlassCard.tsx # 毛玻璃卡片 +│ └── utils/ # 主题工具 +│ ├── index.ts # 工具导出 +│ └── colorUtils.ts # 颜色工具函数 │ ├── hooks/ # 页面级 Hooks │ ├── useCompanyStock.js # 股票代码管理(URL 同步) │ ├── useCompanyWatchlist.js # 自选股管理(Redux 集成) -│ └── useCompanyEvents.js # PostHog 事件追踪 -│ # 注:useStockQuote.js 已下沉到 StockQuoteCard/hooks/useStockQuoteData.ts +│ ├── useCompanyEvents.js # PostHog 事件追踪 +│ ├── useCompanyData.ts # 公司数据聚合 Hook +│ └── useStockSearch.ts # 股票搜索 Hook │ -└── constants/ # 常量定义 - └── index.js # Tab 配置、Toast 消息、默认值 +├── constants/ # 常量定义 +│ └── index.js # Tab 配置、Toast 消息、默认值 +│ +└── components/ # UI 组件 + │ + ├── LoadingState.tsx # 通用加载状态组件 + ├── EChartsWrapper.tsx # ECharts 图表包装器 + │ + ├── CompanyHeader/ # 页面头部 + │ ├── index.tsx # 组合导出(TypeScript) + │ └── constants.ts # 常量配置 + │ + ├── CompanyTabs/ # Tab 切换容器 + │ └── index.js # Tab 容器(状态管理 + 内容渲染) + │ + ├── StockQuoteCard/ # 股票行情卡片(TypeScript,数据已下沉) + │ ├── index.tsx # 主组件(Props 精简为 4 个) + │ ├── types.ts # 类型定义 + │ ├── hooks/ # 内部数据 Hooks + │ │ ├── index.ts # hooks 导出索引 + │ │ ├── useStockQuoteData.ts # 行情数据+基本信息获取 + │ │ └── useStockCompare.ts # 股票对比逻辑 + │ └── components/ # 子组件 + │ ├── index.ts # 组件导出 + │ ├── theme.ts # 主题配置 + │ ├── formatters.ts # 格式化工具 + │ ├── StockHeader.tsx # 股票头部(名称、代码、收藏按钮) + │ ├── PriceDisplay.tsx # 价格显示组件 + │ ├── MetricRow.tsx # 指标行组件 + │ ├── GlassSection.tsx # 毛玻璃区块 + │ ├── LoadingSkeleton.tsx # 加载骨架屏 + │ ├── MainForceInfo.tsx # 主力资金信息 + │ ├── SecondaryQuote.tsx # 副行情(对比股票) + │ ├── CompareStockInput.tsx # 对比股票输入 + │ └── StockCompareModal.tsx # 股票对比弹窗 + │ + ├── CompanyOverview/ # Tab: 公司概览(TypeScript) + │ ├── types.ts # 类型定义 + │ ├── utils.ts # 格式化工具 + │ │ + │ ├── hooks/ # 数据 Hooks + │ │ ├── useBasicInfo.ts # 基本信息 Hook + │ │ ├── useShareholderData.ts # 股权结构 Hook(4 APIs) + │ │ ├── useManagementData.ts # 管理团队 Hook + │ │ ├── useAnnouncementsData.ts # 公告数据 Hook + │ │ ├── useBranchesData.ts # 分支机构 Hook + │ │ └── useDisclosureData.ts # 披露日程 Hook + │ │ + │ ├── components/ # 股权结构子组件 + │ │ └── shareholder/ + │ │ ├── index.ts # 导出 + │ │ ├── ActualControlCard.tsx # 实控人卡片 + │ │ ├── ConcentrationCard.tsx # 股权集中度卡片 + │ │ └── ShareholdersTable.tsx # 股东表格 + │ │ + │ ├── BasicInfoTab/ # 基本信息 Tab(可配置化) + │ │ ├── index.tsx # 主组件(可配置) + │ │ ├── config.ts # Tab 配置 + 黑金主题 + │ │ ├── utils.ts # 格式化工具函数 + │ │ └── components/ # 子组件 + │ │ ├── index.ts # 组件统一导出 + │ │ ├── LoadingState.tsx # 加载状态组件 + │ │ ├── BasicInfoTabSkeleton.tsx # 骨架屏 + │ │ ├── CompanyOverviewNavSkeleton.tsx # 导航骨架屏 + │ │ ├── ShareholderPanel.tsx # 股权结构面板 + │ │ ├── AnnouncementsPanel.tsx # 公告信息面板 + │ │ ├── BranchesPanel.tsx # 分支机构面板 + │ │ ├── BusinessInfoPanel.tsx # 工商信息面板 + │ │ ├── DisclosureSchedulePanel.tsx # 披露日程面板 + │ │ └── management/ # 管理团队模块 + │ │ ├── index.ts # 模块导出 + │ │ ├── types.ts # 类型定义 + │ │ ├── ManagementPanel.tsx # 主组件(useMemo) + │ │ ├── CategorySection.tsx # 分类区块(memo) + │ │ └── ManagementCard.tsx # 人员卡片(memo) + │ │ + │ └── DeepAnalysisTab/ # 深度分析 Tab(原子设计模式) + │ ├── index.tsx # 主入口组件 + │ ├── types.ts # 类型定义 + │ ├── atoms/ # 原子组件 + │ │ ├── index.ts + │ │ ├── DisclaimerBox.tsx # 免责声明 + │ │ ├── ScoreBar.tsx # 评分进度条 + │ │ ├── BusinessTreeItem.tsx # 业务树形项 + │ │ ├── KeyFactorCard.tsx # 关键因素卡片 + │ │ ├── ProcessNavigation.tsx # 流程导航 + │ │ └── ValueChainFilterBar.tsx # 产业链筛选栏 + │ ├── components/ # Card 组件 + │ │ ├── index.ts + │ │ ├── CorePositioningCard/ # 核心定位卡片(含 atoms) + │ │ │ ├── index.tsx + │ │ │ ├── theme.ts + │ │ │ └── atoms/ + │ │ │ ├── index.ts + │ │ │ ├── HighlightCard.tsx + │ │ │ ├── ModelBlock.tsx + │ │ │ └── SectionHeader.tsx + │ │ ├── CompetitiveAnalysisCard.tsx + │ │ ├── BusinessStructureCard.tsx + │ │ ├── BusinessSegmentsCard.tsx + │ │ ├── ValueChainCard.tsx + │ │ ├── KeyFactorsCard.tsx + │ │ ├── TimelineCard.tsx + │ │ └── StrategyAnalysisCard.tsx + │ ├── organisms/ # 复杂交互组件 + │ │ ├── ValueChainNodeCard/ + │ │ │ ├── index.tsx + │ │ │ └── RelatedCompaniesModal.tsx + │ │ └── TimelineComponent/ + │ │ ├── index.tsx + │ │ └── EventDetailModal.tsx + │ ├── tabs/ # Tab 面板 + │ │ ├── index.ts + │ │ ├── BusinessTab.tsx + │ │ ├── DevelopmentTab.tsx + │ │ ├── StrategyTab.tsx + │ │ └── ValueChainTab.tsx + │ └── utils/ + │ └── chartOptions.ts + │ + ├── DeepAnalysis/ # Tab: 深度分析(独立入口) + │ ├── index.tsx # 主组件(TypeScript) + │ ├── types.ts # 类型定义 + │ └── hooks/ + │ ├── index.ts # hooks 导出 + │ └── useDeepAnalysisData.ts # 深度分析数据 Hook + │ + ├── DynamicTracking/ # Tab: 动态跟踪 + │ ├── index.js # 主组件 + │ ├── components/ + │ │ ├── index.js # 组件导出 + │ │ ├── NewsPanel.js # 新闻面板 + │ │ ├── ForecastPanel.js # 业绩预告面板 + │ │ ├── DynamicTrackingSkeleton.tsx # 骨架屏 + │ │ └── DynamicTrackingNavSkeleton.tsx # 导航骨架屏 + │ └── NewsEventsTab/ # 新闻事件 Tab(TypeScript) + │ ├── index.tsx # 主组件 + │ ├── types.ts # 类型定义 + │ ├── constants.ts # 常量配置 + │ ├── utils.ts # 工具函数 + │ └── components/ + │ ├── index.ts + │ ├── NewsSearchBar.tsx # 搜索栏 + │ ├── NewsEventCard.tsx # 事件卡片 + │ ├── NewsPagination.tsx # 分页组件 + │ ├── NewsLoadingState.tsx # 加载状态 + │ └── NewsEmptyState.tsx # 空状态 + │ + ├── MarketDataView/ # Tab: 股票行情(TypeScript) + │ ├── index.tsx # 主组件入口 + │ ├── types.ts # 类型定义 + │ ├── constants.ts # 主题配置(含黑金主题 darkGoldTheme) + │ ├── services/ + │ │ └── marketService.ts # API 服务层 + │ ├── hooks/ + │ │ └── useMarketData.ts # 数据获取 Hook + │ ├── utils/ + │ │ ├── formatUtils.ts # 格式化工具函数 + │ │ └── chartOptions.ts # ECharts 图表配置 + │ └── components/ + │ ├── index.ts # 组件导出 + │ ├── ThemedCard.tsx # 主题化卡片 + │ ├── MarkdownRenderer.tsx # Markdown 渲染 + │ ├── AnalysisModal.tsx # 涨幅分析模态框 + │ ├── MarketDataSkeleton.tsx # 骨架屏 + │ ├── shared/ # 共享组件 + │ │ ├── index.ts + │ │ ├── styles.ts # 共享样式 + │ │ ├── DarkGoldCard.tsx # 黑金卡片 + │ │ ├── DarkGoldBadge.tsx # 黑金徽章 + │ │ ├── DataRow.tsx # 数据行 + │ │ └── EmptyState.tsx # 空状态 + │ ├── StockSummaryCard/ # 股票概览卡片(黑金主题 4 列布局) + │ │ ├── index.tsx + │ │ ├── StockHeaderCard.tsx + │ │ ├── MetricCard.tsx + │ │ ├── utils.ts + │ │ └── atoms/ + │ │ ├── index.ts + │ │ ├── DarkGoldCard.tsx + │ │ ├── CardTitle.tsx + │ │ ├── MetricValue.tsx + │ │ ├── PriceDisplay.tsx + │ │ └── StatusTag.tsx + │ └── panels/ # Tab 面板组件 + │ ├── index.ts + │ ├── TradeDataPanel/ # 交易数据面板 + │ │ ├── index.tsx + │ │ ├── KLineModule.tsx + │ │ ├── MetricOverlaySearch.tsx + │ │ ├── constants.ts + │ │ ├── styles.ts + │ │ └── components/ + │ │ ├── index.ts + │ │ ├── DailyKLineChart.tsx + │ │ ├── KLineToolbar.tsx + │ │ └── MinuteChartWithOrderBook.tsx + │ ├── FundingPanel.tsx + │ ├── BigDealPanel.tsx + │ ├── UnusualPanel.tsx + │ └── PledgePanel.tsx + │ + ├── FinancialPanorama/ # Tab: 财务全景(TypeScript 模块化) + │ ├── index.tsx # 主组件入口 + │ ├── types.ts # TypeScript 类型定义 + │ ├── constants.ts # 常量配置(颜色、指标定义) + │ ├── hooks/ + │ │ ├── index.ts + │ │ └── useFinancialData.ts + │ ├── utils/ + │ │ ├── index.ts + │ │ ├── calculations.ts + │ │ ├── chartOptions.ts + │ │ └── tableTheme.ts # 表格主题配置 + │ ├── tabs/ # Tab 面板组件 + │ │ ├── index.ts + │ │ └── UnifiedTabs.tsx # 统一 Tab 组件 + │ └── components/ + │ ├── index.ts + │ ├── StockInfoHeader.tsx + │ ├── UnifiedFinancialTable.tsx # 统一财务表格 + │ ├── FinancialOverviewPanel.tsx # 财务概览面板 + │ ├── FinancialPanoramaSkeleton.tsx # 骨架屏 + │ ├── KeyMetricsOverview.tsx # 关键指标概览 + │ ├── PeriodSelector.tsx # 期数选择器 + │ ├── MetricChartModal.tsx # 指标图表模态框 + │ ├── MainBusinessAnalysis.tsx + │ ├── IndustryRankingView.tsx + │ ├── StockComparison.tsx + │ └── ComparisonAnalysis.tsx + │ + └── ForecastReport/ # Tab: 盈利预测(TypeScript,已模块化) + ├── index.tsx # 主组件入口 + ├── types.ts # 类型定义 + ├── constants.ts # 配色、图表配置常量 + ├── hooks/ + │ ├── index.ts + │ └── useForecastData.ts + ├── services/ + │ ├── index.ts + │ └── forecastService.ts + ├── utils/ + │ ├── index.ts + │ └── chartFormatters.ts + └── components/ + ├── index.ts + ├── ChartCard.tsx # 图表卡片容器 + ├── ForecastSkeleton.tsx # 骨架屏 + ├── IncomeProfitGrowthChart.tsx # 营收与利润趋势图 + ├── IncomeProfitChart.tsx # 营收利润图 + ├── GrowthChart.tsx # 增长率图 + ├── EpsChart.tsx # EPS 趋势图 + ├── PePegChart.tsx # PE/PEG 分析图 + └── DetailTable.tsx # 详细数据表格 ``` --- @@ -273,11 +333,11 @@ Company 模块共使用 **27 个** API 接口(去重后)。 | 接口 | 方法 | 调用位置 | |------|------|----------| -| `/api/company/comprehensive-analysis/${stockCode}` | GET | DeepAnalysis/index.js | -| `/api/company/value-chain-analysis/${stockCode}` | GET | DeepAnalysis/index.js | -| `/api/company/key-factors-timeline/${stockCode}` | GET | DeepAnalysis/index.js | +| `/api/company/comprehensive-analysis/${stockCode}` | GET | DeepAnalysis/index.tsx | +| `/api/company/value-chain-analysis/${stockCode}` | GET | DeepAnalysis/index.tsx | +| `/api/company/key-factors-timeline/${stockCode}` | GET | DeepAnalysis/index.tsx | | `/api/company/value-chain/related-companies?node_name=...` | GET | ValueChainNodeCard/index.tsx | -| `/api/financial/industry-rank/${stockCode}` | GET | DeepAnalysis/index.js | +| `/api/financial/industry-rank/${stockCode}` | GET | DeepAnalysis/index.tsx | ### 五、财务数据 (1 个) @@ -303,28 +363,20 @@ Company 模块共使用 **27 个** API 接口(去重后)。 | 事件/新闻 | 1 | | **去重后总计** | **27** | -> 注:`/api/stock/${stockCode}/basic-info` 在 3 处调用,但只算 1 个接口。 - --- ## 文件职责说明 ### 入口文件 -#### `index.js` - 页面入口 +#### `index.tsx` - 页面入口 - **职责**:纯组合层,协调 Hooks 和 Components -- **代码行数**:~105 行(2025-12-17 优化后精简) - **依赖**: - - `useCompanyStock` - 股票代码状态 - - `useCompanyWatchlist` - 自选股状态 + - `useCompanyData` - 公司数据聚合 - `useCompanyEvents` - 事件追踪 - `CompanyHeader` - 页面头部 - `StockQuoteCard` - 股票行情卡片(内部自行获取数据) - - `CompanyTabs` - Tab 切换区 -- **已移除**(2025-12-17): - - `useStockQuote` - 已下沉到 StockQuoteCard - - `useBasicInfo` - 已下沉到 StockQuoteCard - - 股票对比逻辑 - 已下沉到 StockQuoteCard + - `SubTabContainer` - Tab 切换区 --- @@ -335,16 +387,6 @@ Company 模块共使用 **27 个** API 接口(去重后)。 - 管理当前股票代码状态 - 双向同步 URL 参数(支持浏览器前进/后退) - 处理搜索输入和提交 -- **返回值**: - ```js - { - stockCode, // 当前确认的股票代码 - inputCode, // 输入框中的值(未确认) - setInputCode, // 更新输入框 - handleSearch, // 执行搜索 - handleKeyPress, // 处理回车键 - } - ``` - **依赖**:`react-router-dom` (useSearchParams) #### `useCompanyWatchlist.js` - 自选股管理 @@ -352,14 +394,6 @@ Company 模块共使用 **27 个** API 接口(去重后)。 - 检查当前股票是否在自选股中 - 提供添加/移除自选股功能 - 与 Redux stockSlice 同步 -- **返回值**: - ```js - { - isInWatchlist, // 是否在自选股中 - isLoading, // 操作进行中 - toggle, // 切换自选状态 - } - ``` - **依赖**:Redux (`stockSlice`)、`AuthContext`、Chakra UI (useToast) #### `useCompanyEvents.js` - 事件追踪 @@ -368,16 +402,26 @@ Company 模块共使用 **27 个** API 接口(去重后)。 - 股票搜索追踪 - Tab 切换追踪 - 自选股操作追踪 +- **依赖**:PostHog (`usePostHogTrack`) + +#### `useCompanyData.ts` - 公司数据聚合 +- **功能**: + - 聚合股票信息和自选股状态 + - 提供统一的数据接口 - **返回值**: - ```js + ```ts { - trackStockSearched, // 追踪股票搜索 - trackTabChanged, // 追踪 Tab 切换 - trackWatchlistAdded, // 追踪添加自选 - trackWatchlistRemoved, // 追踪移除自选 + stockInfo, // 股票基础信息 + isInWatchlist, // 是否在自选股中 + watchlistLoading, // 自选操作加载中 + toggleWatchlist, // 切换自选状态 } ``` -- **依赖**:PostHog (`usePostHogTrack`) + +#### `useStockSearch.ts` - 股票搜索 +- **功能**: + - 股票搜索逻辑 + - 搜索建议和自动完成 --- @@ -386,777 +430,45 @@ Company 模块共使用 **27 个** API 接口(去重后)。 #### `CompanyHeader/` - 页面头部 | 文件 | 职责 | |------|------| -| `index.js` | 组合 SearchBar 和 WatchlistButton | -| `SearchBar.js` | 股票代码搜索输入框 | -| `WatchlistButton.js` | 自选股添加/移除按钮 | - -**Props 接口**: -```js - -``` +| `index.tsx` | 组合搜索栏和标题 | +| `constants.ts` | 常量配置 | #### `CompanyTabs/` - Tab 切换 | 文件 | 职责 | |------|------| | `index.js` | Tab 容器,管理切换状态,渲染 Tab 内容 | -| `TabNavigation.js` | Tab 导航栏(4个 Tab 按钮) | - -**Props 接口**: -```js - -``` --- -### Constants 目录 +### Tab 内容组件 -#### `constants/index.js` - 常量配置 -- `COMPANY_TABS` - Tab 配置数组(key, name, icon) -- `TAB_SELECTED_STYLE` - Tab 选中样式 -- `TOAST_MESSAGES` - Toast 消息配置 -- `DEFAULT_STOCK_CODE` - 默认股票代码 ('000001') -- `URL_PARAM_NAME` - URL 参数名 ('scode') -- `getTabNameByIndex()` - 根据索引获取 Tab 名称 - ---- - -### Tab 内容组件(`components/` 目录下) - -| 组件 | Tab 名称 | 职责 | 代码行数 | -|------|----------|------|----------| -| `CompanyOverview/` | 公司概览 | 公司基本信息、相关事件 | - | -| `MarketDataView/` | 股票行情 | K线图、实时行情 | - | -| `FinancialPanorama/` | 财务全景 | 财务报表、指标分析 | 2153 行 | -| `ForecastReport/` | 盈利预测 | 分析师预测、目标价 | 161 行 | - -> 📌 所有 Tab 内容组件已文件夹化并统一放置在 `components/` 目录下 - ---- - -## 数据流示意 - -``` -┌─────────────────────────────────────────────────────────────┐ -│ index.js (页面入口) │ -│ │ -│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────┐ │ -│ │ useCompanyStock │ │useCompanyWatchlist│ │useCompanyEvents│ -│ │ │ │ │ │ │ │ -│ │ • stockCode │ │ • isInWatchlist │ │ • track* │ │ -│ │ • inputCode │ │ • toggle │ │ functions │ │ -│ │ • handleSearch │ │ │ │ │ │ -│ └────────┬────────┘ └────────┬────────┘ └──────┬──────┘ │ -│ │ │ │ │ -│ └──────────┬─────────┴───────────────────┘ │ -│ ▼ │ -│ ┌───────────────────────────────────────────────────────┐ │ -│ │ CompanyHeader │ │ -│ │ ┌─────────────┐ ┌──────────────────┐ │ │ -│ │ │ SearchBar │ │ WatchlistButton │ │ │ -│ │ └─────────────┘ └──────────────────┘ │ │ -│ └───────────────────────────────────────────────────────┘ │ -│ ▼ │ -│ ┌───────────────────────────────────────────────────────┐ │ -│ │ CompanyTabs │ │ -│ │ ┌─────────────────────────────────────────────────┐ │ │ -│ │ │ TabNavigation │ │ │ -│ │ │ [概览] [行情] [财务] [预测] │ │ │ -│ │ └─────────────────────────────────────────────────┘ │ │ -│ │ ┌─────────────────────────────────────────────────┐ │ │ -│ │ │ TabPanels │ │ │ -│ │ │ • CompanyOverview │ │ │ -│ │ │ • MarketDataView │ │ │ -│ │ │ • FinancialPanorama │ │ │ -│ │ │ • ForecastReport │ │ │ -│ │ └─────────────────────────────────────────────────┘ │ │ -│ └───────────────────────────────────────────────────────┘ │ -└─────────────────────────────────────────────────────────────┘ -``` +| 组件 | Tab 名称 | 职责 | +|------|----------|------| +| `CompanyOverview/` | 公司概览 | 公司基本信息、股权结构、管理层、公告等 | +| `DeepAnalysis/` | 深度分析 | 公司深度研究报告、投资逻辑分析 | +| `MarketDataView/` | 股票行情 | K线图、实时行情、技术指标 | +| `FinancialPanorama/` | 财务全景 | 财务报表、财务指标分析 | +| `ForecastReport/` | 盈利预测 | 分析师预测、目标价、评级 | +| `DynamicTracking/` | 动态跟踪 | 相关事件、新闻动态、投资日历 | --- ## 重构记录 -### 2025-12-09 重构 +### 2025-12-26 目录结构更新 **改动概述**: -- `index.js` 从 **349 行** 精简至 **95 行**(减少 73%) -- 提取 **3 个自定义 Hooks** -- 提取 **2 个组件目录**(CompanyHeader、CompanyTabs) -- 抽离常量到 `constants/index.js` - -**修复的问题**: -1. **无限循环 Bug**:`useCompanyWatchlist` 中使用 `useRef` 防止重复初始化 -2. **Hook 调用顺序**:确保 `useCompanyEvents` 在 `useCompanyStock` 之后调用(依赖 stockCode) -3. **类型检查**:`CompanyOverview.js` 中 `event.keywords` 渲染时添加类型检查,支持字符串和对象两种格式 - -**设计原则**: -- **关注点分离**:每个 Hook 只负责单一职责 -- **纯组合层**:index.js 不包含业务逻辑,只负责组合 -- **Props 透传**:通过 Props 将状态和回调传递给子组件 - -### 2025-12-09 文件夹化 - -**改动概述**: -- 所有 4 个 Tab 内容组件统一移动到 `components/` 目录 -- `CompanyOverview.js` → `components/CompanyOverview/index.js` -- `MarketDataView.js` → `components/MarketDataView/index.js` -- `FinancialPanorama.js` → `components/FinancialPanorama/index.js`(2153 行) -- `ForecastReport.js` → `components/ForecastReport/index.js`(161 行) -- 更新 `CompanyTabs/index.js` 中的导入路径 - -**目的**: -- 统一目录结构,所有组件都在 `components/` 下 -- 为后期组件拆分做准备,便于添加子组件、hooks、utils 等 - -### 2025-12-10 CompanyOverview 拆分(TypeScript) - -**改动概述**: -- `CompanyOverview/index.js` 从 **330 行** 精简至 **50 行**(减少 85%) -- 采用 **TypeScript** 进行拆分,提高类型安全性 -- 提取 **1 个自定义 Hook**(`useCompanyOverviewData`) -- 提取 **1 个子组件**(`CompanyHeaderCard`) -- 抽离类型定义到 `types.ts` -- 抽离工具函数到 `utils.ts` - -**拆分后文件结构**: -``` -CompanyOverview/ -├── index.tsx # 主组件(组合层,约 60 行) -├── CompanyHeaderCard.tsx # 头部卡片组件(约 130 行) -├── BasicInfoTab.js # 基本信息 Tab(懒加载版本,约 994 行) -├── DeepAnalysisTab/ # 深度分析 Tab(21 个 TS 文件,见 2025-12-11 重构记录) -├── NewsEventsTab.js # 新闻事件 Tab -├── types.ts # 类型定义(约 50 行) -├── utils.ts # 格式化工具(约 20 行) -└── hooks/ - ├── useBasicInfo.ts # 基本信息 Hook(1 API) - ├── useShareholderData.ts # 股权结构 Hook(4 APIs) - ├── useManagementData.ts # 管理团队 Hook(1 API) - ├── useAnnouncementsData.ts # 公告数据 Hook(1 API) - ├── useBranchesData.ts # 分支机构 Hook(1 API) - ├── useDisclosureData.ts # 披露日程 Hook(1 API) - └── useCompanyOverviewData.ts # [已废弃] 原合并 Hook -``` - -**懒加载架构**(2025-12-10 优化): -- `index.tsx` 只加载 `useBasicInfo`(1 个 API)用于头部卡片 -- `BasicInfoTab.js` 使用 `isLazy` + 独立子组件实现懒加载 -- 每个内层 Tab 使用独立 Hook,点击时才加载数据 - -**Hooks 说明**: -| Hook | API 数量 | 用途 | -|------|----------|------| -| `useBasicInfo` | 1 | 公司基本信息(头部卡片 + 工商信息 Tab) | -| `useShareholderData` | 4 | 实控人、股权集中度、十大股东、十大流通股东 | -| `useManagementData` | 1 | 管理团队数据 | -| `useAnnouncementsData` | 1 | 公司公告列表 | -| `useBranchesData` | 1 | 分支机构列表 | -| `useDisclosureData` | 1 | 财报披露日程 | - -**类型定义**(`types.ts`): -- `BasicInfo` - 公司基本信息 -- `ActualControl` - 实际控制人 -- `Concentration` - 股权集中度 -- `Management` - 管理层信息 -- `Shareholder` - 股东信息 -- `Branch` - 分支机构 -- `Announcement` - 公告信息 -- `DisclosureSchedule` - 披露计划 -- `CompanyOverviewData` - Hook 返回值类型 -- `CompanyOverviewProps` - 组件 Props 类型 -- `CompanyHeaderCardProps` - 头部卡片 Props 类型 - -**工具函数**(`utils.ts`): -- `formatRegisteredCapital(value)` - 格式化注册资本(万元/亿元) -- `formatDate(dateString)` - 格式化日期 - -**设计原则**: -- **渐进式 TypeScript 迁移**:新拆分的文件使用 TypeScript,旧文件暂保持 JS -- **关注点分离**:数据加载逻辑提取到 Hook,UI 逻辑保留在组件 -- **类型复用**:统一的类型定义便于在多个文件间共享 -- **懒加载优化**:减少首屏 API 请求,按需加载数据 - -### 2025-12-10 懒加载优化 - -**改动概述**: -- 将 `useCompanyOverviewData`(9 个 API)拆分为 6 个独立 Hook -- `CompanyOverview/index.tsx` 只加载 `useBasicInfo`(1 个 API) -- `BasicInfoTab.js` 使用 5 个懒加载子组件,配合 `isLazy` 实现按需加载 -- 页面初次加载从 **9 个 API** 减少到 **1 个 API** - -**懒加载子组件**(BasicInfoTab.js 内部): -| 子组件 | Hook | 功能 | -|--------|------|------| -| `ShareholderTabPanel` | `useShareholderData` | 股权结构(4 APIs) | -| `ManagementTabPanel` | `useManagementData` | 管理团队 | -| `AnnouncementsTabPanel` | `useAnnouncementsData` + `useDisclosureData` | 公告 + 披露日程 | -| `BranchesTabPanel` | `useBranchesData` | 分支机构 | -| `BusinessInfoTabPanel` | - | 工商信息(使用父组件传入的 basicInfo) | - -**实现原理**: -- Chakra UI `Tabs` 的 `isLazy` 属性延迟渲染 TabPanel -- 每个 TabPanel 使用独立子组件,组件内调用 Hook -- 子组件只在首次激活时渲染,此时 Hook 才执行并发起 API 请求 - - | Tab 模块 | 中文名称 | 功能说明 | - |-------------------|------|----------------------------| - | CompanyOverview | 公司概览 | 公司基本信息、股权结构、管理层、公告等(9个接口) | - | DeepAnalysis | 深度分析 | 公司深度研究报告、投资逻辑分析 | - | MarketDataView | 股票行情 | K线图、实时行情、技术指标 | - | FinancialPanorama | 财务全景 | 财务报表(资产负债表、利润表、现金流)、财务指标分析 | - | ForecastReport | 盈利预测 | 分析师预测、目标价、评级 | - | DynamicTracking | 动态跟踪 | 相关事件、新闻动态、投资日历 | - -### 2025-12-10 MarketDataView TypeScript 拆分 - -**改动概述**: -- `MarketDataView/index.js` 从 **2060 行** 拆分为 **12 个 TypeScript 文件** -- 采用 **TypeScript** 进行重构,提高类型安全性 -- 提取 **1 个自定义 Hook**(`useMarketData`) -- 提取 **4 个子组件**(ThemedCard、MarkdownRenderer、StockSummaryCard、AnalysisModal) -- 抽离 API 服务到 `services/marketService.ts` -- 抽离图表配置到 `utils/chartOptions.ts` - -**拆分后文件结构**: -``` -MarketDataView/ -├── index.tsx # 主组件入口(~285 行,Tab 容器) -├── types.ts # 类型定义(~383 行) -├── constants.ts # 主题配置、常量(~49 行) -├── services/ -│ └── marketService.ts # API 服务层(~173 行) -├── hooks/ -│ └── useMarketData.ts # 数据获取 Hook(~193 行) -├── utils/ -│ ├── formatUtils.ts # 格式化工具函数(~175 行) -│ └── chartOptions.ts # ECharts 图表配置生成器(~698 行) -└── components/ - ├── index.ts # 组件导出(~8 行) - ├── ThemedCard.tsx # 主题化卡片(~32 行) - ├── MarkdownRenderer.tsx # Markdown 渲染(~65 行) - ├── StockSummaryCard.tsx # 股票概览卡片(~133 行) - ├── AnalysisModal.tsx # 涨幅分析模态框(~188 行) - └── panels/ # Tab 面板组件(2025-12-12 拆分) - ├── index.ts # 面板组件统一导出 - ├── TradeDataPanel.tsx # 交易数据面板(~381 行) - ├── FundingPanel.tsx # 融资融券面板(~113 行) - ├── BigDealPanel.tsx # 大宗交易面板(~143 行) - ├── UnusualPanel.tsx # 龙虎榜面板(~163 行) - └── PledgePanel.tsx # 股权质押面板(~124 行) -``` - -**文件职责说明**: - -| 文件 | 行数 | 职责 | -|------|------|------| -| `index.tsx` | ~285 | 主组件,Tab 容器和状态管理,导入使用 5 个 Panel 组件 | -| `types.ts` | ~383 | 所有 TypeScript 类型定义(Theme、TradeDayData、MinuteData、FundingData 等) | -| `constants.ts` | ~49 | 主题配置(light/dark)、周期选项常量 | -| `marketService.ts` | ~173 | API 服务封装(getMarketData、getMinuteData、getBigDealData 等) | -| `useMarketData.ts` | ~193 | 数据获取 Hook,管理所有市场数据状态 | -| `formatUtils.ts` | ~175 | 数字/日期/涨跌幅格式化工具 | -| `chartOptions.ts` | ~698 | ECharts 配置生成器(K线图、分钟图、融资融券图、质押图) | -| `ThemedCard.tsx` | ~32 | 主题化卡片容器组件 | -| `MarkdownRenderer.tsx` | ~65 | Markdown 内容渲染组件 | -| `StockSummaryCard.tsx` | ~133 | 股票概览卡片(价格、涨跌幅、成交量等) | -| `AnalysisModal.tsx` | ~188 | 涨幅分析详情模态框 | - -**类型定义**(`types.ts`): -- `Theme` - 主题配置类型 -- `TradeDayData` - 日线交易数据 -- `MinuteData` - 分钟线数据 -- `FundingDayData` - 融资融券数据 -- `BigDealData` / `BigDealDayStats` - 大宗交易数据 -- `UnusualData` / `UnusualDayData` - 龙虎榜数据 -- `PledgeData` - 股权质押数据 -- `RiseAnalysis` - 涨幅分析数据 -- `MarketSummary` - 市场概览数据 -- `VerificationReport` - 验证报告数据 -- 各组件 Props 类型 - -**Hook 返回值**(`useMarketData`): -```typescript -{ - loading: boolean; - summary: MarketSummary | null; - tradeData: TradeDayData[]; - minuteData: MinuteData | null; - minuteLoading: boolean; - fundingData: FundingDayData[]; - bigDealData: BigDealData | null; - unusualData: UnusualData | null; - pledgeData: PledgeData | null; - analysisMap: Record; - refetch: () => Promise; - loadMinuteData: () => Promise; -} -``` - -**设计原则**: -- **TypeScript 类型安全**:所有数据结构有完整类型定义 -- **服务层分离**:API 调用统一在 `marketService.ts` 中管理 -- **图表配置抽离**:复杂的 ECharts 配置集中在 `chartOptions.ts` -- **组件复用**:通用组件(ThemedCard、MarkdownRenderer)可在其他模块使用 - -### 2025-12-10 ManagementPanel 拆分重构 - -**改动概述**: -- `ManagementPanel.tsx` 从 **180 行** 拆分为 **5 个 TypeScript 文件** -- 创建 `management/` 子目录,模块化管理 -- 添加性能优化(`useMemo`、`React.memo`) - -**拆分后文件结构**: -``` -components/management/ -├── index.ts # 模块导出 -├── types.ts # 类型定义(~35 行) -├── ManagementPanel.tsx # 主组件(~105 行,useMemo 优化) -├── CategorySection.tsx # 分类区块组件(~65 行,memo) -└── ManagementCard.tsx # 人员卡片组件(~100 行,memo) -``` - -**类型定义**(`types.ts`): -- `ManagementPerson` - 管理人员信息 -- `ManagementCategory` - 分类类型(高管/董事/监事/其他) -- `CategorizedManagement` - 分类后的数据结构 -- `CategoryConfig` - 分类配置(图标、颜色) - -**性能优化**: -- `useMemo` - 缓存 `categorizeManagement()` 分类计算结果 -- `React.memo` - `ManagementCard` 和 `CategorySection` 使用 memo 包装 -- 常量提取 - `CATEGORY_CONFIG` 和 `CATEGORY_ORDER` 提取到组件外部 - -**设计原则**: -- **职责分离**:卡片渲染、分类区块、数据处理各自独立 -- **类型安全**:消除 `any` 类型,完整的 TypeScript 类型定义 -- **可复用性**:`ManagementCard` 可独立使用 - -### 2025-12-11 DeepAnalysisTab 模块化拆分(TypeScript) - -**改动概述**: -- `DeepAnalysisTab.js` 从 **1,796 行** 拆分为 **21 个 TypeScript 文件** -- 采用**原子设计模式**(atoms/components/organisms)组织代码 -- 完整 TypeScript 类型定义 -- 格式化工具合并到全局 `src/utils/priceFormatters.js` - -**拆分后文件结构**: -``` -DeepAnalysisTab/ -├── index.tsx # 主入口组件,组合所有 Card 子组件 -├── types.ts # TypeScript 类型定义(接口、数据结构) -├── atoms/ # 原子组件(基础 UI 元素) -│ ├── index.ts # 原子组件统一导出 -│ ├── DisclaimerBox.tsx # 免责声明警告框(黄色 Alert,用 6 次) -│ ├── ScoreBar.tsx # 评分进度条(带颜色渐变,用 8 次) -│ ├── BusinessTreeItem.tsx # 业务结构树形项(递归组件) -│ └── KeyFactorCard.tsx # 关键因素卡片(带影响方向图标) -├── components/ # Card 容器组件(页面区块) -│ ├── index.ts # Card 组件统一导出 -│ ├── CorePositioningCard.tsx # 核心定位卡片(行业地位、核心优势) -│ ├── CompetitiveAnalysisCard.tsx # 竞争地位分析卡片(雷达图 + 评分条) -│ ├── BusinessStructureCard.tsx # 业务结构分析卡片(树形展示) -│ ├── ValueChainCard.tsx # 产业链分析卡片(Tabs: 上游/中游/下游) -│ ├── KeyFactorsCard.tsx # 关键因素卡片(Accordion 折叠面板) -│ ├── TimelineCard.tsx # 发展时间线卡片(正面/负面事件统计) -│ ├── BusinessSegmentsCard.tsx # 业务板块详情卡片(可展开/折叠) -│ └── StrategyAnalysisCard.tsx # 战略分析卡片(战略方向 + 战略举措) -├── organisms/ # 复杂组件(含状态管理和 API 调用) -│ ├── ValueChainNodeCard/ # 产业链节点组件 -│ │ ├── index.tsx # 产业链节点卡片(点击展开详情) -│ │ └── RelatedCompaniesModal.tsx # 相关公司模态框(API 获取公司列表) -│ └── TimelineComponent/ # 时间线组件 -│ ├── index.tsx # 时间线主组件(事件列表渲染) -│ └── EventDetailModal.tsx # 事件详情模态框(查看完整事件信息) -└── utils/ - └── chartOptions.ts # ECharts 图表配置(雷达图、桑基图) -``` - -**组件依赖关系**: -``` -index.tsx -├── CorePositioningCard -├── CompetitiveAnalysisCard -│ ├── ScoreBar (atom) -│ ├── DisclaimerBox (atom) -│ └── ReactECharts (雷达图) -├── BusinessStructureCard -│ └── BusinessTreeItem (atom, 递归) -├── ValueChainCard -│ └── ValueChainNodeCard (organism) -│ └── RelatedCompaniesModal -├── KeyFactorsCard -│ └── KeyFactorCard (atom) -├── TimelineCard -│ └── TimelineComponent (organism) -│ └── EventDetailModal -├── BusinessSegmentsCard -└── StrategyAnalysisCard - └── DisclaimerBox (atom) -``` - -**类型定义**(`types.ts`): -- `DeepAnalysisTabProps` - 主组件 Props -- `QualitativeAnalysis` - 定性分析数据 -- `CompetitivePosition` - 竞争地位数据 -- `BusinessStructureItem` - 业务结构项 -- `ValueChainData` - 产业链数据 -- `ValueChainNode` - 产业链节点 -- `KeyFactor` - 关键因素 -- `DevelopmentTimeline` - 发展时间线 -- `TimelineEvent` - 时间线事件 -- `BusinessSegment` - 业务板块 -- `Strategy` - 战略分析 - -**工具函数位置**: -| 函数 | 文件位置 | 说明 | -|------|----------|------| -| `formatCurrency` | `src/utils/priceFormatters.js` | 货币格式化 | -| `formatBusinessRevenue` | `src/utils/priceFormatters.js` | 营收格式化(亿/万) | -| `formatPercentage` | `src/utils/priceFormatters.js` | 百分比格式化 | -| `getRadarChartOption` | `DeepAnalysisTab/utils/chartOptions.ts` | 雷达图 ECharts 配置 | -| `getSankeyChartOption` | `DeepAnalysisTab/utils/chartOptions.ts` | 桑基图 ECharts 配置 | - -**优化效果**: -| 指标 | 优化前 | 优化后 | 改善 | -|------|--------|--------|------| -| 主文件行数 | 1,796 | ~117 | -93% | -| 文件数量 | 1 (.js) | 21 (.tsx/.ts) | 模块化 + TS | -| 可复用组件 | 0 | 4 原子 + 2 复杂 | 提升 | -| 类型安全 | 无 | 完整 | TypeScript | - -**设计原则**: -- **原子设计模式**:atoms(基础元素)→ components(区块)→ organisms(复杂交互) -- **TypeScript 类型安全**:完整的接口定义,消除 any 类型 -- **职责分离**:UI 渲染与 API 调用分离,模态框独立管理 -- **代码复用**:DisclaimerBox、ScoreBar 等原子组件多处复用 - -### 2025-12-12 FinancialPanorama 模块化拆分(TypeScript) - -**改动概述**: -- `FinancialPanorama/index.js` 从 **2,150 行** 拆分为 **21 个 TypeScript 文件** -- 提取 **1 个自定义 Hook**(`useFinancialData`) -- 提取 **9 个子组件**(表格组件 + 分析组件) -- 抽离类型定义到 `types.ts` -- 抽离常量配置到 `constants.ts` -- 抽离工具函数到 `utils/` - -**拆分后文件结构**: -``` -FinancialPanorama/ -├── index.tsx # 主入口组件(~400 行) -├── types.ts # TypeScript 类型定义(~441 行) -├── constants.ts # 常量配置(颜色、指标定义) -├── hooks/ -│ ├── index.ts # Hook 统一导出 -│ └── useFinancialData.ts # 财务数据加载 Hook(9 API 并行加载) -├── utils/ -│ ├── index.ts # 工具函数统一导出 -│ ├── calculations.ts # 计算工具(同比变化率、单元格背景色) -│ └── chartOptions.ts # ECharts 图表配置生成器 -└── components/ - ├── index.ts # 组件统一导出 - ├── StockInfoHeader.tsx # 股票信息头部(~95 行) - ├── BalanceSheetTable.tsx # 资产负债表(~220 行,可展开分组) - ├── IncomeStatementTable.tsx # 利润表(~205 行,可展开分组) - ├── CashflowTable.tsx # 现金流量表(~140 行) - ├── FinancialMetricsTable.tsx # 财务指标表(~260 行,7 分类切换) - ├── MainBusinessAnalysis.tsx # 主营业务分析(~180 行,饼图 + 表格) - ├── IndustryRankingView.tsx # 行业排名(~110 行) - ├── StockComparison.tsx # 股票对比(~210 行,含独立数据加载) - └── ComparisonAnalysis.tsx # 综合对比分析(~40 行) -``` - -**组件依赖关系**: -``` -index.tsx -├── useFinancialData (hook) # 数据加载 -├── StockInfoHeader # 股票基本信息展示 -├── ComparisonAnalysis # 营收与利润趋势图 -├── FinancialMetricsTable # 财务指标表(7 分类) -├── BalanceSheetTable # 资产负债表(可展开) -├── IncomeStatementTable # 利润表(可展开) -├── CashflowTable # 现金流量表 -├── MainBusinessAnalysis # 主营业务(饼图) -├── IndustryRankingView # 行业排名 -└── StockComparison # 股票对比(独立状态) -``` - -**类型定义**(`types.ts`): -- `StockInfo` - 股票基本信息 -- `BalanceSheetData` - 资产负债表数据 -- `IncomeStatementData` - 利润表数据 -- `CashflowData` - 现金流量表数据 -- `FinancialMetricsData` - 财务指标数据(7 分类) -- `ProductClassification` / `IndustryClassification` - 主营业务分类 -- `IndustryRankData` - 行业排名数据 -- `ForecastData` - 业绩预告数据 -- `ComparisonData` - 对比数据 -- `MetricConfig` / `MetricSectionConfig` - 指标配置类型 -- 各组件 Props 类型 - -**常量配置**(`constants.ts`): -- `COLORS` - 颜色配置(中国市场:红涨绿跌) -- `CURRENT_ASSETS_METRICS` / `NON_CURRENT_ASSETS_METRICS` 等 - 资产负债表指标 -- `INCOME_STATEMENT_SECTIONS` - 利润表分组配置 -- `CASHFLOW_METRICS` - 现金流量表指标 -- `FINANCIAL_METRICS_CATEGORIES` - 财务指标 7 大分类 -- `RANKING_METRICS` / `COMPARE_METRICS` - 排名和对比指标 - -**工具函数**(`utils/`): -| 函数 | 文件 | 说明 | -|------|------|------| -| `calculateYoYChange` | calculations.ts | 计算同比变化率和强度 | -| `getCellBackground` | calculations.ts | 根据变化率返回单元格背景色 | -| `getValueByPath` | calculations.ts | 从嵌套对象获取值 | -| `isNegativeIndicator` | calculations.ts | 判断是否为负向指标 | -| `getMetricChartOption` | chartOptions.ts | 指标趋势图配置 | -| `getComparisonChartOption` | chartOptions.ts | 营收与利润对比图配置 | -| `getMainBusinessPieOption` | chartOptions.ts | 主营业务饼图配置 | -| `getCompareBarChartOption` | chartOptions.ts | 股票对比柱状图配置 | - -**Hook 返回值**(`useFinancialData`): -```typescript -{ - // 数据状态 - stockInfo: StockInfo | null; - balanceSheet: BalanceSheetData[]; - incomeStatement: IncomeStatementData[]; - cashflow: CashflowData[]; - financialMetrics: FinancialMetricsData[]; - mainBusiness: MainBusinessData | null; - forecast: ForecastData | null; - industryRank: IndustryRankData[]; - comparison: ComparisonData[]; - - // 加载状态 - loading: boolean; - error: string | null; - - // 操作方法 - refetch: () => Promise; - setStockCode: (code: string) => void; - setSelectedPeriods: (periods: number) => void; - - // 当前参数 - currentStockCode: string; - selectedPeriods: number; -} -``` - -**优化效果**: -| 指标 | 优化前 | 优化后 | 改善 | -|------|--------|--------|------| -| 主文件行数 | 2,150 | ~400 | -81% | -| 文件数量 | 1 (.js) | 21 (.tsx/.ts) | 模块化 + TS | -| 可复用组件 | 0(内联) | 9 个独立组件 | 提升 | -| 类型安全 | 无 | 完整 | TypeScript | - -**设计原则**: -- **TypeScript 类型安全**:完整的接口定义,消除 any 类型 -- **Hook 数据层**:`useFinancialData` 封装 9 个 API 并行加载 -- **组件解耦**:每个表格/分析视图独立为组件 -- **常量配置化**:指标定义可维护、可扩展 -- **工具函数复用**:计算和图表配置统一管理 - -### 2025-12-12 MarketDataView Panel 拆分 - -**改动概述**: -- `MarketDataView/index.tsx` 从 **1,049 行** 精简至 **285 行**(减少 73%) -- 将 5 个 TabPanel 拆分为独立的面板组件 -- 创建 `components/panels/` 子目录 - -**拆分后文件结构**: -``` -MarketDataView/components/panels/ -├── index.ts # 面板组件统一导出 -├── TradeDataPanel.tsx # 交易数据面板(~381 行) -├── FundingPanel.tsx # 融资融券面板(~113 行) -├── BigDealPanel.tsx # 大宗交易面板(~143 行) -├── UnusualPanel.tsx # 龙虎榜面板(~163 行) -└── PledgePanel.tsx # 股权质押面板(~124 行) -``` - -**面板组件职责**: - -| 组件 | 行数 | 功能 | -|------|------|------| -| `TradeDataPanel` | ~381 | K线图、分钟K线图、交易明细表格 | -| `FundingPanel` | ~113 | 融资融券图表和数据卡片 | -| `BigDealPanel` | ~143 | 大宗交易记录表格 | -| `UnusualPanel` | ~163 | 龙虎榜数据(买入/卖出前五) | -| `PledgePanel` | ~124 | 股权质押图表和明细表格 | - -**优化效果**: -| 指标 | 优化前 | 优化后 | 改善 | -|------|--------|--------|------| -| 主文件行数 | 1,049 | 285 | -73% | -| 面板组件 | 内联 | 5 个独立文件 | 模块化 | -| 可维护性 | 低 | 高 | 每个面板独立维护 | - -**设计原则**: -- **职责分离**:主组件只负责 Tab 容器和状态管理 -- **组件复用**:面板组件可独立测试和维护 -- **类型安全**:每个面板组件有独立的 Props 类型定义 - -### 2025-12-16 StockSummaryCard 黑金主题重构 - -**改动概述**: -- `StockSummaryCard.tsx` 从单文件重构为**原子设计模式**的目录结构 -- 布局从 **1+3**(头部+三卡片)改为 **4 列横向排列** -- 新增**黑金主题**(`darkGoldTheme`) -- 提取 **5 个原子组件** + **2 个业务组件** - -**拆分后文件结构**: -``` -StockSummaryCard/ -├── index.tsx # 主组件(4 列 SimpleGrid 布局) -├── StockHeaderCard.tsx # 股票信息卡片(名称、价格、涨跌幅、走势) -├── MetricCard.tsx # 指标卡片模板组件 -├── utils.ts # 状态计算工具函数 -└── atoms/ # 原子组件 - ├── index.ts # 统一导出 - ├── DarkGoldCard.tsx # 黑金主题卡片容器(渐变背景、金色边框) - ├── CardTitle.tsx # 卡片标题(图标+标题+副标题) - ├── MetricValue.tsx # 核心数值展示(标签+数值+后缀) - ├── PriceDisplay.tsx # 价格显示(价格+涨跌箭头+百分比) - └── StatusTag.tsx # 状态标签(活跃/健康/警惕等) -``` - -**4 列布局设计**: -``` -┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ -│ 股票信息 │ │ 交易热度 │ │ 估值VS安全 │ │ 情绪与风险 │ -│ 平安银行 │ │ (流动性) │ │ (便宜否) │ │ (资金面) │ -│ (000001) │ │ │ │ │ │ │ -│ 13.50 ↗+1.89%│ │ 成交额 46.79亿│ │ PE 4.96 │ │ 融资 58.23亿 │ -│ 走势:小幅上涨 │ │ 成交量|换手率 │ │ 质押率(健康) │ │ 融券 1.26亿 │ -└──────────────┘ └──────────────┘ └──────────────┘ └──────────────┘ -``` - -**黑金主题配置**(`constants.ts`): -```typescript -export const darkGoldTheme = { - bgCard: 'linear-gradient(135deg, #1a1a2e 0%, #0f0f1a 100%)', - border: 'rgba(212, 175, 55, 0.3)', - gold: '#D4AF37', - orange: '#FF9500', - green: '#00C851', - red: '#FF4444', - textPrimary: '#FFFFFF', - textMuted: 'rgba(255, 255, 255, 0.6)', -}; -``` - -**状态计算工具**(`utils.ts`): -| 函数 | 功能 | -|------|------| -| `getTrendDescription` | 根据涨跌幅返回走势描述(强势上涨/小幅下跌等) | -| `getTurnoverStatus` | 换手率状态(≥3% 活跃, ≥1% 正常, <1% 冷清) | -| `getPEStatus` | 市盈率估值评级(极低估值/合理/偏高/泡沫风险) | -| `getPledgeStatus` | 质押率健康状态(<10% 健康, <30% 正常, <50% 偏高, ≥50% 警惕) | -| `getPriceColor` | 根据涨跌返回颜色(红涨绿跌) | - -**原子组件说明**: -| 组件 | 行数 | 用途 | 可复用场景 | -|------|------|------|-----------| -| `DarkGoldCard` | ~40 | 黑金主题卡片容器 | 任何需要黑金风格的卡片 | -| `CardTitle` | ~30 | 卡片标题行 | 带图标的标题展示 | -| `MetricValue` | ~45 | 核心数值展示 | 各种指标数值展示 | -| `PriceDisplay` | ~55 | 价格+涨跌幅 | 股票价格展示 | -| `StatusTag` | ~20 | 状态标签 | 各种状态文字标签 | - -**响应式断点**: -- `lg` (≥992px): 4 列 -- `md` (≥768px): 2 列 -- `base` (<768px): 1 列 - -**类型定义更新**(`types.ts`): -- `StockSummaryCardProps.theme` 改为可选参数,组件内置使用 `darkGoldTheme` - -**优化效果**: -| 指标 | 优化前 | 优化后 | 改善 | -|------|--------|--------|------| -| 主文件行数 | ~350 | ~115 | -67% | -| 文件数量 | 1 | 8 | 原子设计模式 | -| 可复用组件 | 0 | 5 原子 + 2 业务 | 提升 | -| 主题支持 | 依赖传入 | 内置黑金主题 | 独立 | - -**设计原则**: -- **原子设计模式**:atoms(基础元素)→ 业务组件(MetricCard、StockHeaderCard)→ 页面组件(index.tsx) -- **主题独立**:StockSummaryCard 使用内置黑金主题,不依赖外部传入 -- **职责分离**:状态计算逻辑提取到 `utils.ts`,UI 与逻辑解耦 -- **组件复用**:原子组件可在其他黑金主题场景复用 - -### 2025-12-16 TradeDataPanel 原子设计模式拆分 - -**改动概述**: -- `TradeDataPanel.tsx` 从 **382 行** 拆分为 **8 个 TypeScript 文件** -- 采用**原子设计模式**组织代码 -- 提取 **3 个原子组件** + **3 个业务组件** - -**拆分后文件结构**: -``` -TradeDataPanel/ -├── index.tsx # 主入口组件(~50 行,组合 3 个子组件) -├── KLineChart.tsx # 日K线图组件(~40 行) -├── MinuteKLineSection.tsx # 分钟K线区域(~95 行,含加载/空状态处理) -├── TradeTable.tsx # 交易明细表格(~75 行) -└── atoms/ # 原子组件 - ├── index.ts # 统一导出 - ├── MinuteStats.tsx # 分钟数据统计(~80 行,4 个 Stat 卡片) - ├── TradeAnalysis.tsx # 成交分析(~65 行,活跃时段/平均价格等) - └── EmptyState.tsx # 空状态组件(~35 行,可复用) -``` - -**组件依赖关系**: -``` -index.tsx -├── KLineChart # 日K线图(ECharts) -├── MinuteKLineSection # 分钟K线区域 -│ ├── MinuteStats (atom) # 开盘/当前/最高/最低价统计 -│ ├── TradeAnalysis (atom) # 成交数据分析 -│ └── EmptyState (atom) # 空状态提示 -└── TradeTable # 交易明细表格(最近 10 天) -``` - -**组件职责**: -| 组件 | 行数 | 功能 | -|------|------|------| -| `index.tsx` | ~50 | 主入口,组合 3 个子组件 | -| `KLineChart` | ~40 | 日K线图渲染,支持图表点击事件 | -| `MinuteKLineSection` | ~95 | 分钟K线区域,含加载状态、空状态、统计数据 | -| `TradeTable` | ~75 | 最近 10 天交易明细表格 | -| `MinuteStats` | ~80 | 分钟数据四宫格统计(开盘/当前/最高/最低价) | -| `TradeAnalysis` | ~65 | 成交数据分析(活跃时段、平均价格、数据点数) | -| `EmptyState` | ~35 | 通用空状态组件(可配置标题和描述) | - -**优化效果**: -| 指标 | 优化前 | 优化后 | 改善 | -|------|--------|--------|------| -| 主文件行数 | 382 | ~50 | -87% | -| 文件数量 | 1 | 8 | 原子设计模式 | -| 可复用组件 | 0 | 3 原子 + 3 业务 | 提升 | - -**设计原则**: -- **原子设计模式**:atoms(MinuteStats、TradeAnalysis、EmptyState)→ 业务组件(KLineChart、MinuteKLineSection、TradeTable)→ 主组件 -- **职责分离**:图表、统计、表格各自独立 -- **组件复用**:EmptyState 可在其他场景复用 -- **类型安全**:完整的 Props 类型定义和导出 +- `index.js` 迁移为 `index.tsx`(TypeScript) +- 新增 `theme/` 目录:FUI 主题系统 +- 新增 `config.ts`:页面配置 +- 新增 `types.ts`:页面级类型定义 +- `hooks/` 新增 `useCompanyData.ts` 和 `useStockSearch.ts` +- `CompanyHeader/` 迁移为 TypeScript +- `DeepAnalysis/` 迁移为 TypeScript,新增 hooks 目录 +- `DynamicTracking/NewsEventsTab/` 完整 TypeScript 重构 +- `MarketDataView/` 新增 `shared/` 共享组件目录 +- `TradeDataPanel/` 新增 `components/` 子目录 +- `FinancialPanorama/` 新增 `tableTheme.ts` ### 2025-12-17 StockQuoteCard 数据下沉优化 @@ -1164,90 +476,8 @@ index.tsx - StockQuoteCard Props 从 **11 个** 精简至 **4 个**(减少 64%) - 行情数据、基本信息、股票对比逻辑全部下沉到组件内部 - Company/index.js 移除约 **40 行** 数据获取代码 -- 删除 `Company/hooks/useStockQuote.js` - -**创建的文件**: -``` -StockQuoteCard/hooks/ -├── index.ts # hooks 导出索引 -├── useStockQuoteData.ts # 行情数据 + 基本信息获取(~152 行) -└── useStockCompare.ts # 股票对比逻辑(~91 行) -``` - -**Props 对比**: - -**优化前(11 个 Props)**: -```tsx - -``` - -**优化后(4 个 Props)**: -```tsx - -``` - -**Hook 返回值**: - -`useStockQuoteData(stockCode)`: -```typescript -{ - quoteData: StockQuoteCardData | null; // 行情数据 - basicInfo: BasicInfo | null; // 基本信息 - isLoading: boolean; // 加载状态 - error: string | null; // 错误信息 - refetch: () => void; // 手动刷新 -} -``` - -`useStockCompare(stockCode)`: -```typescript -{ - currentStockInfo: StockInfo | null; // 当前股票财务信息 - compareStockInfo: StockInfo | null; // 对比股票财务信息 - isCompareLoading: boolean; // 对比数据加载中 - handleCompare: (code: string) => Promise; // 触发对比 - clearCompare: () => void; // 清除对比 -} -``` - -**修改的文件**: -| 文件 | 操作 | 说明 | -|------|------|------| -| `StockQuoteCard/hooks/useStockQuoteData.ts` | 新建 | 合并行情+基本信息获取 | -| `StockQuoteCard/hooks/useStockCompare.ts` | 新建 | 股票对比逻辑 | -| `StockQuoteCard/hooks/index.ts` | 新建 | hooks 导出索引 | -| `StockQuoteCard/index.tsx` | 修改 | 使用内部 hooks,减少 props | -| `StockQuoteCard/types.ts` | 修改 | Props 从 11 个精简为 4 个 | -| `Company/index.js` | 修改 | 移除下沉的数据获取逻辑 | -| `Company/hooks/useStockQuote.js` | 删除 | 已移到 StockQuoteCard | - -**优化收益**: -| 指标 | 优化前 | 优化后 | 改善 | -|------|--------|--------|------| -| Props 数量 | 11 | 4 | -64% | -| Company/index.js 行数 | ~172 | ~105 | -39% | -| 数据获取位置 | 页面层 | 组件内部 | 就近原则 | -| 可复用性 | 依赖父组件 | 独立可用 | 提升 | **设计原则**: - **数据就近获取**:组件自己获取自己需要的数据 - **Props 最小化**:只传递真正需要外部控制的状态 -- **职责清晰**:自选股状态保留在页面层(涉及 Redux 和事件追踪) -- **可复用性**:StockQuoteCard 可独立在其他页面使用 \ No newline at end of file +- **可复用性**:StockQuoteCard 可独立在其他页面使用