zdl d69a32a320 fix: 修复个人中心不显示新发表的评论问题
问题描述:
- 用户在事件中心发表评论后,打开个人中心看不到新评论
- 个人中心"我的评论"区域始终为空或显示旧数据

根本原因:
- 项目存在两套独立的评论系统:
  1. 旧系统(EventComment 表)- 个人中心查询此表
  2. 新系统(Post 表)- 事件中心写入此表
- 创建评论时写入 Post 表,但个人中心查询 EventComment 表
- 两个表完全独立,数据不同步

修复方案(统一到 Post 系统):
1. 后端新增 API:GET /api/account/events/posts
   - 查询 Post 表中当前用户的所有评论
   - 返回格式完全兼容旧 EventComment.to_dict()
   - 新增 event_title 字段(改进点,旧 API 没有)

2. 前端修改 API 调用:Center.js
   - 将 /api/account/events/comments 改为 /api/account/events/posts
   - 无需修改数据渲染逻辑(格式兼容)

修改文件:
- app.py (第 4144-4187 行) - 新增 get_my_event_posts API
  - 查询 Post 表(user_id 过滤 + 按时间倒序)
  - JOIN 查询关联的 Event(获取 event_title)
  - 返回兼容格式:author(字符串), likes, created_at, event_title

- src/views/Dashboard/Center.js (第 105 行) - 修改 API 调用路径
  - 修改前:GET /api/account/events/comments
  - 修改后:GET /api/account/events/posts

数据兼容性:
- author 字段:字符串类型(与旧 EventComment 一致)
- likes 字段:映射自 likes_count
- created_at 字段:ISO 8601 格式
- 新增:event_title 字段(个人中心可显示评论关联的事件)

修复效果:
- 用户在事件中心发表评论 → 立即在个人中心看到新评论 
- 评论显示完整信息:内容、时间、关联事件标题 
- 前端无需修改渲染逻辑(完全兼容) 

🤖 Generated with Claude Code
2025-11-17 11:25:18 +08:00
2025-10-11 12:02:01 +08:00
2025-11-10 20:05:53 +08:00
2025-11-14 07:25:12 +08:00
2025-11-15 10:09:17 +08:00
2025-10-29 16:19:01 +08:00
2025-10-29 16:00:21 +08:00
2025-11-14 16:15:29 +08:00
2025-10-11 12:02:01 +08:00
2025-10-11 12:02:01 +08:00
2025-11-13 10:30:08 +08:00
2025-11-13 15:22:02 +08:00
2025-11-14 16:15:29 +08:00
2025-10-11 12:02:01 +08:00
2025-10-13 19:53:13 +08:00
2025-11-14 16:15:29 +08:00
2025-11-15 10:09:17 +08:00
2025-10-11 12:02:01 +08:00
2025-11-07 17:42:06 +08:00
2025-11-10 07:56:52 +08:00
2025-10-15 11:49:55 +08:00
2025-10-13 19:53:13 +08:00
2025-11-15 09:15:54 +08:00
2025-10-11 12:02:01 +08:00
2025-11-13 10:30:08 +08:00
2025-10-13 19:53:13 +08:00
2025-11-13 10:30:08 +08:00
2025-10-11 12:02:01 +08:00
2025-10-11 16:16:02 +08:00
2025-10-11 12:02:01 +08:00
2025-11-03 16:10:35 +08:00
2025-11-14 16:15:29 +08:00
2025-11-15 09:50:55 +08:00
2025-10-11 12:02:01 +08:00
2025-10-11 12:02:01 +08:00

vf_react

前端


📚 重构记录

2025-10-30: EventList.js 组件化重构

🎯 重构目标

将 Community 社区页面的 EventList.js 组件1095行拆分为多个可复用的子组件提高代码可维护性和复用性。

📊 重构成果

  • 重构前: 1095 行
  • 重构后: 497 行
  • 减少: 598 行 (-54.6%)

📁 新增目录结构

src/views/Community/components/EventCard/
├── index.js                      (60行)  - EventCard 统一入口,智能路由紧凑/详细模式
│
├── ──────────────────────────────────────────────────────────
│   原子组件 (Atoms) - 7个基础UI组件
├── ──────────────────────────────────────────────────────────
│
├── EventTimeline.js              (60行)  - 时间轴显示组件
│   └── Props: createdAt, timelineStyle, borderColor, minHeight
│
├── EventImportanceBadge.js       (100行) - 重要性等级标签 (S/A/B/C/D)
│   └── Props: importance, showTooltip, showIcon, size
│
├── EventStats.js                 (60行)  - 统计信息 (浏览/帖子/关注)
│   └── Props: viewCount, postCount, followerCount, size, spacing
│
├── EventFollowButton.js          (40行)  - 关注按钮
│   └── Props: isFollowing, followerCount, onToggle, size, showCount
│
├── EventPriceDisplay.js          (130行) - 价格变动显示 (平均/最大/周)
│   └── Props: avgChange, maxChange, weekChange, compact, inline
│
├── EventDescription.js           (60行)  - 描述文本 (支持展开/收起)
│   └── Props: description, textColor, minLength, noOfLines
│
├── EventHeader.js                (100行) - 事件标题头部
│   └── Props: title, importance, onTitleClick, linkColor, compact
│
├── ──────────────────────────────────────────────────────────
│   组合组件 (Molecules) - 2个卡片组件
├── ──────────────────────────────────────────────────────────
│
├── CompactEventCard.js           (160行) - 紧凑模式事件卡片
│   ├── 使用: EventTimeline, EventHeader, EventStats, EventFollowButton
│   └── Props: event, index, isFollowing, followerCount, callbacks...
│
└── DetailedEventCard.js          (170行) - 详细模式事件卡片
    ├── 使用: EventTimeline, EventHeader, EventStats, EventFollowButton,
    │        EventPriceDisplay, EventDescription
    └── Props: event, isFollowing, followerCount, callbacks...

总计: 10个文件940行代码


🔧 重构的文件

src/views/Community/components/EventList.js

移除的内容:

  • renderPriceChange 函数 (~60行)
  • renderCompactEvent 函数 (~200行)
  • renderDetailedEvent 函数 (~300行)
  • expandedDescriptions state展开状态管理移至子组件
  • 冗余的 Chakra UI 导入

保留的功能:

  • WebSocket 实时推送
  • 浏览器原生通知
  • 关注状态管理 (followingMap, followCountMap)
  • 分页控制
  • 视图模式切换(紧凑/详细)
  • 推送权限管理

新增引入:

import EventCard from './EventCard';

🏗️ 架构改进

重构前(单体架构)

EventList.js (1095行)
├── 业务逻辑 (WebSocket, 关注, 通知)
├── renderCompactEvent (200行)
│   └── 所有UI代码内联
├── renderDetailedEvent (300行)
│   └── 所有UI代码内联
└── renderPriceChange (60行)

重构后(组件化架构)

EventList.js (497行) - 容器组件
├── 业务逻辑 (WebSocket, 关注, 通知)
└── 渲染逻辑
    └── EventCard (智能路由)
        ├── CompactEventCard (紧凑模式)
        │   ├── EventTimeline
        │   ├── EventHeader (compact)
        │   ├── EventStats
        │   └── EventFollowButton
        └── DetailedEventCard (详细模式)
            ├── EventTimeline
            ├── EventHeader (detailed)
            ├── EventStats
            ├── EventFollowButton
            ├── EventPriceDisplay
            └── EventDescription

优势

  1. 可维护性 ⬆️

    • 每个组件职责单一(单一职责原则)
    • 代码行数减少 54.6%
    • 组件边界清晰,易于理解
  2. 可复用性 ⬆️

    • 原子组件可在其他页面复用
    • 例如EventImportanceBadge 可用于任何需要显示事件等级的地方
  3. 可测试性 ⬆️

    • 小组件更容易编写单元测试
    • 可独立测试每个组件的渲染和交互
  4. 性能优化 ⬆️

    • React 可以更精确地追踪变化
    • 减少不必要的重渲染
    • 每个子组件可独立优化useMemo, React.memo
  5. 开发效率 ⬆️

    • 新增功能时只需修改对应的子组件
    • 代码审查更高效
    • 降低了代码冲突的概率

📦 依赖工具函数

本次重构使用了之前提取的工具函数:

src/utils/priceFormatters.js          (105行)
├── getPriceChangeColor(value)        - 获取价格变化文字颜色
├── getPriceChangeBg(value)           - 获取价格变化背景颜色
├── getPriceChangeBorderColor(value)  - 获取价格变化边框颜色
├── formatPriceChange(value)          - 格式化价格为字符串
└── PriceArrow({ value })             - 价格涨跌箭头组件

src/constants/animations.js           (72行)
├── pulseAnimation                    - 脉冲动画S/A级标签
├── fadeIn                            - 渐入动画
├── slideInUp                         - 从下往上滑入
├── scaleIn                           - 缩放进入
└── spin                              - 旋转动画Loading

🚀 下一步优化计划

Phase 1 已完成,后续可继续优化:

  • Phase 2: 拆分 StockDetailPanel.js (1067行 → ~250行)
  • Phase 3: 拆分 InvestmentCalendar.js (827行 → ~200行)
  • Phase 4: 拆分 MidjourneyHeroSection.js (813行 → ~200行)
  • Phase 5: 拆分 UnifiedSearchBox.js (679行 → ~180行)

🔗 相关提交

  • feat: 拆分 EventList.js/提取价格相关工具函数到 utils/priceFormatters.js
  • feat(EventList): 创建事件卡片原子组件
  • feat(EventList): 创建事件卡片组合组件
  • refactor(EventList): 使用组件化架构替换内联渲染函数

Description
前端
Readme 195 MiB
Languages
HTML 75.9%
JavaScript 9.6%
CSS 8%
SCSS 3.2%
Python 2.1%
Other 1.2%