zdl
|
1a3987afe0
|
feature: 重要性支持多选
|
2025-11-04 17:53:42 +08:00 |
|
zdl
|
ffa6c2f761
|
pref: 优化 useEffect 依赖和清理逻辑
|
2025-11-04 16:01:56 +08:00 |
|
zdl
|
5b9155a30c
|
feat: 提取常量和 Hooks 到独立文件(已完成)
|
2025-11-04 15:38:54 +08:00 |
|
zdl
|
8ed65b062b
|
pref: 日志管理优化
|
2025-11-04 15:19:49 +08:00 |
|
zdl
|
868b4ccebc
|
feat: 筛选添加收益率筛选
|
2025-11-04 15:19:24 +08:00 |
|
zdl
|
67981f21a2
|
feat:拆分 handlePageChange 为子函数(减少复杂度)
|
2025-11-04 15:05:25 +08:00 |
|
zdl
|
0a10270ab0
|
feat: 提取 usePagination Hook
|
2025-11-04 14:58:02 +08:00 |
|
zdl
|
ce46820105
|
feat: 优化社区动态新闻分页和预加载策略
## 主要改动
### 1. 修复分页显示问题
- 修复总页数计算错误(使用服务端 total 而非缓存 cachedCount)
- 修复目标页数据检查逻辑(排除 null 占位符)
### 2. 实现请求拆分策略 (Critical Fix)
- 将合并请求(per_page: 15)拆分为单页循环请求(per_page: 5)
- 解决后端无法处理动态 per_page 导致返回空数据的问题
- 后台预加载和显示 loading 两个场景均已拆分
### 3. 优化智能预加载逻辑
- 连续翻页(上/下页):预加载前后各 2 页
- 跳转翻页(点页码):只加载当前页
- 目标页已缓存时立即切换,后台静默预加载其他页
### 4. Redux 状态管理优化
- 添加 pageSize 参数用于正确计算索引
- 重写 reducer 插入逻辑(append/replace/jump 三种模式)
- 只在 append 模式去重,避免替换和跳页时数据丢失
- 修复 selector 计算有效数量(排除 null)
### 5. 修复 React Hook 规则违规
- 将所有 useColorModeValue 移至组件顶层
- 添加缺失的 HStack 导入
## 影响范围
- 仅影响社区页面动态新闻分页功能
- 无后端变更,向后兼容
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-04 11:43:54 +08:00 |
|
zdl
|
82cb0b4034
|
feat: bugfix
|
2025-11-03 18:26:59 +08:00 |
|
zdl
|
78e7001372
|
feat: bugfix
|
2025-11-03 18:20:57 +08:00 |
|
zdl
|
f17a8fbd87
|
feat: 实现 Redux 全局状态管理事件关注功能
本次提交实现了滚动列表和事件详情的关注按钮状态同步:
✅ Redux 状态管理
- communityDataSlice.js: 添加 eventFollowStatus state
- 新增 toggleEventFollow AsyncThunk(复用 EventList.js 逻辑)
- 新增 setEventFollowStatus reducer 和 selectEventFollowStatus selector
✅ 组件集成
- DynamicNewsCard.js: 从 Redux 读取关注状态并传递给子组件
- EventScrollList.js: 接收并传递关注状态给事件卡片
- DynamicNewsDetailPanel.js: 移除本地 state,使用 Redux 状态
✅ Mock API 支持
- event.js: 添加 POST /api/events/:eventId/follow 处理器
- 返回 { is_following, follower_count } 模拟数据
✅ Bug 修复
- EventDetail/index.js: 添加 useRef 导入
- concept.js: 导出 generatePopularConcepts 函数
- event.js: 添加 /api/events/:eventId/concepts 处理器
功能:
- 点击滚动列表的关注按钮,详情面板的关注状态自动同步
- 点击详情面板的关注按钮,滚动列表的关注状态自动同步
- 关注人数实时更新
- 状态在整个应用中保持一致
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-03 17:40:09 +08:00 |
|
zdl
|
8ebfad9992
|
feat: 单排/双排列表模式切换
|
2025-11-03 17:21:07 +08:00 |
|
zdl
|
b14eb175f5
|
fix: 修复 Mock 环境相关概念返回空结果问题
问题分析:
- Mock handler 的过滤逻辑过于严格
- 只保留概念名包含查询关键词的结果
- 导致大部分查询返回空数组
解决方案:
✅ 移除字符串匹配过滤逻辑
- Mock 环境直接返回热门概念
- 模拟真实 API 的语义搜索行为
- 确保每次搜索都有结果展示
✅ 添加详细调试日志
- RelatedConceptsSection 组件渲染日志
- useEffect 触发和参数日志
- 请求发送和响应详情
- 数据处理过程追踪
✅ 完善 Mock 数据结构
- 添加 score, match_type, happened_times, stocks
- 支持详细卡片展示
- 数据结构与线上完全一致
修改文件:
- src/mocks/handlers/concept.js
- src/views/Community/components/DynamicNewsDetail/RelatedConceptsSection/index.js
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-03 16:40:25 +08:00 |
|
zdl
|
462933f4af
|
feat: 统一事件详情和滚动列表的重要性颜色样式
优化:
- 事件详情页面的重要性标签从固定橙色改为动态红色渐变
- 背景色使用 importance.bgColor (red.50)
- 文字和边框颜色使用 importance.badgeBg (red.800/600/500/400)
- 添加 2px 边框以保持视觉一致性
- 与滚动事件列表的重要性角标样式保持统一
修改文件:
- src/views/Community/components/DynamicNewsDetail/EventHeaderInfo.js
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-03 15:59:12 +08:00 |
|
zdl
|
26dcfd061c
|
feat: 优化 EventScrollList 分页控制器位置和样式
本次提交包含以下优化:
✅ 分页控制器位置调整
- 从底部移至顶部右对齐
- 使用相对定位 (Flex justify="flex-end")
- 移除 CardBody 顶部 padding (pt={0})
- 确保分页控制器紧贴顶部,无任何间距
✅ 箭头样式优化
- 调整箭头大小和颜色
- 使用毛玻璃效果背景
- 改善视觉层次和交互体验
修改文件:
- src/views/Community/components/DynamicNewsCard.js (CardBody pt={0})
- src/views/Community/components/DynamicNewsCard/EventScrollList.js (分页位置和箭头样式)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-03 15:56:19 +08:00 |
|
zdl
|
7e32dda2df
|
feat本次提交包含的优化
✅ StockChangeIndicators 组件优化
- 调整 padding 使布局更紧凑
- 修复窄卡片中的折行问题
- 自动根据内容调整宽度
✅ 重要性等级视觉优化
- 统一使用红色系(S→A→B→C:从深红到浅红)
- 添加 badgeBg 字段支持新的角标样式
✅ DynamicNewsEventCard 卡片改版
- 左上角矩形角标显示重要性(镂空边框样式)
- 悬浮显示所有等级说明
- 标题限制两行显示
✅ Mock 数据完整性
- 添加缺失的 related_week_chg 字段
- 确保三个涨跌幅指标数据完整
|
2025-11-03 15:38:30 +08:00 |
|
zdl
|
9274323151
|
fix: 完全移除 EventScrollList 顶部间距
问题:
- EventScrollList 顶部间距 (pt={2}, 8px) 仍然过大
- 用户期望事件列表紧贴搜索框,无顶部间距
修改:
- pt={2} 改为 pt={0}
- 顶部间距从 8px 完全移除为 0px
- 保持底部 pb={4} (16px) 和左右 px={2} (8px) 不变
视觉效果:
- EventScrollList 紧贴 CardHeader,更加紧凑
- 其他方向间距保持不变
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-03 14:41:05 +08:00 |
|
zdl
|
cedfd3978d
|
fix: 减少 EventScrollList 顶部间距
问题:
- EventScrollList 的 Flex 容器设置了 py={4}(上下各 16px padding)
- 导致顶部间距过大,视觉不够紧凑
修改:
- py={4} 改为 pt={2} pb={4}
- 顶部间距从 16px 减少到 8px
- 保持底部 16px 间距,为滚动条留出足够空间
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-03 14:32:28 +08:00 |
|
zdl
|
89fe0cd10b
|
fix: 修改 EventScrollList 左右箭头为翻页功能
问题:
- 左边箭头位置 (left: -4) 超出容器,看不到
- 右边箭头点击只是滚动 400px,而不是切换页面
- 用户期望左右箭头用于翻页,而不是横向滚动
修改内容:
1. 删除滚动相关函数和状态
- 删除 scrollLeft()、scrollRight() 函数
- 删除 handleScroll() 监听函数
- 删除 showLeftArrow、showRightArrow state
- 删除 useEffect 重置滚动位置逻辑
- 移除 useState、useEffect 导入
2. 修改箭头功能从"滚动"改为"翻页"
- 左箭头: onClick={scrollLeft} → onClick={() => onPageChange(currentPage - 1)}
- 右箭头: onClick={scrollRight} → onClick={() => onPageChange(currentPage + 1)}
3. 修改箭头显隐逻辑为基于页码
- 左箭头: showLeftArrow → currentPage > 1
- 右箭头: showRightArrow → currentPage < totalPages
4. 优化箭头位置和样式
- 位置: left/right: "-4" → "2" (在容器内部边缘)
- 图标尺寸: boxSize={6} → boxSize={8}
- 按钮尺寸: size="md" → size="lg"
- 阴影: shadow="md" → shadow="lg"
- 明确背景色: bg="blue.500"
- 增强 hover 效果: 放大 scale(1.1) + 加深颜色
- 更新说明文字: "向左/右滚动" → "上一页/下一页"
预期效果:
- 左箭头点击后加载上一页数据
- 右箭头点击后加载下一页数据
- 第1页时左箭头隐藏,最后一页时右箭头隐藏
- 箭头位置清晰可见,视觉效果突出
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-03 14:29:44 +08:00 |
|
zdl
|
d027071e98
|
feat: 优化社区页面滚动和分页交互体验…)
⎿ [feature_2025/1028_event 5dedbb3] feat: 优化社区页面滚动和分页交互体验
6 files changed, 1355 insertions(+), 49 deletions(-)
create mode 100644 docs/test-cases/Community351241265351235242346265213350257225347224250344276213.md
|
2025-11-03 14:24:41 +08:00 |
|
zdl
|
e31e4118a0
|
fix: 修改相关概念组件以匹配真实API数据结构
修改内容:
- SimpleConceptCard.js: 改用 concept.concept 和 concept.score 字段
- DetailedConceptCard.js: 改用 concept.concept、concept.score 和 concept.price_info.avg_change_pct
- RelatedConceptsSection/index.js: 导航时使用 concept.concept 字段
- events.js mock数据: 更新keywords生成函数,使用concept/score/price_info结构
数据结构变更:
- name → concept (概念名称)
- relevance (0-100) → score (0-1)
- avg_change_pct → price_info.avg_change_pct (嵌套结构)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-03 14:18:17 +08:00 |
|
zdl
|
daf7372bab
|
feat: 修复相关概念卡片跳转逻辑,支持跳转至概念中心
功能优化:
- 相关概念卡片点击跳转至概念中心(/concepts)并自动搜索该概念
- 概念相关股票支持点击跳转至公司详情页
组件修改:
- RelatedConceptsSection/index.js:
* 修复 handleConceptClick 函数跳转路径
* 从错误的 /concept/:name 改为正确的 /concepts?q=:name
* 使用 encodeURIComponent 确保中文概念名称正确编码
- RelatedConceptsSection/ConceptStockItem.js:
* 新增 handleStockClick 点击处理函数
* 点击股票跳转至公司详情页(valuefrontier.cn/company)
* 添加 hover 效果和过渡动画
* 使用 stopPropagation 防止事件冒泡到概念卡片
跳转行为:
- 简单概念卡片(横向)→ 点击跳转到概念中心搜索结果页
- 详细概念卡片(展开后)→ 点击跳转到概念中心搜索结果页
- 概念相关股票 → 点击跳转到公司详情页(新标签页)
URL示例:
- 点击"人工智能"概念 → /concepts?q=人工智能
- 点击股票"000001.SZ" → valuefrontier.cn/company?scode=000001
用户体验提升:
- 概念卡片跳转逻辑符合用户预期
- 股票点击可查看公司详情,提供更多信息
- 事件冒泡控制正确,避免误触发
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-03 12:58:21 +08:00 |
|
zdl
|
7291777488
|
feat: 优化股票卡片交互体验
StockListItem 组件优化:
- 整个卡片可点击,点击后跳转到股票详情页(新标签页)
- 添加 cursor="pointer" 鼠标悬停提示
- 分时图/K线图区域点击时阻止事件冒泡,仅打开弹窗
- "查看"按钮、自选股按钮、展开/收起按钮点击时阻止冒泡
StockChartModal 组件修复:
- 修复 relation_desc 对象渲染错误
- 添加 getRelationDesc() 函数兼容对象和字符串格式
- 正确提取 {data: [...]} 结构中的文本内容
交互改进:
- 用户可点击卡片任意空白区域快速跳转
- 图表、按钮保持独立交互功能
- 提升用户操作便利性和体验流畅度
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-03 12:54:26 +08:00 |
|
zdl
|
92d6751529
|
feat: 在 DynamicNewsCard 头部集成搜索和筛选功能
功能新增:
- 将 UnifiedSearchBox 组件集成到 DynamicNewsCard 的 CardHeader 中
- 实现 DynamicNewsCard 和 EventTimelineCard 共享筛选状态
- 用户可在动态新闻区域直接进行搜索和筛选操作
组件修改:
- DynamicNewsCard.js:
* 导入 UnifiedSearchBox 组件
* 添加 filters, popularKeywords, onSearch, onSearchFocus 等 props
* 在 CardHeader 内部渲染搜索框(标题下方,mt={4})
- Community/index.js:
* 向 DynamicNewsCard 传递筛选状态和回调函数
* filters 和 popularKeywords 数据传递
* updateFilters 和 scrollToTimeline 回调传递
布局结构:
CardHeader
├─ 第一行:标题、徽章、更新时间
└─ 第二行:UnifiedSearchBox(搜索框 + 热门概念 + 筛选器)
状态管理:
- 使用共享的 filters 状态(来自 useEventFilters hook)
- 搜索操作通过 updateFilters 回调同步到父组件
- 两个组件的筛选条件保持一致
用户体验提升:
- 用户无需滚动到页面底部即可进行搜索
- 动态新闻区域功能更完整和独立
- 搜索结果在两个组件间同步显示
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-03 12:49:58 +08:00 |
|
zdl
|
95134d526d
|
feat(HistoricalEvents): 优化历史事件列表 UI 和相关股票弹窗
主要改进:
1. 历史事件列表改为卡片式网格布局
- 移除时间轴样式(垂直线 + 节点图标)
- 使用 SimpleGrid 响应式布局(1列/2列/3列)
- 卡片显示:事件名称、日期、相关度、重要性、描述
- 点击"相关股票"按钮打开 Modal 弹窗
2. 历史事件对比默认展开
- DynamicNewsDetailPanel: isHistoricalOpen 初始值改为 true
- 用户打开事件详情面板时,历史事件对比区域默认展开
3. 相关股票弹窗改为卡片式布局
- StocksList 组件从 Table 表格改为 SimpleGrid 卡片
- 显示 6 个字段:代码、名称、板块、相关度、涨幅、关联原因
- 关联原因支持展开/收起(startingHeight: 40px)
- 响应式网格布局(base: 1列, md: 2列, lg: 3列)
4. 修复字段映射兼容性
- 添加 getEventDate() 兼容多种日期字段
- 添加 getEventContent() 兼容多种内容字段
- 支持字段:event_date/created_at/date、content/description/summary
- 添加 Debug 日志输出实际数据结构
5. 修复弹窗关闭问题
- 添加 handleCloseModal() 同时清空两个状态
- 使用条件渲染 {stocksModalOpen && <Modal>}
- 关闭时完全卸载 Modal 组件,避免状态残留
技术细节:
- 移除未使用的导入(Table, Thead, Tbody, Tr, Th, Td 等)
- 新增工具函数:formatChange, getChangeColor, getCorrelationColor
- 卡片 hover 效果:boxShadow + borderColor 变化
- 涨跌幅颜色:红色(上涨)/ 绿色(下跌)
- 相关度颜色梯度:>=80% 红色, >=60% 橙色, <60% 绿色
代码统计:
- HistoricalEvents.js: -402 行, +344 行(净减少 58 行)
- 移除时间轴复杂逻辑,简化组件结构
- 提升代码可维护性和可读性
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-03 12:41:02 +08:00 |
|
zdl
|
cc2777ae20
|
feat: 实现实时要闻服务端分页功能
功能新增:
- 实时要闻组件支持服务端分页,每次切换页码重新请求数据
- 分页控制器组件,支持数字页码、上下翻页、快速跳转
- Mock 数据量从 100 条增加到 200 条,支持分页测试
技术实现:
1. Redux 状态管理(communityDataSlice.js)
- fetchDynamicNews 接收分页参数 { page, per_page }
- 返回数据结构调整为 { events, pagination }
- initialState 新增 dynamicNewsPagination 字段
- Reducer 分别存储 events 和 pagination 信息
- Selector 返回完整的 pagination 数据
2. 组件层(index.js → DynamicNewsCard → EventScrollList)
- Community/index.js: 获取并传递 pagination 信息
- DynamicNewsCard.js: 管理分页状态,触发服务端请求
- EventScrollList.js: 接收服务端 totalPages,渲染当前页数据
- 页码切换时自动选中第一个事件
3. 分页控制器(PaginationControl.js)
- 精简版设计:移除首页/末页按钮
- 上一页/下一页按钮,边界状态自动禁用
- 智能页码列表(最多5个,使用省略号)
- 输入框跳转功能,支持回车键
- Toast 提示非法输入
- 全部使用 xs 尺寸,紧凑布局
4. Mock 数据(events.js)
- 总事件数从 100 增加到 200 条
- 支持服务端分页测试(40 页 × 5 条/页)
分页流程:
1. 初始加载:请求 page=1, per_page=5
2. 切换页码:dispatch(fetchDynamicNews({ page: 2, per_page: 5 }))
3. 后端返回:{ events: [5条], pagination: { page, total, total_pages } }
4. 前端更新:显示新页面数据,更新分页控制器状态
UI 优化:
- 紧凑的分页控制器布局
- 移除冗余元素(首页/末页/总页数提示)
- xs 尺寸按钮,减少视觉负担
- 保留核心功能(翻页、页码、跳转)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-03 12:38:25 +08:00 |
|
zdl
|
6160edf060
|
feat(DynamicNewsDetailPanel): 升级为实时数据,移除模拟数据生成
|
2025-11-03 11:57:04 +08:00 |
|
zdl
|
bdea4209b2
|
feat: 添加 EventScrollList.js 组件
|
2025-11-03 11:42:04 +08:00 |
|
zdl
|
6cde2175db
|
feat: 实现实时要闻事件卡片点击高亮效果
功能新增:
- 点击事件卡片后显示高亮状态
- 当前选中的卡片有明显的视觉反馈
视觉效果:
- 选中状态:蓝色浅背景 (blue.50) + 蓝色粗边框 (2px, blue.500) + 大阴影 (lg)
- 未选中状态:原样式(白色/灰色交替背景 + 细边框 + 小阴影)
- 过渡动画:0.3s 平滑过渡
- 悬停效果:选中卡片悬停时边框变为 blue.600,阴影增强为 xl
技术实现:
1. DynamicNewsCard.js:
- 传递 isSelected prop 给 DynamicNewsEventCard
- 判断逻辑:isSelected={selectedEvent?.id === event.id}
2. DynamicNewsEventCard.js:
- 添加 isSelected 参数(默认 false)
- 根据 isSelected 动态调整 Card 样式:
- 背景色:选中 blue.50 / 未选中 原样式
- 边框:选中 2px blue.500 / 未选中 1px 原颜色
- 阴影:选中 lg / 未选中 sm
用户体验提升:
- 清晰显示当前查看的事件
- 与下方详情面板形成呼应
- 视觉反馈明确,交互友好
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-03 11:28:03 +08:00 |
|
zdl
|
f432d72151
|
fix: 移除 DynamicNewsCard 点击事件时的弹窗触发
问题描述:
- 点击新闻卡片时,既更新了详情组件,又触发了不需要的弹窗
- 用户只希望更新下方的详情面板,不需要弹窗
解决方案:
- 移除 onEventClick 和 onTitleClick 中对父组件回调的调用
- 保留 setSelectedEvent 更新逻辑
- 详情面板仍然正常更新显示
修改位置:
- src/views/Community/components/DynamicNewsCard.js 第226-235行
交互效果:
- 点击新闻卡片 → 只更新下方的 DynamicNewsDetailPanel
- 不再触发任何额外的弹窗
- 保持内联详情面板显示方式
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-03 11:19:10 +08:00 |
|
zdl
|
7ae4bc418f
|
feat: 提取交易日期
|
2025-11-02 16:41:55 +08:00 |
|
zdl
|
e7e2b3bb11
|
feat: 提交迷你分时图组件
|
2025-11-02 16:38:44 +08:00 |
|
zdl
|
e22a39c5cd
|
feat: 提交历史事件对比组件
|
2025-11-02 16:37:46 +08:00 |
|
zdl
|
3b8b749eb1
|
feat: 添加相关股票模块
|
2025-11-01 12:19:47 +08:00 |
|
zdl
|
571d5e68bc
|
feat:删除不必要组件
|
2025-10-31 20:12:05 +08:00 |
|
zdl
|
fc251ede05
|
feat: 添加相关概念组件
|
2025-10-31 20:08:53 +08:00 |
|
zdl
|
57c4c3c959
|
feat: 添加可折叠模块标题组件
|
2025-10-31 18:15:39 +08:00 |
|
zdl
|
e1e82555bf
|
feat: 事件滑动面板添加 详情面板
|
2025-10-31 18:14:05 +08:00 |
|
zdl
|
b44a0ccd39
|
feat: 添加事件描述组件
|
2025-10-31 17:50:23 +08:00 |
|
zdl
|
2d936ca1c7
|
feat: UI调整
|
2025-10-31 16:29:11 +08:00 |
|
zdl
|
14db374820
|
style: 优化事件详情和涨跌幅指标的视觉效果
EventHeaderInfo 组件优化:
- "重要性:高"背景色改为浅杏黄色(yellow.100 → orange.50)
- 文字颜色改为深杏色(yellow.700 → orange.800)
- 视觉效果更柔和优雅,不刺眼
StockChangeIndicators 组件优化:
- 改用多颜色梯度(5级分级)
- 上涨:红色系(red.900/700/500)→ 橙色系(orange.600/400)
- 下跌:绿色系(green.900/700/500)→ 青色系(teal.600/400)
- 背景色和边框色跟随数字颜色
- 移除调试 console.log
视觉改进:
- 颜色分级更细腻,从3级增加到5级
- 引入橙色和青色让小幅和大幅波动有明显色系区别
- 5.7% 显示为深红色,1.7% 显示为橙色,视觉区分明显
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-10-31 16:00:37 +08:00 |
|
zdl
|
db472620f3
|
feat: 添加事件详情头部
|
2025-10-31 15:33:22 +08:00 |
|
zdl
|
9fd9fcb731
|
feat: 添加事件详情面板
|
2025-10-31 14:38:43 +08:00 |
|
zdl
|
c372832f1f
|
feat: 新增实时要闻·动态追踪与市场复盘功能,优化导航体验
新增功能:
- 实时要闻·动态追踪横向滚动卡片(DynamicNewsCard)
- 动态新闻事件卡片组件(DynamicNewsEventCard)
- 市场复盘卡片组件(MarketReviewCard)
- 股票涨跌幅指标组件(StockChangeIndicators)
- 交易时间工具函数(tradingTimeUtils)
- Mock API 支持动态新闻数据生成
UI 优化:
- EventFollowButton 改用 react-icons 星星图标,实现真正的空心/实心效果
- 关注按钮添加半透明白色背景(whiteAlpha.500),悬停效果更明显
- 事件卡片标题添加右侧留白,防止关注按钮遮挡文字
性能优化:
- 禁用 Router v7_startTransition 特性,解决路由切换延迟 2 秒问题
- 调整导航菜单点击顺序(先跳转后关闭),提升响应速度
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-10-31 14:11:03 +08:00 |
|
zdl
|
5d8ad5e442
|
feat: bugfix
|
2025-10-31 10:33:53 +08:00 |
|
zdl
|
85d505cd53
|
fix: 修复 InvestmentCalendar Ant Design 5.x API 废弃警告
## 问题
控制台出现 4 个 Ant Design API 废弃警告:
```
[antd: Calendar] `dateCellRender` is deprecated. Please use `cellRender` instead.
[antd: Modal] `visible` is deprecated. Please use `open` instead.
[antd: Modal] `bodyStyle` is deprecated. Please use `styles.body` instead.
[antd: Drawer] `visible` is deprecated. Please use `open` instead.
```
## 修复内容
### 1. Calendar API (Line 137, 687)
**旧 API**:
```javascript
const dateCellRender = (value) => {
const dateStr = value.format('YYYY-MM-DD');
// ...
};
<Calendar dateCellRender={dateCellRender} />
```
**新 API (Ant Design 5.x)**:
```javascript
const cellRender = (current, info) => {
// 只处理日期单元格,月份单元格返回默认
if (info.type !== 'date') return info.originNode;
const dateStr = current.format('YYYY-MM-DD');
// ...
};
<Calendar cellRender={cellRender} />
```
### 2. Modal API (Line 701, 766)
`visible` → `open`
```javascript
// 旧 API
<Modal visible={modalVisible} />
// 新 API
<Modal open={modalVisible} />
```
### 3. Modal Styles API (Line 705)
`bodyStyle` → `styles.body`
```javascript
// 旧 API
<Modal bodyStyle={{ padding: '24px' }} />
// 新 API
<Modal styles={{ body: { padding: '24px' } }} />
```
### 4. Drawer API (Line 740)
`visible` → `open`
```javascript
// 旧 API
<Drawer visible={detailDrawerVisible} />
// 新 API
<Drawer open={detailDrawerVisible} />
```
## 影响
- ✅ 消除 4 个 Ant Design API 废弃警告
- ✅ 兼容 Ant Design 5.x
- ✅ 功能不受影响
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-10-30 19:04:30 +08:00 |
|
zdl
|
5236976307
|
fix(EventList): 删除重复的 Toast 通知,统一使用右下角通知卡片
**问题描述**
新事件推送时显示两种通知:
1. ❌ 左侧顶部绿色 Toast(重复多次)
2. ✅ 右下角通知卡片(NotificationContainer)
用户反馈:只需要右下角通知卡片,不需要 Toast 提示
**修复内容**
删除 EventList.js 中的 Chakra UI Toast 通知代码(13 行):
```diff
- console.log('[EventList DEBUG] 准备显示 Toast 通知');
- // 显示 Toast 通知 - 更明显的配置
- const toastId = toast({
- title: '🔔 新事件发布',
- description: event.title,
- status: 'success',
- duration: 8000,
- isClosable: true,
- position: 'top',
- variant: 'solid',
- });
- console.log('[EventList DEBUG] ✓ Toast 通知已调用,ID:', toastId);
```
**保留的通知能力**
- ✅ 右下角通知卡片(NotificationContainer)
- ✅ 浏览器原生通知(需用户授权)
- ✅ 事件列表实时更新
- ✅ PostHog 埋点追踪
**验证**
刷新页面后,新事件推送时:
- ❌ 不再显示左侧 Toast
- ✅ 只显示右下角通知卡片
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-10-30 18:39:47 +08:00 |
|
zdl
|
d57db02c15
|
fix(klineDataCache): 修复 K线类型参数错误导致的 400 错误
**问题描述**
MiniTimelineChart 组件加载时,K线数据请求失败:
- 错误: `HTTP error! status: 400`
- 响应: `{"error":"不支持的类型"}`
- 请求: `GET /api/stock/{code}/kline?type=minute`
**根本原因**
klineDataCache.js 使用了错误的 K线类型参数:
- ❌ 使用: `'minute'`
- ✅ 应为: `'timeline'`
根据 API 文档 (MOCK_API_DOCS.md),后端支持的类型:
- `'timeline'` - 分时图
- `'daily'` - 日K线
- `'weekly'` - 周K线
- `'monthly'` - 月K线
**修复内容**
### 1. src/views/Community/components/StockDetailPanel/utils/klineDataCache.js
```diff
const requestPromise = stockService
- .getKlineData(stockCode, 'minute', normalizedEventTime)
+ .getKlineData(stockCode, 'timeline', normalizedEventTime)
.then((res) => {
```
### 2. docs/StockDetailPanel_BUSINESS_LOGIC.md
更新文档中的 K线类型说明:
```diff
- **K线类型**: 'minute' (分时), 'day' (日K), 'week' (周K), 'month' (月K)
+ **K线类型**: 'timeline' (分时), 'daily' (日K), 'weekly' (周K), 'monthly' (月K)
```
更新代码示例:
```diff
const requestPromise = stockService
- .getKlineData(stockCode, 'minute', eventTime)
+ .getKlineData(stockCode, 'timeline', eventTime)
```
**验证**
- ✅ 与 MidjourneyHeroSection.js 中的用法保持一致
- ✅ 符合 MOCK_API_DOCS.md 规范
- ✅ 消除控制台 400 错误
**影响范围**
- StockDetailPanel 中的 MiniTimelineChart 组件
- 所有使用 fetchKlineData 的地方
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-10-30 18:32:24 +08:00 |
|
zdl
|
1b2437e71c
|
fix: 使用 shallowEqual 修复 useSelector 引用不稳定导致的无限循环
## 问题
仍然报错 "Maximum update depth exceeded",第一次修复不完整。
## 根本原因(第二轮诊断)
useSelector 返回的数组/对象引用不稳定:
**useEventStocks.js**
```javascript
const stocks = useSelector(state =>
eventId ? (state.stock.eventStocksCache[eventId] || []) : []
);
// 每次 Redux state 更新,|| [] 都会创建新数组引用
```
**StockDetailPanel.js 触发频繁更新**
```javascript
useEffect(() => {
setFilteredStocks(stocks); // stocks 引用变化 → setState
}, [searchText, stocks]); // stocks 是不稳定的引用
```
**无限循环链**:
1. Redux state 更新 → stocks 新引用
2. stocks 变化 → 触发 StockDetailPanel useEffect
3. useEffect 调用 setFilteredStocks → 组件重新渲染
4. 重渲染可能触发其他操作 → Redux 更新
5. 返回步骤 1,无限循环 🔁
## 解决方案
在所有 useSelector 调用中使用 shallowEqual 进行浅比较:
```javascript
import { useSelector, shallowEqual } from 'react-redux';
const stocks = useSelector(
state => eventId ? (state.stock.eventStocksCache[eventId] || []) : [],
shallowEqual // 内容相同则返回旧引用,防止不必要的更新
);
```
## 修改文件
1. **useEventStocks.js** - 6 个 useSelector 添加 shallowEqual
- stocks, quotes, historicalEvents, loading
2. **useStockMonitoring.js** - 1 个 useSelector 添加 shallowEqual
- quotes
3. **useWatchlist.js** - 1 个 useSelector 添加 shallowEqual
- watchlistArray
## 工作原理
shallowEqual 会比较新旧值的内容:
- 如果内容相同 → 返回旧引用 → 不触发依赖更新
- 如果内容不同 → 返回新引用 → 正常触发更新
这样可以防止因为引用变化导致的不必要重新渲染。
## 影响
- ✅ 修复无限循环错误
- ✅ 减少不必要的组件重新渲染
- ✅ 提升整体性能
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-10-30 16:30:35 +08:00 |
|
zdl
|
ff0c4d65e1
|
fix: 修复 StockDetailPanel 导入路径错误
问题:
- StockDetailPanel.js 引用了不存在的相对路径
- ./hooks/... 和 ./components 找不到文件
- 导致编译失败: Module not found
根因:
- hooks 和 components 实际在 ./StockDetailPanel/ 子目录下
- 但导入路径缺少 StockDetailPanel/ 前缀
修复:
- ✅ ./hooks/useEventStocks → ./StockDetailPanel/hooks/useEventStocks
- ✅ ./hooks/useWatchlist → ./StockDetailPanel/hooks/useWatchlist
- ✅ ./hooks/useStockMonitoring → ./StockDetailPanel/hooks/useStockMonitoring
- ✅ ./components → ./StockDetailPanel/components
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-10-30 15:32:22 +08:00 |
|