Files
vf_react/docs/POSTHOG_EVENT_TRACKING.md
zdl 09db05c448 docs: 将所有文档迁移到 docs/ 目录
- 移动42个文档文件到 docs/ 目录
  - 更新 .gitignore 允许 docs/ 下的 .md 文件
  - 删除根目录下的重复文档文件

  📁 文档分类:
  - StockDetailPanel 重构文档(3个)
  - PostHog 集成文档(6个)
  - 系统架构和API文档(33个)

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

  Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-30 14:51:22 +08:00

23 KiB
Raw Permalink Blame History

PostHog 事件追踪实施总结

已完成的追踪

1. Home 页面(首页/落地页)

已实施的追踪事件:

📄 页面浏览

  • 事件: LANDING_PAGE_VIEWED
  • 触发时机: 页面加载
  • 属性:
    • timestamp - 访问时间
    • is_authenticated - 是否已登录
    • user_id - 用户ID如果已登录

🎯 功能卡片点击

  • 事件: FEATURE_CARD_CLICKED
  • 触发时机: 用户点击任何功能卡片
  • 属性:
    • feature_id - 功能IDnews-catalyst, concepts, stocks, etc.
    • feature_title - 功能标题
    • feature_url - 目标URL
    • is_featured - 是否为推荐功能(新闻中心为 true
    • link_type - 链接类型internal/external

追踪的6个核心功能:

  1. 新闻中心 (news-catalyst) - 推荐功能,黄色边框
  2. 概念中心 (concepts)
  3. 个股信息汇总 (stocks)
  4. 涨停板块分析 (limit-analyse)
  5. 个股罗盘 (company)
  6. 模拟盘交易 (trading-simulation)

2. StockOverview 页面(个股中心) 已完成

注意:个股中心页面已完全实现 PostHog 追踪,通过 src/views/StockOverview/hooks/useStockOverviewEvents.js Hook。

已实施的追踪事件:

📄 页面浏览

  • 事件: STOCK_OVERVIEW_VIEWED
  • 触发时机: 页面加载
  • 属性:
    • timestamp - 访问时间

📊 市场统计数据查看

  • 事件: STOCK_LIST_VIEWED
  • 触发时机: 加载市场统计数据
  • 属性:
    • total_market_cap - 总市值
    • total_volume - 总成交量
    • rising_stocks - 上涨股票数
    • falling_stocks - 下跌股票数
    • data_date - 数据日期

🔍 搜索追踪

  • 事件: SEARCH_INITIATED / STOCK_SEARCHED
  • 触发时机: 用户输入搜索、完成搜索
  • 属性:
    • query - 搜索关键词
    • result_count - 搜索结果数量
    • has_results - 是否有结果
    • context - 固定为 'stock_overview'

🎯 搜索结果点击

  • 事件: SEARCH_RESULT_CLICKED
  • 触发时机: 用户点击搜索结果
  • 属性:
    • stock_code - 股票代码
    • stock_name - 股票名称
    • exchange - 交易所
    • position - 在搜索结果中的位置
    • context - 固定为 'stock_overview'

🔥 概念卡片点击

  • 事件: CONCEPT_CLICKED
  • 触发时机: 用户点击热门概念卡片
  • 属性:
    • concept_name - 概念名称
    • concept_code - 概念代码
    • change_percent - 涨跌幅
    • stock_count - 股票数量
    • rank - 排名
    • source - 固定为 'daily_hot_concepts'

🏷️ 概念股票标签点击

  • 事件: CONCEPT_STOCK_CLICKED
  • 触发时机: 点击概念下的股票标签
  • 属性:
    • stock_code - 股票代码
    • stock_name - 股票名称
    • concept_name - 所属概念
    • source - 固定为 'daily_hot_concepts_tag'

📊 热力图股票点击

  • 事件: STOCK_CLICKED
  • 触发时机: 点击热力图中的股票
  • 属性:
    • stock_code - 股票代码
    • stock_name - 股票名称
    • change_percent - 涨跌幅
    • market_cap_range - 市值区间
    • source - 固定为 'market_heatmap'

📅 日期选择变化

  • 事件: SEARCH_FILTER_APPLIED
  • 触发时机: 用户选择不同的交易日期
  • 属性:
    • filter_type - 固定为 'date'
    • filter_value - 新选择的日期
    • previous_value - 之前的日期
    • context - 固定为 'stock_overview'

实施方式: Custom Hook (useStockOverviewEvents.js) 已集成


3. Concept 页面(概念中心)

已实施的追踪事件:

📄 页面浏览

  • 事件: CONCEPT_CENTER_VIEWED
  • 触发时机: 页面加载
  • 属性:
    • timestamp - 访问时间

🔍 搜索查询

  • 事件: SEARCH_QUERY_SUBMITTED
  • 触发时机: 用户搜索概念
  • 属性:
    • query - 搜索关键词
    • category - 固定为 'concept'
    • result_count - 搜索结果数量
    • has_results - 是否有结果

🎚️ 筛选追踪

  • 事件: SEARCH_FILTER_APPLIED
  • 触发时机: 用户更改筛选条件
  • 属性:
    • filter_type - 筛选类型sort/date
    • filter_value - 筛选值
    • previous_value - 之前的值
    • context - 固定为 'concept_center'

支持的筛选类型:

  1. 排序 (sort): 涨跌幅/相关度/股票数量/概念名称
  2. 日期范围 (date): 选择交易日期

🎯 概念卡片点击

  • 事件: CONCEPT_CLICKED
  • 触发时机: 用户点击概念卡片
  • 属性:
    • concept_id - 概念ID
    • concept_name - 概念名称
    • change_percent - 涨跌幅
    • stock_count - 股票数量
    • position - 在列表中的位置
    • source - 固定为 'concept_center_list'

👀 查看个股

  • 事件: CONCEPT_STOCKS_VIEWED
  • 触发时机: 用户点击"查看个股"按钮
  • 属性:
    • concept_name - 概念名称
    • stock_count - 股票数量
    • source - 固定为 'concept_center'

🏷️ 概念股票点击

  • 事件: CONCEPT_STOCK_CLICKED
  • 触发时机: 点击概念股票表格中的股票
  • 属性:
    • stock_code - 股票代码
    • stock_name - 股票名称
    • concept_name - 所属概念
    • source - 固定为 'concept_center_stock_table'

📊 历史时间轴查看

  • 事件: CONCEPT_TIMELINE_VIEWED
  • 触发时机: 用户点击"历史时间轴"按钮
  • 属性:
    • concept_id - 概念ID
    • concept_name - 概念名称
    • source - 固定为 'concept_center'

📄 翻页追踪

  • 事件: NEWS_LIST_VIEWED
  • 触发时机: 用户翻页
  • 属性:
    • page - 页码
    • filters - 当前筛选条件
      • sort - 排序方式
      • has_query - 是否有搜索词
      • date - 日期
    • context - 固定为 'concept_center'

🔄 视图模式切换

  • 事件: VIEW_MODE_CHANGED
  • 触发时机: 用户切换网格/列表视图
  • 属性:
    • view_mode - 新视图模式grid/list
    • previous_mode - 之前的模式
    • context - 固定为 'concept_center'

4. Company 页面(公司详情/个股罗盘)

已实施的追踪事件:

📄 页面浏览

  • 事件: COMPANY_PAGE_VIEWED
  • 触发时机: 页面加载
  • 属性:
    • timestamp - 访问时间
    • stock_code - 当前查看的股票代码

🔍 股票搜索

  • 事件: STOCK_SEARCHED
  • 触发时机: 用户输入股票代码并查询
  • 属性:
    • query - 搜索的股票代码
    • stock_code - 股票代码
    • previous_stock_code - 之前查看的股票代码
    • context - 固定为 'company_page'

🔄 Tab 切换

  • 事件: TAB_CHANGED
  • 触发时机: 用户切换不同的 Tab
  • 属性:
    • tab_index - Tab 索引0-3
    • tab_name - Tab 名称(公司概览/股票行情/财务全景/盈利预测)
    • previous_tab_index - 之前的 Tab 索引
    • stock_code - 当前股票代码
    • context - 固定为 'company_page'

支持的 Tab:

  1. 公司概览 (index 0): 公司基本信息
  2. 股票行情 (index 1): 实时行情数据
  3. 财务全景 (index 2): 财务报表分析
  4. 盈利预测 (index 3): 盈利预测数据

自选股管理

  • 事件: WATCHLIST_ADDED / WATCHLIST_REMOVED
  • 触发时机: 用户添加/移除自选股
  • 属性:
    • stock_code - 股票代码
    • source - 固定为 'company_page'

5. Community 页面(新闻催化分析)

已实施的追踪事件:

📄 页面浏览

  • 事件: COMMUNITY_PAGE_VIEWED
  • 触发时机: 页面加载
  • 属性:
    • timestamp - 访问时间
    • has_hot_events - 是否有热点事件
    • has_keywords - 是否有热门关键词

🔍 搜索追踪

  • 事件: SEARCH_QUERY_SUBMITTED
  • 触发时机: 用户输入搜索关键词
  • 属性:
    • query - 搜索关键词
    • category - 分类(固定为 'news'
    • previous_query - 上一次搜索词

🎚️ 筛选追踪

  • 事件: SEARCH_FILTER_APPLIED
  • 触发时机: 用户更改筛选条件
  • 属性:
    • filter_type - 筛选类型sort/importance/date_range/industry
    • filter_value - 筛选值
    • previous_value - 上一次的值

支持的筛选类型:

  1. 排序 (sort): 最新/最热/重要性
  2. 重要性 (importance): 全部/高/中/低
  3. 时间范围 (date_range): 今天/近7天/近30天
  4. 行业 (industry): 各行业代码

🗞️ 新闻点击追踪

  • 事件: NEWS_ARTICLE_CLICKED
  • 触发时机: 用户点击新闻事件
  • 属性:
    • event_id - 事件ID
    • event_title - 事件标题
    • importance - 重要性等级
    • source - 来源(固定为 'community_page'
    • has_stocks - 是否包含相关股票
    • has_concepts - 是否包含相关概念

📖 详情查看追踪

  • 事件: NEWS_DETAIL_OPENED
  • 触发时机: 用户点击"查看详情"
  • 属性:
    • event_id - 事件ID
    • source - 来源(固定为 'community_page'

📄 翻页追踪

  • 事件: NEWS_LIST_VIEWED
  • 触发时机: 用户翻页
  • 属性:
    • page - 页码
    • filters - 当前筛选条件
      • sort - 排序方式
      • importance - 重要性
      • has_query - 是否有搜索词

🛠️ 实施方式

方案Custom Hook 集成(推荐)

优势:

  • 集中管理,易于维护
  • 自动追踪,无需修改组件
  • 符合关注点分离原则
  • 便于测试和调试

修改的文件

0. src/views/StockOverview/hooks/useStockOverviewEvents.js

文件已存在,无需修改。已完整实现个股中心的所有追踪事件。

1. src/views/Concept/hooks/useConceptEvents.js

新建 Hook 文件:

import { usePostHogTrack } from '../../../hooks/usePostHogRedux';
import { RETENTION_EVENTS } from '../../../lib/constants';

提供的追踪函数:

  • trackConceptSearched() - 搜索概念
  • trackFilterApplied() - 筛选变化
  • trackConceptClicked() - 概念点击
  • trackConceptStocksViewed() - 查看个股
  • trackConceptStockClicked() - 点击概念股票
  • trackConceptTimelineViewed() - 历史时间轴
  • trackPageChange() - 翻页
  • trackViewModeChanged() - 视图切换

2. src/views/Company/hooks/useCompanyEvents.js

新建 Hook 文件:

import { usePostHogTrack } from '../../../hooks/usePostHogRedux';
import { RETENTION_EVENTS } from '../../../lib/constants';

提供的追踪函数:

  • trackStockSearched() - 股票搜索
  • trackTabChanged() - Tab 切换
  • trackWatchlistAdded() - 加入自选
  • trackWatchlistRemoved() - 移除自选

3. src/views/Company/index.js

添加的导入:

import { useCompanyEvents } from './hooks/useCompanyEvents';

添加的 Hook:

const {
  trackStockSearched,
  trackTabChanged,
  trackWatchlistAdded,
  trackWatchlistRemoved,
} = useCompanyEvents({ stockCode });

添加的 State:

const [currentTabIndex, setCurrentTabIndex] = useState(0);

修改的函数:

  1. handleSearch: 追踪股票搜索
  2. handleWatchlistToggle: 追踪自选股添加/移除
  3. Tabs onChange: 追踪 Tab 切换

4. src/views/Concept/index.js

添加的导入:

import { useConceptEvents } from './hooks/useConceptEvents';

添加的 Hook:

const {
  trackConceptSearched,
  trackFilterApplied,
  trackConceptClicked,
  trackConceptStocksViewed,
  trackConceptStockClicked,
  trackConceptTimelineViewed,
  trackPageChange,
  trackViewModeChanged,
} = useConceptEvents({ navigate });

修改的函数:

  1. handleSearch: 追踪搜索查询
  2. handleSortChange: 追踪排序变化
  3. handleDateChange: 追踪日期变化
  4. handlePageChange: 追踪翻页
  5. handleConceptClick: 追踪概念点击
  6. handleViewStocks: 追踪查看个股
  7. handleViewContent: 追踪历史时间轴
  8. 视图切换按钮: 追踪网格/列表切换

3. src/views/Home/HomePage.js

添加的导入:

import { usePostHogTrack } from '../../hooks/usePostHogRedux';
import { ACQUISITION_EVENTS } from '../../lib/constants';

添加的 Hook:

const { track } = usePostHogTrack();

添加的 useEffect(页面浏览追踪):

useEffect(() => {
  track(ACQUISITION_EVENTS.LANDING_PAGE_VIEWED, {
    timestamp: new Date().toISOString(),
    is_authenticated: isAuthenticated,
    user_id: user?.id || null,
  });
}, [track, isAuthenticated, user?.id]);

修改的函数:

  • handleProductClick: 从接收 URL 改为接收完整 feature 对象,添加追踪逻辑

修改后的代码:

const handleProductClick = useCallback((feature) => {
  // 🎯 PostHog 追踪:功能卡片点击
  track(ACQUISITION_EVENTS.FEATURE_CARD_CLICKED, {
    feature_id: feature.id,
    feature_title: feature.title,
    feature_url: feature.url,
    is_featured: feature.featured || false,
    link_type: feature.url.startsWith('http') ? 'external' : 'internal',
  });

  // 原有导航逻辑
  if (feature.url.startsWith('http')) {
    window.open(feature.url, '_blank');
  } else {
    navigate(feature.url);
  }
}, [track, navigate]);

更新的 onClick 事件:

// 从
onClick={() => handleProductClick(coreFeatures[0].url)}

// 改为
onClick={() => handleProductClick(coreFeatures[0])}

1. src/views/Community/hooks/useEventFilters.js

添加的导入:

import { usePostHogTrack } from '../../../hooks/usePostHogRedux';
import { RETENTION_EVENTS } from '../../../lib/constants';

添加的Hook:

const { track } = usePostHogTrack();

修改的函数:

  1. updateFilters: 追踪搜索和筛选
  2. handlePageChange: 追踪翻页
  3. handleEventClick: 追踪新闻点击
  4. handleViewDetail: 追踪详情查看

2. src/views/Community/index.js

添加的导入:

import { usePostHogTrack } from '../../hooks/usePostHogRedux';
import { RETENTION_EVENTS } from '../../lib/constants';

添加的Hook:

const { track } = usePostHogTrack();

添加的useEffect:

useEffect(() => {
  track(RETENTION_EVENTS.COMMUNITY_PAGE_VIEWED, {
    timestamp: new Date().toISOString(),
    has_hot_events: hotEvents && hotEvents.length > 0,
    has_keywords: popularKeywords && popularKeywords.length > 0,
  });
}, [track]);

📊 追踪效果示例

用户行为路径示例

首页转化路径:

1. 游客访问首页
   → 触发: LANDING_PAGE_VIEWED
   → 属性: { is_authenticated: false, user_id: null }

2. 点击"新闻中心"功能卡片
   → 触发: FEATURE_CARD_CLICKED
   → 属性: { feature_id: "news-catalyst", feature_title: "新闻中心", is_featured: true, link_type: "internal" }

3. 进入 Community 页面
   → 触发: COMMUNITY_PAGE_VIEWED

Community 页面行为路径:

1. 用户进入 Community 页面
   → 触发: COMMUNITY_PAGE_VIEWED

2. 用户搜索 "人工智能"
   → 触发: SEARCH_QUERY_SUBMITTED
   → 属性: { query: "人工智能", category: "news" }

3. 用户筛选 "重要性:高"
   → 触发: SEARCH_FILTER_APPLIED
   → 属性: { filter_type: "importance", filter_value: "high" }

4. 用户点击第一条新闻
   → 触发: NEWS_ARTICLE_CLICKED
   → 属性: { event_id: "123", event_title: "...", importance: "high", source: "community_page" }

5. 用户翻到第2页
   → 触发: NEWS_LIST_VIEWED
   → 属性: { page: 2, filters: { sort: "new", importance: "high", has_query: true } }

6. 用户点击"查看详情"
   → 触发: NEWS_DETAIL_OPENED
   → 属性: { event_id: "456", source: "community_page" }

🧪 测试方法

1. 使用 Redux DevTools

  1. 打开应用:npm start
  2. 打开浏览器 Redux DevTools
  3. 筛选 posthog/trackEvent actions
  4. 执行各种操作
  5. 查看追踪的事件和属性

2. 控制台日志

开发环境下PostHog 会自动输出日志:

📍 Event tracked: Community Page Viewed { timestamp: "...", has_hot_events: true }
📍 Event tracked: Search Query Submitted { query: "人工智能", category: "news" }
📍 Event tracked: Search Filter Applied { filter_type: "importance", filter_value: "high" }

3. PostHog Dashboard

  1. 登录 PostHog 后台
  2. 查看 "Events" 页面
  3. 筛选 Community 相关事件:
    • Community Page Viewed
    • Search Query Submitted
    • Search Filter Applied
    • News Article Clicked
    • News List Viewed

📈 数据分析建议

1. 搜索行为分析

问题: 用户最常搜索什么?

方法:

  • 筛选 SEARCH_QUERY_SUBMITTED 事件
  • query 属性分组
  • 查看 Top 关键词

2. 筛选偏好分析

问题: 用户更喜欢什么排序方式?

方法:

  • 筛选 SEARCH_FILTER_APPLIED 事件
  • filter_type: "sort" 筛选
  • filter_value 分组统计

3. 新闻热度分析

问题: 哪些新闻最受欢迎?

方法:

  • 筛选 NEWS_ARTICLE_CLICKED 事件
  • event_id 分组
  • 统计点击次数

4. 用户旅程分析

问题: 用户从搜索到点击的转化率?

方法:

  • 创建漏斗:
    1. COMMUNITY_PAGE_VIEWED
    2. SEARCH_QUERY_SUBMITTED
    3. NEWS_ARTICLE_CLICKED
  • 分析每一步的流失率

🔧 扩展计划

下一步:其他页面追踪

按优先级排序:

  1. Concept概念中心

    • 搜索概念
    • 点击概念卡片
    • 查看概念详情
    • 点击概念内股票
  2. StockOverview个股中心

    • 搜索股票
    • 点击股票卡片
    • 查看股票详情
    • 切换 Tab
  3. LimitAnalyse涨停分析

    • 进入页面
    • 点击涨停板块
    • 展开板块详情
    • 点击涨停个股
  4. TradingSimulation模拟盘

    • 进入模拟盘
    • 下单操作
    • 查看持仓
    • 查看历史
  5. Company公司详情

    • 查看公司概览
    • 查看财务全景
    • 查看盈利预测
    • Tab 切换

💡 最佳实践

1. 属性命名规范

  • 使用 snake_case 命名(与 PostHog 推荐一致)
  • 属性名要 描述性强,易于理解
  • 使用 布尔值 表示是/否has_xxx, is_xxx
  • 使用 枚举值 表示类别filter_type: "sort"

2. 事件追踪原则

  • 追踪用户意图,而不仅仅是点击
  • 添加上下文帮助分析previous_value, source
  • 保持一致性,相似事件使用相似属性
  • 避免敏感信息,不追踪用户隐私数据

3. 性能优化

  • 使用 usePostHogTrack 而不是 usePostHogRedux
    • 更轻量,只订阅追踪功能
    • 避免不必要的重渲染
  • Custom Hooks 中集成,而不是每个组件
    • 集中管理,易于维护
    • 减少重复代码

⚠️ 注意事项

1. 依赖管理

确保 useCallback 的依赖数组包含 track

// ✅ 正确
const handleClick = useCallback(() => {
  track(EVENT_NAME, { ... });
}, [track]);

// ❌ 错误(缺少 track
const handleClick = useCallback(() => {
  track(EVENT_NAME, { ... });
}, []);

2. 事件去重

避免重复追踪相同事件:

// ✅ 正确(只在值变化时追踪)
if (newFilters.sort !== filters.sort) {
  track(SEARCH_FILTER_APPLIED, { ... });
}

// ❌ 错误(每次都追踪)
track(SEARCH_FILTER_APPLIED, { ... });

3. 空值处理

使用安全的属性访问:

// ✅ 正确
has_stocks: !!(event.related_stocks && event.related_stocks.length > 0)

// ❌ 错误(可能报错)
has_stocks: event.related_stocks.length > 0

📚 参考资料


🎉 总结

已实现的功能

  • Home 页面追踪2个事件
  • StockOverview 页面完整追踪10个事件 已完成
  • Concept 页面完整追踪9个事件
  • Company 页面完整追踪5个事件
  • Community 页面完整追踪7个事件
  • Custom Hook 集成方案
  • Redux DevTools 调试支持
  • 详细的事件属性

追踪的用户行为

Home 页面:

  1. 页面访问 - 了解流量来源、登录转化率
  2. 功能卡片点击 - 识别最受欢迎的功能
  3. 推荐功能效果 - 分析特色功能(新闻中心)的点击率

StockOverview 页面 :

  1. 页面访问 - 了解个股中心流量
  2. 搜索行为 - 股票搜索、搜索结果点击
  3. 概念交互 - 热门概念点击、概念股票标签点击
  4. 热力图交互 - 热力图中股票点击
  5. 数据筛选 - 日期选择变化
  6. 市场统计 - 市场数据查看

Concept 页面:

  1. 页面访问 - 了解概念中心流量
  2. 搜索行为 - 概念搜索、搜索结果数量
  3. 筛选偏好 - 排序方式、日期选择
  4. 概念交互 - 概念点击、位置追踪
  5. 个股查看 - 查看个股、股票点击
  6. 时间轴查看 - 历史时间轴
  7. 翻页行为 - 优化分页逻辑
  8. 视图切换 - 网格/列表偏好

Company 页面:

  1. 页面访问 - 了解公司详情页流量
  2. 股票搜索 - 用户查询哪些股票
  3. Tab 切换 - 用户最关注哪个 Tab概览/行情/财务/预测)
  4. 自选股管理 - 自选股添加/移除行为
  5. 股票切换 - 分析用户查看股票的路径

Community 页面:

  1. 页面访问 - 了解流量来源
  2. 搜索行为 - 了解用户需求
  3. 筛选偏好 - 优化默认设置
  4. 内容点击 - 识别热门内容
  5. 详情查看 - 分析用户兴趣
  6. 翻页行为 - 优化分页逻辑

下一步计划

  1. 在关键页面实施追踪Home, StockOverview, Concept, Company, Community 已完成
  2. 下一步:其他页面追踪
    • LimitAnalyse涨停分析
    • TradingSimulation模拟盘
  3. 创建 PostHog Dashboard 和 Insights
  4. 设置用户行为漏斗分析
  5. 配置 Feature Flags 进行 A/B 测试

Home, StockOverview, Concept, Company, Community 页面追踪全部完成! 🚀

现在你可以在 PostHog 后台看到完整的用户行为数据:

  • 首页个股中心/概念中心/公司详情/新闻中心 的完整转化路径
  • 搜索行为筛选偏好内容点击 的详细数据
  • Tab 切换视图切换翻页行为 的用户习惯分析
  • 自选股管理 的用户行为追踪

共追踪 33个事件,覆盖 5个核心页面