- 移动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>
8.5 KiB
8.5 KiB
消息推送系统优化总结
优化目标
- 简化通知信息密度,通过视觉层次(边框+背景色)表达优先级
- 增强紧急通知的视觉冲击力(红色脉冲边框动画)
- 采用智能显示策略,降低普通通知的视觉干扰
实施内容
1. 优先级配置更新 (src/constants/notificationTypes.js)
新增配置项
-
borderWidth: 边框宽度- 紧急 (urgent): 6px
- 重要 (important): 4px
- 普通 (normal): 2px
-
bgOpacity: 背景色透明度(亮色模式)- 紧急: 0.25 (深色背景)
- 重要: 0.15 (中色背景)
- 普通: 0.08 (浅色背景)
-
darkBgOpacity: 背景色透明度(暗色模式)- 紧急: 0.30
- 重要: 0.20
- 普通: 0.12
新增辅助函数
getPriorityBgOpacity(priority, isDark): 获取优先级对应的背景色透明度getPriorityBorderWidth(priority): 获取优先级对应的边框宽度
2. 紧急通知脉冲动画 (src/components/NotificationContainer/index.js)
动画效果
- 使用
@emotion/react的keyframes创建脉冲动画 - 仅紧急通知 (urgent) 应用动画效果
- 动画特性:
- 边框颜色脉冲效果
- 阴影扩散效果(0 → 12px)
- 持续时间:2秒
- 缓动函数:ease-in-out
- 无限循环
const pulseAnimation = keyframes`
0%, 100% {
border-left-color: currentColor;
box-shadow: 0 0 0 0 currentColor;
}
50% {
border-left-color: currentColor;
box-shadow: -4px 0 12px 0 currentColor;
}
`;
3. 背景色优先级优化
亮色模式
- 紧急通知:
${colorScheme}.200- 深色背景 + 脉冲动画 - 重要通知:
${colorScheme}.100- 中色背景 - 普通通知:
white- 极淡背景(降低视觉干扰)
暗色模式
- 紧急通知:
${colorScheme}.800或 typeConfig.darkBg - 重要通知:
${colorScheme}.800或 typeConfig.darkBg - 普通通知:
gray.800- 暗灰背景(降低视觉干扰)
4. 可点击性视觉提示
问题
- 用户需要 hover 才能知道通知是否可点击
- cursor: pointer 不够直观
解决方案
-
可点击的通知:
- 添加完整边框(四周 1px solid)
- 保持左侧优先级边框宽度
- 使用更明显的阴影(md 级别)
- 产生微妙的悬浮感
-
不可点击的通知:
- 仅左侧边框
- 使用较淡的阴影(sm 级别)
// 可点击的通知添加完整边框
{...(isActuallyClickable && {
border: '1px solid',
borderLeftWidth: priorityBorderWidth, // 保持优先级
})}
// 可点击的通知使用更明显的阴影
boxShadow={isActuallyClickable
? (isNewest ? '2xl' : 'md')
: (isNewest ? 'xl' : 'sm')}
5. 通知组件简化 (src/components/NotificationContainer/index.js)
显示元素分级
LV1 - 必需元素(始终显示)
- ✅ 标题 (title)
- ✅ 内容 (content, 最多3行)
- ✅ 时间 (publishTime/pushTime)
- ✅ 查看详情 (仅当 clickable=true 时)
- ✅ 关闭按钮
LV2 - 可选元素(数据存在时显示)
- ✅ 图标:仅在紧急/重要通知时显示
- ❌ 优先级标签:已移除,改用边框+背景色表示
- ✅ 状态提示:仅当
extra?.statusHint存在时显示
LV3 - 可选元素(数据存在时显示)
- ✅ AI 标识:仅当
isAIGenerated = true时显示 - ✅ 预测标识:仅当
isPrediction = true时显示
其他
- ✅ 作者信息:移除屏幕尺寸限制,仅当
author存在时显示
优先级视觉样式
- ✅ 边框宽度:根据优先级动态调整 (2px/4px/6px)
- ✅ 背景色深度:根据优先级使用不同深度的颜色
- 亮色模式: .50 (普通) / .100 (重要) / .200 (紧急)
- 暗色模式: 使用 typeConfig 的 darkBg 配置
布局优化
- ✅ 内容和元数据区域的左侧填充根据图标显示状态自适应
- ✅ 无图标时不添加额外的左侧间距
预期效果
视觉改进
- 清晰度提升:移除冗余的优先级标签,视觉更整洁
- 优先级强化:
- 紧急通知:6px 粗边框 + 深色背景 + 红色脉冲动画 → 视觉冲击力极强
- 重要通知:4px 中等边框 + 中色背景 + 图标 → 醒目但不打扰
- 普通通知:2px 细边框 + 白色/极淡背景 → 低视觉干扰
- 可点击性一目了然:
- 可点击:完整边框 + 明显阴影 → 卡片悬浮感
- 不可点击:仅左侧边框 + 淡阴影 → 平面感
- 信息密度降低:减少不必要的视觉元素,关键信息更突出
用户体验
- 紧急通知引起注意:脉冲动画确保用户不会错过紧急信息
- 快速识别优先级:
- 动画 = 紧急(需要立即关注)
- 图标 + 粗边框 = 重要(需要关注)
- 细边框 + 淡背景 = 普通(可稍后查看)
- 可点击性无需 hover:
- 完整边框 + 悬浮感 = 可以点击查看详情
- 仅左侧边框 = 信息已完整,无需跳转
- 智能显示:可选信息只在数据存在时显示,避免空白占位
- 响应式优化:所有设备上保持一致的显示逻辑
向后兼容
- ✅ 完全兼容现有通知数据结构
- ✅ 可选字段不存在时自动隐藏
- ✅ 不影响现有功能(点击、关闭、自动消失等)
测试建议
1. 功能测试
# 启动开发服务器
npm start
# 观察不同优先级通知的显示效果
# - 紧急通知:粗边框 (6px) + 深色背景 + 红色脉冲动画 + 图标 + 不自动关闭
# - 重要通知:中等边框 (4px) + 中色背景 + 图标 + 30秒后关闭
# - 普通通知:细边框 (2px) + 白色背景 + 无图标 + 15秒后关闭
1.1 动画测试
- 紧急通知的脉冲动画流畅无卡顿
- 动画周期为 2 秒
- 动画在紧急通知显示期间持续循环
- 阴影扩散效果清晰可见
2. 边界测试
- 仅必需字段的通知(无作者、无 AI 标识、无预测标识)
- 包含所有可选字段的通知
- 不同类型的通知(公告、股票、事件、分析报告)
- 不同优先级的通知(紧急、重要、普通)
3. 响应式测试
- 移动设备 (< 480px)
- 平板设备 (480px - 768px)
- 桌面设备 (> 768px)
4. 暗色模式测试
- 切换到暗色模式,确认背景色对比度合适
技术细节
关键代码变更
1. 脉冲动画实现
// 导入 keyframes
import { keyframes } from '@emotion/react';
// 定义脉冲动画
const pulseAnimation = keyframes`
0%, 100% {
border-left-color: currentColor;
box-shadow: 0 0 0 0 currentColor;
}
50% {
border-left-color: currentColor;
box-shadow: -4px 0 12px 0 currentColor;
}
`;
// 应用到紧急通知
<Box
animation={priority === PRIORITY_LEVELS.URGENT
? `${pulseAnimation} 2s ease-in-out infinite`
: undefined}
...
/>
2. 优先级标签自动隐藏
// PRIORITY_CONFIGS 中所有 show 属性设置为 false
show: false, // 不再显示标签,改用边框+背景色表示
3. 背景色优先级优化
const getPriorityBgColor = () => {
const colorScheme = typeConfig.colorScheme;
if (!isDark) {
if (priority === PRIORITY_LEVELS.URGENT) {
return `${colorScheme}.200`; // 深色背景 + 脉冲动画
} else if (priority === PRIORITY_LEVELS.IMPORTANT) {
return `${colorScheme}.100`; // 中色背景
} else {
return 'white'; // 极淡背景(降低视觉干扰)
}
} else {
if (priority === PRIORITY_LEVELS.URGENT) {
return typeConfig.darkBg || `${colorScheme}.800`;
} else if (priority === PRIORITY_LEVELS.IMPORTANT) {
return typeConfig.darkBg || `${colorScheme}.800`;
} else {
return 'gray.800'; // 暗灰背景(降低视觉干扰)
}
}
};
4. 图标条件显示
const shouldShowIcon = priority === PRIORITY_LEVELS.URGENT ||
priority === PRIORITY_LEVELS.IMPORTANT;
{shouldShowIcon && (
<Icon as={typeConfig.icon} ... />
)}
};
后续改进建议
短期
- 添加通知优先级过渡动画(边框和背景色渐变)
- 提供配置选项让用户自定义显示元素
长期
- 支持通知分组(按类型或优先级)
- 添加通知搜索和筛选功能
- 通知历史记录可视化统计
构建状态
✅ 构建成功 (npm run build) ✅ 无语法错误 ✅ 无 TypeScript 错误