# 消息推送系统优化总结 ## 优化目标 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; } `; // 应用到紧急通知 ``` #### 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 && ( )} }; ``` ## 后续改进建议 ### 短期 - [ ] 添加通知优先级过渡动画(边框和背景色渐变) - [ ] 提供配置选项让用户自定义显示元素 ### 长期 - [ ] 支持通知分组(按类型或优先级) - [ ] 添加通知搜索和筛选功能 - [ ] 通知历史记录可视化统计 ## 构建状态 ✅ 构建成功 (npm run build) ✅ 无语法错误 ✅ 无 TypeScript 错误