- 移动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>
281 lines
8.5 KiB
Markdown
281 lines
8.5 KiB
Markdown
# 消息推送系统优化总结
|
||
|
||
## 优化目标
|
||
1. 简化通知信息密度,通过视觉层次(边框+背景色)表达优先级
|
||
2. 增强紧急通知的视觉冲击力(红色脉冲边框动画)
|
||
3. 采用智能显示策略,降低普通通知的视觉干扰
|
||
|
||
## 实施内容
|
||
|
||
### 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
|
||
- 无限循环
|
||
|
||
```javascript
|
||
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 级别)
|
||
|
||
```javascript
|
||
// 可点击的通知添加完整边框
|
||
{...(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. 功能测试
|
||
```bash
|
||
# 启动开发服务器
|
||
npm start
|
||
|
||
# 观察不同优先级通知的显示效果
|
||
# - 紧急通知:粗边框 (6px) + 深色背景 + 红色脉冲动画 + 图标 + 不自动关闭
|
||
# - 重要通知:中等边框 (4px) + 中色背景 + 图标 + 30秒后关闭
|
||
# - 普通通知:细边框 (2px) + 白色背景 + 无图标 + 15秒后关闭
|
||
```
|
||
|
||
### 1.1 动画测试
|
||
- [ ] 紧急通知的脉冲动画流畅无卡顿
|
||
- [ ] 动画周期为 2 秒
|
||
- [ ] 动画在紧急通知显示期间持续循环
|
||
- [ ] 阴影扩散效果清晰可见
|
||
|
||
### 2. 边界测试
|
||
- [ ] 仅必需字段的通知(无作者、无 AI 标识、无预测标识)
|
||
- [ ] 包含所有可选字段的通知
|
||
- [ ] 不同类型的通知(公告、股票、事件、分析报告)
|
||
- [ ] 不同优先级的通知(紧急、重要、普通)
|
||
|
||
### 3. 响应式测试
|
||
- [ ] 移动设备 (< 480px)
|
||
- [ ] 平板设备 (480px - 768px)
|
||
- [ ] 桌面设备 (> 768px)
|
||
|
||
### 4. 暗色模式测试
|
||
- [ ] 切换到暗色模式,确认背景色对比度合适
|
||
|
||
## 技术细节
|
||
|
||
### 关键代码变更
|
||
|
||
#### 1. 脉冲动画实现
|
||
```javascript
|
||
// 导入 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. 优先级标签自动隐藏
|
||
```javascript
|
||
// PRIORITY_CONFIGS 中所有 show 属性设置为 false
|
||
show: false, // 不再显示标签,改用边框+背景色表示
|
||
```
|
||
|
||
#### 3. 背景色优先级优化
|
||
```javascript
|
||
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. 图标条件显示
|
||
```javascript
|
||
const shouldShowIcon = priority === PRIORITY_LEVELS.URGENT ||
|
||
priority === PRIORITY_LEVELS.IMPORTANT;
|
||
|
||
{shouldShowIcon && (
|
||
<Icon as={typeConfig.icon} ... />
|
||
)}
|
||
};
|
||
```
|
||
|
||
## 后续改进建议
|
||
|
||
### 短期
|
||
- [ ] 添加通知优先级过渡动画(边框和背景色渐变)
|
||
- [ ] 提供配置选项让用户自定义显示元素
|
||
|
||
### 长期
|
||
- [ ] 支持通知分组(按类型或优先级)
|
||
- [ ] 添加通知搜索和筛选功能
|
||
- [ ] 通知历史记录可视化统计
|
||
|
||
## 构建状态
|
||
✅ 构建成功 (npm run build)
|
||
✅ 无语法错误
|
||
✅ 无 TypeScript 错误
|