Files
vf_react/docs/NOTIFICATION_OPTIMIZATION_SUMMARY.md
zdl 09db05c448 docs: 将所有文档迁移到 docs/ 目录
- 移动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>
2025-10-30 14:51:22 +08:00

8.5 KiB
Raw Permalink Blame History

消息推送系统优化总结

优化目标

  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/reactkeyframes 创建脉冲动画
  • 仅紧急通知 (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 错误