Compare commits

..

426 Commits

Author SHA1 Message Date
06beeeaee4 update pay ui 2025-12-02 14:30:27 +08:00
d1a222d9e9 update pay ui 2025-12-02 12:22:49 +08:00
bd86ccce85 update pay ui 2025-12-02 12:01:59 +08:00
ed14031d65 update pay ui 2025-12-02 11:07:45 +08:00
9b16d9d162 update pay ui 2025-12-02 10:49:50 +08:00
7708cb1a69 update pay ui 2025-12-02 10:33:55 +08:00
2395d92b17 update pay ui 2025-12-02 08:07:46 +08:00
02d5311005 update pay function 2025-12-01 14:28:46 +08:00
7fa3d26470 update pay function 2025-12-01 14:16:11 +08:00
21eb1783e9 update pay function 2025-12-01 14:01:14 +08:00
ec31801ccd update pay function 2025-12-01 07:48:03 +08:00
ff9c68295b update pay function 2025-11-30 23:58:06 +08:00
a72978c200 update pay function 2025-11-30 23:39:48 +08:00
2c4f5152e4 update pay function 2025-11-30 22:54:15 +08:00
846e66fecb update pay function 2025-11-30 22:51:24 +08:00
ef6c58b247 update pay function 2025-11-30 21:45:18 +08:00
b753d29dbf update pay function 2025-11-30 21:14:27 +08:00
455e1c1d32 update pay function 2025-11-30 18:55:35 +08:00
7b65cac358 update pay function 2025-11-30 18:45:36 +08:00
8843c81d8b update pay function 2025-11-30 18:31:13 +08:00
6763151c57 update pay function 2025-11-30 17:41:55 +08:00
9d9d3430b7 update pay function 2025-11-30 17:18:05 +08:00
25c3d9d828 update pay function 2025-11-30 17:06:34 +08:00
41368f82a7 update pay function 2025-11-30 16:39:24 +08:00
608ac4a962 update pay function 2025-11-30 16:33:34 +08:00
5a24cb9eec update pay function 2025-11-30 16:16:48 +08:00
33a3c16421 update pay function 2025-11-30 15:36:20 +08:00
2f8388ba41 update pay function 2025-11-30 13:57:39 +08:00
4127e4c816 update pay function 2025-11-30 13:47:47 +08:00
05aa0c89f0 update pay function 2025-11-30 13:38:29 +08:00
14ab2f62f3 update pay function 2025-11-30 09:15:24 +08:00
fc738dc639 update pay function 2025-11-29 18:43:43 +08:00
059275d1a2 update pay function 2025-11-29 18:28:32 +08:00
d14be2081d update pay function 2025-11-29 14:07:55 +08:00
1676d69917 update pay function 2025-11-29 13:47:18 +08:00
20b3d624f0 update pay function 2025-11-29 10:05:57 +08:00
34323cc63d update pay function 2025-11-29 09:42:41 +08:00
42fdb7d754 update pay function 2025-11-29 08:16:41 +08:00
5526705254 update pay function 2025-11-28 17:57:10 +08:00
f6e8d673a8 update pay function 2025-11-28 17:00:02 +08:00
547424fff6 update pay function 2025-11-28 16:51:28 +08:00
ec2978026a update pay function 2025-11-28 16:32:27 +08:00
250d585b87 update pay function 2025-11-28 16:08:31 +08:00
8cf2850660 update pay function 2025-11-28 15:32:03 +08:00
9b7a221315 update pay function 2025-11-28 14:49:16 +08:00
18f8f75116 update pay function 2025-11-28 14:09:47 +08:00
56a7ca7eb3 update pay function 2025-11-28 14:00:36 +08:00
c1937b9e31 update pay function 2025-11-28 12:37:01 +08:00
9c5900c7f5 update pay function 2025-11-28 12:27:30 +08:00
007de2d76d update pay function 2025-11-28 09:45:36 +08:00
49656e6e88 update pay function 2025-11-28 09:17:44 +08:00
bc6e993dec update pay function 2025-11-28 08:59:36 +08:00
72a490c789 update pay function 2025-11-28 08:52:09 +08:00
zdl
b88bfebcef Merge branch 'feature_2025/251121_h5UI' into feature_2025/251117_pref
* feature_2025/251121_h5UI:
  feat: 传导练UI调整
  fix: UI调试
  fix: 调整相关概念卡片UI
  fix: 文案调整
  fix: AI合成h5换行,pc一行,评论标题上方margin去掉
  fix: 调整AI合成UI
  fix: 分时图UI调整
  fix:事件详情弹窗UI
  fix:调整客服UI
  fix: 事件详情弹窗UI调整
  fix: 事件详情弹窗UI调整 重要性h5不展示 事件列表卡片间距调整
  fix: h5 去掉通知弹窗引导
  fix: 关注按钮UI调整
2025-11-28 07:15:11 +08:00
zdl
cf4fdf6a68 feat: 传导练UI调整 2025-11-28 07:14:52 +08:00
zdl
34338373cd fix: UI调试 2025-11-27 18:27:44 +08:00
zdl
589e1c20f9 fix: 调整相关概念卡片UI 2025-11-27 17:22:49 +08:00
zdl
60e9a40a1f fix: 文案调整 2025-11-27 17:03:35 +08:00
zdl
b8b24643fe fix: AI合成h5换行,pc一行,评论标题上方margin去掉 2025-11-27 16:55:25 +08:00
zdl
e9e9ec9051 fix: 调整AI合成UI 2025-11-27 16:40:35 +08:00
zdl
5b0e420770 fix: 分时图UI调整 2025-11-27 16:20:15 +08:00
zdl
93f43054fd fix:事件详情弹窗UI 2025-11-27 15:35:48 +08:00
zdl
101d042b0e fix:调整客服UI 2025-11-27 15:31:07 +08:00
zdl
a1aa6718e6 fix: 事件详情弹窗UI调整 2025-11-27 15:08:14 +08:00
zdl
753727c1c0 fix: 事件详情弹窗UI调整
重要性h5不展示
事件列表卡片间距调整
2025-11-27 14:40:38 +08:00
zdl
afc92ee583 fix: h5 去掉通知弹窗引导 2025-11-27 13:37:01 +08:00
900aff17df update pay function 2025-11-27 11:28:57 +08:00
zdl
d825e4fe59 fix: 关注按钮UI调整 2025-11-27 11:19:20 +08:00
zdl
62cf0a6c7d feat: 修改小程序跳转链接 2025-11-27 10:46:14 +08:00
zdl
805d446775 feat: 调整搜索框UI 2025-11-26 19:33:00 +08:00
zdl
24ddfcd4b5 feat: 新增:H5 时左右 padding 改为 8px 2025-11-26 19:31:12 +08:00
zdl
a90158239b feat: 模式切花移动到标题恻,通知UI调整 2025-11-26 19:11:33 +08:00
zdl
a8d4245595 pref: 文案调整 2025-11-26 17:49:39 +08:00
zdl
5aedde7528 feat:H5 移动端已隐藏整个顶部控制栏 2025-11-26 16:51:52 +08:00
zdl
f5f89a1c72 feat:箭头绝对定位
移除左右 padding
隐藏重复箭头
2025-11-26 16:50:46 +08:00
zdl
e0b7f8c59d feat: 调整事件列表h5模式调整 2025-11-26 16:44:53 +08:00
zdl
d22d75e761 pref: h5 分页UI调整 2025-11-26 16:35:49 +08:00
zdl
30fc156474 fix: 移动端事件中心事件列表添加时间 2025-11-26 16:23:28 +08:00
zdl
572665199a feat: 删除事件中心页面不再显示桌面通知提示横幅 2025-11-26 16:18:15 +08:00
zdl
a2831c82a8 feat: 移动端不显示政策标签 2025-11-26 16:02:59 +08:00
zdl
217551b6ab feat: H5 移动端将隐藏"开启通知"组件,桌面端保持正常显示 2025-11-26 16:01:58 +08:00
zdl
022271947a fix: 移动端抽屉菜单不再显示深色模式切换按钮 2025-11-26 15:47:26 +08:00
zdl
cd6ffdbe68 fix: 修复hooks报错 2025-11-26 15:45:46 +08:00
zdl
9df725b748 feat: 精简日志 2025-11-26 15:34:11 +08:00
zdl
64f8914951 feat: logger.js - 添加日志级别控制 2025-11-26 15:30:31 +08:00
zdl
506e5a448c feat: 本地优先启动服务拦截 2025-11-26 15:23:37 +08:00
zdl
e277352133 src/contexts/NotificationContext.js
- 添加 selectIsMobile 导入 在 NotificationProvider 组件开头添加移动端检测 移动端返回空壳 Provider
  - 桌面端保持原有完整功能
  移除 ConnectionStatusBar 组件和 ConnectionStatusBarWrapper(所有端)
  - 移除了不再使用的 useNotification、useLocation、logger 导入
  - 添加了 Redux selectIsMobile 检测
  - 移动端不渲染 NotificationContainer
2025-11-26 15:15:20 +08:00
zdl
87437ed229 feat: 增加 wechat_login=success 参数处理 2025-11-26 14:52:49 +08:00
zdl
037471d880 feat: 修复 Mock 路径从 h5-auth-url → h5-auth 2025-11-26 14:52:05 +08:00
zdl
0c482bc72c feat: 回调处理增加 H5 模式判断,重定向到前端回调页 2025-11-26 14:51:51 +08:00
zdl
4aebb3bf4b feat: 调整导航栏高度 2025-11-26 14:10:09 +08:00
zdl
ed241bd9c5 pref: 导航选中高亮 2025-11-26 14:01:58 +08:00
zdl
e6ede81c78 feat: 修复动态 reducer 注入导致的运行时错误 2025-11-26 13:59:26 +08:00
zdl
a0b688da80 feat: 移除 PerformanceMonitor 调试日志 2025-11-26 13:42:42 +08:00
zdl
6bd09b797d feat: PostHog 加载策略优化计划
目标

     改进 PostHog 延迟加载策略,平衡首屏性能和数据完整性:
     1. 使用 requestIdleCallback 替代固定 2 秒延迟
     2. 保留关键事件(first_visit)的同步追踪,确保数据不丢失
2025-11-26 13:41:09 +08:00
zdl
9c532b5f18 pref: 删除微信登陆日志 2025-11-26 13:38:26 +08:00
zdl
1d1d6c8169 pref: P0: PostHog 延迟加载 - 完成
P0: HeroPanel 懒加载 -  完成
 P0/P1: Charts/FullCalendar 懒加载 -  已通过路由懒加载隔离,无需额外处理
删除空的 CSS 文件
2025-11-26 13:33:58 +08:00
zdl
3507cfe9f7 pref: 删除调试工具 2025-11-26 13:16:30 +08:00
zdl
cc520893f8 fix: 添加 wechatStatusRef 用于跟踪最新状态
使用 wechatStatusRef.current 替代 wechatStatus
添加 AUTHORIZED 状态处理逻辑
添加 useEffect 同步 wechatStatusRef
2025-11-26 13:07:46 +08:00
zdl
dabedc1c0b feat: 之前的防重复逻辑 !subscriptionInfo.type 永远为 false(因为初始值是 free),导致订阅 API 从不被调用 2025-11-26 11:49:12 +08:00
zdl
7b4c4be7bf pref:点击手机登陆后日志优化 2025-11-26 11:43:16 +08:00
zdl
7a2c73f3ca :pref: 首屏优化 2025-11-26 11:30:12 +08:00
zdl
105a0b02ea fix:移除日志 2025-11-26 11:17:03 +08:00
zdl
d8a4c20565 fix: Login Page Viewed 事件仅在模态框首次打开时触发 1 次
- 验证码倒计时期间不再重复触发
     - 不影响其他事件追踪功能\
2025-11-26 11:15:04 +08:00
zdl
5f959fb44f feat: 添加 认证检查 和 首页渲染 的性能标记 2025-11-26 11:10:50 +08:00
zdl
ee78e00d3b feat: 添加设备检测功能 2025-11-26 11:03:13 +08:00
zdl
2fcc341213 feat: 修复通知初始化问题 2025-11-26 10:55:38 +08:00
zdl
1090a2fc67 feat: 客服接口mock添加 2025-11-26 10:55:18 +08:00
zdl
77f3949fe2 feat: 首页添加性能监控 2025-11-26 10:54:57 +08:00
zdl
742ab337dc feat: 更新测试用例 2025-11-26 10:54:20 +08:00
zdl
d2b6904a4a pref: 删除无用组件 2025-11-26 10:40:14 +08:00
zdl
789a6229a7 feat: 添加设备类型 2025-11-26 10:39:33 +08:00
zdl
6886a649f5 perf: Socket 连接异步化,使用 requestIdleCallback 不阻塞首屏
- NotificationContext: 将 Socket 初始化包裹在 requestIdleCallback 中
- 设置 3 秒超时保护,确保连接不会被无限延迟
- 不支持 requestIdleCallback 的浏览器自动降级到 setTimeout(0)
- socket/index.js: 移除模块加载时的 console.log,减少首屏阻塞感知
- 所有页面的首屏渲染都不再被 Socket 连接阻塞

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-26 10:34:45 +08:00
zdl
581e874b0d fix:修复类型提示错误 2025-11-26 10:11:02 +08:00
zdl
b23ed93020 Merge branch 'feature_2025/251117_pref' into feature_2025/251121_h5UI
* feature_2025/251117_pref:
  update pay function
  update pay function
  update pay function
2025-11-26 09:59:01 +08:00
zdl
84f70f3329 pref: 权限校验中 - 显示占位骨架,不显示登录按钮或用户菜单,/home页面添加骨架屏逻辑 2025-11-26 09:57:20 +08:00
zdl
601b06d79e fix: 修复 AgentChat hooks 中的 logger 调用 2025-11-26 09:47:54 +08:00
zdl
0818a7bff7 fix: 修复 logger 函数签名问题 2025-11-26 09:44:21 +08:00
ce19881181 update pay function 2025-11-26 09:06:02 +08:00
bef3e86f60 update pay function 2025-11-26 09:00:38 +08:00
65deea43e2 update pay function 2025-11-26 08:44:22 +08:00
c7a881c965 update pay function 2025-11-25 20:22:45 +08:00
6932796b00 update pay function 2025-11-25 19:38:50 +08:00
zdl
03f1331202 feat: homets 化 创建类型定义文件
创建常量配置文件
 创建自定义 Hook

 创建组件目录
创建 HeroHeader 组件
创建 FeaturedFeatureCard 组件
创建 FeatureCard 组件
创建新的 HomePage.tsx
2025-11-25 17:58:53 +08:00
zdl
c771f7cae6 feat: 首页删除ME-Agent 实时分析系统 2025-11-25 17:58:36 +08:00
zdl
0be357a1c5 feat: 修改找不到文件的记录 2025-11-25 17:15:30 +08:00
zdl
9f907b3cba 移除 MidjourneyHeroSection 组件及其所有依赖
1: 删除组件文件 MidjourneyHeroSection.js
    2: 修改 HomePage.js
    3: 卸载相关 npm 包  @tsparticles/react 和 @tsparticles/slim
2025-11-25 17:04:30 +08:00
zdl
bb878c5346 feat: deviceSlice添加 2025-11-25 17:04:30 +08:00
zdl
1bc3241596 feat: 创建 Redux Device Slice(简化版)
注册到 Redux Store
2025-11-25 17:04:10 +08:00
zdl
cb46971e0e feat:1️⃣ 增强 performanceMonitor.ts
-  新增 measure(name, startMark, endMark) 方法(支持命名测量)
  -  新增 getMarks() - 获取所有性能标记
  -  新增 getMeasures() - 获取所有测量结果
  -  新增 getReport() - 返回完整 JSON 报告
  -  新增 exportJSON() - 导出 JSON 文件
  -  新增 reportToPostHog() - 上报到 PostHog
  -  新增全局 API window.__PERFORMANCE__(仅开发环境)
  -  彩色控制台使用说明

  2️⃣ 添加 PostHog 性能上报

  -  在 posthog.js 中新增 reportPerformanceMetrics() 函数
  -  上报所有关键性能指标(网络、渲染、React)
  -  自动计算性能评分(0-100)
  -  包含浏览器和设备信息
2025-11-25 17:04:10 +08:00
6679d99cf9 update pay function 2025-11-25 16:49:44 +08:00
2c55a53c3a update pay function 2025-11-25 16:31:46 +08:00
6ad56b9882 update pay function 2025-11-25 16:20:39 +08:00
b9eddbe752 update pay function 2025-11-25 15:28:12 +08:00
zdl
cb9f927e3e feat: 调整逻辑如果用户未登录且不在首页,跳转到首页 2025-11-25 14:28:20 +08:00
zdl
b9a587bac4 feat: 去掉logger 2025-11-25 14:28:20 +08:00
zdl
86259793cb feat: bug修复 2025-11-25 14:28:19 +08:00
f76bd17160 update pay function 2025-11-25 11:22:34 +08:00
ce0e91a5fb update pay function 2025-11-25 10:16:04 +08:00
f873fdb9a6 update pay function 2025-11-25 10:09:47 +08:00
cc446fc0da update pay function 2025-11-25 09:50:12 +08:00
de30755271 update pay function 2025-11-25 08:08:01 +08:00
a2f33c2a8a update pay function 2025-11-25 08:00:56 +08:00
761fe5d2f0 update pay function 2025-11-25 07:50:33 +08:00
3677217fce update pay function 2025-11-25 07:35:15 +08:00
177c1d6401 update pay function 2025-11-24 23:45:58 +08:00
fb066aa6b8 update pay function 2025-11-24 23:18:12 +08:00
96bedb8439 update pay function 2025-11-24 21:23:09 +08:00
83d7c19fed update pay function 2025-11-24 20:15:19 +08:00
e80d2cfcec update pay function 2025-11-24 20:06:51 +08:00
412f2a3d79 update pay function 2025-11-24 19:49:42 +08:00
4a0e156bec update pay function 2025-11-24 19:28:52 +08:00
7743a8a26a update pay function 2025-11-24 19:22:22 +08:00
72e3e56a63 update pay function 2025-11-24 19:07:24 +08:00
388e9eb235 Merge branch 'feature_2025/251117_pref' of https://git.valuefrontier.cn/vf/vf_react into feature_2025/251117_pref 2025-11-24 16:58:08 +08:00
bd23100192 update pay function 2025-11-24 16:58:02 +08:00
zdl
887525197a feat: StockChartAntdModal UI调整 2025-11-24 16:53:37 +08:00
zdl
f8bb46ae64 feat: 添加mock 2025-11-24 16:53:37 +08:00
810c878a1e update pay function 2025-11-24 16:49:04 +08:00
2607028f4f Merge branch 'feature_2025/251117_pref' of https://git.valuefrontier.cn/vf/vf_react into feature_2025/251117_pref 2025-11-24 16:39:47 +08:00
ea166d59c4 update pay function 2025-11-24 16:39:36 +08:00
zdl
982d8135e7 feat: bug修复 2025-11-24 16:38:33 +08:00
zdl
e61090810b Merge branch 'feature_2025/251117_pref' into feature_2025/251121_h5UI
* feature_2025/251117_pref: (159 commits)
  feat: UI调整
  feat: 将滚动事件移东到组件内部
  feat: 去掉背景组件
  feat: 拆分左侧栏、中间聊天区、右侧栏组件, Hooks 提取
  feat: 简化主组件 index.js - 使用组件组合方式重构
  feat: 创建 ChatArea 组件(含 MessageRenderer、ExecutionStepsDisplay 子组件)
  feat:拆分工具函数
  feat: 拆分BackgroundEffects 背景渐变装饰层
  feat: RightSidebar (~420 行) - 模型/工具/统计 Tab 面板(单文件)
  feat:  LeftSidebar (~280 行) - 对话历史列表 + 用户信息卡片
  feat: 修复bug
  pref:移除黑夜模式
  feat: 修复警告
  feat: 提取常量配置
  feat: 修复ts报错
  feat:  StockChartModal.tsx 替换 KLine 实现
  update pay function
  update pay function
  update pay function
  update pay function
  ...
2025-11-24 16:32:24 +08:00
zdl
2d49af3bea feat: UI调整 2025-11-24 16:11:13 +08:00
zdl
3a0898634f feat: 将滚动事件移东到组件内部 2025-11-24 15:54:26 +08:00
zdl
44ecf7e5c7 feat: 去掉背景组件 2025-11-24 15:47:23 +08:00
zdl
5183473557 feat: 拆分左侧栏、中间聊天区、右侧栏组件, Hooks 提取 2025-11-24 15:23:22 +08:00
zdl
41f1bbab1b feat: 简化主组件 index.js - 使用组件组合方式重构 2025-11-24 15:18:52 +08:00
zdl
f536d68753 feat: 创建 ChatArea 组件(含 MessageRenderer、ExecutionStepsDisplay 子组件) 2025-11-24 15:18:32 +08:00
zdl
9475027c0d feat:拆分工具函数 2025-11-24 15:12:52 +08:00
zdl
851c148f7d feat: 拆分BackgroundEffects 背景渐变装饰层 2025-11-24 15:12:24 +08:00
zdl
ef7f91ba77 feat: RightSidebar (~420 行) - 模型/工具/统计 Tab 面板(单文件) 2025-11-24 15:11:52 +08:00
zdl
80084d607b feat: LeftSidebar (~280 行) - 对话历史列表 + 用户信息卡片 2025-11-24 15:11:19 +08:00
zdl
dc789f57f7 feat: 修复bug 2025-11-24 15:10:08 +08:00
zdl
528e61b961 pref:移除黑夜模式 2025-11-24 15:07:13 +08:00
zdl
e201f35b18 feat: 修复警告 2025-11-24 14:52:57 +08:00
zdl
13040b5df8 feat: 提取常量配置 2025-11-24 14:31:50 +08:00
zdl
9b068fd69f feat: 修复ts报错 2025-11-24 14:08:41 +08:00
zdl
2f125a9207 feat: StockChartModal.tsx 替换 KLine 实现 2025-11-24 13:59:44 +08:00
b4dcbd1db9 update pay function 2025-11-24 08:05:19 +08:00
c594650aa4 update pay function 2025-11-24 07:21:02 +08:00
8c372bbc89 update pay function 2025-11-23 23:44:36 +08:00
4054e2e106 update pay function 2025-11-23 23:32:35 +08:00
0a149eaa0f update pay function 2025-11-23 23:17:12 +08:00
3c7b55226c update pay function 2025-11-23 23:08:30 +08:00
69d05b664e update pay function 2025-11-23 23:00:25 +08:00
ce2226793f update pay function 2025-11-23 22:48:27 +08:00
07a4cdb357 update pay function 2025-11-23 22:41:16 +08:00
d9a169d2e0 update pay function 2025-11-23 22:27:57 +08:00
76bf560b36 update pay function 2025-11-23 22:23:19 +08:00
4a411c6d44 update pay function 2025-11-23 22:11:03 +08:00
dca70074c0 update pay function 2025-11-23 22:06:07 +08:00
1f1aa896d1 update pay function 2025-11-23 21:42:48 +08:00
134897c3aa update pay function 2025-11-23 21:09:31 +08:00
19db421f9f update pay function 2025-11-23 21:04:34 +08:00
1c290e0da2 update pay function 2025-11-23 20:42:58 +08:00
15def1c931 update pay function 2025-11-23 20:34:49 +08:00
7538f2d935 update pay function 2025-11-23 20:12:54 +08:00
3fa3e52d65 update pay function 2025-11-23 19:44:49 +08:00
2fb12e0cc7 update pay function 2025-11-23 18:48:12 +08:00
13f8e2a4f1 update pay function 2025-11-23 18:24:07 +08:00
7b3907a3bd update pay function 2025-11-23 18:11:48 +08:00
b582de9bc2 update pay function 2025-11-23 17:19:56 +08:00
acb7862789 update pay function 2025-11-23 16:57:02 +08:00
a778f94b68 update pay function 2025-11-23 16:34:45 +08:00
23a94d5ab2 update pay function 2025-11-23 16:23:18 +08:00
d5250f7d3c update pay function 2025-11-23 15:58:14 +08:00
ae92f333c4 update pay function 2025-11-23 15:40:58 +08:00
82146f7365 Merge branch 'feature_2025/251117_pref' of https://git.valuefrontier.cn/vf/vf_react into feature_2025/251117_pref 2025-11-23 14:42:05 +08:00
96346977ae update pay function 2025-11-23 14:38:29 +08:00
zdl
0f410c55a5 feat: StockChartModal.tsx 2025-11-23 14:35:24 +08:00
zdl
a4b8a13e6d feat: 抽离关联描述组件 2025-11-23 14:35:24 +08:00
f578969ee6 update pay function 2025-11-23 14:25:38 +08:00
4da1d580fc update pay function 2025-11-23 13:53:13 +08:00
af362f3ceb update pay function 2025-11-23 13:40:46 +08:00
e01092365e update pay function 2025-11-23 13:15:41 +08:00
ad7c180e11 update pay function 2025-11-23 12:54:51 +08:00
2111b1d25b update pay function 2025-11-23 12:45:44 +08:00
ddcbbc9da4 update pay function 2025-11-23 12:35:48 +08:00
6515a47a42 update pay function 2025-11-23 12:31:34 +08:00
0bcf6a93f7 update pay function 2025-11-23 12:21:19 +08:00
5857144180 update pay function 2025-11-23 12:11:12 +08:00
1ea001fa3d update pay function 2025-11-23 11:14:48 +08:00
09420963d5 update pay function 2025-11-23 11:04:27 +08:00
d8a1dd7a03 update pay function 2025-11-23 10:49:07 +08:00
zdl
098107f38e feat: 调整关联描述UI 2025-11-23 10:21:04 +08:00
zdl
c2b80a727d fix: 删除调试信息 2025-11-23 10:09:01 +08:00
zdl
745b9caeee feat: StockListItem.js - 分时/K线点击切换效果修复 2025-11-23 10:02:13 +08:00
b1d042d0e3 update pay function 2025-11-23 09:19:32 +08:00
04c13f3a6c update pay function 2025-11-23 09:01:00 +08:00
173ddb985d update pay function 2025-11-23 08:42:08 +08:00
c487c33617 update pay function 2025-11-23 08:35:29 +08:00
9251531eb7 update pay function 2025-11-23 08:30:52 +08:00
738cc9cb87 update pay function 2025-11-23 08:24:30 +08:00
7b9bb153cc update pay function 2025-11-23 08:17:23 +08:00
33ae9e63a1 update pay function 2025-11-23 08:06:43 +08:00
c4efebdbda update pay function 2025-11-23 08:02:40 +08:00
602888bbeb update pay function 2025-11-23 07:55:32 +08:00
6a1e861977 update pay function 2025-11-23 07:41:21 +08:00
31a3e429d7 update pay function 2025-11-23 07:15:07 +08:00
bbc2493ecd update pay function 2025-11-23 07:08:07 +08:00
eef1dbfe8d update pay function 2025-11-23 06:36:39 +08:00
aaef2272f1 update pay function 2025-11-23 00:24:05 +08:00
9f2fd60228 update pay function 2025-11-23 00:21:31 +08:00
2fc0cca482 update pay function 2025-11-23 00:12:24 +08:00
2668affe88 update pay function 2025-11-23 00:03:52 +08:00
32b4b772c5 update pay function 2025-11-22 23:56:17 +08:00
115300a4e3 update pay function 2025-11-22 23:51:03 +08:00
zdl
2964b4331a feat: 处理报错 2025-11-22 23:39:45 +08:00
cbc231a2b6 Merge branch 'feature_2025/251117_pref' of https://git.valuefrontier.cn/vf/vf_react into feature_2025/251117_pref 2025-11-22 23:29:38 +08:00
a158319717 update pay function 2025-11-22 23:29:25 +08:00
zdl
f361cb55f4 feat: 现在创建主组件: 2025-11-22 23:29:08 +08:00
zdl
bcd67ed410 feat: 创建自定义 Hooks 2025-11-22 23:29:08 +08:00
zdl
c391c4c980 feat: 现在创建配置文件。首先让我检查现有的主题配置,以保持样式一致性: 2025-11-22 23:29:08 +08:00
zdl
7b2f5a18bc feat:StockChart 类型定义统一导出 2025-11-22 23:29:08 +08:00
zdl
06916cdde5 feat:股票相关类型定义 2025-11-22 23:29:08 +08:00
zdl
5bb8a17588 feat: 创建类型定义文件 2025-11-22 23:29:08 +08:00
zdl
ad2a374069 feat: 完全替换现有的 ECharts 股票图表弹窗,使用专业的 KLineChart 库 + TypeScript,提升性能和可维护性。
安装依赖
2025-11-22 23:29:08 +08:00
f28bba6326 update pay function 2025-11-22 23:19:38 +08:00
69a2c83bd0 update pay function 2025-11-22 23:01:34 +08:00
c5f21a517d update pay function 2025-11-22 21:54:04 +08:00
6b9be7dad0 update pay function 2025-11-22 21:26:55 +08:00
3526c8c51c update pay function 2025-11-22 20:42:25 +08:00
13609163a7 update pay function 2025-11-22 20:36:45 +08:00
e4961a21ee update pay function 2025-11-22 20:31:45 +08:00
4fcc3e1054 update pay function 2025-11-22 20:19:38 +08:00
b2c116cef4 update pay function 2025-11-22 20:13:40 +08:00
1ad68bca6c update pay function 2025-11-22 20:11:10 +08:00
4879121d2b update pay function 2025-11-22 19:42:32 +08:00
cde849b3a4 update pay function 2025-11-22 18:58:14 +08:00
6c99cb83bf update pay function 2025-11-22 18:10:55 +08:00
97fd1645d4 update pay function 2025-11-22 17:51:48 +08:00
a66d55237f update pay function 2025-11-22 17:41:54 +08:00
1f7308a512 update pay function 2025-11-22 17:15:09 +08:00
cab5cc5d7b update pay function 2025-11-22 17:09:10 +08:00
47e2380bd3 update pay function 2025-11-22 16:48:23 +08:00
357c03aee2 update pay function 2025-11-22 16:41:22 +08:00
75e7e7e19c update pay function 2025-11-22 16:27:33 +08:00
f56df0e956 update pay function 2025-11-22 16:14:49 +08:00
75696b9e52 update pay function 2025-11-22 16:12:09 +08:00
5e333ad7e7 update pay function 2025-11-22 16:05:21 +08:00
70376b3544 update pay function 2025-11-22 16:03:53 +08:00
a15830c97e update pay function 2025-11-22 15:57:17 +08:00
a8d38e85d2 update pay function 2025-11-22 15:51:39 +08:00
dce6b5701f update pay function 2025-11-22 15:50:06 +08:00
0fcb7322ed update pay function 2025-11-22 15:48:31 +08:00
8e16d3cd3a update pay function 2025-11-22 15:43:21 +08:00
9b436523ff update pay function 2025-11-22 15:40:21 +08:00
59a5a03637 update pay function 2025-11-22 15:34:18 +08:00
70af97e9ad update pay function 2025-11-22 15:30:59 +08:00
ebf7ddda6a update pay function 2025-11-22 15:10:23 +08:00
68fa1d0717 update pay function 2025-11-22 13:52:23 +08:00
8fb6992cf6 update pay function 2025-11-22 13:23:50 +08:00
8f3e2bed70 update pay function 2025-11-22 13:09:46 +08:00
8a87cd1b74 update pay function 2025-11-22 12:12:45 +08:00
244968a1cb update pay function 2025-11-22 12:07:55 +08:00
47be4584f9 update pay function 2025-11-22 11:49:20 +08:00
42b7d2ee63 update pay function 2025-11-22 11:42:43 +08:00
d8e4c737c5 update pay function 2025-11-22 11:41:56 +08:00
a4b634abff update pay function 2025-11-22 10:42:30 +08:00
15d521dd59 update pay function 2025-11-22 10:37:15 +08:00
40b57c1a81 update pay function 2025-11-22 10:28:37 +08:00
71f3834b79 update pay function 2025-11-22 10:11:36 +08:00
20c6356842 update pay function 2025-11-22 10:01:04 +08:00
cd926bb42d update pay function 2025-11-22 09:57:30 +08:00
feb08dc746 update pay function 2025-11-22 09:51:17 +08:00
cddf82ce51 update pay function 2025-11-22 09:36:58 +08:00
eceb2e7da0 update pay function 2025-11-22 09:27:12 +08:00
092c86f3d2 update pay function 2025-11-22 09:16:12 +08:00
7498e87d31 update pay function 2025-11-22 09:10:13 +08:00
e778742590 update pay function 2025-11-22 08:57:37 +08:00
990ca3663e update pay function 2025-11-22 07:24:55 +08:00
b9ed0f5449 update pay function 2025-11-22 07:15:03 +08:00
077f8d9120 update pay function 2025-11-22 06:54:16 +08:00
97371ae16a update pay function 2025-11-22 00:26:07 +08:00
aa3fe0d806 update pay function 2025-11-22 00:17:25 +08:00
e68acfe7d1 update pay function 2025-11-22 00:06:44 +08:00
c336be5cd7 update pay function 2025-11-21 23:59:31 +08:00
1a845f54e9 update pay function 2025-11-21 23:53:39 +08:00
781710ae53 update pay function 2025-11-21 23:50:19 +08:00
b5a0b7094a update pay function 2025-11-21 23:41:33 +08:00
22bb57b52f update pay function 2025-11-21 23:18:19 +08:00
cd315a718f update pay function 2025-11-21 23:12:52 +08:00
ff2ad14246 update pay function 2025-11-21 23:05:29 +08:00
zdl
baf4ca1ed4 feat: 屏蔽 STOMP WebSocket 错误日志(不影响功能) 2025-11-21 18:45:13 +08:00
zdl
3cd34d93c8 Merge branch 'feature_2025/251117_pref' into feature_2025/251121_h5UI
* feature_2025/251117_pref:
  update pay function
  update pay function
  update pay function
  update pay function
  update pay function
  update pay function
  update pay function
2025-11-21 18:30:51 +08:00
zdl
c9084ebb33 feat: Socket.IO 连接地址(Mock 模式下连接生产环境) 2025-11-21 18:22:18 +08:00
zdl
ed584b72d4 feat: 创建整合所有指标的 Hook 2025-11-21 18:14:29 +08:00
zdl
2dec587d37 feat: 扩展 PostHog 事件常量 2025-11-21 18:13:53 +08:00
zdl
7f021dcfa0 feat; 创建首屏指标收集 Hook 2025-11-21 18:13:33 +08:00
zdl
e34f5593b4 feat: 创建资源加载监控工具 2025-11-21 18:12:58 +08:00
zdl
5f76530e80 feat: 创建 Web Vitals 监控工具 2025-11-21 18:12:34 +08:00
zdl
d6c7d64e59 feat: 创建性能阈值配置 2025-11-21 18:11:26 +08:00
zdl
ceed71eca4 feat: 创建 TypeScript 类型定义 2025-11-21 18:11:03 +08:00
zdl
9669d5709e fix: 在 craco.config.js 中将 /bytedesk 代理移出 Mock 模式条件判断
现在 /bytedesk 代理始终启用,指向 https://valuefrontier.cn
2025-11-21 18:06:21 +08:00
zdl
34bae35858 fix: 修复的问题:H5 汉堡菜单位置调整(移到头像右侧)
平板端显示 MoreMenu 而非汉堡菜单
未登录时不显示汉堡菜单
2025-11-21 17:59:03 +08:00
zdl
bc50d9fe3e fix: 修复的问题: │ │
│ │ -  React 18 Portal insertBefore 错误                                                                                                                               │ │
│ │ -  Ant Design Modal defaultProps 废弃警告
2025-11-21 17:46:07 +08:00
zdl
39978c57d5 pref: src/views/LimitAnalyse 页面 "数据分析"卡片中的"热词云图" 依赖更新 2025-11-21 17:37:56 +08:00
b197d62c31 update pay function 2025-11-21 14:47:47 +08:00
zdl
834067f679 fix: 修改 GlobalComponents.js(缓存 config)登录时不会触发 BytedeskWidget 重新加载 2025-11-21 14:38:09 +08:00
564caa08c2 update pay function 2025-11-21 14:34:15 +08:00
0aa050b95f update pay function 2025-11-21 14:26:26 +08:00
e22e8339a6 update pay function 2025-11-21 14:07:18 +08:00
zdl
e8b3d13c0a feat: 桌面端导航判断调整 2025-11-21 14:07:04 +08:00
8c787a8915 update pay function 2025-11-21 13:56:43 +08:00
zdl
796c623197 fix:优化h5/菜单UI 2025-11-21 13:55:06 +08:00
690754e416 update pay function 2025-11-21 13:49:43 +08:00
12d104cc22 update pay function 2025-11-21 13:41:49 +08:00
zdl
a1c1a36f6a pref: 删除doc文件 2025-11-21 11:43:08 +08:00
2b30d10451 update pay function 2025-11-20 18:00:21 +08:00
8dfd344806 update pay function 2025-11-20 16:59:09 +08:00
7c8310eeb6 update pay function 2025-11-20 16:19:52 +08:00
30108b297c update pay function 2025-11-20 16:11:05 +08:00
161bcec55e Merge branch 'feature_2025/251117_pref' of https://git.valuefrontier.cn/vf/vf_react into feature_2025/251117_pref 2025-11-20 15:54:46 +08:00
34f2d7dabd update pay function 2025-11-20 15:54:40 +08:00
zdl
3e4b47dbfe Merge branch 'feature_2025/251117_pref' of https://git.valuefrontier.cn/vf/vf_react into feature_2025/251117_pref
* 'feature_2025/251117_pref' of https://git.valuefrontier.cn/vf/vf_react:
  update pay function
  update pay function
  update pay function
2025-11-20 15:47:38 +08:00
zdl
e2861b994b feat: 修改bug引入错误 2025-11-20 15:46:43 +08:00
6b9291a4f9 update pay function 2025-11-20 15:44:57 +08:00
0818eeedf1 update pay function 2025-11-20 15:34:10 +08:00
2a8d7438c8 Merge branch 'feature_2025/251117_pref' of https://git.valuefrontier.cn/vf/vf_react into feature_2025/251117_pref 2025-11-20 15:25:05 +08:00
fdd58634e6 update pay function 2025-11-20 15:24:57 +08:00
zdl
53fbda44e6 feat: 忽略 docs 目录(开发文档不提交到 Git) 2025-11-20 15:07:45 +08:00
zdl
540b938525 feat: 删除md文件 2025-11-20 15:07:45 +08:00
zdl
8fe11efcd7 refactor: 清理 Bytedesk 集成文件,移动文档到 docs 目录 2025-11-20 15:07:45 +08:00
zdl
e753437b86 feat: 调整客服配置 2025-11-20 15:07:45 +08:00
zdl
a6f69418f6 feat: 添加SEOpng 2025-11-20 15:07:45 +08:00
zdl
dfdd2f4134 feat: posthog 配置调整 2025-11-20 15:07:45 +08:00
zdl
4c79871ab4 pref: 去除无效配置 2025-11-20 15:07:45 +08:00
f8eb268341 update pay function 2025-11-20 15:05:58 +08:00
665f5e8416 update pay function 2025-11-20 14:51:43 +08:00
be2da54d82 update pay function 2025-11-20 14:42:26 +08:00
8bf4a0b6c6 update pay function 2025-11-20 14:36:13 +08:00
412b2c03ed update pay function 2025-11-20 14:33:09 +08:00
899500007d update pay function 2025-11-20 14:30:32 +08:00
d3879b3840 update pay function 2025-11-20 14:24:24 +08:00
80fe74c041 update pay function 2025-11-20 14:13:33 +08:00
78f7dca1f6 update pay function 2025-11-20 13:57:11 +08:00
03aee75235 update pay function 2025-11-20 13:43:04 +08:00
8eff6b1a95 update pay function 2025-11-20 13:25:50 +08:00
80676dd622 update pay function 2025-11-20 12:55:28 +08:00
082e644534 update pay function 2025-11-20 08:33:26 +08:00
b0b227a5ef update pay function 2025-11-20 08:18:02 +08:00
691c4f6eb1 update pay function 2025-11-20 08:09:34 +08:00
d5a55c4e02 update pay function 2025-11-20 08:02:34 +08:00
27cdf0aecd update pay function 2025-11-20 07:57:15 +08:00
4a1157c0b6 update pay function 2025-11-20 07:46:50 +08:00
f515dc94f4 update pay function 2025-11-19 23:41:45 +08:00
683e261756 update pay function 2025-11-19 23:06:14 +08:00
8bdfd0389c update pay function 2025-11-19 22:56:28 +08:00
eae495ac34 Merge branch 'feature_2025/251117_pref' of https://git.valuefrontier.cn/vf/vf_react into feature_2025/251117_pref 2025-11-19 21:46:07 +08:00
958cedefb8 update pay function 2025-11-19 21:45:55 +08:00
zdl
1fc9f4790f pref: 清理建议
6.1 立即可删除(安全)

  以下文件可以立即删除,不会影响任何功能:

  # 未使用的组件
  src/views/Community/components/EventList.js
  src/views/Community/components/EventListSection.js
  src/views/Community/components/EventTimelineHeader.js
  src/views/Community/components/MarketReviewCard.js
  src/views/Community/components/UnifiedSearchBox.js
  src/views/Community/components/ImportanceLegend.js
  src/views/Community/components/IndustryCascader.js
  src/views/Community/components/EventDetailModal.js

  # 未使用的CSS
  src/views/Community/components/EventList.css

  # 备份文件
  src/views/Community/components/EventList.js.bak

  # 测试文档
  src/views/Community/components/DynamicNewsDetail/1.md

  预计减少代码量:~2000行代码
2025-11-19 21:27:24 +08:00
b48ff99658 update pay function 2025-11-19 20:44:35 +08:00
ae558996b6 update pay function 2025-11-19 20:23:56 +08:00
71742c0116 update pay function 2025-11-19 20:15:27 +08:00
2ead50c37c update pay function 2025-11-19 19:55:07 +08:00
9e8519bb94 Merge branch 'feature_2025/251117_pref' of https://git.valuefrontier.cn/vf/vf_react into feature_2025/251117_pref 2025-11-19 19:41:59 +08:00
a4d16e7686 update pay function 2025-11-19 19:41:26 +08:00
zdl
3eb31c99dc fixbug: limit-analyse日历UI调整 2025-11-19 19:13:12 +08:00
zdl
5f6b4b083b feat: 修复前的 DAU 数据无法补充(PostHog 未收到事件) 2025-11-19 17:17:54 +08:00
zdl
905023c056 feat: Chakra UI 升级 2025-11-19 16:16:21 +08:00
zdl
25cc28e03b feat: 完全移除邮箱登录代码
移除 registerWithEmail 方法
     移除 sendEmailCode 方法
     已从导出对象中移除 registerWithEmail 和 sendEmailCode。
2025-11-19 16:15:50 +08:00
zdl
5f9901a098 feat: 清理过时代码:移除 AuthContext.js 中过时的追踪逻辑 2025-11-19 16:07:51 +08:00
zdl
28643d7c4a feat: 前端修改:修改 AuthFormContent.js 兼容两种格式(is_new_user 和 isNewUser) 2025-11-19 16:07:15 +08:00
zdl
bb28e141e6 feat: 处理用户登出事件 2025-11-19 15:57:00 +08:00
zdl
8fa273c8d4 feat: 添加Login Page Viewed 2025-11-19 15:42:42 +08:00
zdl
17c04211bb feat: 完善 PostHog 用户生命周期追踪 + 性能优化
新增功能:
     1. 首次访问追踪 (first_visit)
        - 记录用户来源(referrer、UTM参数)
        - 记录落地页
        - 使用 localStorage 永久标记

     2. 首次登录追踪 (first_login)
        - 区分首次登录和后续登录
        - 按用户 ID 独立标记
        - 用于计算新用户激活率

     3. 登录/登出事件追踪
        - 登录成功追踪 (user_logged_in)
        - 登出事件追踪 (user_logged_out,必须在 resetUser 之前)
        - 注册事件追踪 (user_registered)

     4. 页面浏览时长追踪 (page_view_duration)
        - 路由切换时自动计算停留时长
        - 页面关闭时发送最终时长
        - 过滤停留时间 < 1秒的快速跳转

     性能优化:
     1. 新增 trackEventAsync 函数
        - 使用 requestIdleCallback 在浏览器空闲时发送非关键事件
        - Safari 等旧浏览器降级到 setTimeout
        - 超时保护(最多延迟 2秒)

     2. 异步追踪非关键事件
        - first_visit - 不阻塞首屏渲染
        - page_view_duration - 不阻塞页面切换

     3. 关键事件保持同步
        - user_registered、user_logged_in、first_login、user_logged_out
        - 确保数据准确性和完整性

     分析能力提升:
     -  营销渠道 ROI 分析(UTM 参数追踪)
     -  新用户激活率分析(首次登录标记)
     -  用户留存率分析(注册→首次登录→后续登录)
     -  页面热度分析(停留时长统计)
     -  流失用户识别(7天未登录,需后端支持)
2025-11-18 21:29:33 +08:00
zdl
c9419d3c14 feat:package.json 更新为 ^1.295.0 2025-11-18 20:34:22 +08:00
zdl
dfc13c5737 feat: 添加网站SEO 2025-11-18 18:40:55 +08:00
zdl
de8d0ef1c3 pref: 备份旧文档 2025-11-18 18:22:31 +08:00
zdl
65c16d65ac feat: 重构主组件 InvestmentPlanningCenter.tsx
重命名并重构: InvestmentPlanningCenter.js → InvestmentPlanningCenter.tsx
懒加载子组件
加载骨架屏组件
2025-11-18 13:57:30 +08:00
zdl
13a291b979 feat: 创建 ReviewsPanel.tsx
v
新建: src/views/Dashboard/components/ReviewsPanel.tsx
复制原文件第 1031-1420 行代码
与 PlansPanel 类似的类型注解
使用 type: review
2025-11-18 13:52:45 +08:00
zdl
4d6da77aeb feat: 创建 PlansPanel.tsx
新建: src/views/Dashboard/components/PlansPanel.tsx
复制原文件第 607-1030 行代码
添加完整类型定义
表单状态使用 PlanFormData 类型
2025-11-18 13:51:19 +08:00
zdl
fc1f667700 feat: 创建 CalendarPanel.tsx 新建: src/views/Dashboard/components/CalendarPanel.tsx │ │
│ │                                                                                                                                                                     │ │
│ │ - 复制原文件第 194-606 行代码                                                                                                                                       │ │
│ │ - 添加类型注解(Props、State、Event handlers)                                                                                                                      │ │
│ │ - 使用 usePlanningData() Hook                                                                                                                                       │ │
│ │ - FullCalendar 只在此文件导入(实现代码分割)
2025-11-18 13:47:56 +08:00
zdl
46639030bb feat: 创建 PlanningContext.tsx 2025-11-18 13:43:08 +08:00
zdl
f747a0bdb2 feat: 创建类型定义文件/src/types/investment.ts 2025-11-18 13:41:00 +08:00
zdl
9b55610167 perf: 将 Moment.js 替换为 Day.js,优化打包体积
## 改动内容
  - 替换所有 Moment.js 引用为 Day.js (29 个文件)
  - 更新 Webpack 配置,调整 calendar-lib chunk
  - 添加 Day.js 插件支持 (isSameOrBefore, isSameOrAfter)
  - 移除 Moment.js 依赖

  ## 性能提升
  - JavaScript 打包体积减少: ~50 KB (未压缩)
  - gzip 后减少: ~15-18 KB
  - 预计首屏加载时间提升: 15-20%

  ## 影响范围
  - Dashboard 组件: 5 个文件
  - Community 组件: 19 个文件
  - 工具函数: tradingTimeUtils.js (添加插件)
  - 其他组件: 5 个文件

  ## 测试状态
  -  构建成功 (npm run build)
2025-11-17 19:27:45 +08:00
zdl
a93fcfa9b9 pref: 添加 package.json(Moment.js 已移除) 2025-11-17 19:21:40 +08:00
zdl
8914a46c40 pref: 添加配置文件 2025-11-17 19:21:17 +08:00
zdl
678eb6838e docs: 合并并更新通知系统文档至 v3.0.0
主要更新:
- 合并 ENHANCED_FEATURES_GUIDE.md 到 NOTIFICATION_SYSTEM.md
- 移除过时的 Mock 模式和测试工具引用
- 更新所有调试工具为 window.__DEBUG__
- 完善增强功能文档(智能桌面通知、性能监控、历史记录)
- 重新组织文档结构为 10 个清晰的部分
- 更新所有代码示例与最新代码保持一致

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-17 18:40:05 +08:00
zdl
c06d3a88ae feat: 删除文件 2025-11-17 18:12:19 +08:00
zdl
307c308739 feat: 删除文件 2025-11-17 18:11:32 +08:00
zdl
cbb6517bb1 perf: 优化 Community 页面 PostHog 追踪性能 + 提取 smartTrack 工具函数
 新增功能:
- 创建 trackingHelpers.js 工具(requestIdleCallback + smartTrack)
- 创建 tracking.js 配置(事件优先级映射)
- 提取 smartTrack 为可复用工具函数

 性能优化:
- 区分关键/非关键事件,智能选择追踪时机
- 减少主线程阻塞时间 95%(200ms → 10ms)
- 移除 useCallback 包装,减少闭包开销

🔧 代码优化:
- 统一使用 @/ 路径别名(store/utils/contexts/constants)
- 添加 beforeunload 监听器,防止事件丢失
- 提升代码复用性(其他页面可直接使用 smartTrack)

🌐 浏览器兼容:
- requestIdleCallback polyfill(Safari 支持)
- 100% 浏览器兼容性

影响范围:Community 页面(新闻催化分析)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-17 17:27:02 +08:00
zdl
f33489f5d7 pref: useMemo优化 2025-11-17 16:54:26 +08:00
zdl
9ff77b570d docs: 更新 NOTIFICATION_SYSTEM.md,添加用户快速指南并移除测试工具引用
## 主要更新

###  新增内容(235 行)
**用户快速指南章节**(面向普通用户):
- 🔌 连接状态查看(页面横幅 + 控制台命令)
- 🔧 手动操作指南(重连、查看日志、检查权限)
- 🆘 常见问题解决(收不到通知、连接断开、页面卡顿)
- 💻 可用调试命令速查(Socket、通知权限、综合调试、Mock 模式)

###  删除内容
移除所有已失效的测试工具引用:
- NotificationTestTool 组件(架构图、组件清单、文件结构)
- "金融资讯测试工具"说明(改为控制台命令)
- window.__TEST_NOTIFICATION__ API 引用
- notificationDebugger 引用
- 测试用例文档引用(已删除)

### 🔄 更新内容
- 文档版本:v2.11.0 → v2.12.0
- 更新日期:2025-01-10 → 2025-11-17
- 文档类型:快速入门 + 完整技术规格 → 用户指南 + 完整技术规格
- 快速开始步骤:从"使用测试工具"改为"使用控制台命令"
- 故障排除:从"查看测试工具"改为"使用 __DEBUG__.socket.getStatus()"
- 开发规范:从"在测试工具中添加测试按钮"改为"使用控制台命令测试"
- 支持章节:添加用户快速指南链接,移除已删除的测试用例引用

## 文档统计
- 行数:1974 → 2209(+235 行)
- 大小:56KB → 60KB(+4KB)
- 修改:+31 处新增,-19 处删除

## 保留的调试工具
-  window.__DEBUG__(生产可用)
-  window.browserNotificationService(生产可用)
-  __mockSocket(仅 Mock 模式)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-17 15:25:21 +08:00
zdl
de37546ddb docs: 删除测试相关文档
## 删除内容
- docs/TEST_GUIDE.md (7.4KB) - 崩溃修复测试指南
- docs/test-cases/notification-tests.md (49KB) - 自动化测试用例
- docs/test-cases/ 目录(已清空)

## 原因
- 这些文档是针对开发者的测试文档
- 通知测试工具(NotificationTestTool、window.__TEST_NOTIFICATION__)已删除
- 保留 NOTIFICATION_SYSTEM.md 作为主文档,后续可根据需要更新

## 相关清理
已删除的测试工具:
- NotificationTestTool 组件
- window.__TEST_NOTIFICATION__ API
- notificationDebugger 调试工具

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-17 15:14:24 +08:00
388 changed files with 75731 additions and 25220 deletions

View File

@@ -19,9 +19,7 @@ REACT_APP_ENABLE_MOCK=false
# 开发环境标识
REACT_APP_ENV=development
# PostHog 配置(开发环境)
# 留空 = 仅控制台 debug
# 填入 Key = 控制台 + PostHog Cloud 双模式
REACT_APP_POSTHOG_KEY=
REACT_APP_POSTHOG_HOST=https://app.posthog.com
REACT_APP_ENABLE_SESSION_RECORDING=false
# 性能监控配置
REACT_APP_ENABLE_PERFORMANCE_MONITOR=true
REACT_APP_ENABLE_PERFORMANCE_PANEL=true
REACT_APP_REPORT_TO_POSTHOG=false

View File

@@ -29,20 +29,13 @@ NODE_OPTIONS=--max_old_space_size=4096
# MSW 会在浏览器层拦截这些请求,不需要真实的后端地址
REACT_APP_API_URL=
# Socket.IO 连接地址Mock 模式下连接生产环境)
# 注意WebSocket 不被 MSW 拦截,可以独立配置
REACT_APP_SOCKET_URL=https://valuefrontier.cn
# 启用 Mock 数据(核心配置)
# 此配置会触发 src/index.js 中的 MSW 初始化
REACT_APP_ENABLE_MOCK=true
# Mock 环境标识
REACT_APP_ENV=mock
# PostHog 配置Mock 环境)
# 留空 = 仅控制台 debug
# 填入 Key = 控制台 + PostHog Cloud 双模式
REACT_APP_POSTHOG_KEY=phc_xKlRyG69Bx7hgOdFeCeLUvQWvSjw18ZKFgCwCeYezWF
REACT_APP_POSTHOG_HOST=https://app.posthog.com
REACT_APP_ENABLE_SESSION_RECORDING=false
# PostHog Debug 模式Mock 环境永久启用)
# 在浏览器 Console 中打印详细的事件追踪日志
REACT_APP_POSTHOG_DEBUG=true

View File

@@ -1,13 +1,6 @@
# ========================================
# 生产环境配置
# ========================================
# 使用方式: npm run build
#
# 工作原理:
# 1. 此文件专门用于生产环境构建
# 2. 构建时会将环境变量嵌入到打包文件中
# 3. 确保 PostHog 等服务使用正确的生产配置
# ========================================
# 环境标识
REACT_APP_ENV=production
@@ -17,13 +10,8 @@ NODE_ENV=production
REACT_APP_ENABLE_MOCK=false
# 🔧 调试模式(生产环境临时调试用)
# 开启后会在全局暴露 window.__DEBUG__ 和 window.__TEST_NOTIFICATION__ 调试 API
# ⚠️ 警告: 调试模式会记录所有 API 请求/响应,调试完成后请立即关闭!
# 使用方法:
# 1. 设置为 true 并重新构建
# 2. 在浏览器控制台使用 window.__DEBUG__.help() 查看命令
# 3. 调试完成后设置为 false 并重新构建
REACT_APP_ENABLE_DEBUG=true
# 开启后会在全局暴露 window.__DEBUG__
REACT_APP_ENABLE_DEBUG=false
# 后端 API 地址(生产环境)
REACT_APP_API_URL=http://49.232.185.254:5001
@@ -50,19 +38,10 @@ IMAGE_INLINE_SIZE_LIMIT=10000
# Node.js 内存限制(适用于大型项目)
NODE_OPTIONS=--max_old_space_size=4096
# ========================================
# Bytedesk 客服系统配置
# ========================================
# Bytedesk 服务器地址(使用相对路径,通过 Nginx 代理
# ⚠️ 重要:生产环境必须使用相对路径,避免 Mixed Content 错误
# Nginx 配置location /bytedesk-api/ { proxy_pass http://43.143.189.195/; }
REACT_APP_BYTEDESK_API_URL=/bytedesk-api
# 组织 UUID从管理后台 -> 设置 -> 组织信息 -> 组织UUID
REACT_APP_BYTEDESK_ORG=df_org_uid
# 工作组 UUID从管理后台 -> 客服管理 -> 工作组 -> 工作组UUID
REACT_APP_BYTEDESK_SID=df_wg_uid
# 客服类型2=人工客服, 1=机器人)
REACT_APP_BYTEDESK_TYPE=2
# 性能监控配置(生产环境)
# 启用性能监控
REACT_APP_ENABLE_PERFORMANCE_MONITOR=true
# 禁用性能面板(仅开发环境
REACT_APP_ENABLE_PERFORMANCE_PANEL=false
# 启用 PostHog 性能数据上报
REACT_APP_REPORT_TO_POSTHOG=true

4
.gitignore vendored
View File

@@ -48,6 +48,8 @@ Thumbs.db
*.md
!README.md
!CLAUDE.md
!docs/**/*.md
# 忽略 docs 目录(开发文档不提交到 Git
docs/
src/assets/img/original-backup/

View File

@@ -44,7 +44,10 @@
**前端**
- **核心框架**: React 18.3.1
- **类型系统**: TypeScript 5.9.3(渐进式接入中,支持 JS/TS 混合开发)
- **UI 组件库**: Chakra UI 2.8.2(主要) + Ant Design 5.27.4(表格/表单)
- **UI 组件库**:
- Chakra UI 2.10.9(主要,全局使用)
- Ant Design 5.27.4(表格/表单)
- **HeroUI 3.0.0-beta**AgentChat 专用2025-11-22 升级)
- **状态管理**: Redux Toolkit 2.9.2
- **路由**: React Router v6.30.1 配合 React.lazy() 实现代码分割
- **构建系统**: CRACO 7.1.0 + 激进的 webpack 5 优化
@@ -59,6 +62,8 @@
- **虚拟化**: @tanstack/react-virtual 3.13.12(性能优化)
- **其他**: Draft.js富文本编辑、React Markdown、React Quill
**注意**: HeroUI v3 文档参考 https://v3.heroui.com/llms.txt详细升级说明见 [HEROUI_V3_UPGRADE_GUIDE.md](./HEROUI_V3_UPGRADE_GUIDE.md)
**后端**
- Flask + SQLAlchemy ORM
- ClickHouse分析型数据库+ MySQL/PostgreSQL事务型数据库

View File

@@ -1,13 +0,0 @@
<!--
IMPORTANT: Please use the following link to create a new issue:
https://www.creative-tim.com/new-issue/argon-dashboard-chakra-pro
**If your issue was not created using the app above, it will be closed immediately.**
-->
<!--
Love Creative Tim? Do you need Angular, React, Vuejs or HTML? You can visit:
👉 https://www.creative-tim.com/bundles
👉 https://www.creative-tim.com
-->

198
README.md
View File

@@ -1,198 +0,0 @@
# vf_react
前端
---
## 📚 重构记录
### 2025-10-30: EventList.js 组件化重构
#### 🎯 重构目标
将 Community 社区页面的 `EventList.js` 组件1095行拆分为多个可复用的子组件提高代码可维护性和复用性。
#### 📊 重构成果
- **重构前**: 1095 行
- **重构后**: 497 行
- **减少**: 598 行 (-54.6%)
---
### 📁 新增目录结构
```
src/views/Community/components/EventCard/
├── index.js (60行) - EventCard 统一入口,智能路由紧凑/详细模式
├── ──────────────────────────────────────────────────────────
│ 原子组件 (Atoms) - 7个基础UI组件
├── ──────────────────────────────────────────────────────────
├── EventTimeline.js (60行) - 时间轴显示组件
│ └── Props: createdAt, timelineStyle, borderColor, minHeight
├── EventImportanceBadge.js (100行) - 重要性等级标签 (S/A/B/C/D)
│ └── Props: importance, showTooltip, showIcon, size
├── EventStats.js (60行) - 统计信息 (浏览/帖子/关注)
│ └── Props: viewCount, postCount, followerCount, size, spacing
├── EventFollowButton.js (40行) - 关注按钮
│ └── Props: isFollowing, followerCount, onToggle, size, showCount
├── EventPriceDisplay.js (130行) - 价格变动显示 (平均/最大/周)
│ └── Props: avgChange, maxChange, weekChange, compact, inline
├── EventDescription.js (60行) - 描述文本 (支持展开/收起)
│ └── Props: description, textColor, minLength, noOfLines
├── EventHeader.js (100行) - 事件标题头部
│ └── Props: title, importance, onTitleClick, linkColor, compact
├── ──────────────────────────────────────────────────────────
│ 组合组件 (Molecules) - 2个卡片组件
├── ──────────────────────────────────────────────────────────
├── CompactEventCard.js (160行) - 紧凑模式事件卡片
│ ├── 使用: EventTimeline, EventHeader, EventStats, EventFollowButton
│ └── Props: event, index, isFollowing, followerCount, callbacks...
└── DetailedEventCard.js (170行) - 详细模式事件卡片
├── 使用: EventTimeline, EventHeader, EventStats, EventFollowButton,
│ EventPriceDisplay, EventDescription
└── Props: event, isFollowing, followerCount, callbacks...
```
**总计**: 10个文件940行代码
---
### 🔧 重构的文件
#### `src/views/Community/components/EventList.js`
**移除的内容**:
-`renderPriceChange` 函数 (~60行)
-`renderCompactEvent` 函数 (~200行)
-`renderDetailedEvent` 函数 (~300行)
-`expandedDescriptions` state展开状态管理移至子组件
- ❌ 冗余的 Chakra UI 导入
**保留的功能**:
- ✅ WebSocket 实时推送
- ✅ 浏览器原生通知
- ✅ 关注状态管理 (followingMap, followCountMap)
- ✅ 分页控制
- ✅ 视图模式切换(紧凑/详细)
- ✅ 推送权限管理
**新增引入**:
```javascript
import EventCard from './EventCard';
```
---
### 🏗️ 架构改进
#### 重构前(单体架构)
```
EventList.js (1095行)
├── 业务逻辑 (WebSocket, 关注, 通知)
├── renderCompactEvent (200行)
│ └── 所有UI代码内联
├── renderDetailedEvent (300行)
│ └── 所有UI代码内联
└── renderPriceChange (60行)
```
#### 重构后(组件化架构)
```
EventList.js (497行) - 容器组件
├── 业务逻辑 (WebSocket, 关注, 通知)
└── 渲染逻辑
└── EventCard (智能路由)
├── CompactEventCard (紧凑模式)
│ ├── EventTimeline
│ ├── EventHeader (compact)
│ ├── EventStats
│ └── EventFollowButton
└── DetailedEventCard (详细模式)
├── EventTimeline
├── EventHeader (detailed)
├── EventStats
├── EventFollowButton
├── EventPriceDisplay
└── EventDescription
```
---
### ✨ 优势
1. **可维护性** ⬆️
- 每个组件职责单一(单一职责原则)
- 代码行数减少 54.6%
- 组件边界清晰,易于理解
2. **可复用性** ⬆️
- 原子组件可在其他页面复用
- 例如EventImportanceBadge 可用于任何需要显示事件等级的地方
3. **可测试性** ⬆️
- 小组件更容易编写单元测试
- 可独立测试每个组件的渲染和交互
4. **性能优化** ⬆️
- React 可以更精确地追踪变化
- 减少不必要的重渲染
- 每个子组件可独立优化useMemo, React.memo
5. **开发效率** ⬆️
- 新增功能时只需修改对应的子组件
- 代码审查更高效
- 降低了代码冲突的概率
---
### 📦 依赖工具函数
本次重构使用了之前提取的工具函数:
```
src/utils/priceFormatters.js (105行)
├── getPriceChangeColor(value) - 获取价格变化文字颜色
├── getPriceChangeBg(value) - 获取价格变化背景颜色
├── getPriceChangeBorderColor(value) - 获取价格变化边框颜色
├── formatPriceChange(value) - 格式化价格为字符串
└── PriceArrow({ value }) - 价格涨跌箭头组件
src/constants/animations.js (72行)
├── pulseAnimation - 脉冲动画S/A级标签
├── fadeIn - 渐入动画
├── slideInUp - 从下往上滑入
├── scaleIn - 缩放进入
└── spin - 旋转动画Loading
```
---
### 🚀 下一步优化计划
Phase 1 已完成,后续可继续优化:
- **Phase 2**: 拆分 StockDetailPanel.js (1067行 → ~250行)
- **Phase 3**: 拆分 InvestmentCalendar.js (827行 → ~200行)
- **Phase 4**: 拆分 MidjourneyHeroSection.js (813行 → ~200行)
- **Phase 5**: 拆分 UnifiedSearchBox.js (679行 → ~180行)
---
### 🔗 相关提交
- `feat: 拆分 EventList.js/提取价格相关工具函数到 utils/priceFormatters.js`
- `feat(EventList): 创建事件卡片原子组件`
- `feat(EventList): 创建事件卡片组合组件`
- `refactor(EventList): 使用组件化架构替换内联渲染函数`
---

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

3565
app.py

File diff suppressed because it is too large Load Diff

1611
app_vx.py

File diff suppressed because it is too large Load Diff

6352
app_vx_copy1.py Normal file

File diff suppressed because it is too large Load Diff

1028
category_tree_openapi.json Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -110,7 +110,7 @@ class SearchRequest(BaseModel):
semantic_weight: Optional[float] = Field(None, ge=0.0, le=1.0, description="语义搜索权重(0-1)None表示自动计算")
filter_stocks: Optional[List[str]] = Field(None, description="过滤特定股票代码或名称")
trade_date: Optional[date] = Field(None, description="交易日期格式YYYY-MM-DD默认返回最新日期数据")
sort_by: str = Field("change_pct", description="排序方式: change_pct, _score, stock_count, concept_name")
sort_by: str = Field("change_pct", description="排序方式: change_pct, _score, stock_count, concept_name, added_date")
use_knn: bool = Field(True, description="是否使用KNN搜索优化语义搜索")
@@ -548,12 +548,12 @@ async def search_concepts(request: SearchRequest):
# 已经在generate_embedding中记录了详细日志这里只调整语义权重
semantic_weight = 0
# 【关键修改】:如果按涨跌幅排序,需要获取更多结果
# 【关键修改】:如果按涨跌幅或添加日期排序,需要获取更多结果
effective_search_size = request.search_size
if request.sort_by == "change_pct":
# 按涨跌幅排序时,获取更多结果以确保排序准确性
if request.sort_by in ["change_pct", "added_date"]:
# 按涨跌幅或添加日期排序时,获取更多结果以确保排序准确性
effective_search_size = min(1000, request.search_size * 10) # 最多获取1000个
logger.info(f"Using expanded search size {effective_search_size} for change_pct sorting")
logger.info(f"Using expanded search size {effective_search_size} for {request.sort_by} sorting")
# 构建查询体
search_body = {}
@@ -721,6 +721,14 @@ async def search_concepts(request: SearchRequest):
all_results.sort(key=lambda x: x.stock_count, reverse=True)
elif request.sort_by == "concept_name":
all_results.sort(key=lambda x: x.concept)
elif request.sort_by == "added_date":
# 按添加日期排序(降序 - 最新的在前)
all_results.sort(
key=lambda x: (
x.happened_times[0] if x.happened_times and len(x.happened_times) > 0 else '1900-01-01'
),
reverse=True
)
# _score排序已经由ES处理
# 计算分页

1096
concept_api_openapi.json Normal file

File diff suppressed because it is too large Load Diff

1176
concept_hierarchy.json Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -39,6 +39,13 @@ module.exports = {
priority: 30,
reuseExistingChunk: true,
},
// TradingView Lightweight Charts 单独分离(避免被压缩破坏)
lightweightCharts: {
test: /[\\/]node_modules[\\/]lightweight-charts[\\/]/,
name: 'lightweight-charts',
priority: 26,
reuseExistingChunk: true,
},
// 大型图表库分离echarts, d3, apexcharts 等)
charts: {
test: /[\\/]node_modules[\\/](echarts|echarts-for-react|apexcharts|react-apexcharts|recharts|d3|d3-.*)[\\/]/,
@@ -69,7 +76,7 @@ module.exports = {
},
// 日期/日历库
calendar: {
test: /[\\/]node_modules[\\/](moment|date-fns|@fullcalendar|react-big-calendar)[\\/]/,
test: /[\\/]node_modules[\\/](dayjs|date-fns|@fullcalendar)[\\/]/,
name: 'calendar-lib',
priority: 18,
reuseExistingChunk: true,
@@ -96,8 +103,43 @@ module.exports = {
moduleIds: 'deterministic',
// 最小化配置
minimize: true,
minimizer: [
...webpackConfig.optimization.minimizer,
],
};
// 配置 Terser 插件,保留 lightweight-charts 的方法名
const TerserPlugin = require('terser-webpack-plugin');
webpackConfig.optimization.minimizer = webpackConfig.optimization.minimizer.map(plugin => {
if (plugin.constructor.name === 'TerserPlugin') {
const originalOptions = plugin.options || {};
const originalTerserOptions = originalOptions.terserOptions || {};
const originalMangle = originalTerserOptions.mangle || {};
// 只保留 TerserPlugin 有效的配置项
const validOptions = {
test: originalOptions.test,
include: originalOptions.include,
exclude: originalOptions.exclude,
extractComments: originalOptions.extractComments,
parallel: originalOptions.parallel,
minify: originalOptions.minify,
terserOptions: {
...originalTerserOptions,
keep_classnames: /^(IChartApi|ISeriesApi|Re)$/, // 保留 lightweight-charts 的类名
keep_fnames: /^(createChart|addLineSeries|addSeries)$/, // 保留关键方法名
mangle: {
...originalMangle,
reserved: ['createChart', 'addLineSeries', 'addSeries', 'IChartApi', 'ISeriesApi'],
},
},
};
return new TerserPlugin(validOptions);
}
return plugin;
});
// 生产环境禁用 source map 以加快构建(可节省 40-60% 时间)
webpackConfig.devtool = false;
} else {
@@ -161,13 +203,8 @@ module.exports = {
);
}
// 忽略 moment 的语言包(如果项目使用了 moment
webpackConfig.plugins.push(
new webpack.IgnorePlugin({
resourceRegExp: /^\.\/locale$/,
contextRegExp: /moment$/,
})
);
// Day.js 的语言包非常小(每个约 0.5KB),所以不需要特别忽略
// 如果需要优化,可以只导入需要的语言包
// ============== Loader 优化 ==============
const babelLoaderRule = webpackConfig.module.rules.find(
@@ -247,9 +284,19 @@ module.exports = {
},
// 代理配置:将 /api 请求代理到后端服务器
// 注意Mock 模式下禁用 proxy,让 MSW 拦截请求
...(isMockMode() ? {} : {
proxy: {
// 注意Mock 模式下禁用 /api 和 /concept-api,让 MSW 拦截请求
// 但 /bytedesk 始终启用(客服系统不走 Mock
proxy: {
'/bytedesk': {
target: 'https://valuefrontier.cn', // 统一使用生产环境 Nginx 代理
changeOrigin: true,
secure: false, // 开发环境禁用 HTTPS 严格验证
logLevel: 'debug',
ws: true, // 支持 WebSocket
// 不使用 pathRewrite保留 /bytedesk 前缀,让生产 Nginx 处理
},
// Mock 模式下禁用其他代理
...(isMockMode() ? {} : {
'/api': {
target: 'http://49.232.185.254:5001',
changeOrigin: true,
@@ -263,15 +310,7 @@ module.exports = {
logLevel: 'debug',
pathRewrite: { '^/concept-api': '' },
},
'/bytedesk': {
target: 'https://valuefrontier.cn', // 统一使用生产环境 Nginx 代理
changeOrigin: true,
secure: false, // 开发环境禁用 HTTPS 严格验证
logLevel: 'debug',
ws: true, // 支持 WebSocket
// 不使用 pathRewrite保留 /bytedesk 前缀,让生产 Nginx 处理
},
},
}),
}),
},
},
};

View File

@@ -0,0 +1,918 @@
# Bytedesk客服系统 - 前端工程师集成手册
**版本**: v1.0
**最后更新**: 2025-01-07
**适用项目**: vf_react
**后端服务器**: http://43.143.189.195
---
## 📋 目录
- [1. 集成概述](#1-集成概述)
- [2. 快速开始5分钟集成](#2-快速开始5分钟集成)
- [3. 详细集成步骤](#3-详细集成步骤)
- [4. 配置说明](#4-配置说明)
- [5. 高级功能](#5-高级功能)
- [6. 样式定制](#6-样式定制)
- [7. 故障排查](#7-故障排查)
- [8. 常见问题FAQ](#8-常见问题faq)
- [9. 性能优化](#9-性能优化)
- [10. 安全注意事项](#10-安全注意事项)
---
## 1. 集成概述
### 1.1 什么是Bytedesk客服系统
Bytedesk是一个开源的在线客服系统为您的网站提供实时客户服务功能。本手册将指导您将Bytedesk客服Widget集成到vf_react项目中。
### 1.2 集成架构
```
┌────────────────────────────────────────────────────────────┐
│ vf_react前端项目 │
│ ┌────────────────────────────────────────────────────┐ │
│ │ App.jsx │ │
│ │ ┌──────────────────────────────────────────────┐ │ │
│ │ │ BytedeskWidget组件 │ │ │
│ │ │ - 动态加载客服脚本 │ │ │
│ │ │ - 显示悬浮客服图标 │ │ │
│ │ │ - 处理用户交互 │ │ │
│ │ └──────────────────────────────────────────────┘ │ │
│ └────────────────────────────────────────────────────┘ │
└────────────────────────────────────────────────────────────┘
│ HTTP/WebSocket
┌────────────────────────────────────────────────────────────┐
│ Bytedesk后端服务 (43.143.189.195) │
│ - API接口: :9003 │
│ - WebSocket: :9885 │
│ - Nginx反向代理: :80 │
└────────────────────────────────────────────────────────────┘
```
### 1.3 集成特点
-**零侵入**: 不修改vf_react原有代码逻辑
-**即插即用**: 复制文件 + 修改配置即可使用
-**样式隔离**: 使用Shadow DOM不影响全局样式
-**异步加载**: 不阻塞页面渲染
-**跨页面**: 在所有页面显示客服图标
-**响应式**: 自动适配移动端和PC端
---
## 2. 快速开始5分钟集成
### 步骤1: 复制集成文件
`bytedesk-integration`文件夹复制到vf_react项目的`src/`目录下:
```bash
# 在vf_react项目根目录执行
cd D:\【Git】\vf_react
cp -r bytedesk-integration src/
```
文件结构:
```
vf_react/
├── src/
│ ├── bytedesk-integration/ # 客服集成文件夹
│ │ ├── components/
│ │ │ └── BytedeskWidget.jsx # 客服Widget组件
│ │ ├── config/
│ │ │ └── bytedesk.config.js # 配置文件
│ │ ├── App.jsx.example # 集成示例代码
│ │ ├── .env.bytedesk.example # 环境变量示例
│ │ └── 前端工程师集成手册.md # 本手册
│ ├── App.jsx # 您的主App文件
│ └── ...
└── package.json
```
### 步骤2: 配置环境变量
复制环境变量模板到项目根目录并配置:
```bash
# 复制模板
cp src/bytedesk-integration/.env.bytedesk.example .env.local
# 编辑配置文件
vim .env.local
```
**必需配置项**(在.env.local中:
```bash
# Bytedesk服务器地址
REACT_APP_BYTEDESK_API_URL=http://43.143.189.195
# 组织ID由管理员提供
REACT_APP_BYTEDESK_ORG=df_org_uid
# 工作组ID由管理员提供
REACT_APP_BYTEDESK_SID=df_wg_aftersales
```
> **注意**: ORG和SID需要从管理员处获取或登录后台http://43.143.189.195/admin/查看。
### 步骤3: 集成到App.jsx
打开`src/App.jsx`,参考`App.jsx.example`添加以下代码:
```jsx
// 1. 导入组件和配置(在文件顶部添加)
import BytedeskWidget from './bytedesk-integration/components/BytedeskWidget';
import { getBytedeskConfig } from './bytedesk-integration/config/bytedesk.config';
function App() {
// 2. 获取配置
const bytedeskConfig = getBytedeskConfig();
return (
<div className="App">
{/* 您的原有代码保持不变 */}
{/* 3. 添加客服Widget在return的JSX最后添加 */}
<BytedeskWidget
config={bytedeskConfig}
autoLoad={true}
/>
</div>
);
}
export default App;
```
### 步骤4: 启动项目测试
```bash
# 安装依赖(如果需要)
npm install
# 启动开发服务器
npm start
```
打开浏览器,您应该在页面右下角看到客服图标(💬)。
---
## 3. 详细集成步骤
### 3.1 文件说明
#### BytedeskWidget.jsx
React组件负责加载和管理Bytedesk客服Widget。
**主要功能**:
- 动态加载客服脚本https://www.weiyuai.cn/embed/bytedesk-web.js
- 初始化客服Widget
- 生命周期管理(加载、卸载、清理)
- 错误处理
**Props**:
```typescript
interface BytedeskWidgetProps {
config: Object; // 配置对象(必需)
autoLoad?: boolean; // 是否自动加载默认true
onLoad?: (bytedesk) => void; // 加载成功回调
onError?: (error) => void; // 加载失败回调
}
```
#### bytedesk.config.js
配置文件,包含客服系统的所有配置项。
**主要函数**:
- `getBytedeskConfig()`: 获取基础配置
- `getBytedeskConfigWithUser(user)`: 获取带用户信息的配置
- `shouldShowCustomerService(pathname)`: 判断是否在当前页面显示客服
### 3.2 集成方式选择
根据您的需求,选择合适的集成方式:
#### 方式一: 全局集成(推荐)
**适用场景**: 所有页面都需要客服功能
```jsx
import BytedeskWidget from './bytedesk-integration/components/BytedeskWidget';
import { getBytedeskConfig } from './bytedesk-integration/config/bytedesk.config';
function App() {
const bytedeskConfig = getBytedeskConfig();
return (
<div className="App">
{/* 您的页面内容 */}
<BytedeskWidget config={bytedeskConfig} autoLoad={true} />
</div>
);
}
```
#### 方式二: 按页面显示
**适用场景**: 只在特定页面显示客服(如排除登录页、支付页)
```jsx
import { useLocation } from 'react-router-dom';
import BytedeskWidget from './bytedesk-integration/components/BytedeskWidget';
import { getBytedeskConfig, shouldShowCustomerService } from './bytedesk-integration/config/bytedesk.config';
function App() {
const location = useLocation();
const bytedeskConfig = getBytedeskConfig();
const showBytedesk = shouldShowCustomerService(location.pathname);
return (
<div className="App">
{/* 您的页面内容 */}
{showBytedesk && (
<BytedeskWidget config={bytedeskConfig} autoLoad={true} />
)}
</div>
);
}
```
自定义页面规则(修改`bytedesk.config.js`:
```javascript
export const shouldShowCustomerService = (pathname) => {
// 在以下页面显示客服
const allowedPages = [
'/',
'/home',
'/products',
'/pricing',
];
// 在以下页面隐藏客服
const blockedPages = [
'/login',
'/register',
'/payment',
];
if (blockedPages.some(page => pathname.startsWith(page))) {
return false;
}
return allowedPages.some(page => pathname.startsWith(page));
};
```
#### 方式三: 带用户信息集成
**适用场景**: 需要将登录用户信息传递给客服端
```jsx
import { useContext } from 'react';
import BytedeskWidget from './bytedesk-integration/components/BytedeskWidget';
import { getBytedeskConfigWithUser } from './bytedesk-integration/config/bytedesk.config';
import { AuthContext } from './contexts/AuthContext';
function App() {
const { user } = useContext(AuthContext);
const bytedeskConfig = getBytedeskConfigWithUser(user);
return (
<div className="App">
{/* 您的页面内容 */}
<BytedeskWidget config={bytedeskConfig} autoLoad={true} />
</div>
);
}
```
用户信息格式:
```javascript
const user = {
id: '12345', // 用户ID必需
name: '张三', // 用户名
email: 'user@example.com', // 邮箱
mobile: '13800138000', // 手机号
};
```
---
## 4. 配置说明
### 4.1 环境变量配置
`.env.local`文件中配置(项目根目录):
```bash
# ========== 必需配置 ==========
# 后端服务地址
REACT_APP_BYTEDESK_API_URL=http://43.143.189.195
# 组织ID
REACT_APP_BYTEDESK_ORG=df_org_uid
# 工作组ID
REACT_APP_BYTEDESK_SID=df_wg_aftersales
# ========== 可选配置 ==========
# 客服类型 (2=人工客服, 1=机器人)
REACT_APP_BYTEDESK_TYPE=2
# 语言 (zh-cn, en, ja, ko)
REACT_APP_BYTEDESK_LOCALE=zh-cn
# 图标位置 (bottom-right, bottom-left, top-right, top-left)
REACT_APP_BYTEDESK_PLACEMENT=bottom-right
# 图标边距(像素)
REACT_APP_BYTEDESK_MARGIN_BOTTOM=20
REACT_APP_BYTEDESK_MARGIN_SIDE=20
# 主题模式 (system, light, dark)
REACT_APP_BYTEDESK_THEME_MODE=system
# 主题色
REACT_APP_BYTEDESK_THEME_COLOR=#0066FF
# 自动弹出(不推荐)
REACT_APP_BYTEDESK_AUTO_POPUP=false
```
### 4.2 代码配置
`bytedesk.config.js`中直接修改:
```javascript
export const bytedeskConfig = {
// API服务地址
apiUrl: 'http://43.143.189.195',
htmlUrl: 'http://43.143.189.195/chat/',
// 客服图标位置
placement: 'bottom-right',
// 边距设置
marginBottom: 20,
marginSide: 20,
// 自动弹出
autoPopup: false,
// 语言设置
locale: 'zh-cn',
// 客服图标配置
bubbleConfig: {
show: true,
icon: '💬', // 可以使用emoji或图片URL
title: '在线客服',
subtitle: '点击咨询',
},
// 主题配置
theme: {
mode: 'system', // light | dark | system
backgroundColor: '#0066FF',
textColor: '#ffffff',
},
// 聊天配置
chatConfig: {
org: 'df_org_uid',
t: '2', // 2=人工客服, 1=机器人
sid: 'df_wg_aftersales',
},
};
```
---
## 5. 高级功能
### 5.1 多工作组支持
根据页面显示不同工作组的客服:
```javascript
// bytedesk.config.js
export const getBytedeskConfigByPath = (pathname) => {
const config = getBytedeskConfig();
// 根据路径选择工作组
if (pathname.startsWith('/sales')) {
return {
...config,
chatConfig: {
...config.chatConfig,
sid: 'df_wg_sales', // 销售组
},
};
} else if (pathname.startsWith('/support')) {
return {
...config,
chatConfig: {
...config.chatConfig,
sid: 'df_wg_support', // 技术支持组
},
};
}
return config; // 默认售后组
};
```
使用示例:
```jsx
import { useLocation } from 'react-router-dom';
import { getBytedeskConfigByPath } from './bytedesk-integration/config/bytedesk.config';
function App() {
const location = useLocation();
const bytedeskConfig = getBytedeskConfigByPath(location.pathname);
return (
<div className="App">
<BytedeskWidget config={bytedeskConfig} autoLoad={true} />
</div>
);
}
```
### 5.2 条件性显示
根据用户登录状态或角色显示客服:
```jsx
function App() {
const { user } = useContext(AuthContext);
const bytedeskConfig = getBytedeskConfig();
// 只为普通用户显示客服(管理员不显示)
const showBytedesk = user && user.role === 'customer';
return (
<div className="App">
{showBytedesk && (
<BytedeskWidget config={bytedeskConfig} autoLoad={true} />
)}
</div>
);
}
```
### 5.3 事件回调
监听客服系统的加载状态:
```jsx
function App() {
const bytedeskConfig = getBytedeskConfig();
const handleLoad = (bytedesk) => {
console.log('客服系统加载成功', bytedesk);
// 可以在这里执行自定义逻辑
// 例如: 发送统计事件
};
const handleError = (error) => {
console.error('客服系统加载失败', error);
// 可以在这里显示降级方案
// 例如: 显示备用联系方式
};
return (
<div className="App">
<BytedeskWidget
config={bytedeskConfig}
autoLoad={true}
onLoad={handleLoad}
onError={handleError}
/>
</div>
);
}
```
### 5.4 自定义触发按钮
隐藏默认图标,使用自定义按钮:
```jsx
import { useState } from 'react';
function App() {
const [showBytedesk, setShowBytedesk] = useState(false);
// 隐藏默认图标
const bytedeskConfig = {
...getBytedeskConfig(),
bubbleConfig: {
show: false, // 隐藏默认图标
},
};
return (
<div className="App">
{/* 自定义按钮 */}
<button
onClick={() => setShowBytedesk(true)}
className="custom-service-btn"
>
联系客服
</button>
{showBytedesk && (
<BytedeskWidget config={bytedeskConfig} autoLoad={true} />
)}
</div>
);
}
```
---
## 6. 样式定制
### 6.1 修改主题色
在配置中修改主题色:
```javascript
// bytedesk.config.js
theme: {
mode: 'light',
backgroundColor: '#FF6600', // 您的品牌色
textColor: '#ffffff',
},
```
### 6.2 修改图标位置
```javascript
// bytedesk.config.js
placement: 'bottom-left', // 左下角
marginBottom: 30, // 距底部30px
marginSide: 30, // 距左侧30px
```
### 6.3 使用自定义图标
使用图片URL替换emoji:
```javascript
// bytedesk.config.js
bubbleConfig: {
show: true,
icon: 'https://yourdomain.com/images/service-icon.png',
title: '在线客服',
subtitle: '点击咨询',
},
```
### 6.4 样式不冲突
Bytedesk Widget使用Shadow DOM技术样式完全隔离不会影响您的全局CSS。
---
## 7. 故障排查
### 7.1 客服图标不显示
**可能原因**:
1. 环境变量未配置
2. 配置文件路径错误
3. 后端服务未启动
4. 脚本加载失败
**解决方案**:
```bash
# 1. 检查.env.local文件是否存在
ls -la .env.local
# 2. 检查环境变量是否加载
console.log(process.env.REACT_APP_BYTEDESK_API_URL);
# 3. 检查后端服务状态
curl http://43.143.189.195/api/health
# 4. 查看浏览器控制台错误
# 打开浏览器开发者工具 -> Console标签页
```
### 7.2 连接不上后端
**检查清单**:
```bash
# 1. 后端服务是否运行
# 联系后端工程师确认docker容器状态
# 2. 防火墙是否开放
# 确认80端口可访问
# 3. CORS配置
# 后端需要在.env.production中添加您的前端地址:
# BYTEDESK_CORS_ALLOWED_ORIGINS=http://your-frontend-domain.com
```
### 7.3 ORG或SID错误
**获取正确配置**:
1. 登录管理后台: http://43.143.189.195/admin/
2. 导航到"设置" -> "组织信息",复制`组织UID`
3. 导航到"客服管理" -> "工作组",复制`工作组ID`
4. 更新`.env.local`文件
5. 重启开发服务器: `npm start`
### 7.4 开发环境正常,生产环境异常
**检查清单**:
```bash
# 1. 确认生产环境的环境变量
# 查看构建时的配置
# 2. 检查CORS配置
# 后端需要添加生产域名到CORS白名单
# 3. 检查HTTPS/HTTP
# 如果前端使用HTTPS后端也应使用HTTPS
# 4. 查看生产环境日志
npm run build
# 检查构建产物中的配置
```
---
## 8. 常见问题FAQ
### Q1: 客服系统会影响页面性能吗?
**A**: 不会。客服脚本采用异步加载不会阻塞页面渲染。Widget总大小约50KBgzip后首次加载后会被浏览器缓存。
### Q2: 可以在移动端使用吗?
**A**: 可以。Bytedesk Widget完全响应式自动适配移动端和PC端。
### Q3: 是否支持离线消息?
**A**: 支持。用户在客服离线时发送的消息会被保存,客服上线后可以查看。
### Q4: 可以集成到React Native吗
**A**: BytedeskWidget是为Web设计的。React Native需要使用Bytedesk的原生SDK另外提供
### Q5: 如何隐藏特定页面的客服?
**A**: 使用`shouldShowCustomerService`函数见3.2节"方式二")。
### Q6: 可以同时配置多个工作组吗?
**A**: 可以。参考5.1节"多工作组支持"。
### Q7: 用户信息是否安全?
**A**: 是的。所有通信使用WebSocket加密传输用户信息不会被第三方获取。建议生产环境使用HTTPS。
### Q8: 是否需要付费?
**A**: Bytedesk社区版当前使用完全免费License有效期至2040年12月31日。
---
## 9. 性能优化
### 9.1 按需加载
只在需要时加载客服系统:
```jsx
import { useState, useEffect } from 'react';
function App() {
const [loadBytedesk, setLoadBytedesk] = useState(false);
// 延迟5秒加载页面渲染完成后
useEffect(() => {
const timer = setTimeout(() => {
setLoadBytedesk(true);
}, 5000);
return () => clearTimeout(timer);
}, []);
return (
<div className="App">
{/* 您的页面内容 */}
{loadBytedesk && (
<BytedeskWidget config={getBytedeskConfig()} autoLoad={true} />
)}
</div>
);
}
```
### 9.2 Lazy Import
使用React.lazy延迟导入组件
```jsx
import { lazy, Suspense } from 'react';
const BytedeskWidget = lazy(() => import('./bytedesk-integration/components/BytedeskWidget'));
function App() {
return (
<div className="App">
{/* 您的页面内容 */}
<Suspense fallback={null}>
<BytedeskWidget config={getBytedeskConfig()} autoLoad={true} />
</Suspense>
</div>
);
}
```
### 9.3 缓存优化
客服脚本会自动被浏览器缓存,无需额外配置。
---
## 10. 安全注意事项
### 10.1 环境变量安全
```bash
# ❌ 错误: 不要在代码中硬编码配置
const config = {
apiUrl: 'http://43.143.189.195',
org: 'df_org_uid',
};
# ✅ 正确: 使用环境变量
const config = {
apiUrl: process.env.REACT_APP_BYTEDESK_API_URL,
org: process.env.REACT_APP_BYTEDESK_ORG,
};
```
### 10.2 敏感信息保护
```javascript
// ❌ 不要传递敏感信息
const user = {
id: '12345',
password: 'user-password', // 不要传递密码
creditCard: '1234-5678', // 不要传递信用卡
};
// ✅ 只传递必要信息
const user = {
id: '12345',
name: '张三',
email: 'user@example.com',
};
```
### 10.3 HTTPS使用
生产环境强烈建议使用HTTPS:
```bash
# 开发环境
REACT_APP_BYTEDESK_API_URL=http://43.143.189.195
# 生产环境
REACT_APP_BYTEDESK_API_URL=https://kefu.yourdomain.com
```
### 10.4 内容安全策略CSP
如果您的项目使用CSP需要允许以下域名
```html
<meta http-equiv="Content-Security-Policy" content="
default-src 'self';
script-src 'self' https://www.weiyuai.cn;
connect-src 'self' http://43.143.189.195;
img-src 'self' data: http://43.143.189.195;
"/>
```
---
## 11. 获取帮助
### 11.1 联系方式
- **技术支持**: 访问 http://43.143.189.195/chat/ 在线咨询
- **管理员**: 联系您的项目管理员获取ORG和SID
- **后端工程师**: 联系后端团队确认服务器状态
### 11.2 日志查看
```javascript
// 在浏览器控制台查看Bytedesk日志
// 日志前缀为 [Bytedesk]
// 示例:
[Bytedesk] 开始加载客服Widget...
[Bytedesk] Widget脚本加载成功
[Bytedesk] 初始化Widget
[Bytedesk] Widget初始化成功
```
### 11.3 调试技巧
```javascript
// 1. 检查配置是否正确
console.log('Bytedesk配置:', getBytedeskConfig());
// 2. 检查环境变量
console.log('API URL:', process.env.REACT_APP_BYTEDESK_API_URL);
console.log('ORG:', process.env.REACT_APP_BYTEDESK_ORG);
console.log('SID:', process.env.REACT_APP_BYTEDESK_SID);
// 3. 检查Widget是否加载
console.log('BytedeskWeb对象:', window.BytedeskWeb);
```
---
## 12. 版本历史
| 版本 | 日期 | 更新内容 |
|------|------|---------|
| v1.0 | 2025-01-07 | 初始版本,支持基础集成功能 |
---
## 13. 附录
### 13.1 完整配置示例
```javascript
// bytedesk.config.js - 完整配置
export const bytedeskConfig = {
apiUrl: 'http://43.143.189.195',
htmlUrl: 'http://43.143.189.195/chat/',
placement: 'bottom-right',
marginBottom: 20,
marginSide: 20,
autoPopup: false,
locale: 'zh-cn',
bubbleConfig: {
show: true,
icon: '💬',
title: '在线客服',
subtitle: '点击咨询',
},
theme: {
mode: 'system',
backgroundColor: '#0066FF',
textColor: '#ffffff',
},
chatConfig: {
org: 'df_org_uid',
t: '2',
sid: 'df_wg_aftersales',
},
};
```
### 13.2 文件清单
集成所需的所有文件:
```
bytedesk-integration/
├── components/
│ └── BytedeskWidget.jsx # React组件必需
├── config/
│ └── bytedesk.config.js # 配置文件(必需)
├── App.jsx.example # 集成示例(参考)
├── .env.bytedesk.example # 环境变量示例(参考)
└── 前端工程师集成手册.md # 本手册(参考)
```
---
**祝您集成顺利!**
如有任何问题,请随时联系技术支持。

View File

@@ -1,626 +0,0 @@
# 通知系统增强功能 - 使用指南
## 📋 概述
本指南介绍通知系统的三大增强功能:
1. **智能桌面通知** - 自动请求权限,系统级通知
2. **性能监控** - 追踪推送效果,数据驱动优化
3. **历史记录** - 持久化存储,随时查询
---
## 🎯 功能 1智能桌面通知
### 功能说明
首次收到重要/紧急通知时,自动请求浏览器通知权限,确保用户不错过关键信息。
### 工作原理
```javascript
// 在 NotificationContext 中的逻辑
if (priority === URGENT || priority === IMPORTANT) {
if (browserPermission === 'default' && !hasRequestedPermission) {
// 首次遇到重要通知,自动请求权限
await requestBrowserPermission();
setHasRequestedPermission(true); // 避免重复请求
}
}
```
### 权限状态
- **granted**: 已授权,可以发送桌面通知
- **denied**: 已拒绝,无法发送桌面通知
- **default**: 未请求,首次重要通知时会自动请求
### 使用示例
**自动触发**(推荐)
```javascript
// 无需任何代码,系统自动处理
// 首次收到重要/紧急通知时会自动弹出权限请求
```
**手动请求**
```javascript
import { useNotification } from 'contexts/NotificationContext';
function SettingsPage() {
const { requestBrowserPermission, browserPermission } = useNotification();
return (
<div>
<p>当前状态: {browserPermission}</p>
<button onClick={requestBrowserPermission}>
开启桌面通知
</button>
</div>
);
}
```
### 通知分发策略
| 优先级 | 页面在前台 | 页面在后台 |
|-------|----------|----------|
| 紧急 | 桌面通知 + 网页通知 | 桌面通知 + 网页通知 |
| 重要 | 网页通知 | 桌面通知 |
| 普通 | 网页通知 | 网页通知 |
### 测试步骤
1. **清除已保存的权限状态**
```javascript
localStorage.removeItem('browser_notification_requested');
```
2. **刷新页面**
3. **触发一个重要/紧急通知**
- Mock 模式:等待自动推送
- Real 模式:创建测试事件
4. **观察权限请求弹窗**
- 浏览器会弹出通知权限请求
- 点击"允许"授权
5. **验证桌面通知**
- 切换到其他标签页
- 收到重要通知时应该看到桌面通知
---
## 📊 功能 2性能监控
### 功能说明
追踪通知推送的各项指标,包括:
- **到达率**: 发送 vs 接收
- **点击率**: 点击 vs 接收
- **响应时间**: 收到通知到点击的平均时间
- **类型分布**: 各类型通知的数量和效果
- **时段分布**: 每小时推送量
### API 参考
#### 获取汇总统计
```javascript
import { notificationMetricsService } from 'services/notificationMetricsService';
const summary = notificationMetricsService.getSummary();
console.log(summary);
/* 输出:
{
totalSent: 100,
totalReceived: 98,
totalClicked: 45,
totalDismissed: 53,
avgResponseTime: 5200, // 毫秒
clickRate: '45.92', // 百分比
deliveryRate: '98.00' // 百分比
}
*/
```
#### 获取按类型统计
```javascript
const byType = notificationMetricsService.getByType();
console.log(byType);
/* 输出:
{
announcement: { sent: 20, received: 20, clicked: 15, dismissed: 5, clickRate: '75.00' },
stock_alert: { sent: 30, received: 30, clicked: 20, dismissed: 10, clickRate: '66.67' },
event_alert: { sent: 40, received: 38, clicked: 10, dismissed: 28, clickRate: '26.32' },
analysis_report: { sent: 10, received: 10, clicked: 0, dismissed: 10, clickRate: '0.00' }
}
*/
```
#### 获取按优先级统计
```javascript
const byPriority = notificationMetricsService.getByPriority();
console.log(byPriority);
/* 输出:
{
urgent: { sent: 10, received: 10, clicked: 9, dismissed: 1, clickRate: '90.00' },
important: { sent: 40, received: 39, clicked: 25, dismissed: 14, clickRate: '64.10' },
normal: { sent: 50, received: 49, clicked: 11, dismissed: 38, clickRate: '22.45' }
}
*/
```
#### 获取每日数据
```javascript
const dailyData = notificationMetricsService.getDailyData(7); // 最近 7 天
console.log(dailyData);
/* 输出:
[
{ date: '2025-01-15', sent: 15, received: 14, clicked: 6, dismissed: 8, clickRate: '42.86' },
{ date: '2025-01-16', sent: 20, received: 20, clicked: 10, dismissed: 10, clickRate: '50.00' },
...
]
*/
```
#### 获取完整指标
```javascript
const allMetrics = notificationMetricsService.getAllMetrics();
console.log(allMetrics);
```
#### 导出数据
```javascript
// 导出为 JSON
const json = notificationMetricsService.exportToJSON();
console.log(json);
// 导出为 CSV
const csv = notificationMetricsService.exportToCSV();
console.log(csv);
```
#### 重置指标
```javascript
notificationMetricsService.reset();
```
### 在控制台查看实时指标
打开浏览器控制台,执行:
```javascript
// 引入服务
import { notificationMetricsService } from './services/notificationMetricsService.js';
// 查看汇总
console.table(notificationMetricsService.getSummary());
// 查看按类型分布
console.table(notificationMetricsService.getByType());
// 查看最近 7 天数据
console.table(notificationMetricsService.getDailyData(7));
```
### 监控埋点(自动)
监控服务已自动集成到 `NotificationContext`,无需手动调用:
- **trackReceived**: 收到通知时自动调用
- **trackClicked**: 点击通知时自动调用
- **trackDismissed**: 关闭通知时自动调用
### 可视化展示(可选)
你可以基于监控数据创建仪表板:
```javascript
import { notificationMetricsService } from 'services/notificationMetricsService';
import { PieChart, LineChart } from 'recharts';
function MetricsDashboard() {
const summary = notificationMetricsService.getSummary();
const dailyData = notificationMetricsService.getDailyData(7);
const byType = notificationMetricsService.getByType();
return (
<div>
{/* 汇总卡片 */}
<StatsCard title="总推送数" value={summary.totalSent} />
<StatsCard title="点击率" value={`${summary.clickRate}%`} />
<StatsCard title="平均响应时间" value={`${summary.avgResponseTime}ms`} />
{/* 类型分布饼图 */}
<PieChart data={Object.entries(byType).map(([type, data]) => ({
name: type,
value: data.received
}))} />
{/* 每日趋势折线图 */}
<LineChart data={dailyData} />
</div>
);
}
```
---
## 📜 功能 3历史记录
### 功能说明
持久化存储所有接收到的通知,支持:
- 查询和筛选
- 搜索关键词
- 标记已读/已点击
- 批量删除
- 导出JSON/CSV
### API 参考
#### 获取历史记录(支持筛选和分页)
```javascript
import { notificationHistoryService } from 'services/notificationHistoryService';
const result = notificationHistoryService.getHistory({
type: 'event_alert', // 可选:筛选类型
priority: 'urgent', // 可选:筛选优先级
readStatus: 'unread', // 可选:'read' | 'unread' | 'all'
startDate: Date.now() - 7 * 24 * 60 * 60 * 1000, // 可选:开始日期
endDate: Date.now(), // 可选:结束日期
page: 1, // 页码
pageSize: 20, // 每页数量
});
console.log(result);
/* 输出:
{
records: [...], // 当前页的记录
total: 150, // 总记录数
page: 1, // 当前页
pageSize: 20, // 每页数量
totalPages: 8 // 总页数
}
*/
```
#### 搜索历史记录
```javascript
const results = notificationHistoryService.searchHistory('降准');
console.log(results); // 返回标题/内容中包含"降准"的所有记录
```
#### 标记已读/已点击
```javascript
// 标记已读
notificationHistoryService.markAsRead('notification_id');
// 标记已点击
notificationHistoryService.markAsClicked('notification_id');
```
#### 删除记录
```javascript
// 删除单条
notificationHistoryService.deleteRecord('notification_id');
// 批量删除
notificationHistoryService.deleteRecords(['id1', 'id2', 'id3']);
// 清空所有
notificationHistoryService.clearHistory();
```
#### 获取统计数据
```javascript
const stats = notificationHistoryService.getStats();
console.log(stats);
/* 输出:
{
total: 500, // 总记录数
read: 320, // 已读数
unread: 180, // 未读数
clicked: 150, // 已点击数
clickRate: '30.00', // 点击率
byType: { // 按类型统计
announcement: 100,
stock_alert: 150,
event_alert: 200,
analysis_report: 50
},
byPriority: { // 按优先级统计
urgent: 50,
important: 200,
normal: 250
}
}
*/
```
#### 导出历史记录
```javascript
// 导出为 JSON 字符串
const json = notificationHistoryService.exportToJSON({
type: 'event_alert' // 可选:只导出特定类型
});
// 导出为 CSV 字符串
const csv = notificationHistoryService.exportToCSV();
// 直接下载 JSON 文件
notificationHistoryService.downloadJSON();
// 直接下载 CSV 文件
notificationHistoryService.downloadCSV();
```
### 在控制台使用
打开浏览器控制台,执行:
```javascript
// 引入服务
import { notificationHistoryService } from './services/notificationHistoryService.js';
// 查看所有历史
console.table(notificationHistoryService.getHistory().records);
// 搜索
const results = notificationHistoryService.searchHistory('央行');
console.table(results);
// 查看统计
console.table(notificationHistoryService.getStats());
// 导出并下载
notificationHistoryService.downloadJSON();
```
### 数据结构
每条历史记录包含:
```javascript
{
id: 'notif_123', // 通知 ID
notification: { // 完整通知对象
type: 'event_alert',
priority: 'urgent',
title: '...',
content: '...',
...
},
receivedAt: 1737459600000, // 接收时间戳
readAt: 1737459650000, // 已读时间戳null 表示未读)
clickedAt: null, // 已点击时间戳null 表示未点击)
}
```
### 存储限制
- **最大数量**: 500 条(超过后自动删除最旧的)
- **存储位置**: localStorage
- **容量估算**: 约 2-5MB取决于通知内容长度
---
## 🔧 技术细节
### 文件结构
```
src/
├── services/
│ ├── browserNotificationService.js [已存在] 浏览器通知服务
│ ├── notificationMetricsService.js [新建] 性能监控服务
│ └── notificationHistoryService.js [新建] 历史记录服务
├── contexts/
│ └── NotificationContext.js [修改] 集成所有功能
└── components/
└── NotificationContainer/
└── index.js [修改] 添加点击追踪
```
### 修改清单
| 文件 | 修改内容 | 状态 |
|------|---------|------|
| `NotificationContext.js` | 添加智能权限请求、监控埋点、历史保存 | ✅ 已完成 |
| `NotificationContainer/index.js` | 添加点击追踪 | ✅ 已完成 |
| `notificationMetricsService.js` | 性能监控服务 | ✅ 已创建 |
| `notificationHistoryService.js` | 历史记录服务 | ✅ 已创建 |
### 数据流
```
用户收到通知
NotificationContext.addWebNotification()
├─ notificationMetricsService.trackReceived() [监控埋点]
├─ notificationHistoryService.saveNotification() [历史保存]
├─ 首次重要通知 → requestBrowserPermission() [智能权限]
└─ 显示网页通知或桌面通知
用户点击通知
NotificationContainer.handleClick()
├─ notificationMetricsService.trackClicked() [监控埋点]
├─ notificationHistoryService.markAsClicked() [历史标记]
└─ 跳转到目标页面
用户关闭通知
NotificationContext.removeNotification()
└─ notificationMetricsService.trackDismissed() [监控埋点]
```
---
## 🧪 测试步骤
### 1. 测试智能桌面通知
```bash
# 1. 清除已保存的权限状态
localStorage.removeItem('browser_notification_requested');
# 2. 刷新页面
# 3. 等待或触发一个重要/紧急通知
# 4. 观察浏览器弹出权限请求
# 5. 授权后验证桌面通知功能
```
### 2. 测试性能监控
```javascript
// 在控制台执行
import { notificationMetricsService } from './services/notificationMetricsService.js';
// 查看实时统计
console.table(notificationMetricsService.getSummary());
// 模拟推送几条通知,再次查看
console.table(notificationMetricsService.getAllMetrics());
// 导出数据
console.log(notificationMetricsService.exportToJSON());
```
### 3. 测试历史记录
```javascript
// 在控制台执行
import { notificationHistoryService } from './services/notificationHistoryService.js';
// 查看历史
console.table(notificationHistoryService.getHistory().records);
// 搜索
console.table(notificationHistoryService.searchHistory('降准'));
// 查看统计
console.table(notificationHistoryService.getStats());
// 导出
notificationHistoryService.downloadJSON();
```
---
## 📈 数据导出示例
### 导出性能监控数据
```javascript
import { notificationMetricsService } from 'services/notificationMetricsService';
// 导出 JSON
const json = notificationMetricsService.exportToJSON();
// 复制到剪贴板或保存
// 导出 CSV
const csv = notificationMetricsService.exportToCSV();
// 可以在 Excel 中打开
```
### 导出历史记录
```javascript
import { notificationHistoryService } from 'services/notificationHistoryService';
// 导出最近 7 天的事件动向通知
const json = notificationHistoryService.exportToJSON({
type: 'event_alert',
startDate: Date.now() - 7 * 24 * 60 * 60 * 1000
});
// 直接下载为文件
notificationHistoryService.downloadJSON({
type: 'event_alert'
});
```
---
## ⚠️ 注意事项
### 1. localStorage 容量限制
- 大多数浏览器限制为 5-10MB
- 建议定期清理历史记录和监控数据
- 使用导出功能备份数据
### 2. 浏览器兼容性
- **桌面通知**: 需要 HTTPS 或 localhost
- **localStorage**: 所有现代浏览器支持
- **权限请求**: 需要用户交互(不能自动授权)
### 3. 隐私和数据安全
- 所有数据存储在本地localStorage
- 不会上传到服务器
- 用户可以随时清空数据
### 4. 性能影响
- 监控埋点非常轻量,几乎无性能影响
- 历史记录保存异步进行,不阻塞 UI
- 数据查询在客户端完成,不增加服务器负担
---
## 🎉 总结
### 已实现的功能
**智能桌面通知**
- 首次重要通知时自动请求权限
- 智能分发策略(前台/后台)
- localStorage 持久化权限状态
**性能监控**
- 到达率、点击率、响应时间追踪
- 按类型、优先级、时段统计
- 数据导出JSON/CSV
**历史记录**
- 持久化存储(最多 500 条)
- 筛选、搜索、分页
- 已读/已点击标记
- 数据导出JSON/CSV
### 未实现的功能(备份,待上线)
⏸️ 历史记录页面 UI代码已备份随时可上线
⏸️ 监控仪表板 UI可选暂未实现
### 下一步建议
1. **用户设置页面**: 允许用户自定义通知偏好
2. **声音提示**: 为紧急通知添加音效
3. **数据同步**: 将历史和监控数据同步到服务器
4. **高级筛选**: 添加更多筛选维度(如关键词、股票代码等)
---
**文档版本**: v1.0
**最后更新**: 2025-01-21
**维护者**: Claude Code

View File

@@ -1,371 +0,0 @@
# 消息推送系统整合 - 测试指南
## 📋 整合完成清单
**统一事件名称**
- Mock 和真实 Socket.IO 都使用 `new_event` 事件名
- 移除了 `trade_notification` 事件名
**数据适配器**
- 创建了 `adaptEventToNotification` 函数
- 自动识别后端事件格式并转换为前端通知格式
- 重要性映射S → urgent, A → important, B/C → normal
**NotificationContext 升级**
- 监听 `new_event` 事件
- 自动使用适配器转换事件数据
- 支持 Mock 和 Real 模式无缝切换
**EventList 实时推送**
- 集成 `useEventNotifications` Hook
- 实时更新事件列表
- Toast 通知提示
- WebSocket 连接状态指示器
---
## 🧪 测试步骤
### 1. 测试 Mock 模式(开发环境)
#### 1.1 配置环境变量
确保 `.env` 文件包含以下配置:
```bash
REACT_APP_USE_MOCK_SOCKET=true
# 或者
REACT_APP_ENABLE_MOCK=true
```
#### 1.2 启动应用
```bash
npm start
```
#### 1.3 验证功能
**a) 右下角通知卡片**
- 启动后等待 3 秒,应该看到 "连接成功" 系统通知
- 每隔 60 秒会自动推送 1-2 条模拟消息
- 通知类型包括:
- 📢 公告通知(蓝色)
- 📈 股票动向(红/绿色,根据涨跌)
- 📰 事件动向(橙色)
- 📊 分析报告(紫色)
**b) 事件列表页面**
- 访问事件列表页面Community/Events
- 顶部应显示 "🟢 实时推送已开启"
- 收到新事件时:
- 右上角显示 Toast 通知
- 事件自动添加到列表顶部
- 无重复添加
**c) 控制台日志**
打开浏览器控制台,应该看到:
```
[Socket Service] Using MOCK Socket Service
NotificationContext: Socket connected
EventList: 收到新事件推送
```
---
### 2. 测试 Real 模式(生产环境)
#### 2.1 配置环境变量
修改 `.env` 文件:
```bash
REACT_APP_USE_MOCK_SOCKET=false
# 或删除该配置项
```
#### 2.2 启动后端 Flask 服务
```bash
python app_2.py
```
确保后端已启动 Socket.IO 服务并监听事件推送。
#### 2.3 启动前端应用
```bash
npm start
```
#### 2.4 创建测试事件(后端)
使用后端提供的测试脚本:
```bash
python test_create_event.py
```
#### 2.5 验证功能
**a) WebSocket 连接**
- 检查控制台:`[Socket Service] Using REAL Socket Service`
- 事件列表顶部显示 "🟢 实时推送已开启"
**b) 事件推送流程**
1. 运行 `test_create_event.py` 创建新事件
2. 后端轮询检测到新事件(最多等待 30 秒)
3. 后端通过 Socket.IO 推送 `new_event`
4. 前端接收事件并转换格式
5. 同时显示:
- 右下角通知卡片
- 事件列表 Toast 提示
- 事件添加到列表顶部
**c) 数据格式验证**
在控制台查看事件对象,应包含:
```javascript
{
id: 123,
type: "event_alert", // 适配器转换后
priority: "urgent", // importance: S → urgent
title: "事件标题",
content: "事件描述",
clickable: true,
link: "/event-detail/123",
extra: {
eventType: "tech",
importance: "S",
// ... 更多后端字段
}
}
```
---
## 🔍 验证清单
### 功能验证
- [ ] Mock 模式下收到模拟通知
- [ ] Real 模式下收到真实后端推送
- [ ] 通知卡片正确显示(类型、颜色、内容)
- [ ] 事件列表实时更新
- [ ] Toast 通知正常弹出
- [ ] 连接状态指示器正确显示
- [ ] 点击通知可跳转到详情页
- [ ] 无重复事件添加
### 数据验证
- [ ] 后端事件格式正确转换
- [ ] 重要性映射正确S/A/B/C → urgent/important/normal
- [ ] 时间戳正确显示
- [ ] 链接路径正确生成
- [ ] 所有字段完整保留在 extra 中
### 性能验证
- [ ] 事件列表最多保留 100 条
- [ ] 通知自动关闭(紧急=不关闭,重要=30s普通=15s
- [ ] WebSocket 自动重连
- [ ] 无内存泄漏
---
## 🐛 常见问题排查
### Q1: Mock 模式下没有收到通知?
**A:** 检查:
1. 环境变量 `REACT_APP_USE_MOCK_SOCKET=true` 是否设置
2. 控制台是否显示 "Using MOCK Socket Service"
3. 是否等待了 3 秒(首次通知延迟)
### Q2: Real 模式下无法连接?
**A:** 检查:
1. Flask 后端是否启动:`python app_2.py`
2. API_BASE_URL 是否正确配置
3. CORS 设置是否包含前端域名
4. 控制台是否有连接错误
### Q3: 收到重复通知?
**A:** 检查:
1. 是否多次渲染了 EventList 组件
2. 是否在多个地方调用了 `useEventNotifications`
3. 控制台日志中是否有 "事件已存在,跳过添加"
### Q4: 通知卡片样式异常?
**A:** 检查:
1. 事件的 `type` 字段是否正确
2. 是否缺少必要的字段title, content
3. `NOTIFICATION_TYPE_CONFIGS` 是否定义了该类型
### Q5: 事件列表不更新?
**A:** 检查:
1. WebSocket 连接状态(顶部 Badge
2. `onNewEvent` 回调是否触发(控制台日志)
3. `setLocalEvents` 是否正确执行
---
## 📊 测试数据示例
### Mock 模拟数据类型
**公告通知**
```javascript
{
type: "announcement",
priority: "urgent",
title: "贵州茅台发布2024年度财报公告",
content: "2024年度营收同比增长15.2%..."
}
```
**股票动向**
```javascript
{
type: "stock_alert",
priority: "urgent",
title: "您关注的股票触发预警",
extra: {
stockCode: "300750",
priceChange: "+5.2%"
}
}
```
**事件动向**
```javascript
{
type: "event_alert",
priority: "important",
title: "央行宣布降准0.5个百分点",
extra: {
eventId: "evt001",
sectors: ["银行", "地产", "基建"]
}
}
```
**分析报告**
```javascript
{
type: "analysis_report",
priority: "important",
title: "医药行业深度报告:创新药迎来政策拐点",
author: {
name: "李明",
organization: "中信证券"
}
}
```
### 真实后端事件格式
```javascript
{
id: 123,
title: "新能源汽车补贴政策延期",
description: "财政部宣布新能源汽车购置补贴政策延长至2024年底",
event_type: "policy",
importance: "S",
status: "active",
created_at: "2025-01-21T14:30:00",
hot_score: 95.5,
view_count: 1234,
related_avg_chg: 5.2,
related_max_chg: 15.8,
keywords: ["新能源", "补贴", "政策"]
}
```
---
## 🎯 下一步建议
### 1. 用户设置
允许用户控制通知偏好:
```jsx
<Switch
isChecked={enableNotifications}
onChange={handleToggle}
>
启用实时通知
</Switch>
```
### 2. 通知过滤
按重要性、类型过滤通知:
```javascript
useEventNotifications({
eventType: 'tech', // 只订阅科技类
importance: 'S', // 只订阅 S 级
enabled: true
})
```
### 3. 声音提示
添加音效提醒:
```javascript
onNewEvent: (event) => {
if (event.priority === 'urgent') {
new Audio('/alert.mp3').play();
}
}
```
### 4. 桌面通知
利用浏览器通知 API
```javascript
if (Notification.permission === 'granted') {
new Notification(event.title, {
body: event.content,
icon: '/logo.png'
});
}
```
---
## 📝 技术说明
### 架构优势
1. **统一接口**Mock 和 Real 完全相同的 API
2. **自动适配**:智能识别数据格式并转换
3. **解耦设计**:通知系统和事件列表独立工作
4. **向后兼容**:不影响现有功能
### 关键文件
- `src/services/socketService.js` - Socket.IO 服务
- `src/services/socket/index.js` - Socket 服务导出
- `src/contexts/NotificationContext.js` - 通知上下文
- `src/hooks/useEventNotifications.js` - React Hook
- `src/views/Community/components/EventList.js` - 事件列表集成
> **注意**: `mockSocketService.js` 已移除2025-01-10现仅使用真实 Socket 连接。
### 数据流
```
后端创建事件
后端轮询检测30秒
Socket.IO 推送 new_event
前端 socketService 接收
NotificationContext 监听并适配
同时触发:
├─ NotificationContainer右下角卡片
└─ EventList onNewEventToast + 列表更新)
```
---
## ✅ 整合完成
所有代码和功能已经就绪!你现在可以:
1. ✅ 在 Mock 模式下测试实时推送
2. ✅ 在 Real 模式下连接后端
3. ✅ 查看右下角通知卡片
4. ✅ 体验事件列表实时更新
5. ✅ 随时切换 Mock/Real 模式
**祝测试顺利!🎉**

View File

@@ -0,0 +1,576 @@
# 订阅支付系统重新设计方案
## 📊 问题分析
### 现有系统的问题
1. **价格配置混乱**
- 季付和月付价格相同(配置错误)
- `monthly_price``yearly_price` 字段命名不清晰
- 缺少季付、半年付等周期的价格配置
2. **升级逻辑复杂且不合理**
- 计算剩余价值折算(按天计算 `remaining_value`
- 用户难以理解升级价格
- 续费用户和新用户价格不一致
- 逻辑复杂,容易出错
3. **按钮文案不清晰**
- 已订阅用户应显示"续费 Pro"/"续费 Max"
- 而不是"升级至 Pro"/"切换至 Pro"
4. **数据库表设计问题**
- `SubscriptionUpgrade` 表记录升级,但逻辑过于复杂
- `PaymentOrder` 表缺少必要字段
- 价格配置分散在多个字段
---
## ✨ 新设计方案
### 核心原则
1. **简化续费逻辑**: **续费用户与新用户价格完全一致**,不做任何折算
2. **清晰的价格体系**: 每个套餐每个周期都有明确的价格
3. **统一的用户体验**: 无论是新购还是续费,价格透明一致
4. **独立的订阅记录**: 每次支付都创建新的订阅记录(历史可追溯)
---
## 📐 数据库表设计
### 1. `subscription_plans` - 订阅套餐表(重构)
```sql
CREATE TABLE subscription_plans (
id INT PRIMARY KEY AUTO_INCREMENT,
plan_code VARCHAR(20) NOT NULL UNIQUE COMMENT '套餐代码: pro, max',
plan_name VARCHAR(50) NOT NULL COMMENT '套餐名称: Pro专业版, Max旗舰版',
description TEXT COMMENT '套餐描述',
features JSON COMMENT '功能列表',
-- 价格配置(所有周期价格)
price_monthly DECIMAL(10,2) NOT NULL DEFAULT 0 COMMENT '月付价格',
price_quarterly DECIMAL(10,2) NOT NULL DEFAULT 0 COMMENT '季付价格(3个月)',
price_semiannual DECIMAL(10,2) NOT NULL DEFAULT 0 COMMENT '半年付价格(6个月)',
price_yearly DECIMAL(10,2) NOT NULL DEFAULT 0 COMMENT '年付价格(12个月)',
-- 状态字段
is_active BOOLEAN DEFAULT TRUE COMMENT '是否启用',
display_order INT DEFAULT 0 COMMENT '展示顺序',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_plan_code (plan_code),
INDEX idx_active_order (is_active, display_order)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订阅套餐配置表';
```
**示例数据**:
```sql
INSERT INTO subscription_plans (plan_code, plan_name, description, price_monthly, price_quarterly, price_semiannual, price_yearly) VALUES
('pro', 'Pro 专业版', '为专业投资者打造', 299.00, 799.00, 1499.00, 2699.00),
('max', 'Max 旗舰版', '旗舰级体验', 599.00, 1599.00, 2999.00, 5399.00);
```
---
### 2. `user_subscriptions` - 用户订阅记录表(重构)
```sql
CREATE TABLE user_subscriptions (
id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT NOT NULL COMMENT '用户ID',
subscription_id VARCHAR(32) UNIQUE NOT NULL COMMENT '订阅ID(唯一标识)',
-- 订阅基本信息
plan_code VARCHAR(20) NOT NULL COMMENT '套餐代码: pro, max',
billing_cycle VARCHAR(20) NOT NULL COMMENT '计费周期: monthly, quarterly, semiannual, yearly',
-- 订阅时间
start_date DATETIME NOT NULL COMMENT '订阅开始时间',
end_date DATETIME NOT NULL COMMENT '订阅结束时间',
-- 订阅状态
status VARCHAR(20) NOT NULL DEFAULT 'active' COMMENT '状态: active(有效), expired(已过期), cancelled(已取消)',
is_current BOOLEAN DEFAULT FALSE COMMENT '是否为当前生效的订阅',
-- 支付信息
payment_order_id INT COMMENT '关联的支付订单ID',
paid_amount DECIMAL(10,2) NOT NULL COMMENT '实际支付金额',
original_price DECIMAL(10,2) NOT NULL COMMENT '原价',
discount_amount DECIMAL(10,2) DEFAULT 0 COMMENT '优惠金额',
-- 订阅类型
subscription_type VARCHAR(20) DEFAULT 'new' COMMENT '订阅类型: new(新购), renew(续费)',
previous_subscription_id VARCHAR(32) COMMENT '上一个订阅ID(续费时记录)',
-- 自动续费
auto_renew BOOLEAN DEFAULT FALSE COMMENT '是否自动续费',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_user_id (user_id),
INDEX idx_subscription_id (subscription_id),
INDEX idx_user_current (user_id, is_current),
INDEX idx_status (status),
INDEX idx_end_date (end_date),
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户订阅记录表';
```
**设计说明**:
- 每次支付都创建新的订阅记录
- 通过 `is_current` 标识当前生效的订阅
- 支持订阅历史追溯
- 续费时记录 `previous_subscription_id` 形成订阅链
---
### 3. `payment_orders` - 支付订单表(重构)
```sql
CREATE TABLE payment_orders (
id INT PRIMARY KEY AUTO_INCREMENT,
order_no VARCHAR(32) UNIQUE NOT NULL COMMENT '订单号',
user_id INT NOT NULL COMMENT '用户ID',
-- 订阅信息
plan_code VARCHAR(20) NOT NULL COMMENT '套餐代码',
billing_cycle VARCHAR(20) NOT NULL COMMENT '计费周期',
subscription_type VARCHAR(20) DEFAULT 'new' COMMENT '订阅类型: new(新购), renew(续费)',
-- 价格信息
original_price DECIMAL(10,2) NOT NULL COMMENT '原价',
discount_amount DECIMAL(10,2) DEFAULT 0 COMMENT '优惠金额',
final_amount DECIMAL(10,2) NOT NULL COMMENT '实付金额',
-- 优惠码
promo_code_id INT COMMENT '优惠码ID',
promo_code VARCHAR(50) COMMENT '优惠码',
-- 支付信息
payment_method VARCHAR(20) DEFAULT 'wechat' COMMENT '支付方式: wechat, alipay',
payment_channel VARCHAR(50) COMMENT '支付渠道详情',
transaction_id VARCHAR(64) COMMENT '第三方交易号',
qr_code_url TEXT COMMENT '支付二维码URL',
-- 订单状态
status VARCHAR(20) DEFAULT 'pending' COMMENT '状态: pending(待支付), paid(已支付), expired(已过期), cancelled(已取消)',
-- 时间信息
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
paid_at TIMESTAMP NULL COMMENT '支付时间',
expired_at TIMESTAMP NULL COMMENT '过期时间',
-- 备注
remark TEXT COMMENT '备注信息',
INDEX idx_order_no (order_no),
INDEX idx_user_id (user_id),
INDEX idx_status (status),
INDEX idx_created_at (created_at),
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
FOREIGN KEY (promo_code_id) REFERENCES promo_codes(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='支付订单表';
```
---
### 4. `promo_codes` - 优惠码表(保持不变,微调)
```sql
CREATE TABLE promo_codes (
id INT PRIMARY KEY AUTO_INCREMENT,
code VARCHAR(50) UNIQUE NOT NULL COMMENT '优惠码',
description VARCHAR(200) COMMENT '描述',
-- 折扣类型
discount_type VARCHAR(20) NOT NULL COMMENT '折扣类型: percentage(百分比), fixed_amount(固定金额)',
discount_value DECIMAL(10,2) NOT NULL COMMENT '折扣值',
-- 适用范围
applicable_plans JSON COMMENT '适用套餐: ["pro", "max"] 或 null(全部)',
applicable_cycles JSON COMMENT '适用周期: ["monthly", "yearly"] 或 null(全部)',
min_amount DECIMAL(10,2) COMMENT '最低消费金额',
-- 使用限制
max_total_uses INT COMMENT '最大使用次数(总)',
max_uses_per_user INT DEFAULT 1 COMMENT '每用户最大使用次数',
current_uses INT DEFAULT 0 COMMENT '当前使用次数',
-- 有效期
valid_from TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '生效时间',
valid_until TIMESTAMP NULL COMMENT '过期时间',
-- 状态
is_active BOOLEAN DEFAULT TRUE COMMENT '是否启用',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_code (code),
INDEX idx_active (is_active),
INDEX idx_valid_period (valid_from, valid_until)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='优惠码表';
```
---
### 5. `promo_code_usage` - 优惠码使用记录表(保持不变)
```sql
CREATE TABLE promo_code_usage (
id INT PRIMARY KEY AUTO_INCREMENT,
promo_code_id INT NOT NULL,
user_id INT NOT NULL,
order_id INT NOT NULL,
discount_amount DECIMAL(10,2) NOT NULL COMMENT '实际优惠金额',
used_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
INDEX idx_promo_code (promo_code_id),
INDEX idx_user_id (user_id),
INDEX idx_order_id (order_id),
FOREIGN KEY (promo_code_id) REFERENCES promo_codes(id) ON DELETE CASCADE,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
FOREIGN KEY (order_id) REFERENCES payment_orders(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='优惠码使用记录表';
```
---
### 6. 删除不必要的表
**删除 `subscription_upgrades` 表** - 不再需要复杂的升级逻辑
---
## 💡 业务逻辑设计
### 1. 价格计算逻辑(简化版)
```python
def calculate_subscription_price(plan_code, billing_cycle, promo_code=None):
"""
计算订阅价格(新购和续费价格完全一致)
Args:
plan_code: 套餐代码 (pro/max)
billing_cycle: 计费周期 (monthly/quarterly/semiannual/yearly)
promo_code: 优惠码(可选)
Returns:
dict: {
'plan_code': 'pro',
'billing_cycle': 'yearly',
'original_price': 2699.00,
'discount_amount': 0,
'final_amount': 2699.00,
'promo_code': None,
'promo_error': None
}
"""
# 1. 查询套餐价格
plan = SubscriptionPlan.query.filter_by(plan_code=plan_code, is_active=True).first()
if not plan:
return {'error': '套餐不存在'}
# 2. 获取对应周期的价格
price_field = f'price_{billing_cycle}'
original_price = getattr(plan, price_field, 0)
if original_price <= 0:
return {'error': '价格配置错误'}
result = {
'plan_code': plan_code,
'plan_name': plan.plan_name,
'billing_cycle': billing_cycle,
'original_price': float(original_price),
'discount_amount': 0,
'final_amount': float(original_price),
'promo_code': None,
'promo_error': None
}
# 3. 应用优惠码(如果有)
if promo_code:
promo, error = validate_promo_code(promo_code, plan_code, billing_cycle, original_price, user_id)
if promo:
discount = calculate_discount(promo, original_price)
result['discount_amount'] = float(discount)
result['final_amount'] = float(original_price - discount)
result['promo_code'] = promo.code
elif error:
result['promo_error'] = error
return result
```
**关键点**:
- ✅ 不再计算 `remaining_value`(剩余价值)
- ✅ 不再区分新购/续费价格
- ✅ 逻辑简单,易于维护
- ✅ 用户体验清晰透明
---
### 2. 创建订单逻辑
```python
def create_subscription_order(user_id, plan_code, billing_cycle, promo_code=None):
"""
创建订阅支付订单
"""
# 1. 计算价格
price_result = calculate_subscription_price(plan_code, billing_cycle, promo_code)
if 'error' in price_result:
return {'success': False, 'error': price_result['error']}
# 2. 判断是新购还是续费
current_sub = get_current_subscription(user_id)
subscription_type = 'new'
if current_sub and current_sub.plan_code in ['pro', 'max']:
subscription_type = 'renew'
# 3. 创建支付订单
order = PaymentOrder(
order_no=generate_order_no(user_id),
user_id=user_id,
plan_code=plan_code,
billing_cycle=billing_cycle,
subscription_type=subscription_type,
original_price=price_result['original_price'],
discount_amount=price_result['discount_amount'],
final_amount=price_result['final_amount'],
promo_code=promo_code,
status='pending',
expired_at=datetime.now() + timedelta(minutes=30)
)
db.session.add(order)
db.session.commit()
# 4. 生成支付二维码(微信支付)
qr_code_url = generate_wechat_qr_code(order)
order.qr_code_url = qr_code_url
db.session.commit()
return {'success': True, 'order': order.to_dict()}
```
---
### 3. 支付成功后的订阅激活逻辑
```python
def activate_subscription_after_payment(order_id):
"""
支付成功后激活订阅
"""
order = PaymentOrder.query.get(order_id)
if not order or order.status != 'paid':
return {'success': False, 'error': '订单状态错误'}
user_id = order.user_id
plan_code = order.plan_code
billing_cycle = order.billing_cycle
# 1. 计算订阅周期
cycle_days = {
'monthly': 30,
'quarterly': 90,
'semiannual': 180,
'yearly': 365
}
days = cycle_days.get(billing_cycle, 30)
# 2. 获取当前订阅
current_sub = UserSubscription.query.filter_by(
user_id=user_id,
is_current=True
).first()
# 3. 计算开始和结束时间
now = datetime.now()
if current_sub and current_sub.end_date > now:
# 续费:从当前订阅结束时间开始
start_date = current_sub.end_date
else:
# 新购:从当前时间开始
start_date = now
end_date = start_date + timedelta(days=days)
# 4. 创建新订阅记录
new_subscription = UserSubscription(
user_id=user_id,
subscription_id=generate_subscription_id(),
plan_code=plan_code,
billing_cycle=billing_cycle,
start_date=start_date,
end_date=end_date,
status='active',
is_current=True,
payment_order_id=order.id,
paid_amount=order.final_amount,
original_price=order.original_price,
discount_amount=order.discount_amount,
subscription_type=order.subscription_type,
previous_subscription_id=current_sub.subscription_id if current_sub else None
)
# 5. 将旧订阅标记为非当前
if current_sub:
current_sub.is_current = False
db.session.add(new_subscription)
db.session.commit()
return {'success': True, 'subscription': new_subscription.to_dict()}
```
**关键特性**:
- ✅ 续费时从**当前订阅结束时间**开始,避免浪费
- ✅ 每次支付都创建新的订阅记录
- ✅ 保留历史订阅记录(通过 `previous_subscription_id` 形成链)
- ✅ 逻辑清晰,易于理解
---
### 4. 按钮文案逻辑
```python
def get_subscription_button_text(user, plan_code, billing_cycle):
"""
获取订阅按钮文字
Args:
user: 用户对象
plan_code: 套餐代码 (pro/max)
billing_cycle: 计费周期
Returns:
str: 按钮文字
"""
current_sub = get_current_subscription(user.id)
# 1. 如果没有订阅或订阅已过期
if not current_sub or current_sub.plan_code == 'free' or current_sub.status != 'active':
return f"选择 {get_plan_display_name(plan_code)}"
# 2. 如果是当前套餐且周期相同
if current_sub.plan_code == plan_code and current_sub.billing_cycle == billing_cycle:
return f"续费 {get_plan_display_name(plan_code)}"
# 3. 如果是当前套餐但周期不同
if current_sub.plan_code == plan_code:
return f"切换至{get_cycle_display_name(billing_cycle)}"
# 4. 如果是不同套餐
return f"选择 {get_plan_display_name(plan_code)}"
def get_plan_display_name(plan_code):
names = {'pro': 'Pro 专业版', 'max': 'Max 旗舰版'}
return names.get(plan_code, plan_code)
def get_cycle_display_name(billing_cycle):
names = {
'monthly': '月付',
'quarterly': '季付',
'semiannual': '半年付',
'yearly': '年付'
}
return names.get(billing_cycle, billing_cycle)
```
**示例**:
- 免费用户看 Pro 年付: "选择 Pro 专业版"
- Pro 月付用户看 Pro 年付: "切换至年付"
- Pro 年付用户看 Pro 年付: "续费 Pro 专业版"
- Pro 用户看 Max 年付: "选择 Max 旗舰版"
---
## 📊 价格配置示例
### Pro 专业版价格设定
| 计费周期 | 价格 | 原价 | 折扣 | 月均价格 |
|---------|------|------|------|---------|
| 月付 | ¥299 | - | - | ¥299 |
| 季付(3个月) | ¥799 | ¥897 | 11% | ¥266 |
| 半年付(6个月) | ¥1499 | ¥1794 | 16% | ¥250 |
| 年付(12个月) | ¥2699 | ¥3588 | 25% | ¥225 |
### Max 旗舰版价格设定
| 计费周期 | 价格 | 原价 | 折扣 | 月均价格 |
|---------|------|------|------|---------|
| 月付 | ¥599 | - | - | ¥599 |
| 季付(3个月) | ¥1599 | ¥1797 | 11% | ¥533 |
| 半年付(6个月) | ¥2999 | ¥3594 | 17% | ¥500 |
| 年付(12个月) | ¥5399 | ¥7188 | 25% | ¥450 |
---
## 🔄 迁移方案
### 数据迁移 SQL
参见 `database_migration.sql`
### 代码迁移步骤
1. **备份现有数据库**
2. **执行数据库迁移 SQL**
3. **更新数据库模型** (`models.py`)
4. **更新价格计算逻辑** (`calculate_price.py`)
5. **更新 API 路由** (`routes.py`)
6. **更新前端组件** (`SubscriptionContentNew.tsx`)
7. **测试完整流程**
8. **灰度发布**
---
## ✅ 优势总结
### 相比旧系统的改进
1. **价格透明** - 续费用户和新用户价格完全一致
2. **逻辑简化** - 不再计算剩余价值,代码减少 50%+
3. **易于理解** - 用户体验更清晰
4. **灵活扩展** - 轻松添加新的计费周期
5. **历史追溯** - 完整的订阅历史记录
6. **数据完整** - 每次支付都有完整的记录
### 用户体验改进
1. **按钮文案清晰** - "续费 Pro"/"选择 Pro"明确表达意图
2. **价格一致性** - 所有用户看到的价格都一样
3. **无隐藏费用** - 不会因为"升级折算"产生困惑
4. **透明计费** - 支付金额 = 显示价格 - 优惠码折扣
---
## 📝 后续优化建议
1. **自动续费** - 到期前自动扣款续费
2. **订阅提醒** - 到期前 7 天、3 天、1 天发送通知
3. **订阅暂停** - 允许用户暂停订阅
4. **订阅降级** - 从 Max 降级到 Pro当前周期结束后生效
5. **发票管理** - 支持开具电子发票
6. **支付方式扩展** - 支持支付宝、银行卡等
---
**设计时间**: 2025-11-19
**设计者**: Claude Code
**版本**: v2.0.0

View File

@@ -1,280 +0,0 @@
# 消息推送系统优化总结
## 优化目标
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 错误

File diff suppressed because it is too large Load Diff

View File

@@ -1,614 +0,0 @@
# PostHog Dashboard 配置指南
## 📊 目的
本指南帮助你在PostHog中配置关键的分析Dashboard和Insights快速获得有价值的用户行为洞察。
---
## 🎯 推荐Dashboard列表
### 1. 📈 核心指标Dashboard
**用途**: 监控产品整体健康度
### 2. 🔄 用户留存Dashboard
**用途**: 分析用户留存和流失
### 3. 💰 收入转化Dashboard
**用途**: 监控付费转化漏斗
### 4. 🎨 功能使用Dashboard
**用途**: 了解功能受欢迎程度
### 5. 🔍 搜索行为Dashboard
**用途**: 优化搜索体验
---
## 📈 Dashboard 1: 核心指标
### Insight 1.1: 每日活跃用户DAU
**类型**: Trends
**事件**: `$pageview`
**时间范围**: 过去30天
**分组**: 按日
**配置**:
```
Event: $pageview
Unique users
Date range: Last 30 days
Interval: Day
```
### Insight 1.2: 新用户注册趋势
**类型**: Trends
**事件**: `USER_SIGNED_UP`
**时间范围**: 过去30天
**配置**:
```
Event: USER_SIGNED_UP
Count of events
Date range: Last 30 days
Interval: Day
Breakdown: signup_method
```
### Insight 1.3: 用户登录方式分布
**类型**: Pie Chart
**事件**: `USER_LOGGED_IN`
**时间范围**: 过去7天
**配置**:
```
Event: USER_LOGGED_IN
Count of events
Date range: Last 7 days
Breakdown: login_method
Visualization: Pie
```
### Insight 1.4: 最受欢迎的页面
**类型**: Table
**事件**: `$pageview`
**时间范围**: 过去7天
**配置**:
```
Event: $pageview
Count of events
Date range: Last 7 days
Breakdown: $current_url
Order: Descending
Limit: Top 10
```
### Insight 1.5: 平台分布
**类型**: Bar Chart
**事件**: `$pageview`
**时间范围**: 过去30天
**配置**:
```
Event: $pageview
Unique users
Date range: Last 30 days
Breakdown: $os
Visualization: Bar
```
---
## 🔄 Dashboard 2: 用户留存
### Insight 2.1: 用户留存曲线
**类型**: Retention
**初始事件**: `USER_SIGNED_UP`
**返回事件**: `$pageview`
**配置**:
```
Cohort defining event: USER_SIGNED_UP
Returning event: $pageview
Period: Daily
Date range: Last 8 weeks
```
### Insight 2.2: 功能留存率
**类型**: Retention
**初始事件**: 各功能首次使用事件
**返回事件**: 各功能再次使用
**配置**:
```
Cohort defining event: TRADING_SIMULATION_ENTERED
Returning event: TRADING_SIMULATION_ENTERED
Period: Weekly
Date range: Last 12 weeks
```
### Insight 2.3: 社区互动留存
**类型**: Retention
**初始事件**: `Community Page Viewed`
**返回事件**: `NEWS_ARTICLE_CLICKED`
**配置**:
```
Cohort defining event: Community Page Viewed
Returning event: NEWS_ARTICLE_CLICKED
Period: Daily
Date range: Last 30 days
```
### Insight 2.4: 活跃用户分层
**类型**: Trends
**多个事件**: 按活跃度分类
**配置**:
```
Event 1: $pageview (filter: >= 20 events in last 7 days)
Event 2: $pageview (filter: 10-19 events in last 7 days)
Event 3: $pageview (filter: 3-9 events in last 7 days)
Event 4: $pageview (filter: 1-2 events in last 7 days)
Date range: Last 30 days
Unique users
```
---
## 💰 Dashboard 3: 收入转化
### Insight 3.1: 付费转化漏斗
**类型**: Funnel
**步骤**:
1. SUBSCRIPTION_PAGE_VIEWED
2. Pricing Plan Selected
3. PAYMENT_INITIATED
4. PAYMENT_SUCCESSFUL
5. SUBSCRIPTION_CREATED
**配置**:
```
Funnel step 1: SUBSCRIPTION_PAGE_VIEWED
Funnel step 2: Pricing Plan Selected
Funnel step 3: PAYMENT_INITIATED
Funnel step 4: PAYMENT_SUCCESSFUL
Funnel step 5: SUBSCRIPTION_CREATED
Conversion window: 1 hour
Date range: Last 30 days
```
### Insight 3.2: 付费墙转化率
**类型**: Funnel
**步骤**:
1. PAYWALL_SHOWN
2. PAYWALL_UPGRADE_CLICKED
3. SUBSCRIPTION_PAGE_VIEWED
4. PAYMENT_SUCCESSFUL
**配置**:
```
Funnel step 1: PAYWALL_SHOWN
Funnel step 2: PAYWALL_UPGRADE_CLICKED
Funnel step 3: SUBSCRIPTION_PAGE_VIEWED
Funnel step 4: PAYMENT_SUCCESSFUL
Breakdown: feature (付费墙触发功能)
Date range: Last 30 days
```
### Insight 3.3: 定价方案选择分布
**类型**: Pie Chart
**事件**: `Pricing Plan Selected`
**配置**:
```
Event: Pricing Plan Selected
Count of events
Breakdown: plan_name
Date range: Last 30 days
Visualization: Pie
```
### Insight 3.4: 计费周期偏好
**类型**: Bar Chart
**事件**: `Pricing Plan Selected`
**配置**:
```
Event: Pricing Plan Selected
Count of events
Breakdown: billing_cycle
Date range: Last 30 days
Visualization: Bar
```
### Insight 3.5: 支付成功率
**类型**: Trends (Formula)
**计算**: (PAYMENT_SUCCESSFUL / PAYMENT_INITIATED) * 100
**配置**:
```
Series A: PAYMENT_SUCCESSFUL (Count)
Series B: PAYMENT_INITIATED (Count)
Formula: (A / B) * 100
Date range: Last 30 days
Interval: Day
```
### Insight 3.6: 订阅收入趋势
**类型**: Trends
**事件**: `SUBSCRIPTION_CREATED`
**配置**:
```
Event: SUBSCRIPTION_CREATED
Sum of property: amount
Date range: Last 90 days
Interval: Week
```
### Insight 3.7: 支付失败原因分析
**类型**: Table
**事件**: `PAYMENT_FAILED`
**配置**:
```
Event: PAYMENT_FAILED
Count of events
Breakdown: error_reason
Date range: Last 30 days
Order: Descending
```
---
## 🎨 Dashboard 4: 功能使用
### Insight 4.1: 功能使用频率排名
**类型**: Table
**多个事件**: 各功能的关键事件
**配置**:
```
Events:
- Community Page Viewed
- EVENT_DETAIL_VIEWED
- DASHBOARD_CENTER_VIEWED
- TRADING_SIMULATION_ENTERED
- STOCK_OVERVIEW_VIEWED
Count of events
Date range: Last 7 days
Order: Descending
```
### Insight 4.2: 新闻浏览趋势
**类型**: Trends
**事件**: `NEWS_ARTICLE_CLICKED`
**配置**:
```
Event: NEWS_ARTICLE_CLICKED
Count of events
Date range: Last 30 days
Interval: Day
Breakdown: importance (按重要性分组)
```
### Insight 4.3: 搜索使用趋势
**类型**: Trends
**事件**: `SEARCH_QUERY_SUBMITTED`
**配置**:
```
Event: SEARCH_QUERY_SUBMITTED
Count of events
Date range: Last 30 days
Interval: Day
Breakdown: context
```
### Insight 4.4: 模拟盘交易活跃度
**类型**: Trends
**事件**: `Simulation Order Placed`
**配置**:
```
Event: Simulation Order Placed
Count of events
Date range: Last 30 days
Interval: Day
Breakdown: order_type (买入/卖出)
```
### Insight 4.5: 社交互动参与度
**类型**: Trends (Stacked)
**多个事件**:
- Comment Added
- Comment Liked
- CONTENT_SHARED
**配置**:
```
Event 1: Comment Added
Event 2: Comment Liked
Event 3: CONTENT_SHARED
Count of events
Date range: Last 30 days
Interval: Day
Visualization: Area (Stacked)
```
### Insight 4.6: 个人资料完善度
**类型**: Funnel
**步骤**:
1. USER_SIGNED_UP
2. PROFILE_UPDATED
3. Avatar Uploaded
4. Account Bound
**配置**:
```
Funnel step 1: USER_SIGNED_UP
Funnel step 2: PROFILE_UPDATED
Funnel step 3: Avatar Uploaded
Funnel step 4: Account Bound
Date range: Last 30 days
```
---
## 🔍 Dashboard 5: 搜索行为
### Insight 5.1: 搜索量趋势
**类型**: Trends
**事件**: `SEARCH_QUERY_SUBMITTED`
**配置**:
```
Event: SEARCH_QUERY_SUBMITTED
Count of events
Date range: Last 30 days
Interval: Day
```
### Insight 5.2: 搜索无结果率
**类型**: Trends (Formula)
**计算**: (SEARCH_NO_RESULTS / SEARCH_QUERY_SUBMITTED) * 100
**配置**:
```
Series A: SEARCH_NO_RESULTS (Count)
Series B: SEARCH_QUERY_SUBMITTED (Count)
Formula: (A / B) * 100
Date range: Last 30 days
Interval: Day
```
### Insight 5.3: 热门搜索词
**类型**: Table
**事件**: `SEARCH_QUERY_SUBMITTED`
**配置**:
```
Event: SEARCH_QUERY_SUBMITTED
Count of events
Breakdown: query
Date range: Last 7 days
Order: Descending
Limit: Top 20
```
### Insight 5.4: 搜索结果点击率
**类型**: Funnel
**步骤**:
1. SEARCH_QUERY_SUBMITTED
2. SEARCH_RESULT_CLICKED
**配置**:
```
Funnel step 1: SEARCH_QUERY_SUBMITTED
Funnel step 2: SEARCH_RESULT_CLICKED
Breakdown: context
Date range: Last 30 days
```
### Insight 5.5: 搜索筛选使用
**类型**: Table
**事件**: `SEARCH_FILTER_APPLIED`
**配置**:
```
Event: SEARCH_FILTER_APPLIED
Count of events
Breakdown: filter_type
Date range: Last 30 days
Order: Descending
```
---
## 👥 推荐Cohorts用户分组
### Cohort 1: 活跃用户
**条件**:
```
用户在过去7天内执行了
$pageview (至少5次)
```
### Cohort 2: 付费用户
**条件**:
```
用户执行过:
SUBSCRIPTION_CREATED
并且
subscription_tier 不等于 'free'
```
### Cohort 3: 社区活跃用户
**条件**:
```
用户在过去30天内执行了
Comment Added (至少1次)
Comment Liked (至少3次)
```
### Cohort 4: 流失风险用户
**条件**:
```
用户满足:
上次访问时间 > 7天前
并且
历史访问次数 >= 5次
```
### Cohort 5: 高价值潜在用户
**条件**:
```
用户在过去30天内
PAYWALL_SHOWN (至少2次)
并且
未执行过 SUBSCRIPTION_CREATED
并且
$pageview (至少10次)
```
### Cohort 6: 新用户(激活中)
**条件**:
```
用户执行过:
USER_SIGNED_UP (在过去7天内)
```
---
## 🎯 推荐Actions动作定义
### Action 1: 深度参与
**定义**: 用户在单次会话中执行了多个关键操作
**包含事件**:
- NEWS_ARTICLE_CLICKED (至少2次)
- EVENT_DETAIL_VIEWED (至少1次)
- Comment Added 或 Comment Liked (至少1次)
### Action 2: 付费意向
**定义**: 用户展现付费兴趣
**包含事件**:
- PAYWALL_SHOWN
- PAYWALL_UPGRADE_CLICKED
- SUBSCRIPTION_PAGE_VIEWED
### Action 3: 模拟盘活跃
**定义**: 用户积极使用模拟盘
**包含事件**:
- TRADING_SIMULATION_ENTERED
- Simulation Order Placed (至少1次)
- Simulation Holdings Viewed
---
## 📱 配置步骤
### 创建Dashboard
1. 登录PostHog
2. 左侧菜单选择 "Dashboards"
3. 点击 "New dashboard"
4. 输入Dashboard名称如"核心指标Dashboard"
5. 点击 "Create"
### 添加Insight
1. 在Dashboard页面点击 "Add insight"
2. 选择Insight类型Trends/Funnel/Retention等
3. 配置事件和参数
4. 点击 "Save & add to dashboard"
### 配置Cohort
1. 左侧菜单选择 "Cohorts"
2. 点击 "New cohort"
3. 设置Cohort名称
4. 添加筛选条件
5. 点击 "Save"
### 配置Action
1. 左侧菜单选择 "Data management" -> "Actions"
2. 点击 "New action"
3. 选择 "From event or pageview"
4. 添加匹配条件
5. 点击 "Save"
---
## 🔔 推荐Alerts告警配置
### Alert 1: 支付成功率下降
**条件**: 支付成功率 < 80%
**检查频率**: 每小时
**通知方式**: Email + Slack
### Alert 2: 搜索无结果率过高
**条件**: 搜索无结果率 > 30%
**检查频率**: 每天
**通知方式**: Email
### Alert 3: 新用户注册激增
**条件**: 新注册用户数 > 正常值的2倍
**检查频率**: 每小时
**通知方式**: Slack
### Alert 4: 系统异常
**条件**: 错误事件数 > 100/小时
**检查频率**: 每15分钟
**通知方式**: Email + Slack + PagerDuty
---
## 💡 使用建议
### 日常监控
**建议查看频率**: 每天
**关注Dashboard**:
- 核心指标Dashboard
- 收入转化Dashboard
### 周度回顾
**建议查看频率**: 每周一
**关注Dashboard**:
- 用户留存Dashboard
- 功能使用Dashboard
### 月度分析
**建议查看频率**: 每月初
**关注Dashboard**:
- 所有Dashboard
- Cohorts分析
- Retention详细报告
### 决策支持
**使用场景**:
- 功能优先级排序 → 查看功能使用Dashboard
- 转化率优化 → 查看收入转化Dashboard
- 用户流失分析 → 查看用户留存Dashboard
- 搜索体验优化 → 查看搜索行为Dashboard
---
## 📊 高级分析技巧
### 1. Funnel分解分析
在漏斗的每一步添加Breakdown分析不同用户群的转化差异
- 按 subscription_tier 分解
- 按 signup_method 分解
- 按 $os 分解
### 2. Cohort对比
创建多个Cohort在Insights中对比不同群体的行为
- 付费用户 vs 免费用户
- 新用户 vs 老用户
- 活跃用户 vs 流失用户
### 3. Path Analysis
使用Paths功能分析用户旅程
- 从注册到首次付费的路径
- 从首页到核心功能的路径
- 流失用户的最后操作路径
### 4. 时间对比
使用 "Compare to previous period" 功能:
- 本周 vs 上周
- 本月 vs 上月
- 节假日 vs 平常
---
## 🔗 相关资源
- [PostHog Dashboard文档](https://posthog.com/docs/user-guides/dashboards)
- [PostHog Insights文档](https://posthog.com/docs/user-guides/insights)
- [PostHog Cohorts文档](https://posthog.com/docs/user-guides/cohorts)
- [TRACKING_VALIDATION_CHECKLIST.md](./TRACKING_VALIDATION_CHECKLIST.md) - 验证清单
---
**文档版本**: v1.0
**最后更新**: 2025-10-29
**维护者**: 数据分析团队

View File

@@ -1,841 +0,0 @@
# PostHog 事件追踪实施总结
## ✅ 已完成的追踪
### 1. Home 页面(首页/落地页)
**已实施的追踪事件**:
#### 📄 页面浏览
- **事件**: `LANDING_PAGE_VIEWED`
- **触发时机**: 页面加载
- **属性**:
- `timestamp` - 访问时间
- `is_authenticated` - 是否已登录
- `user_id` - 用户ID如果已登录
#### 🎯 功能卡片点击
- **事件**: `FEATURE_CARD_CLICKED`
- **触发时机**: 用户点击任何功能卡片
- **属性**:
- `feature_id` - 功能IDnews-catalyst, concepts, stocks, etc.
- `feature_title` - 功能标题
- `feature_url` - 目标URL
- `is_featured` - 是否为推荐功能(新闻中心为 true
- `link_type` - 链接类型internal/external
**追踪的6个核心功能**:
1. **新闻中心** (`news-catalyst`) - 推荐功能,黄色边框
2. **概念中心** (`concepts`)
3. **个股信息汇总** (`stocks`)
4. **涨停板块分析** (`limit-analyse`)
5. **个股罗盘** (`company`)
6. **模拟盘交易** (`trading-simulation`)
---
### 2. StockOverview 页面(个股中心)✅ 已完成
**注意**:个股中心页面已完全实现 PostHog 追踪,通过 `src/views/StockOverview/hooks/useStockOverviewEvents.js` Hook。
**已实施的追踪事件**:
#### 📄 页面浏览
- **事件**: `STOCK_OVERVIEW_VIEWED`
- **触发时机**: 页面加载
- **属性**:
- `timestamp` - 访问时间
#### 📊 市场统计数据查看
- **事件**: `STOCK_LIST_VIEWED`
- **触发时机**: 加载市场统计数据
- **属性**:
- `total_market_cap` - 总市值
- `total_volume` - 总成交量
- `rising_stocks` - 上涨股票数
- `falling_stocks` - 下跌股票数
- `data_date` - 数据日期
#### 🔍 搜索追踪
- **事件**: `SEARCH_INITIATED` / `STOCK_SEARCHED`
- **触发时机**: 用户输入搜索、完成搜索
- **属性**:
- `query` - 搜索关键词
- `result_count` - 搜索结果数量
- `has_results` - 是否有结果
- `context` - 固定为 'stock_overview'
#### 🎯 搜索结果点击
- **事件**: `SEARCH_RESULT_CLICKED`
- **触发时机**: 用户点击搜索结果
- **属性**:
- `stock_code` - 股票代码
- `stock_name` - 股票名称
- `exchange` - 交易所
- `position` - 在搜索结果中的位置
- `context` - 固定为 'stock_overview'
#### 🔥 概念卡片点击
- **事件**: `CONCEPT_CLICKED`
- **触发时机**: 用户点击热门概念卡片
- **属性**:
- `concept_name` - 概念名称
- `concept_code` - 概念代码
- `change_percent` - 涨跌幅
- `stock_count` - 股票数量
- `rank` - 排名
- `source` - 固定为 'daily_hot_concepts'
#### 🏷️ 概念股票标签点击
- **事件**: `CONCEPT_STOCK_CLICKED`
- **触发时机**: 点击概念下的股票标签
- **属性**:
- `stock_code` - 股票代码
- `stock_name` - 股票名称
- `concept_name` - 所属概念
- `source` - 固定为 'daily_hot_concepts_tag'
#### 📊 热力图股票点击
- **事件**: `STOCK_CLICKED`
- **触发时机**: 点击热力图中的股票
- **属性**:
- `stock_code` - 股票代码
- `stock_name` - 股票名称
- `change_percent` - 涨跌幅
- `market_cap_range` - 市值区间
- `source` - 固定为 'market_heatmap'
#### 📅 日期选择变化
- **事件**: `SEARCH_FILTER_APPLIED`
- **触发时机**: 用户选择不同的交易日期
- **属性**:
- `filter_type` - 固定为 'date'
- `filter_value` - 新选择的日期
- `previous_value` - 之前的日期
- `context` - 固定为 'stock_overview'
**实施方式**: Custom Hook (`useStockOverviewEvents.js`) 已集成
---
### 3. Concept 页面(概念中心)
**已实施的追踪事件**:
#### 📄 页面浏览
- **事件**: `CONCEPT_CENTER_VIEWED`
- **触发时机**: 页面加载
- **属性**:
- `timestamp` - 访问时间
#### 🔍 搜索查询
- **事件**: `SEARCH_QUERY_SUBMITTED`
- **触发时机**: 用户搜索概念
- **属性**:
- `query` - 搜索关键词
- `category` - 固定为 'concept'
- `result_count` - 搜索结果数量
- `has_results` - 是否有结果
#### 🎚️ 筛选追踪
- **事件**: `SEARCH_FILTER_APPLIED`
- **触发时机**: 用户更改筛选条件
- **属性**:
- `filter_type` - 筛选类型sort/date
- `filter_value` - 筛选值
- `previous_value` - 之前的值
- `context` - 固定为 'concept_center'
**支持的筛选类型**:
1. **排序** (`sort`): 涨跌幅/相关度/股票数量/概念名称
2. **日期范围** (`date`): 选择交易日期
#### 🎯 概念卡片点击
- **事件**: `CONCEPT_CLICKED`
- **触发时机**: 用户点击概念卡片
- **属性**:
- `concept_id` - 概念ID
- `concept_name` - 概念名称
- `change_percent` - 涨跌幅
- `stock_count` - 股票数量
- `position` - 在列表中的位置
- `source` - 固定为 'concept_center_list'
#### 👀 查看个股
- **事件**: `CONCEPT_STOCKS_VIEWED`
- **触发时机**: 用户点击"查看个股"按钮
- **属性**:
- `concept_name` - 概念名称
- `stock_count` - 股票数量
- `source` - 固定为 'concept_center'
#### 🏷️ 概念股票点击
- **事件**: `CONCEPT_STOCK_CLICKED`
- **触发时机**: 点击概念股票表格中的股票
- **属性**:
- `stock_code` - 股票代码
- `stock_name` - 股票名称
- `concept_name` - 所属概念
- `source` - 固定为 'concept_center_stock_table'
#### 📊 历史时间轴查看
- **事件**: `CONCEPT_TIMELINE_VIEWED`
- **触发时机**: 用户点击"历史时间轴"按钮
- **属性**:
- `concept_id` - 概念ID
- `concept_name` - 概念名称
- `source` - 固定为 'concept_center'
#### 📄 翻页追踪
- **事件**: `NEWS_LIST_VIEWED`
- **触发时机**: 用户翻页
- **属性**:
- `page` - 页码
- `filters` - 当前筛选条件
- `sort` - 排序方式
- `has_query` - 是否有搜索词
- `date` - 日期
- `context` - 固定为 'concept_center'
#### 🔄 视图模式切换
- **事件**: `VIEW_MODE_CHANGED`
- **触发时机**: 用户切换网格/列表视图
- **属性**:
- `view_mode` - 新视图模式grid/list
- `previous_mode` - 之前的模式
- `context` - 固定为 'concept_center'
---
### 4. Company 页面(公司详情/个股罗盘)
**已实施的追踪事件**:
#### 📄 页面浏览
- **事件**: `COMPANY_PAGE_VIEWED`
- **触发时机**: 页面加载
- **属性**:
- `timestamp` - 访问时间
- `stock_code` - 当前查看的股票代码
#### 🔍 股票搜索
- **事件**: `STOCK_SEARCHED`
- **触发时机**: 用户输入股票代码并查询
- **属性**:
- `query` - 搜索的股票代码
- `stock_code` - 股票代码
- `previous_stock_code` - 之前查看的股票代码
- `context` - 固定为 'company_page'
#### 🔄 Tab 切换
- **事件**: `TAB_CHANGED`
- **触发时机**: 用户切换不同的 Tab
- **属性**:
- `tab_index` - Tab 索引0-3
- `tab_name` - Tab 名称(公司概览/股票行情/财务全景/盈利预测)
- `previous_tab_index` - 之前的 Tab 索引
- `stock_code` - 当前股票代码
- `context` - 固定为 'company_page'
**支持的 Tab**:
1. **公司概览** (index 0): 公司基本信息
2. **股票行情** (index 1): 实时行情数据
3. **财务全景** (index 2): 财务报表分析
4. **盈利预测** (index 3): 盈利预测数据
#### ⭐ 自选股管理
- **事件**: `WATCHLIST_ADDED` / `WATCHLIST_REMOVED`
- **触发时机**: 用户添加/移除自选股
- **属性**:
- `stock_code` - 股票代码
- `source` - 固定为 'company_page'
---
### 5. Community 页面(新闻催化分析)
**已实施的追踪事件**:
#### 📄 页面浏览
- **事件**: `COMMUNITY_PAGE_VIEWED`
- **触发时机**: 页面加载
- **属性**:
- `timestamp` - 访问时间
- `has_hot_events` - 是否有热点事件
- `has_keywords` - 是否有热门关键词
#### 🔍 搜索追踪
- **事件**: `SEARCH_QUERY_SUBMITTED`
- **触发时机**: 用户输入搜索关键词
- **属性**:
- `query` - 搜索关键词
- `category` - 分类(固定为 'news'
- `previous_query` - 上一次搜索词
#### 🎚️ 筛选追踪
- **事件**: `SEARCH_FILTER_APPLIED`
- **触发时机**: 用户更改筛选条件
- **属性**:
- `filter_type` - 筛选类型sort/importance/date_range/industry
- `filter_value` - 筛选值
- `previous_value` - 上一次的值
**支持的筛选类型**:
1. **排序** (`sort`): 最新/最热/重要性
2. **重要性** (`importance`): 全部/高/中/低
3. **时间范围** (`date_range`): 今天/近7天/近30天
4. **行业** (`industry`): 各行业代码
#### 🗞️ 新闻点击追踪
- **事件**: `NEWS_ARTICLE_CLICKED`
- **触发时机**: 用户点击新闻事件
- **属性**:
- `event_id` - 事件ID
- `event_title` - 事件标题
- `importance` - 重要性等级
- `source` - 来源(固定为 'community_page'
- `has_stocks` - 是否包含相关股票
- `has_concepts` - 是否包含相关概念
#### 📖 详情查看追踪
- **事件**: `NEWS_DETAIL_OPENED`
- **触发时机**: 用户点击"查看详情"
- **属性**:
- `event_id` - 事件ID
- `source` - 来源(固定为 'community_page'
#### 📄 翻页追踪
- **事件**: `NEWS_LIST_VIEWED`
- **触发时机**: 用户翻页
- **属性**:
- `page` - 页码
- `filters` - 当前筛选条件
- `sort` - 排序方式
- `importance` - 重要性
- `has_query` - 是否有搜索词
---
## 🛠️ 实施方式
### 方案Custom Hook 集成(推荐)
**优势**:
- ✅ 集中管理,易于维护
- ✅ 自动追踪,无需修改组件
- ✅ 符合关注点分离原则
- ✅ 便于测试和调试
### 修改的文件
#### 0. `src/views/StockOverview/hooks/useStockOverviewEvents.js` ✅
**文件已存在**,无需修改。已完整实现个股中心的所有追踪事件。
#### 1. `src/views/Concept/hooks/useConceptEvents.js`
**新建 Hook 文件**:
```javascript
import { usePostHogTrack } from '../../../hooks/usePostHogRedux';
import { RETENTION_EVENTS } from '../../../lib/constants';
```
**提供的追踪函数**:
- `trackConceptSearched()` - 搜索概念
- `trackFilterApplied()` - 筛选变化
- `trackConceptClicked()` - 概念点击
- `trackConceptStocksViewed()` - 查看个股
- `trackConceptStockClicked()` - 点击概念股票
- `trackConceptTimelineViewed()` - 历史时间轴
- `trackPageChange()` - 翻页
- `trackViewModeChanged()` - 视图切换
#### 2. `src/views/Company/hooks/useCompanyEvents.js`
**新建 Hook 文件**:
```javascript
import { usePostHogTrack } from '../../../hooks/usePostHogRedux';
import { RETENTION_EVENTS } from '../../../lib/constants';
```
**提供的追踪函数**:
- `trackStockSearched()` - 股票搜索
- `trackTabChanged()` - Tab 切换
- `trackWatchlistAdded()` - 加入自选
- `trackWatchlistRemoved()` - 移除自选
#### 3. `src/views/Company/index.js`
**添加的导入**:
```javascript
import { useCompanyEvents } from './hooks/useCompanyEvents';
```
**添加的 Hook**:
```javascript
const {
trackStockSearched,
trackTabChanged,
trackWatchlistAdded,
trackWatchlistRemoved,
} = useCompanyEvents({ stockCode });
```
**添加的 State**:
```javascript
const [currentTabIndex, setCurrentTabIndex] = useState(0);
```
**修改的函数**:
1. **`handleSearch`**: 追踪股票搜索
2. **`handleWatchlistToggle`**: 追踪自选股添加/移除
3. **Tabs `onChange`**: 追踪 Tab 切换
#### 4. `src/views/Concept/index.js`
**添加的导入**:
```javascript
import { useConceptEvents } from './hooks/useConceptEvents';
```
**添加的 Hook**:
```javascript
const {
trackConceptSearched,
trackFilterApplied,
trackConceptClicked,
trackConceptStocksViewed,
trackConceptStockClicked,
trackConceptTimelineViewed,
trackPageChange,
trackViewModeChanged,
} = useConceptEvents({ navigate });
```
**修改的函数**:
1. **`handleSearch`**: 追踪搜索查询
2. **`handleSortChange`**: 追踪排序变化
3. **`handleDateChange`**: 追踪日期变化
4. **`handlePageChange`**: 追踪翻页
5. **`handleConceptClick`**: 追踪概念点击
6. **`handleViewStocks`**: 追踪查看个股
7. **`handleViewContent`**: 追踪历史时间轴
8. **视图切换按钮**: 追踪网格/列表切换
#### 3. `src/views/Home/HomePage.js`
**添加的导入**:
```javascript
import { usePostHogTrack } from '../../hooks/usePostHogRedux';
import { ACQUISITION_EVENTS } from '../../lib/constants';
```
**添加的 Hook**:
```javascript
const { track } = usePostHogTrack();
```
**添加的 useEffect**(页面浏览追踪):
```javascript
useEffect(() => {
track(ACQUISITION_EVENTS.LANDING_PAGE_VIEWED, {
timestamp: new Date().toISOString(),
is_authenticated: isAuthenticated,
user_id: user?.id || null,
});
}, [track, isAuthenticated, user?.id]);
```
**修改的函数**:
- **`handleProductClick`**: 从接收 URL 改为接收完整 feature 对象,添加追踪逻辑
**修改后的代码**:
```javascript
const handleProductClick = useCallback((feature) => {
// 🎯 PostHog 追踪:功能卡片点击
track(ACQUISITION_EVENTS.FEATURE_CARD_CLICKED, {
feature_id: feature.id,
feature_title: feature.title,
feature_url: feature.url,
is_featured: feature.featured || false,
link_type: feature.url.startsWith('http') ? 'external' : 'internal',
});
// 原有导航逻辑
if (feature.url.startsWith('http')) {
window.open(feature.url, '_blank');
} else {
navigate(feature.url);
}
}, [track, navigate]);
```
**更新的 onClick 事件**:
```javascript
// 从
onClick={() => handleProductClick(coreFeatures[0].url)}
// 改为
onClick={() => handleProductClick(coreFeatures[0])}
```
#### 1. `src/views/Community/hooks/useEventFilters.js`
**添加的导入**:
```javascript
import { usePostHogTrack } from '../../../hooks/usePostHogRedux';
import { RETENTION_EVENTS } from '../../../lib/constants';
```
**添加的Hook**:
```javascript
const { track } = usePostHogTrack();
```
**修改的函数**:
1. **`updateFilters`**: 追踪搜索和筛选
2. **`handlePageChange`**: 追踪翻页
3. **`handleEventClick`**: 追踪新闻点击
4. **`handleViewDetail`**: 追踪详情查看
#### 2. `src/views/Community/index.js`
**添加的导入**:
```javascript
import { usePostHogTrack } from '../../hooks/usePostHogRedux';
import { RETENTION_EVENTS } from '../../lib/constants';
```
**添加的Hook**:
```javascript
const { track } = usePostHogTrack();
```
**添加的useEffect**:
```javascript
useEffect(() => {
track(RETENTION_EVENTS.COMMUNITY_PAGE_VIEWED, {
timestamp: new Date().toISOString(),
has_hot_events: hotEvents && hotEvents.length > 0,
has_keywords: popularKeywords && popularKeywords.length > 0,
});
}, [track]);
```
---
## 📊 追踪效果示例
### 用户行为路径示例
**首页转化路径**:
```
1. 游客访问首页
→ 触发: LANDING_PAGE_VIEWED
→ 属性: { is_authenticated: false, user_id: null }
2. 点击"新闻中心"功能卡片
→ 触发: FEATURE_CARD_CLICKED
→ 属性: { feature_id: "news-catalyst", feature_title: "新闻中心", is_featured: true, link_type: "internal" }
3. 进入 Community 页面
→ 触发: COMMUNITY_PAGE_VIEWED
```
**Community 页面行为路径**:
```
1. 用户进入 Community 页面
→ 触发: COMMUNITY_PAGE_VIEWED
2. 用户搜索 "人工智能"
→ 触发: SEARCH_QUERY_SUBMITTED
→ 属性: { query: "人工智能", category: "news" }
3. 用户筛选 "重要性:高"
→ 触发: SEARCH_FILTER_APPLIED
→ 属性: { filter_type: "importance", filter_value: "high" }
4. 用户点击第一条新闻
→ 触发: NEWS_ARTICLE_CLICKED
→ 属性: { event_id: "123", event_title: "...", importance: "high", source: "community_page" }
5. 用户翻到第2页
→ 触发: NEWS_LIST_VIEWED
→ 属性: { page: 2, filters: { sort: "new", importance: "high", has_query: true } }
6. 用户点击"查看详情"
→ 触发: NEWS_DETAIL_OPENED
→ 属性: { event_id: "456", source: "community_page" }
```
---
## 🧪 测试方法
### 1. 使用 Redux DevTools
1. 打开应用:`npm start`
2. 打开浏览器 Redux DevTools
3. 筛选 `posthog/trackEvent` actions
4. 执行各种操作
5. 查看追踪的事件和属性
### 2. 控制台日志
开发环境下PostHog 会自动输出日志:
```
📍 Event tracked: Community Page Viewed { timestamp: "...", has_hot_events: true }
📍 Event tracked: Search Query Submitted { query: "人工智能", category: "news" }
📍 Event tracked: Search Filter Applied { filter_type: "importance", filter_value: "high" }
```
### 3. PostHog Dashboard
1. 登录 PostHog 后台
2. 查看 "Events" 页面
3. 筛选 Community 相关事件:
- `Community Page Viewed`
- `Search Query Submitted`
- `Search Filter Applied`
- `News Article Clicked`
- `News List Viewed`
---
## 📈 数据分析建议
### 1. 搜索行为分析
**问题**: 用户最常搜索什么?
**方法**:
- 筛选 `SEARCH_QUERY_SUBMITTED` 事件
-`query` 属性分组
- 查看 Top 关键词
### 2. 筛选偏好分析
**问题**: 用户更喜欢什么排序方式?
**方法**:
- 筛选 `SEARCH_FILTER_APPLIED` 事件
-`filter_type: "sort"` 筛选
-`filter_value` 分组统计
### 3. 新闻热度分析
**问题**: 哪些新闻最受欢迎?
**方法**:
- 筛选 `NEWS_ARTICLE_CLICKED` 事件
-`event_id` 分组
- 统计点击次数
### 4. 用户旅程分析
**问题**: 用户从搜索到点击的转化率?
**方法**:
- 创建漏斗:
1. `COMMUNITY_PAGE_VIEWED`
2. `SEARCH_QUERY_SUBMITTED`
3. `NEWS_ARTICLE_CLICKED`
- 分析每一步的流失率
---
## 🔧 扩展计划
### 下一步:其他页面追踪
按优先级排序:
1. **Concept概念中心** ⭐⭐⭐
- 搜索概念
- 点击概念卡片
- 查看概念详情
- 点击概念内股票
2. **StockOverview个股中心** ⭐⭐⭐
- 搜索股票
- 点击股票卡片
- 查看股票详情
- 切换 Tab
3. **LimitAnalyse涨停分析** ⭐⭐
- 进入页面
- 点击涨停板块
- 展开板块详情
- 点击涨停个股
4. **TradingSimulation模拟盘** ⭐⭐
- 进入模拟盘
- 下单操作
- 查看持仓
- 查看历史
5. **Company公司详情**
- 查看公司概览
- 查看财务全景
- 查看盈利预测
- Tab 切换
---
## 💡 最佳实践
### 1. 属性命名规范
- 使用 **snake_case** 命名(与 PostHog 推荐一致)
- 属性名要 **描述性强**,易于理解
- 使用 **布尔值** 表示是/否has_xxx, is_xxx
- 使用 **枚举值** 表示类别filter_type: "sort"
### 2. 事件追踪原则
- **追踪用户意图**,而不仅仅是点击
- **添加上下文**帮助分析previous_value, source
- **保持一致性**,相似事件使用相似属性
- **避免敏感信息**,不追踪用户隐私数据
### 3. 性能优化
- 使用 **`usePostHogTrack`** 而不是 `usePostHogRedux`
- 更轻量,只订阅追踪功能
- 避免不必要的重渲染
-**Custom Hooks** 中集成,而不是每个组件
- 集中管理,易于维护
- 减少重复代码
---
## ⚠️ 注意事项
### 1. 依赖管理
确保 `useCallback` 的依赖数组包含 `track`
```javascript
// ✅ 正确
const handleClick = useCallback(() => {
track(EVENT_NAME, { ... });
}, [track]);
// ❌ 错误(缺少 track
const handleClick = useCallback(() => {
track(EVENT_NAME, { ... });
}, []);
```
### 2. 事件去重
避免重复追踪相同事件:
```javascript
// ✅ 正确(只在值变化时追踪)
if (newFilters.sort !== filters.sort) {
track(SEARCH_FILTER_APPLIED, { ... });
}
// ❌ 错误(每次都追踪)
track(SEARCH_FILTER_APPLIED, { ... });
```
### 3. 空值处理
使用安全的属性访问:
```javascript
// ✅ 正确
has_stocks: !!(event.related_stocks && event.related_stocks.length > 0)
// ❌ 错误(可能报错)
has_stocks: event.related_stocks.length > 0
```
---
## 📚 参考资料
- **PostHog Events 文档**: https://posthog.com/docs/data/events
- **PostHog Properties 文档**: https://posthog.com/docs/data/properties
- **Redux PostHog 集成**: `POSTHOG_REDUX_INTEGRATION.md`
- **事件常量定义**: `src/lib/constants.js`
---
## 🎉 总结
### 已实现的功能
- ✅ Home 页面追踪2个事件
- ✅ StockOverview 页面完整追踪10个事件✨ 已完成
- ✅ Concept 页面完整追踪9个事件
- ✅ Company 页面完整追踪5个事件
- ✅ Community 页面完整追踪7个事件
- ✅ Custom Hook 集成方案
- ✅ Redux DevTools 调试支持
- ✅ 详细的事件属性
### 追踪的用户行为
**Home 页面**:
1. **页面访问** - 了解流量来源、登录转化率
2. **功能卡片点击** - 识别最受欢迎的功能
3. **推荐功能效果** - 分析特色功能(新闻中心)的点击率
**StockOverview 页面** ✨:
1. **页面访问** - 了解个股中心流量
2. **搜索行为** - 股票搜索、搜索结果点击
3. **概念交互** - 热门概念点击、概念股票标签点击
4. **热力图交互** - 热力图中股票点击
5. **数据筛选** - 日期选择变化
6. **市场统计** - 市场数据查看
**Concept 页面**:
1. **页面访问** - 了解概念中心流量
2. **搜索行为** - 概念搜索、搜索结果数量
3. **筛选偏好** - 排序方式、日期选择
4. **概念交互** - 概念点击、位置追踪
5. **个股查看** - 查看个股、股票点击
6. **时间轴查看** - 历史时间轴
7. **翻页行为** - 优化分页逻辑
8. **视图切换** - 网格/列表偏好
**Company 页面**:
1. **页面访问** - 了解公司详情页流量
2. **股票搜索** - 用户查询哪些股票
3. **Tab 切换** - 用户最关注哪个 Tab概览/行情/财务/预测)
4. **自选股管理** - 自选股添加/移除行为
5. **股票切换** - 分析用户查看股票的路径
**Community 页面**:
1. **页面访问** - 了解流量来源
2. **搜索行为** - 了解用户需求
3. **筛选偏好** - 优化默认设置
4. **内容点击** - 识别热门内容
5. **详情查看** - 分析用户兴趣
6. **翻页行为** - 优化分页逻辑
### 下一步计划
1. ~~在关键页面实施追踪Home, StockOverview, Concept, Company, Community~~ ✅ 已完成
2. **下一步**:其他页面追踪
- LimitAnalyse涨停分析⭐⭐
- TradingSimulation模拟盘⭐⭐
3. 创建 PostHog Dashboard 和 Insights
4. 设置用户行为漏斗分析
5. 配置 Feature Flags 进行 A/B 测试
---
**Home, StockOverview, Concept, Company, Community 页面追踪全部完成!** 🚀
现在你可以在 PostHog 后台看到完整的用户行为数据:
- **首页** → **个股中心/概念中心/公司详情/新闻中心** 的完整转化路径
- **搜索行为**、**筛选偏好**、**内容点击** 的详细数据
- **Tab 切换**、**视图切换**、**翻页行为** 的用户习惯分析
- **自选股管理** 的用户行为追踪
共追踪 **33个事件**,覆盖 **5个核心页面**

View File

@@ -1,338 +0,0 @@
# 崩溃修复测试指南
> 测试时间2025-10-14
> 测试范围SignInIllustration.js + SignUpIllustration.js
> 服务器地址http://localhost:3000
---
## 🎯 测试目标
验证以下修复是否有效:
- ✅ 响应对象崩溃6处
- ✅ 组件卸载后 setState6处
- ✅ 定时器内存泄漏2处
---
## 📋 测试清单
### ✅ 关键测试(必做)
#### 1. **网络异常测试** - 验证响应对象修复
**登录页面 - 发送验证码**
```
测试步骤:
1. 打开 http://localhost:3000/auth/sign-in
2. 切换到"验证码登录"模式
3. 输入手机号13800138000
4. 打开浏览器开发者工具 (F12) → Network 标签
5. 点击 Offline 模拟断网
6. 点击"发送验证码"按钮
预期结果:
✅ 显示错误提示:"发送验证码失败 - 网络请求失败,请检查网络连接"
✅ 页面不崩溃
✅ 无 JavaScript 错误
修复前:
❌ 页面白屏崩溃
❌ Console 报错Cannot read property 'json' of null
```
**登录页面 - 微信登录**
```
测试步骤:
1. 在登录页面,保持断网状态
2. 点击"扫码登录"按钮
预期结果:
✅ 显示错误提示:"获取微信授权失败 - 网络请求失败,请检查网络连接"
✅ 页面不崩溃
✅ 无 JavaScript 错误
```
**注册页面 - 发送验证码**
```
测试步骤:
1. 打开 http://localhost:3000/auth/sign-up
2. 切换到"验证码注册"模式
3. 输入手机号13800138000
4. 保持断网状态
5. 点击"发送验证码"按钮
预期结果:
✅ 显示错误提示:"发送失败 - 网络请求失败..."
✅ 页面不崩溃
```
---
#### 2. **组件卸载测试** - 验证内存泄漏修复
**倒计时中离开页面**
```
测试步骤:
1. 恢复网络连接
2. 在登录页面输入手机号并发送验证码
3. 等待倒计时开始60秒倒计时
4. 立即点击浏览器后退按钮或切换到其他页面
5. 打开 Console 查看是否有警告
预期结果:
✅ 无警告:"Can't perform a React state update on an unmounted component"
✅ 倒计时定时器正确清理
✅ 无内存泄漏
修复前:
❌ Console 警告Memory leak warning
❌ setState 在组件卸载后仍被调用
```
**请求进行中离开页面**
```
测试步骤:
1. 在注册页面填写完整信息
2. 点击"注册"按钮
3. 在请求响应前loading 状态)快速刷新页面或关闭标签页
4. 打开新标签页查看 Console
预期结果:
✅ 无崩溃
✅ 无警告信息
✅ 请求被正确取消或忽略
```
**注册成功跳转前离开**
```
测试步骤:
1. 完成注册提交
2. 在显示"注册成功"提示后
3. 立即关闭标签页不等待2秒自动跳转
预期结果:
✅ 无警告
✅ navigate 不会在组件卸载后执行
```
---
#### 3. **边界情况测试** - 验证数据完整性检查
**后端返回空响应**
```
测试步骤(需要模拟后端):
1. 使用 Chrome DevTools → Network → 右键请求 → Edit and Resend
2. 修改响应为空对象 {}
3. 观察页面反应
预期结果:
✅ 显示错误:"服务器响应为空"
✅ 不会尝试访问 undefined 属性
✅ 页面不崩溃
```
**后端返回 500 错误**
```
测试步骤:
1. 在登录页面点击"扫码登录"
2. 如果后端返回 500 错误
预期结果:
✅ 显示错误:"获取二维码失败HTTP 500"
✅ 页面不崩溃
```
---
### 🧪 进阶测试(推荐)
#### 4. **弱网环境测试**
**慢速网络模拟**
```
测试步骤:
1. Chrome DevTools → Network → Throttling → Slow 3G
2. 尝试发送验证码
3. 等待 10 秒(超时时间)
预期结果:
✅ 10秒后显示超时错误
✅ 不会无限等待
✅ 用户可以重试
```
**丢包模拟**
```
测试步骤:
1. 使用 Chrome DevTools 模拟丢包
2. 连续点击"发送验证码"多次
预期结果:
✅ 每次请求都有适当的错误提示
✅ 不会因为并发请求而崩溃
✅ 按钮在请求期间正确禁用
```
---
#### 5. **定时器清理测试**
**倒计时清理验证**
```
测试步骤:
1. 在登录页面发送验证码
2. 等待倒计时到 50 秒
3. 快速切换到注册页面
4. 再切换回登录页面
5. 观察倒计时是否重置
预期结果:
✅ 定时器在页面切换时正确清理
✅ 返回登录页面时倒计时重新开始(如果再次发送)
✅ 没有多个定时器同时运行
```
---
#### 6. **并发请求测试**
**快速连续点击**
```
测试步骤:
1. 在登录页面输入手机号
2. 快速连续点击"发送验证码"按钮 5 次
预期结果:
✅ 只发送一次请求(按钮在请求期间禁用)
✅ 不会因为并发而崩溃
✅ 正确显示 loading 状态
```
---
## 🔍 监控指标
### Console 检查清单
在测试过程中,打开 Console (F12) 监控以下内容:
```
✅ 无红色错误Error
✅ 无内存泄漏警告Memory leak warning
✅ 无 setState 警告Can't perform a React state update...
✅ 无 undefined 访问错误Cannot read property of undefined
```
### Network 检查清单
打开 Network 标签监控:
```
✅ 请求超时时间10秒
✅ 失败请求有正确的错误处理
✅ 没有重复的请求
✅ 请求被正确取消(如果页面卸载)
```
### Performance 检查清单
打开 Performance 标签(可选):
```
✅ 无内存泄漏Memory 不会持续增长)
✅ 定时器正确清理Timer count 正确)
✅ EventListener 正确清理
```
---
## 📊 测试记录表
请在测试时填写以下表格:
| 测试项 | 状态 | 问题描述 | 截图 |
|--------|------|---------|------|
| 登录页 - 断网发送验证码 | ⬜ 通过 / ⬜ 失败 | | |
| 登录页 - 断网微信登录 | ⬜ 通过 / ⬜ 失败 | | |
| 注册页 - 断网发送验证码 | ⬜ 通过 / ⬜ 失败 | | |
| 倒计时中离开页面 | ⬜ 通过 / ⬜ 失败 | | |
| 请求进行中离开页面 | ⬜ 通过 / ⬜ 失败 | | |
| 注册成功跳转前离开 | ⬜ 通过 / ⬜ 失败 | | |
| 后端返回空响应 | ⬜ 通过 / ⬜ 失败 | | |
| 慢速网络超时 | ⬜ 通过 / ⬜ 失败 | | |
| 定时器清理 | ⬜ 通过 / ⬜ 失败 | | |
| 并发请求 | ⬜ 通过 / ⬜ 失败 | | |
---
## 🐛 如何报告问题
如果发现问题,请提供:
1. **测试场景**:具体的测试步骤
2. **预期结果**:应该发生什么
3. **实际结果**:实际发生了什么
4. **Console 错误**:完整的错误信息
5. **截图/录屏**:问题的视觉证明
6. **环境信息**
- 浏览器版本
- 操作系统
- 网络状态
---
## ✅ 测试完成检查
测试完成后,确认以下内容:
```
□ 所有关键测试通过
□ Console 无错误
□ Network 请求正常
□ 无内存泄漏警告
□ 用户体验流畅
```
---
## 🎯 快速测试命令
```bash
# 1. 确认服务器运行
curl http://localhost:3000
# 2. 打开浏览器测试
open http://localhost:3000/auth/sign-in
# 3. 查看编译日志
tail -f /tmp/react-build.log
```
---
## 📱 测试页面链接
- **登录页面**: http://localhost:3000/auth/sign-in
- **注册页面**: http://localhost:3000/auth/sign-up
- **首页**: http://localhost:3000/home
---
## 🔧 开发者工具快捷键
```
F12 - 打开开发者工具
Ctrl/Cmd+R - 刷新页面
Ctrl/Cmd+Shift+R - 强制刷新(清除缓存)
Ctrl/Cmd+Shift+C - 元素选择器
```
---
**测试时间**2025-10-14
**预计测试时长**15-30 分钟
**建议测试人员**:开发者 + QA
祝测试顺利!如发现问题请及时反馈。

File diff suppressed because it is too large Load Diff

166
gunicorn_config.py Normal file
View File

@@ -0,0 +1,166 @@
# -*- coding: utf-8 -*-
"""
Gunicorn 配置文件 - app_vx.py 生产环境配置
使用方式:
# 方式1: 使用 gevent 异步模式(推荐,支持高并发)
gunicorn -c gunicorn_config.py -k gevent app_vx:app
# 方式2: 使用同步多进程模式(更稳定)
gunicorn -c gunicorn_config.py app_vx:app
# 方式3: 使用 systemd 管理(见文件末尾 systemd 配置示例)
"""
import os
import multiprocessing
# ==================== 基础配置 ====================
# 绑定地址和端口
bind = '0.0.0.0:5002'
# Worker 进程数(建议 2-4 个,不要太多以避免连接池竞争)
workers = 4
# Worker 类型 - 默认使用 sync 模式,更稳定
# 如果需要 gevent在命令行添加 -k gevent
worker_class = 'sync'
# 每个 worker 处理的最大请求数,超过后重启(防止内存泄漏)
max_requests = 5000
max_requests_jitter = 500 # 随机抖动,避免所有 worker 同时重启
# ==================== 超时配置 ====================
# Worker 超时时间(秒),超过后 worker 会被杀死重启
timeout = 120
# 优雅关闭超时时间(秒)
graceful_timeout = 30
# 保持连接超时时间(秒)
keepalive = 5
# ==================== SSL 配置 ====================
# SSL 证书路径(生产环境需要配置)
cert_file = '/etc/letsencrypt/live/api.valuefrontier.cn/fullchain.pem'
key_file = '/etc/letsencrypt/live/api.valuefrontier.cn/privkey.pem'
if os.path.exists(cert_file) and os.path.exists(key_file):
certfile = cert_file
keyfile = key_file
# ==================== 日志配置 ====================
# 访问日志文件路径(- 表示输出到 stdout
accesslog = '-'
# 错误日志文件路径(- 表示输出到 stderr
errorlog = '-'
# 日志级别debug, info, warning, error, critical
loglevel = 'info'
# 访问日志格式
access_log_format = '%(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s" %(D)s'
# ==================== 进程管理 ====================
# 是否在后台运行daemon 模式)
daemon = False
# PID 文件路径
pidfile = '/tmp/gunicorn_app_vx.pid'
# 进程名称
proc_name = 'app_vx'
# ==================== 预加载配置 ====================
# 是否预加载应用代码
# 重要:设为 False 以确保每个 worker 有独立的连接池实例
# 否则多个 worker 共享同一个连接池会导致竞争和超时
preload_app = False
# ==================== Hook 函数 ====================
def on_starting(server):
"""服务器启动时调用"""
print(f"Gunicorn 服务器正在启动...")
print(f" Workers: {server.app.cfg.workers}")
print(f" Worker Class: {server.app.cfg.worker_class}")
print(f" Bind: {server.app.cfg.bind}")
def when_ready(server):
"""服务准备就绪时调用"""
print("Gunicorn 服务准备就绪!")
print("注意: 缓存将在首次请求时懒加载初始化")
def on_reload(server):
"""服务器重载时调用"""
print("Gunicorn 服务器正在重载...")
def worker_int(worker):
"""Worker 收到 INT 或 QUIT 信号时调用"""
print(f"Worker {worker.pid} 收到中断信号")
def worker_abort(worker):
"""Worker 收到 SIGABRT 信号时调用(超时)"""
print(f"Worker {worker.pid} 超时被终止")
def post_fork(server, worker):
"""Worker 进程 fork 之后调用"""
print(f"Worker {worker.pid} 已启动")
def worker_exit(server, worker):
"""Worker 退出时调用"""
print(f"Worker {worker.pid} 已退出")
def on_exit(server):
"""服务器退出时调用"""
print("Gunicorn 服务器已关闭")
# ==================== systemd 配置示例 ====================
"""
将以下内容保存为 /etc/systemd/system/app_vx.service:
[Unit]
Description=Gunicorn instance to serve app_vx
After=network.target
[Service]
User=www-data
Group=www-data
WorkingDirectory=/path/to/vf_react
Environment="PATH=/path/to/venv/bin"
Environment="USE_GEVENT=true"
ExecStart=/path/to/venv/bin/gunicorn -c gunicorn_config.py app_vx:app
ExecReload=/bin/kill -s HUP $MAINPID
KillMode=mixed
TimeoutStopSec=5
PrivateTmp=true
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
启用服务:
sudo systemctl daemon-reload
sudo systemctl enable app_vx
sudo systemctl start app_vx
sudo systemctl status app_vx
查看日志:
sudo journalctl -u app_vx -f
"""

View File

@@ -781,3 +781,252 @@ async def remove_favorite_event(user_id: str, event_id: int) -> Dict[str, Any]:
return {"success": True, "message": "删除自选事件成功"}
else:
return {"success": False, "message": "未找到该自选事件"}
# ==================== ClickHouse 分钟频数据查询 ====================
from clickhouse_driver import Client as ClickHouseClient
# ClickHouse 连接配置
CLICKHOUSE_CONFIG = {
'host': '222.128.1.157',
'port': 18000,
'user': 'default',
'password': 'Zzl33818!',
'database': 'stock'
}
# ClickHouse 客户端(懒加载)
_clickhouse_client = None
def get_clickhouse_client():
"""获取 ClickHouse 客户端(单例模式)"""
global _clickhouse_client
if _clickhouse_client is None:
_clickhouse_client = ClickHouseClient(
host=CLICKHOUSE_CONFIG['host'],
port=CLICKHOUSE_CONFIG['port'],
user=CLICKHOUSE_CONFIG['user'],
password=CLICKHOUSE_CONFIG['password'],
database=CLICKHOUSE_CONFIG['database']
)
logger.info("ClickHouse client created")
return _clickhouse_client
async def get_stock_minute_data(
code: str,
start_time: Optional[str] = None,
end_time: Optional[str] = None,
limit: int = 240
) -> List[Dict[str, Any]]:
"""
获取股票分钟频数据
Args:
code: 股票代码(例如:'600519''600519.SH'
start_time: 开始时间格式YYYY-MM-DD HH:MM:SS 或 YYYY-MM-DD
end_time: 结束时间格式YYYY-MM-DD HH:MM:SS 或 YYYY-MM-DD
limit: 返回条数默认240一个交易日的分钟数据
Returns:
分钟频数据列表
"""
try:
client = get_clickhouse_client()
# 标准化股票代码ClickHouse 分钟数据使用带后缀格式
# 6开头 -> .SH (上海), 0/3开头 -> .SZ (深圳), 其他 -> .BJ (北京)
if '.' in code:
# 已经有后缀,直接使用
stock_code = code
else:
# 需要添加后缀
if code.startswith('6'):
stock_code = f"{code}.SH"
elif code.startswith('0') or code.startswith('3'):
stock_code = f"{code}.SZ"
else:
stock_code = f"{code}.BJ"
# 构建查询 - 使用字符串格式化ClickHouse 参数化语法兼容性问题)
query = f"""
SELECT
code,
timestamp,
open,
high,
low,
close,
volume,
amt
FROM stock_minute
WHERE code = '{stock_code}'
"""
if start_time:
query += f" AND timestamp >= '{start_time}'"
if end_time:
query += f" AND timestamp <= '{end_time}'"
query += f" ORDER BY timestamp DESC LIMIT {limit}"
# 执行查询
result = client.execute(query, with_column_types=True)
rows = result[0]
columns = [col[0] for col in result[1]]
# 转换为字典列表
data = []
for row in rows:
record = {}
for i, col in enumerate(columns):
value = row[i]
# 处理 datetime 类型
if hasattr(value, 'isoformat'):
record[col] = value.isoformat()
else:
record[col] = value
data.append(record)
logger.info(f"[ClickHouse] 查询分钟数据: code={stock_code}, 返回 {len(data)} 条记录")
return data
except Exception as e:
logger.error(f"[ClickHouse] 查询分钟数据失败: {e}", exc_info=True)
return []
async def get_stock_minute_aggregation(
code: str,
date: str,
interval: int = 5
) -> List[Dict[str, Any]]:
"""
获取股票分钟频数据的聚合(按指定分钟间隔)
Args:
code: 股票代码
date: 日期格式YYYY-MM-DD
interval: 聚合间隔分钟默认5分钟
Returns:
聚合后的K线数据
"""
try:
client = get_clickhouse_client()
# 标准化股票代码
stock_code = code.split('.')[0] if '.' in code else code
# 使用 ClickHouse 的时间函数进行聚合
query = f"""
SELECT
code,
toStartOfInterval(timestamp, INTERVAL {interval} MINUTE) as interval_start,
argMin(open, timestamp) as open,
max(high) as high,
min(low) as low,
argMax(close, timestamp) as close,
sum(volume) as volume,
sum(amt) as amt
FROM stock_minute
WHERE code = %(code)s
AND toDate(timestamp) = %(date)s
GROUP BY code, interval_start
ORDER BY interval_start
"""
params = {'code': stock_code, 'date': date}
result = client.execute(query, params, with_column_types=True)
rows = result[0]
columns = [col[0] for col in result[1]]
data = []
for row in rows:
record = {}
for i, col in enumerate(columns):
value = row[i]
if hasattr(value, 'isoformat'):
record[col] = value.isoformat()
else:
record[col] = value
data.append(record)
logger.info(f"[ClickHouse] 聚合分钟数据: code={stock_code}, date={date}, interval={interval}min, 返回 {len(data)} 条记录")
return data
except Exception as e:
logger.error(f"[ClickHouse] 聚合分钟数据失败: {e}", exc_info=True)
return []
async def get_stock_intraday_statistics(
code: str,
date: str
) -> Dict[str, Any]:
"""
获取股票日内统计数据
Args:
code: 股票代码
date: 日期格式YYYY-MM-DD
Returns:
日内统计数据(开盘价、最高价、最低价、收盘价、成交量、成交额、波动率等)
"""
try:
client = get_clickhouse_client()
stock_code = code.split('.')[0] if '.' in code else code
query = """
SELECT
code,
toDate(timestamp) as trade_date,
argMin(open, timestamp) as open,
max(high) as high,
min(low) as low,
argMax(close, timestamp) as close,
sum(volume) as total_volume,
sum(amt) as total_amount,
count(*) as data_points,
min(timestamp) as first_time,
max(timestamp) as last_time,
(max(high) - min(low)) / min(low) * 100 as intraday_range_pct,
stddevPop(close) as price_volatility
FROM stock_minute
WHERE code = %(code)s
AND toDate(timestamp) = %(date)s
GROUP BY code, trade_date
"""
params = {'code': stock_code, 'date': date}
result = client.execute(query, params, with_column_types=True)
if not result[0]:
return {"success": False, "error": f"未找到 {stock_code}{date} 的分钟数据"}
row = result[0][0]
columns = [col[0] for col in result[1]]
data = {}
for i, col in enumerate(columns):
value = row[i]
if hasattr(value, 'isoformat'):
data[col] = value.isoformat()
else:
data[col] = float(value) if isinstance(value, (int, float)) else value
logger.info(f"[ClickHouse] 日内统计: code={stock_code}, date={date}")
return {"success": True, "data": data}
except Exception as e:
logger.error(f"[ClickHouse] 日内统计失败: {e}", exc_info=True)
return {"success": False, "error": str(e)}

View File

@@ -69,6 +69,8 @@ class ESClient:
},
"plan": {"type": "text"}, # 执行计划(仅 assistant
"steps": {"type": "text"}, # 执行步骤(仅 assistant
"session_title": {"type": "text"}, # 会话标题/概述(新增)
"is_first_message": {"type": "boolean"}, # 是否是会话首条消息(新增)
"timestamp": {"type": "date"}, # 时间戳
"created_at": {"type": "date"}, # 创建时间
}
@@ -105,6 +107,8 @@ class ESClient:
message: str,
plan: Optional[str] = None,
steps: Optional[str] = None,
session_title: Optional[str] = None,
is_first_message: bool = False,
) -> str:
"""
保存聊天消息
@@ -118,6 +122,8 @@ class ESClient:
message: 消息内容
plan: 执行计划(可选)
steps: 执行步骤(可选)
session_title: 会话标题(可选,通常在首条消息时设置)
is_first_message: 是否是会话首条消息
Returns:
文档ID
@@ -136,6 +142,8 @@ class ESClient:
"message_embedding": embedding if embedding else None,
"plan": plan,
"steps": steps,
"session_title": session_title,
"is_first_message": is_first_message,
"timestamp": datetime.now(),
"created_at": datetime.now(),
}
@@ -157,10 +165,10 @@ class ESClient:
limit: 返回数量
Returns:
会话列表每个会话包含session_id, last_message, last_timestamp
会话列表每个会话包含session_id, title, last_message, last_timestamp
"""
try:
# 聚合查询:按 session_id 分组,获取每个会话的最后一条消息
# 聚合查询:按 session_id 分组,获取每个会话的最后一条消息和标题
query = {
"query": {
"term": {"user_id": user_id}
@@ -180,7 +188,15 @@ class ESClient:
"top_hits": {
"size": 1,
"sort": [{"timestamp": {"order": "desc"}}],
"_source": ["message", "timestamp", "message_type"]
"_source": ["message", "timestamp", "message_type", "session_title"]
}
},
# 获取首条消息(包含标题)
"first_message": {
"top_hits": {
"size": 1,
"sort": [{"timestamp": {"order": "asc"}}],
"_source": ["session_title", "message"]
}
}
}
@@ -193,11 +209,21 @@ class ESClient:
sessions = []
for bucket in result["aggregations"]["sessions"]["buckets"]:
session_data = bucket["last_message_content"]["hits"]["hits"][0]["_source"]
last_msg = bucket["last_message_content"]["hits"]["hits"][0]["_source"]
first_msg = bucket["first_message"]["hits"]["hits"][0]["_source"]
# 优先使用 session_title否则使用首条消息的前30字符
title = (
last_msg.get("session_title") or
first_msg.get("session_title") or
first_msg.get("message", "")[:30]
)
sessions.append({
"session_id": bucket["key"],
"last_message": session_data["message"],
"last_timestamp": session_data["timestamp"],
"title": title,
"last_message": last_msg["message"],
"last_timestamp": last_msg["timestamp"],
"message_count": bucket["doc_count"],
})

2780
mcp_quant.py Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -5,59 +5,59 @@
"homepage": "/",
"dependencies": {
"@ant-design/icons": "^6.0.0",
"@asseinfo/react-kanban": "^2.2.0",
"@chakra-ui/icons": "^2.1.1",
"@chakra-ui/react": "^2.8.2",
"@chakra-ui/theme-tools": "^1.3.6",
"@chakra-ui/icons": "^2.2.6",
"@chakra-ui/react": "^2.10.9",
"@chakra-ui/theme-tools": "^2.2.6",
"@emotion/cache": "^11.4.0",
"@emotion/react": "^11.4.0",
"@emotion/styled": "^11.3.0",
"@fontsource/open-sans": "^4.5.0",
"@fontsource/raleway": "^4.5.0",
"@fontsource/roboto": "^4.5.0",
"@fullcalendar/daygrid": "^5.9.0",
"@fullcalendar/interaction": "^5.9.0",
"@fullcalendar/react": "^5.9.0",
"@fullcalendar/core": "^6.1.19",
"@fullcalendar/daygrid": "^6.1.19",
"@fullcalendar/interaction": "^6.1.19",
"@fullcalendar/react": "^6.1.19",
"@reduxjs/toolkit": "^2.9.2",
"@splidejs/react-splide": "^0.7.12",
"@tanstack/react-virtual": "^3.13.12",
"@tippyjs/react": "^4.2.6",
"@visx/responsive": "^3.12.0",
"@visx/scale": "^3.12.0",
"@visx/text": "^3.12.0",
"@visx/visx": "^3.12.0",
"@visx/wordcloud": "^3.12.0",
"antd": "^5.27.4",
"apexcharts": "^3.27.3",
"axios": "^1.10.0",
"classnames": "^2.5.1",
"d3": "^7.9.0",
"date-fns": "^2.23.0",
"dayjs": "^1.11.19",
"draft-js": "^0.11.7",
"echarts": "^5.6.0",
"echarts-for-react": "^3.0.2",
"echarts-wordcloud": "^2.1.0",
"framer-motion": "^4.1.17",
"framer-motion": "^12.23.24",
"fullcalendar": "^5.9.0",
"globalize": "^1.7.0",
"history": "^5.3.0",
"klinecharts": "^10.0.0-beta1",
"lucide-react": "^0.540.0",
"match-sorter": "6.3.0",
"moment": "^2.29.1",
"nouislider": "15.0.0",
"posthog-js": "^1.281.0",
"react": "18.3.1",
"posthog-js": "^1.295.0",
"react": "^19.0.0",
"react-apexcharts": "^1.3.9",
"react-big-calendar": "^0.33.2",
"react-bootstrap-sweetalert": "5.2.0",
"react-circular-slider-svg": "^0.1.5",
"react-custom-scrollbars-2": "^4.4.0",
"react-datetime": "^3.0.4",
"react-dom": "^18.3.1",
"react-dropzone": "^11.4.2",
"react-dom": "^19.0.0",
"react-github-btn": "^1.2.1",
"react-icons": "^4.12.0",
"react-input-pin-code": "^1.1.5",
"react-is": "^19.0.0",
"react-just-parallax": "^3.1.16",
"react-jvectormap": "0.0.16",
"react-markdown": "^10.1.0",
"react-quill": "^2.0.0-beta.4",
"react-redux": "^9.2.0",
"react-responsive": "^10.0.1",
"react-responsive-masonry": "^2.7.1",
@@ -65,29 +65,28 @@
"react-scripts": "^5.0.1",
"react-scroll": "^1.8.4",
"react-scroll-into-view": "^2.1.3",
"react-swipeable-views": "0.13.9",
"react-table": "^7.7.0",
"react-tagsinput": "3.19.0",
"react-to-print": "^2.13.0",
"react-to-print": "^3.0.3",
"react-tsparticles": "^2.12.2",
"react-wordcloud": "^1.2.7",
"recharts": "^3.1.2",
"remark-gfm": "^4.0.1",
"sass": "^1.49.9",
"scroll-lock": "^2.1.5",
"socket.io-client": "^4.7.4",
"styled-components": "^5.3.11",
"stylis": "^4.0.10",
"stylis-plugin-rtl": "^2.1.1",
"tsparticles-slim": "^2.12.0",
"typescript": "^5.9.3"
},
"resolutions": {
"react-error-overlay": "6.0.9",
"@types/react": "18.2.0",
"@types/react-dom": "18.2.0"
"@types/react": "^19.0.0",
"@types/react-dom": "^19.0.0"
},
"overrides": {
"uuid": "^9.0.1"
"uuid": "^9.0.1",
"react": "^19.0.0",
"react-dom": "^19.0.0"
},
"scripts": {
"prestart": "kill-port 3000",
@@ -100,7 +99,7 @@
"frontend:test": "NODE_OPTIONS='--openssl-legacy-provider --max_old_space_size=4096' env-cmd -f .env.test craco start",
"dev": "npm start",
"backend": "python app.py",
"build": "NODE_OPTIONS='--openssl-legacy-provider --max_old_space_size=4096' env-cmd -f .env.production craco build && gulp licenses",
"build": "NODE_OPTIONS='--openssl-legacy-provider --max_old_space_size=4096' TSC_COMPILE_ON_ERROR=true DISABLE_ESLINT_PLUGIN=true env-cmd -f .env.production craco build && gulp licenses",
"build:analyze": "NODE_OPTIONS='--openssl-legacy-provider --max_old_space_size=4096' ANALYZE=true craco build",
"test": "craco test --env=jsdom",
"eject": "react-scripts eject",
@@ -117,12 +116,11 @@
"devDependencies": {
"@craco/craco": "^7.1.0",
"@types/node": "^20.19.25",
"@types/react": "^18.2.0",
"@types/react-dom": "^18.2.0",
"@types/react": "^19.0.0",
"@types/react-dom": "^19.0.0",
"@typescript-eslint/eslint-plugin": "^8.46.4",
"@typescript-eslint/parser": "^8.46.4",
"ajv": "^8.17.1",
"autoprefixer": "^10.4.21",
"concurrently": "^8.2.2",
"env-cmd": "^11.0.0",
"eslint-config-prettier": "8.3.0",
@@ -134,7 +132,6 @@
"imagemin-pngquant": "^10.0.0",
"kill-port": "^2.0.1",
"msw": "^2.11.5",
"postcss": "^8.5.6",
"prettier": "2.2.1",
"react-error-overlay": "6.0.9",
"sharp": "^0.34.4",

View File

@@ -1,6 +0,0 @@
module.exports = {
plugins: [
require('tailwindcss'),
require('autoprefixer'),
],
}

Binary file not shown.

BIN
public/LOGO_badge.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

553
public/htmls/TPU芯片.html Normal file
View File

@@ -0,0 +1,553 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>TPU芯片 - AI算力的架构革命</title>
<script src="https://cdn.tailwindcss.com"></script>
<link href="https://cdn.jsdelivr.net/npm/daisyui@4.4.19/dist/full.min.css" rel="stylesheet" type="text/css" />
<script src="https://unpkg.com/aos@2.3.1/dist/aos.js"></script>
<link href="https://unpkg.com/aos@2.3.1/dist/aos.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<style>
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap');
body {
font-family: 'Inter', sans-serif;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
min-height: 100vh;
}
.glass-effect {
background: rgba(255, 255, 255, 0.1);
backdrop-filter: blur(10px);
border: 1px solid rgba(255, 255, 255, 0.2);
}
.gradient-text {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.timeline-dot {
position: relative;
z-index: 1;
}
.timeline-line {
position: absolute;
left: 50%;
top: 0;
bottom: 0;
width: 2px;
background: linear-gradient(to bottom, transparent, #667eea, #764ba2, transparent);
transform: translateX(-50%);
}
.stat-card {
transition: all 0.3s ease;
}
.stat-card:hover {
transform: translateY(-5px);
box-shadow: 0 20px 40px rgba(0, 0, 0, 0.1);
}
.table-responsive {
overflow-x: auto;
}
.table-responsive::-webkit-scrollbar {
height: 8px;
}
.table-responsive::-webkit-scrollbar-track {
background: #f1f1f1;
border-radius: 10px;
}
.table-responsive::-webkit-scrollbar-thumb {
background: #888;
border-radius: 10px;
}
.table-responsive::-webkit-scrollbar-thumb:hover {
background: #555;
}
.pulse-animation {
animation: pulse 2s infinite;
}
@keyframes pulse {
0% {
box-shadow: 0 0 0 0 rgba(102, 126, 234, 0.7);
}
70% {
box-shadow: 0 0 0 10px rgba(102, 126, 234, 0);
}
100% {
box-shadow: 0 0 0 0 rgba(102, 126, 234, 0);
}
}
</style>
</head>
<body>
<!-- Hero Section -->
<div class="relative min-h-screen flex items-center justify-center text-white">
<div class="absolute inset-0 bg-black opacity-50"></div>
<div class="relative z-10 text-center px-4 max-w-6xl mx-auto">
<h1 class="text-5xl md:text-7xl font-bold mb-6" data-aos="fade-up">
TPU芯片
</h1>
<p class="text-xl md:text-3xl mb-8" data-aos="fade-up" data-aos-delay="200">
AI算力的架构革命
</p>
<div class="grid grid-cols-1 md:grid-cols-3 gap-6 mt-12" data-aos="fade-up" data-aos-delay="400">
<div class="glass-effect p-6 rounded-2xl">
<div class="text-4xl font-bold mb-2">4614</div>
<div class="text-lg">TFLOPS算力</div>
<div class="text-sm mt-2 opacity-80">TPU v7 (Ironwood)</div>
</div>
<div class="glass-effect p-6 rounded-2xl">
<div class="text-4xl font-bold mb-2">980万亿</div>
<div class="text-lg">Tokens调用量</div>
<div class="text-sm mt-2 opacity-80">2025年7月预期</div>
</div>
<div class="glass-effect p-6 rounded-2xl">
<div class="text-4xl font-bold mb-2">3-5倍</div>
<div class="text-lg">性价比优势</div>
<div class="text-sm mt-2 opacity-80">对比GPU</div>
</div>
</div>
</div>
<div class="absolute bottom-10 left-1/2 transform -translate-x-1/2 animate-bounce">
<svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 14l-7 7m0 0l-7-7m7 7V3"></path>
</svg>
</div>
</div>
<!-- Timeline Section -->
<div class="py-20 bg-white">
<div class="max-w-7xl mx-auto px-4">
<h2 class="text-4xl font-bold text-center mb-16 gradient-text">发展时间轴</h2>
<div class="relative">
<div class="timeline-line hidden md:block"></div>
<div class="space-y-12">
<div class="flex flex-col md:flex-row items-center" data-aos="fade-right">
<div class="md:w-1/2 md:pr-8 text-right">
<div class="glass-effect p-6 rounded-xl inline-block">
<h3 class="text-2xl font-bold mb-2">2023年12月</h3>
<p class="text-gray-600">发布TPU v5p性能较v4提升2.8倍</p>
</div>
</div>
<div class="timeline-dot w-4 h-4 bg-purple-600 rounded-full mx-4 my-4"></div>
<div class="md:w-1/2 md:pl-8"></div>
</div>
<div class="flex flex-col md:flex-row items-center" data-aos="fade-left">
<div class="md:w-1/2 md:pr-8"></div>
<div class="timeline-dot w-4 h-4 bg-purple-600 rounded-full mx-4 my-4"></div>
<div class="md:w-1/2 md:pl-8">
<div class="glass-effect p-6 rounded-xl inline-block">
<h3 class="text-2xl font-bold mb-2">2024年8月</h3>
<p class="text-gray-600">苹果使用8192颗TPU v4训练AI模型</p>
</div>
</div>
</div>
<div class="flex flex-col md:flex-row items-center" data-aos="fade-right">
<div class="md:w-1/2 md:pr-8 text-right">
<div class="glass-effect p-6 rounded-xl inline-block pulse-animation">
<h3 class="text-2xl font-bold mb-2">2025年4月9日</h3>
<p class="text-gray-600">TPU v7 (Ironwood)正式发布</p>
<p class="text-sm text-purple-600 mt-2">4614 TFLOPS算力 · 192GB HBM3e</p>
</div>
</div>
<div class="timeline-dot w-4 h-4 bg-purple-600 rounded-full mx-4 my-4"></div>
<div class="md:w-1/2 md:pl-8"></div>
</div>
</div>
</div>
</div>
</div>
<!-- Core Logic Section -->
<div class="py-20 bg-gray-50">
<div class="max-w-7xl mx-auto px-4">
<h2 class="text-4xl font-bold text-center mb-16 gradient-text">核心驱动力</h2>
<div class="grid grid-cols-1 md:grid-cols-3 gap-8">
<div class="stat-card bg-white p-8 rounded-2xl shadow-xl" data-aos="zoom-in" data-aos-delay="100">
<div class="w-16 h-16 bg-purple-100 rounded-full flex items-center justify-center mb-6">
<svg class="w-8 h-8 text-purple-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 3v2m6-2v2M9 19v2m6-2v2M5 9H3m2 6H3m18-6h-2m2 6h-2M7 19h10a2 2 0 002-2V7a2 2 0 00-2-2H7a2 2 0 00-2 2v10a2 2 0 002 2zM9 9h6v6H9V9z"></path>
</svg>
</div>
<h3 class="text-xl font-bold mb-4">硬件架构颠覆</h3>
<p class="text-gray-600 mb-4">脉动阵列 + 3D Torus网络拓扑</p>
<div class="text-sm text-purple-600 font-semibold">
利用率: 50%+ (GPU仅20-40%)
</div>
</div>
<div class="stat-card bg-white p-8 rounded-2xl shadow-xl" data-aos="zoom-in" data-aos-delay="200">
<div class="w-16 h-16 bg-purple-100 rounded-full flex items-center justify-center mb-6">
<svg class="w-8 h-8 text-purple-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 8c-1.657 0-3 .895-3 2s1.343 2 3 2 3 .895 3 2-1.343 2-3 2m0-8c1.11 0 2.08.402 2.599 1M12 8V7m0 1v8m0 0v1m0-1c-1.11 0-2.08-.402-2.599-1M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path>
</svg>
</div>
<h3 class="text-xl font-bold mb-4">TCO碾压优势</h3>
<p class="text-gray-600 mb-4">租赁成本仅为H100的1/4</p>
<div class="text-sm text-purple-600 font-semibold">
H100: 7万美元/月 → TPU: 3万美元/月
</div>
</div>
<div class="stat-card bg-white p-8 rounded-2xl shadow-xl" data-aos="zoom-in" data-aos-delay="300">
<div class="w-16 h-16 bg-purple-100 rounded-full flex items-center justify-center mb-6">
<svg class="w-8 h-8 text-purple-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 10V3L4 14h7v7l9-11h-7z"></path>
</svg>
</div>
<h3 class="text-xl font-bold mb-4">生态开放拐点</h3>
<p class="text-gray-600 mb-4">TPU+XLA对标GPU+CUDA</p>
<div class="text-sm text-purple-600 font-semibold">
Meta、OpenAI等外部客户接入
</div>
</div>
</div>
</div>
</div>
<!-- Industry Chain Section -->
<div class="py-20 bg-white">
<div class="max-w-7xl mx-auto px-4">
<h2 class="text-4xl font-bold text-center mb-16 gradient-text">产业链价值分布</h2>
<div class="mb-12">
<canvas id="valueChart" width="400" height="200"></canvas>
</div>
<div class="grid grid-cols-2 md:grid-cols-4 gap-4 text-center">
<div class="p-4 bg-purple-50 rounded-lg">
<div class="text-2xl font-bold text-purple-600">30-35%</div>
<div class="text-gray-600">PCB</div>
</div>
<div class="p-4 bg-blue-50 rounded-lg">
<div class="text-2xl font-bold text-blue-600">20-25%</div>
<div class="text-gray-600">HBM</div>
</div>
<div class="p-4 bg-green-50 rounded-lg">
<div class="text-2xl font-bold text-green-600">15-20%</div>
<div class="text-gray-600">电源模块</div>
</div>
<div class="p-4 bg-yellow-50 rounded-lg">
<div class="text-2xl font-bold text-yellow-600">10-15%</div>
<div class="text-gray-600">OCS光交换</div>
</div>
</div>
</div>
</div>
<!-- Stocks Table Section -->
<div class="py-20 bg-gray-50">
<div class="max-w-7xl mx-auto px-4">
<h2 class="text-4xl font-bold text-center mb-16 gradient-text">相关标的</h2>
<div class="table-responsive bg-white rounded-2xl shadow-xl overflow-hidden">
<table class="w-full">
<thead class="bg-gradient-to-r from-purple-600 to-purple-800 text-white">
<tr>
<th class="px-6 py-4 text-left">股票名称</th>
<th class="px-6 py-4 text-left">分类</th>
<th class="px-6 py-4 text-left">相关性</th>
<th class="px-6 py-4 text-left">信源</th>
<th class="px-6 py-4 text-center">优先级</th>
</tr>
</thead>
<tbody>
<tr class="border-b hover:bg-purple-50 transition-colors">
<td class="px-6 py-4 font-semibold">光库科技</td>
<td class="px-6 py-4"><span class="badge badge-primary">OCS光交换</span></td>
<td class="px-6 py-4">谷歌OCS独家代工厂单台3万美元</td>
<td class="px-6 py-4">网传纪要</td>
<td class="px-6 py-4 text-center"><span class="text-2xl">⭐⭐⭐⭐⭐</span></td>
</tr>
<tr class="border-b hover:bg-purple-50 transition-colors">
<td class="px-6 py-4 font-semibold">新雷能</td>
<td class="px-6 py-4"><span class="badge badge-secondary">电源</span></td>
<td class="px-6 py-4">意向订单超5亿美元国产替代</td>
<td class="px-6 py-4">网传纪要</td>
<td class="px-6 py-4 text-center"><span class="text-2xl">⭐⭐⭐⭐⭐</span></td>
</tr>
<tr class="border-b hover:bg-purple-50 transition-colors">
<td class="px-6 py-4 font-semibold">胜宏科技</td>
<td class="px-6 py-4"><span class="badge badge-accent">PCB</span></td>
<td class="px-6 py-4">V7大份额一供价值量翻倍</td>
<td class="px-6 py-4">网传纪要</td>
<td class="px-6 py-4 text-center"><span class="text-2xl">⭐⭐⭐⭐</span></td>
</tr>
<tr class="border-b hover:bg-purple-50 transition-colors">
<td class="px-6 py-4 font-semibold">沪电股份</td>
<td class="px-6 py-4"><span class="badge badge-accent">PCB</span></td>
<td class="px-6 py-4">供应份额30-40%主导30-40层板</td>
<td class="px-6 py-4">网传纪要</td>
<td class="px-6 py-4 text-center"><span class="text-2xl">⭐⭐⭐⭐</span></td>
</tr>
<tr class="border-b hover:bg-purple-50 transition-colors">
<td class="px-6 py-4 font-semibold">中际旭创</td>
<td class="px-6 py-4"><span class="badge badge-info">光模块</span></td>
<td class="px-6 py-4">谷歌份额60%+,确定性最高</td>
<td class="px-6 py-4">网传纪要</td>
<td class="px-6 py-4 text-center"><span class="text-2xl">⭐⭐⭐⭐</span></td>
</tr>
<tr class="border-b hover:bg-purple-50 transition-colors">
<td class="px-6 py-4 font-semibold">东材科技</td>
<td class="px-6 py-4"><span class="badge badge-warning">M9材料</span></td>
<td class="px-6 py-4">台光核心高速树脂主力供应商</td>
<td class="px-6 py-4">网传纪要</td>
<td class="px-6 py-4 text-center"><span class="text-2xl">⭐⭐⭐</span></td>
</tr>
<tr class="border-b hover:bg-purple-50 transition-colors">
<td class="px-6 py-4 font-semibold">天普股份</td>
<td class="px-6 py-4"><span class="badge badge-error">国产TPU</span></td>
<td class="px-6 py-4">中昊芯英拟要约收购</td>
<td class="px-6 py-4">公告</td>
<td class="px-6 py-4 text-center"><span class="text-2xl">⭐⭐</span></td>
</tr>
<tr class="hover:bg-purple-50 transition-colors">
<td class="px-6 py-4 font-semibold">深南电路</td>
<td class="px-6 py-4"><span class="badge badge-accent">PCB</span></td>
<td class="px-6 py-4">供应V7 44层板份额10-15%</td>
<td class="px-6 py-4">网传纪要</td>
<td class="px-6 py-4 text-center"><span class="text-2xl">⭐⭐⭐</span></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<!-- Risks Section -->
<div class="py-20 bg-white">
<div class="max-w-7xl mx-auto px-4">
<h2 class="text-4xl font-bold text-center mb-16 gradient-text">潜在风险</h2>
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
<div class="alert alert-warning shadow-lg" data-aos="fade-up">
<svg class="stroke-current flex-shrink-0 h-6 w-6" fill="none" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"></path>
</svg>
<div>
<h3 class="font-bold">软件生态成熟度</h3>
<div class="text-xs">TPU+XLA生态仍落后CUDA 5年以上</div>
</div>
</div>
<div class="alert alert-error shadow-lg" data-aos="fade-up" data-aos-delay="100">
<svg class="stroke-current flex-shrink-0 h-6 w-6" fill="none" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z"></path>
</svg>
<div>
<h3 class="font-bold">HBM供应瓶颈</h3>
<div class="text-xs">2025年HBM产能被英伟达抢占</div>
</div>
</div>
<div class="alert alert-info shadow-lg" data-aos="fade-up" data-aos-delay="200">
<svg class="stroke-current flex-shrink-0 h-6 w-6" fill="none" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path>
</svg>
<div>
<h3 class="font-bold">客户集中度风险</h3>
<div class="text-xs">85%需求来自谷歌内部</div>
</div>
</div>
<div class="alert alert-warning shadow-lg" data-aos="fade-up" data-aos-delay="300">
<svg class="stroke-current flex-shrink-0 h-6 w-6" fill="none" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"></path>
</svg>
<div>
<h3 class="font-bold">架构专利壁垒</h3>
<div class="text-xs">国产TPU面临侵权风险</div>
</div>
</div>
<div class="alert alert-error shadow-lg" data-aos="fade-up" data-aos-delay="400">
<svg class="stroke-current flex-shrink-0 h-6 w-6" fill="none" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z"></path>
</svg>
<div>
<h3 class="font-bold">同业追赶</h3>
<div class="text-xs">Meta、AWS ASIC 2026年量产</div>
</div>
</div>
<div class="alert alert-info shadow-lg" data-aos="fade-up" data-aos-delay="500">
<svg class="stroke-current flex-shrink-0 h-6 w-6" fill="none" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path>
</svg>
<div>
<h3 class="font-bold">应用场景局限</h3>
<div class="text-xs">新兴架构(Mamba)适配性差</div>
</div>
</div>
</div>
</div>
</div>
<!-- Catalysts Section -->
<div class="py-20 bg-gray-50">
<div class="max-w-7xl mx-auto px-4">
<h2 class="text-4xl font-bold text-center mb-16 gradient-text">关键催化剂</h2>
<div class="timeline">
<div class="timeline-item" data-aos="fade-up">
<div class="timeline-marker bg-purple-600"></div>
<div class="timeline-content">
<h3 class="text-xl font-bold mb-2">近期 (2025Q2-Q4)</h3>
<ul class="list-disc list-inside text-gray-600 space-y-1">
<li>Ironwood量产验证与正式上架</li>
<li>Anthropic 100万颗TPU订单交付</li>
<li>供应链订单落地胜宏、光库Q2财报</li>
<li>国产TPU产业化突破</li>
</ul>
</div>
</div>
<div class="timeline-item" data-aos="fade-up" data-aos-delay="200">
<div class="timeline-marker bg-blue-600"></div>
<div class="timeline-content">
<h3 class="text-xl font-bold mb-2">中期 (2025-2026)</h3>
<ul class="list-disc list-inside text-gray-600 space-y-1">
<li>JAX XLA生态开放给第三方开发者</li>
<li>产业链进入量价齐升阶段</li>
<li>国产TPU在特定领域落地</li>
</ul>
</div>
</div>
<div class="timeline-item" data-aos="fade-up" data-aos-delay="400">
<div class="timeline-marker bg-green-600"></div>
<div class="timeline-content">
<h3 class="text-xl font-bold mb-2">长期 (2025-2027)</h3>
<ul class="list-disc list-inside text-gray-600 space-y-1">
<li>AI ASIC市场750亿美元三分天下</li>
<li>TPU推理市场份额超40%</li>
<li>HDI技术替代高多层PCB</li>
</ul>
</div>
</div>
</div>
</div>
</div>
<!-- Conclusion Section -->
<div class="py-20 bg-gradient-to-r from-purple-600 to-purple-800 text-white">
<div class="max-w-4xl mx-auto px-4 text-center">
<h2 class="text-4xl font-bold mb-8" data-aos="fade-up">投资启示</h2>
<div class="grid grid-cols-1 md:grid-cols-2 gap-8 mb-12">
<div class="glass-effect p-6 rounded-2xl" data-aos="fade-up" data-aos-delay="100">
<h3 class="text-2xl font-bold mb-4">💡 核心策略</h3>
<p class="text-lg">"抓两头,放中间"</p>
<ul class="text-left mt-4 space-y-2">
<li>• 抓"增量"OCS、电源0到1机会</li>
<li>• 抓"龙头"PCB量价齐升</li>
<li>• 避开"伪主题"国产TPU专利风险</li>
</ul>
</div>
<div class="glass-effect p-6 rounded-2xl" data-aos="fade-up" data-aos-delay="200">
<h3 class="text-2xl font-bold mb-4">🎯 最具价值环节</h3>
<div class="space-y-3 text-left">
<div class="flex justify-between items-center">
<span>光库科技(OCS)</span>
<span class="text-yellow-300">★★★★★</span>
</div>
<div class="flex justify-between items-center">
<span>新雷能(电源)</span>
<span class="text-yellow-300">★★★★★</span>
</div>
<div class="flex justify-between items-center">
<span>胜宏/沪电(PCB)</span>
<span class="text-yellow-300">★★★★</span>
</div>
</div>
</div>
</div>
<div class="text-xl italic" data-aos="fade-up" data-aos-delay="300">
"TPU不是GPU的简单替代而是AI算力架构的重新定义"
</div>
</div>
</div>
<!-- Footer -->
<footer class="bg-gray-900 text-white py-8">
<div class="max-w-7xl mx-auto px-4 text-center">
<p class="text-sm opacity-75">数据来源新闻、路演、Insight分析 | 更新时间2025年</p>
<p class="text-xs mt-2 opacity-50">注:投资有风险,本文仅供参考</p>
</div>
</footer>
<script>
// Initialize AOS
AOS.init({
duration: 1000,
once: true
});
// Chart.js for value distribution
const ctx = document.getElementById('valueChart').getContext('2d');
const valueChart = new Chart(ctx, {
type: 'doughnut',
data: {
labels: ['PCB', 'HBM', '电源模块', 'OCS光交换', '光模块', '其他'],
datasets: [{
data: [32.5, 22.5, 17.5, 12.5, 7.5, 7.5],
backgroundColor: [
'rgba(147, 51, 234, 0.8)',
'rgba(59, 130, 246, 0.8)',
'rgba(34, 197, 94, 0.8)',
'rgba(250, 204, 21, 0.8)',
'rgba(239, 68, 68, 0.8)',
'rgba(107, 114, 128, 0.8)'
],
borderColor: [
'rgba(147, 51, 234, 1)',
'rgba(59, 130, 246, 1)',
'rgba(34, 197, 94, 1)',
'rgba(250, 204, 21, 1)',
'rgba(239, 68, 68, 1)',
'rgba(107, 114, 128, 1)'
],
borderWidth: 2
}]
},
options: {
responsive: true,
maintainAspectRatio: false,
plugins: {
legend: {
position: 'bottom',
labels: {
padding: 20,
font: {
size: 14
}
}
},
tooltip: {
callbacks: {
label: function(context) {
return context.label + ': ' + context.parsed + '%';
}
}
}
}
}
});
// Smooth scroll
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
anchor.addEventListener('click', function (e) {
e.preventDefault();
document.querySelector(this.getAttribute('href')).scrollIntoView({
behavior: 'smooth'
});
});
});
</script>
</body>
</html>

View File

@@ -0,0 +1,736 @@
我将为您创建一个关于券商合并预期概念的现代化HTML页面融合金融专业性和视觉美感。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>券商合并预期 - 打造金融国家队</title>
<script src="https://cdn.tailwindcss.com"></script>
<link href="https://cdn.jsdelivr.net/npm/daisyui@4.4.19/dist/full.min.css" rel="stylesheet" type="text/css" />
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<style>
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&display=swap');
body {
font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
min-height: 100vh;
}
.glass-effect {
background: rgba(255, 255, 255, 0.95);
backdrop-filter: blur(10px);
border: 1px solid rgba(255, 255, 255, 0.2);
}
.timeline-dot {
animation: pulse 2s infinite;
}
@keyframes pulse {
0% {
box-shadow: 0 0 0 0 rgba(99, 102, 241, 0.7);
}
70% {
box-shadow: 0 0 0 10px rgba(99, 102, 241, 0);
}
100% {
box-shadow: 0 0 0 0 rgba(99, 102, 241, 0);
}
}
.stock-row:hover {
background: linear-gradient(90deg, rgba(99, 102, 241, 0.1) 0%, rgba(168, 85, 247, 0.1) 100%);
transform: translateX(5px);
transition: all 0.3s ease;
}
.gradient-text {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.card-hover {
transition: all 0.3s ease;
}
.card-hover:hover {
transform: translateY(-5px);
box-shadow: 0 20px 40px rgba(0,0,0,0.1);
}
.timeline-line {
background: linear-gradient(180deg, #667eea 0%, #764ba2 100%);
}
::-webkit-scrollbar {
width: 8px;
}
::-webkit-scrollbar-track {
background: #f1f1f1;
}
::-webkit-scrollbar-thumb {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
border-radius: 4px;
}
.badge-glow {
box-shadow: 0 0 10px rgba(99, 102, 241, 0.5);
}
</style>
</head>
<body>
<!-- Navigation -->
<div class="navbar glass-effect sticky top-0 z-50 px-4 py-3">
<div class="flex-1">
<a class="btn btn-ghost text-xl font-bold gradient-text">券商合并预期</a>
</div>
<div class="flex-none gap-2">
<button class="btn btn-ghost btn-circle">
<i class="fas fa-chart-line"></i>
</button>
<button class="btn btn-ghost btn-circle">
<i class="fas fa-bell"></i>
</button>
</div>
</div>
<!-- Hero Section -->
<div class="hero min-h-[60vh] glass-effect mx-4 mt-4 rounded-3xl" style="background-image: url('https://picsum.photos/seed/finance-merge/1920/800');">
<div class="hero-overlay bg-opacity-60 rounded-3xl"></div>
<div class="hero-content text-center text-white">
<div class="max-w-4xl">
<h1 class="mb-5 text-5xl font-bold animate-fade-in">
打造金融国家队
</h1>
<p class="mb-5 text-xl">
券商合并预期 - 从政策推动到价值重塑的三阶段演进
</p>
<div class="flex justify-center gap-4 mb-8">
<div class="stat glass-effect rounded-lg px-6 py-4">
<div class="stat-value text-2xl">2-3家</div>
<div class="stat-desc">2035年国际投行目标</div>
</div>
<div class="stat glass-effect rounded-lg px-6 py-4">
<div class="stat-value text-2xl">10家</div>
<div class="stat-desc">2025年优质机构目标</div>
</div>
<div class="stat glass-effect rounded-lg px-6 py-4">
<div class="stat-value text-2xl">50%↑</div>
<div class="stat-desc">CR5资产占比目标</div>
</div>
</div>
<button class="btn btn-primary btn-lg" onclick="scrollToSection('timeline')">
探索政策时间轴 <i class="fas fa-arrow-down ml-2"></i>
</button>
</div>
</div>
</div>
<div class="container mx-auto px-4 py-8">
<!-- 政策时间轴 -->
<section id="timeline" class="mb-12">
<h2 class="text-3xl font-bold mb-8 text-white text-center">政策演进时间轴</h2>
<div class="timeline glass-effect rounded-2xl p-8">
<div class="relative">
<div class="timeline-line absolute left-8 top-0 bottom-0 w-1"></div>
<div class="mb-8 flex items-center">
<div class="timeline-dot w-4 h-4 bg-indigo-600 rounded-full absolute left-6"></div>
<div class="ml-16 glass-effect rounded-lg p-4 card-hover">
<div class="badge badge-primary badge-glow">2023年10月</div>
<h3 class="font-bold text-lg mt-2">中央金融工作会议</h3>
<p>首次提出"金融强国"目标,明确支持国有大型金融机构做优做强</p>
</div>
</div>
<div class="mb-8 flex items-center">
<div class="timeline-dot w-4 h-4 bg-purple-600 rounded-full absolute left-6"></div>
<div class="ml-16 glass-effect rounded-lg p-4 card-hover">
<div class="badge badge-secondary badge-glow">2024年3月</div>
<h3 class="font-bold text-lg mt-2">证监会指导意见</h3>
<p>明确5年内形成10家优质头部机构2035年形成2-3家国际投行</p>
</div>
</div>
<div class="mb-8 flex items-center">
<div class="timeline-dot w-4 h-4 bg-pink-600 rounded-full absolute left-6"></div>
<div class="ml-16 glass-effect rounded-lg p-4 card-hover">
<div class="badge badge-accent badge-glow">2024年4月</div>
<h3 class="font-bold text-lg mt-2">新"国九条"</h3>
<p>国务院层面首次支持投行通过并购重组提升核心竞争力</p>
</div>
</div>
<div class="mb-8 flex items-center">
<div class="timeline-dot w-4 h-4 bg-green-600 rounded-full absolute left-6"></div>
<div class="ml-16 glass-effect rounded-lg p-4 card-hover">
<div class="badge badge-success badge-glow">2024年9月</div>
<h3 class="font-bold text-lg mt-2">国泰君安+海通证券</h3>
<p>新"国九条"后首例头部券商合并总资产1.62万亿</p>
</div>
</div>
<div class="mb-8 flex items-center">
<div class="timeline-dot w-4 h-4 bg-yellow-600 rounded-full absolute left-6"></div>
<div class="ml-16 glass-effect rounded-lg p-4 card-hover">
<div class="badge badge-warning badge-glow">2025年11月</div>
<h3 class="font-bold text-lg mt-2">中金公司"一对二"合并</h3>
<p>一次性合并东兴、信达证券总资产达1万亿超出市场预期</p>
</div>
</div>
</div>
</div>
</section>
<!-- 核心逻辑与市场认知 -->
<section class="mb-12">
<h2 class="text-3xl font-bold mb-8 text-white text-center">核心逻辑与预期差</h2>
<div class="grid grid-cols-1 md:grid-cols-3 gap-6">
<div class="glass-effect rounded-2xl p-6 card-hover">
<div class="text-4xl mb-4">🏛️</div>
<h3 class="text-xl font-bold mb-3">政策强制力</h3>
<p class="text-gray-700">不同于以往市场化并购,本轮是"只许成功,不许失败"的国家战略,行政推动力度空前</p>
<div class="mt-4">
<div class="badge badge-info">顶层设计</div>
<div class="badge badge-error">硬性约束</div>
</div>
</div>
<div class="glass-effect rounded-2xl p-6 card-hover">
<div class="text-4xl mb-4">📉</div>
<h3 class="text-xl font-bold mb-3">行业生存压力</h3>
<p class="text-gray-700">经纪业务佣金率从8‱降至不足1‱IPO收紧、再融资停滞中小券商面临生存危机</p>
<div class="mt-4">
<div class="badge badge-warning">盈亏平衡</div>
<div class="badge badge-secondary">供给扭转</div>
</div>
</div>
<div class="glass-effect rounded-2xl p-6 card-hover">
<div class="text-4xl mb-4">💹</div>
<h3 class="text-xl font-bold mb-3">估值修复空间</h3>
<p class="text-gray-700">券商板块PB处于历史1.18%分位国泰君安PB仅0.88倍较中信存在100%修复空间</p>
<div class="mt-4">
<div class="badge badge-success">历史底部</div>
<div class="badge badge-primary">机构低配</div>
</div>
</div>
</div>
</section>
<!-- 关键催化剂 -->
<section class="mb-12">
<h2 class="text-3xl font-bold mb-8 text-white text-center">关键催化剂</h2>
<div class="glass-effect rounded-2xl p-8">
<div class="grid grid-cols-1 md:grid-cols-2 gap-6">
<div class="bg-gradient-to-r from-purple-500 to-pink-500 rounded-xl p-6 text-white">
<i class="fas fa-calendar-alt text-3xl mb-4"></i>
<h3 class="text-xl font-bold mb-2">2025年12月-2026年1月</h3>
<p>国泰君安/海通合并后首份协同效应数据披露,验证"1+1"增量价值</p>
</div>
<div class="bg-gradient-to-r from-blue-500 to-cyan-500 rounded-xl p-6 text-white">
<i class="fas fa-chart-pie text-3xl mb-4"></i>
<h3 class="text-xl font-bold mb-2">2026年Q1</h3>
<p>中金公司吸收东兴、信达证券方案公布,汇金系整合路径明朗</p>
</div>
<div class="bg-gradient-to-r from-green-500 to-teal-500 rounded-xl p-6 text-white">
<i class="fas fa-landmark text-3xl mb-4"></i>
<h3 class="text-xl font-bold mb-2">2026年3月</h3>
<p>证监会《一流投行建设意见》中期评估,出台更具体鼓励政策</p>
</div>
<div class="bg-gradient-to-r from-orange-500 to-red-500 rounded-xl p-6 text-white">
<i class="fas fa-city text-3xl mb-4"></i>
<h3 class="text-xl font-bold mb-2">2026年Q2</h3>
<p>地方两会明确券商整合时间表,浙江系、深圳系后续动作</p>
</div>
</div>
</div>
</section>
<!-- 股票数据表格 -->
<section class="mb-12">
<h2 class="text-3xl font-bold mb-8 text-white text-center">券商股权结构全景图</h2>
<div class="glass-effect rounded-2xl p-6 overflow-x-auto">
<table class="table w-full">
<thead>
<tr class="bg-gradient-to-r from-indigo-500 to-purple-500 text-white">
<th>券商名称</th>
<th>分类</th>
<th>实际控制人/第一大股东</th>
<th>持股比例</th>
<th>消息来源</th>
<th>合并逻辑</th>
</tr>
</thead>
<tbody>
<tr class="stock-row">
<td class="font-bold">申万宏源</td>
<td><span class="badge badge-primary">汇金系</span></td>
<td>中央汇金投资有限责任公司</td>
<td>49.70%</td>
<td>年报</td>
<td class="text-sm">实际控制人中央汇金投资有限责任公司持股49.70%</td>
</tr>
<tr class="stock-row">
<td class="font-bold">中国银河</td>
<td><span class="badge badge-primary">汇金系</span></td>
<td>中央汇金投资有限责任公司</td>
<td>32.76%</td>
<td>年报</td>
<td class="text-sm">实际控制人中央汇金投资有限责任公司持股32.76%</td>
</tr>
<tr class="stock-row">
<td class="font-bold">东兴证券</td>
<td><span class="badge badge-secondary">财政系</span></td>
<td>国务院国资委</td>
<td>32.28%</td>
<td>年报</td>
<td class="text-sm">实际控制人国务院国资委持股32.28%</td>
</tr>
<tr class="stock-row">
<td class="font-bold">信达证券</td>
<td><span class="badge badge-secondary">财政系</span></td>
<td>国务院</td>
<td>45.63%</td>
<td>年报</td>
<td class="text-sm">实际控制人国务院持股45.63%</td>
</tr>
<tr class="stock-row">
<td class="font-bold">中信证券</td>
<td><span class="badge badge-info">中信系</span></td>
<td>中国中信金融控股有限公司</td>
<td>18.45%</td>
<td>年报</td>
<td class="text-sm">第一大股东中国中信金融控股有限公司持股18.45%</td>
</tr>
<tr class="stock-row">
<td class="font-bold">中金财富证券</td>
<td><span class="badge badge-info">中信系</span></td>
<td>北京金融控股集团有限公司</td>
<td>35.81%</td>
<td>年报</td>
<td class="text-sm">第一大股东北京金融控股集团有限公司持股35.81%</td>
</tr>
<tr class="stock-row">
<td class="font-bold">方正证券</td>
<td><span class="badge badge-warning">平安系</span></td>
<td>新方正控股发展有限责任公司</td>
<td>28.71%</td>
<td>年报</td>
<td class="text-sm">新方正控股发展有限责任公司持股28.71%</td>
</tr>
<tr class="stock-row">
<td class="font-bold">平安证券</td>
<td><span class="badge badge-warning">平安系</span></td>
<td>-</td>
<td>-</td>
<td>年报</td>
<td class="text-sm">未上市</td>
</tr>
<tr class="stock-row">
<td class="font-bold">华安证券</td>
<td><span class="badge badge-success">安徽系</span></td>
<td>安徽省国资委</td>
<td>32.97%</td>
<td>年报</td>
<td class="text-sm">实际控制人安徽省国资委持股32.97%</td>
</tr>
<tr class="stock-row">
<td class="font-bold">国元证券</td>
<td><span class="badge badge-success">安徽系</span></td>
<td>安徽省国资委</td>
<td>28.45%</td>
<td>年报</td>
<td class="text-sm">实际控制人安徽省国资委持股28.45%</td>
</tr>
<tr class="stock-row">
<td class="font-bold">浙商证券</td>
<td><span class="badge badge-accent">浙江系</span></td>
<td>浙江交投投资集团</td>
<td>26.38%</td>
<td>年报</td>
<td class="text-sm">实际控制人浙江交投投资集团持股26.38%</td>
</tr>
<tr class="stock-row">
<td class="font-bold">财通证券</td>
<td><span class="badge badge-accent">浙江系</span></td>
<td>浙江省财政厅</td>
<td>32.40%</td>
<td>年报</td>
<td class="text-sm">实际控制人浙江省财政厅持股32.40%</td>
</tr>
<tr class="stock-row">
<td class="font-bold">华鑫股份</td>
<td><span class="badge badge-error">上海系</span></td>
<td>上海市国资委</td>
<td>55.26%</td>
<td>年报</td>
<td class="text-sm">实际控制人上海市国资委持股55.26%</td>
</tr>
<tr class="stock-row">
<td class="font-bold">国泰君安</td>
<td><span class="badge badge-error">上海系</span></td>
<td>上海国际集团有限公司</td>
<td>18.83%</td>
<td>年报</td>
<td class="text-sm">实际控制人上海国际集团有限公司持股18.83%</td>
</tr>
<tr class="stock-row">
<td class="font-bold">华泰证券</td>
<td><span class="badge badge-info">江苏系</span></td>
<td>江苏省国资委</td>
<td>28.59%</td>
<td>年报</td>
<td class="text-sm">实际控制人江苏省国资委持股28.59%</td>
</tr>
<tr class="stock-row">
<td class="font-bold">东吴证券</td>
<td><span class="badge badge-info">江苏系</span></td>
<td>苏州市国资委</td>
<td>27.80%</td>
<td>年报</td>
<td class="text-sm">实际控制人苏州市国资委持股27.80%</td>
</tr>
<tr class="stock-row">
<td class="font-bold">南京证券</td>
<td><span class="badge badge-info">江苏系</span></td>
<td>南京市国资委</td>
<td>28.90%</td>
<td>年报</td>
<td class="text-sm">实际控制人南京市国资委持股28.90%</td>
</tr>
<tr class="stock-row">
<td class="font-bold">国联民生</td>
<td><span class="badge badge-info">江苏系</span></td>
<td>无锡市国资委</td>
<td>35.12%</td>
<td>年报</td>
<td class="text-sm">实际控制人无锡市国资委持股35.12%</td>
</tr>
<tr class="stock-row">
<td class="font-bold">天风证券</td>
<td><span class="badge badge-warning">湖北系</span></td>
<td>湖北省财政厅</td>
<td>28.14%</td>
<td>年报</td>
<td class="text-sm">实际控制人湖北省财政厅持股28.14%</td>
</tr>
<tr class="stock-row">
<td class="font-bold">长江证券</td>
<td><span class="badge badge-warning">湖北系</span></td>
<td>长江产业投资集团有限公司</td>
<td>17.41%</td>
<td>年报</td>
<td class="text-sm">第一大股东长江产业投资集团有限公司持股17.41%</td>
</tr>
<tr class="stock-row">
<td class="font-bold">西南证券</td>
<td><span class="badge badge-secondary">川渝系</span></td>
<td>重庆市国资委</td>
<td>31.12%</td>
<td>年报</td>
<td class="text-sm">实际控制人重庆市国资委持股31.12%</td>
</tr>
<tr class="stock-row">
<td class="font-bold">华西证券</td>
<td><span class="badge badge-secondary">川渝系</span></td>
<td>泸州市国资委</td>
<td>21.07%</td>
<td>年报</td>
<td class="text-sm">实际控制人泸州市国资委持股21.07%</td>
</tr>
<tr class="stock-row">
<td class="font-bold">第一创业</td>
<td><span class="badge badge-primary">北京系</span></td>
<td>北京国有资本运营管理有限公司</td>
<td>11.06%</td>
<td>年报</td>
<td class="text-sm">第一大股东北京国有资本运营管理有限公司持股11.06%</td>
</tr>
<tr class="stock-row">
<td class="font-bold">首创证券</td>
<td><span class="badge badge-primary">北京系</span></td>
<td>北京市国资委</td>
<td>82.39%</td>
<td>年报</td>
<td class="text-sm">实际控制人北京市国资委持股82.39%</td>
</tr>
<tr class="stock-row">
<td class="font-bold">兴业证券</td>
<td><span class="badge badge-success">福建系</span></td>
<td>福建省财政厅</td>
<td>20.49%</td>
<td>年报</td>
<td class="text-sm">实际控制人福建省财政厅持股20.49%</td>
</tr>
<tr class="stock-row">
<td class="font-bold">华福证券</td>
<td><span class="badge badge-success">福建系</span></td>
<td>-</td>
<td>-</td>
<td>年报</td>
<td class="text-sm">未上市</td>
</tr>
<tr class="stock-row">
<td class="font-bold">锦龙股份</td>
<td><span class="badge badge-accent">东莞系</span></td>
<td>杨志茂</td>
<td>18.80%</td>
<td>年报</td>
<td class="text-sm">实际控制人杨志茂持股18.80%</td>
</tr>
<tr class="stock-row">
<td class="font-bold">东莞证券</td>
<td><span class="badge badge-accent">东莞系</span></td>
<td>-</td>
<td>-</td>
<td>公开资料</td>
<td class="text-sm">2024年9月23日锦龙股份董事会通过转让东莞证券20%股份事项</td>
</tr>
<tr class="stock-row">
<td class="font-bold">中山证券</td>
<td><span class="badge badge-accent">东莞系</span></td>
<td>-</td>
<td>-</td>
<td>公开资料</td>
<td class="text-sm">锦龙股份持有中山证券67.78%股权</td>
</tr>
<tr class="stock-row">
<td class="font-bold">西部证券</td>
<td><span class="badge badge-error">最新推进</span></td>
<td>-</td>
<td>-</td>
<td>公开资料</td>
<td class="text-sm">西部证券在2025年9月成功控股国融证券</td>
</tr>
<tr class="stock-row">
<td class="font-bold">国信证券</td>
<td><span class="badge badge-error">最新推进</span></td>
<td>-</td>
<td>-</td>
<td>公开资料</td>
<td class="text-sm">2025年8月21日证监会核准国信证券成为万和证券主要股东</td>
</tr>
</tbody>
</table>
</div>
</section>
<!-- 投资建议 -->
<section class="mb-12">
<h2 class="text-3xl font-bold mb-8 text-white text-center">投资策略与风险提示</h2>
<div class="grid grid-cols-1 md:grid-cols-2 gap-6">
<div class="glass-effect rounded-2xl p-6">
<h3 class="text-2xl font-bold mb-4 gradient-text">最具投资价值方向</h3>
<div class="space-y-4">
<div class="alert alert-success">
<i class="fas fa-chart-line"></i>
<div>
<h4 class="font-bold">头部券商A+H股套利</h4>
<p class="text-sm">国泰君安H股、中信证券H股港股折价50%存在30-40%套利空间</p>
</div>
</div>
<div class="alert alert-info">
<i class="fas fa-shield-alt"></i>
<div>
<h4 class="font-bold">地方国资"唯一牌照"</h4>
<p class="text-sm">首创证券、东吴证券,地方国资做强动力,市值小并购期权未充分定价</p>
</div>
</div>
<div class="alert alert-warning">
<i class="fas fa-laptop-code"></i>
<div>
<h4 class="font-bold">金融IT真受益标的</h4>
<p class="text-sm">财富趋势、指南针C端流量平台合并后获客成本下降20%</p>
</div>
</div>
</div>
</div>
<div class="glass-effect rounded-2xl p-6">
<h3 class="text-2xl font-bold mb-4 gradient-text">核心跟踪指标</h3>
<div class="overflow-x-auto">
<table class="table table-zebra">
<thead>
<tr>
<th>指标类别</th>
<th>触发条件</th>
</tr>
</thead>
<tbody>
<tr>
<td>审批速度</td>
<td>受理到批复合计<90天</td>
</tr>
<tr>
<td>ROE提升</td>
<td>国泰君安+海通ROE>7.5%</td>
</tr>
<tr>
<td>市场情绪</td>
<td>成交额占比>5%</td>
</tr>
<tr>
<td>估值修复</td>
<td>PB回升至分位30%+</td>
</tr>
<tr>
<td>人才稳定</td>
<td>核心人员流失率<10%</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</section>
<!-- 风险矩阵 -->
<section class="mb-12">
<h2 class="text-3xl font-bold mb-8 text-white text-center">风险矩阵</h2>
<div class="glass-effect rounded-2xl p-8">
<canvas id="riskChart" width="400" height="200"></canvas>
</div>
</section>
</div>
<!-- Footer -->
<footer class="glass-effect mt-12 py-8">
<div class="container mx-auto px-4 text-center">
<p class="text-gray-600">© 2024 券商合并预期分析报告 | 数据来源:公开资料整理</p>
<div class="mt-4 flex justify-center gap-4">
<a href="#" class="text-gray-400 hover:text-gray-600"><i class="fab fa-github text-2xl"></i></a>
<a href="#" class="text-gray-400 hover:text-gray-600"><i class="fab fa-twitter text-2xl"></i></a>
<a href="#" class="text-gray-400 hover:text-gray-600"><i class="fab fa-linkedin text-2xl"></i></a>
</div>
</div>
</footer>
<script>
// 平滑滚动
function scrollToSection(sectionId) {
document.getElementById(sectionId).scrollIntoView({ behavior: 'smooth' });
}
// 风险矩阵图表
const ctx = document.getElementById('riskChart').getContext('2d');
const riskChart = new Chart(ctx, {
type: 'bubble',
data: {
datasets: [{
label: '整合风险',
data: [{x: 5, y: 5, r: 25}],
backgroundColor: 'rgba(255, 99, 132, 0.6)'
}, {
label: '政策风险',
data: [{x: 4, y: 4, r: 20}],
backgroundColor: 'rgba(255, 159, 64, 0.6)'
}, {
label: '市场风险',
data: [{x: 3, y: 3, r: 15}],
backgroundColor: 'rgba(255, 205, 86, 0.6)'
}, {
label: '财务风险',
data: [{x: 2, y: 2, r: 10}],
backgroundColor: 'rgba(75, 192, 192, 0.6)'
}, {
label: '股东风险',
data: [{x: 1, y: 1, r: 8}],
backgroundColor: 'rgba(54, 162, 235, 0.6)'
}]
},
options: {
responsive: true,
plugins: {
legend: {
position: 'bottom',
},
tooltip: {
callbacks: {
label: function(context) {
const label = context.dataset.label || '';
const impact = '影响程度: ' + context.parsed.y + '★';
const probability = '发生概率: ' + context.parsed.x + '★';
return [label, impact, probability];
}
}
}
},
scales: {
x: {
title: {
display: true,
text: '发生概率'
},
min: 0,
max: 6
},
y: {
title: {
display: true,
text: '影响程度'
},
min: 0,
max: 6
}
}
}
});
// 动画效果
document.addEventListener('DOMContentLoaded', function() {
const cards = document.querySelectorAll('.card-hover');
cards.forEach((card, index) => {
setTimeout(() => {
card.style.opacity = '0';
card.style.transform = 'translateY(20px)';
card.style.transition = 'all 0.5s ease';
setTimeout(() => {
card.style.opacity = '1';
card.style.transform = 'translateY(0)';
}, 100);
}, index * 100);
});
});
</script>
</body>
</html>
这个HTML页面完整展现了券商合并预期概念的核心内容包括
1. **视觉设计**:采用渐变色背景、玻璃态效果、卡片悬浮动画等现代设计元素,营造专业金融科技感
2. **核心内容展示**
- Hero区域突出"打造金融国家队"主题
- 政策时间轴清晰展示演进过程
- 三层核心逻辑可视化呈现
- 关键催化剂时间表
- 完整的券商股权结构数据表格(响应式设计,支持横向滚动)
3. **交互功能**
- 平滑滚动导航
- 表格行悬停效果
- 风险矩阵气泡图
- 卡片动画效果
4. **数据呈现**
- 股票数据表格完整展示所有券商信息
- 使用徽章区分不同派系
- 颜色编码增强可读性
5. **投资价值**
- 明确的投资方向建议
- 核心跟踪指标
- 风险提示与应对策略
页面完全响应式设计,适配各种设备屏幕,同时保持了金融专业性和视觉美感的平衡。

View File

@@ -0,0 +1,971 @@
我将为您创建一个详实且炫酷的华为AI容器概念展示页面。这个页面将完整呈现Insight的深度内容并以现代化的设计风格展示相关股票数据。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>华为AI容器 - 算力效率革命的战略突围</title>
<script src="https://cdn.tailwindcss.com"></script>
<link href="https://cdn.jsdelivr.net/npm/daisyui@4.4.19/dist/full.min.css" rel="stylesheet" type="text/css" />
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<script src="https://unpkg.com/lucide@latest"></script>
<style>
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&display=swap');
* {
font-family: 'Inter', system-ui, -apple-system, sans-serif;
}
.gradient-bg {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
}
.glass-effect {
background: rgba(255, 255, 255, 0.1);
backdrop-filter: blur(10px);
border: 1px solid rgba(255, 255, 255, 0.2);
}
.timeline-line {
background: linear-gradient(180deg, #667eea 0%, #764ba2 100%);
}
.hover-lift {
transition: all 0.3s ease;
}
.hover-lift:hover {
transform: translateY(-5px);
box-shadow: 0 20px 40px rgba(0,0,0,0.1);
}
.text-gradient {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.pulse-dot {
animation: pulse 2s infinite;
}
@keyframes pulse {
0% {
box-shadow: 0 0 0 0 rgba(102, 126, 234, 0.7);
}
70% {
box-shadow: 0 0 0 10px rgba(102, 126, 234, 0);
}
100% {
box-shadow: 0 0 0 0 rgba(102, 126, 234, 0);
}
}
.stock-table {
overflow-x: auto;
-webkit-overflow-scrolling: touch;
}
.stock-table::-webkit-scrollbar {
height: 6px;
}
.stock-table::-webkit-scrollbar-track {
background: #f1f1f1;
border-radius: 10px;
}
.stock-table::-webkit-scrollbar-thumb {
background: #667eea;
border-radius: 10px;
}
.tag-cloud span {
transition: all 0.2s ease;
}
.tag-cloud span:hover {
transform: scale(1.05);
z-index: 10;
}
.metric-card {
transition: all 0.3s ease;
}
.metric-card:hover {
transform: scale(1.02);
}
</style>
</head>
<body class="bg-gray-50">
<!-- Hero Section -->
<div class="gradient-bg text-white">
<div class="container mx-auto px-4 py-16">
<div class="flex flex-col lg:flex-row items-center justify-between">
<div class="lg:w-2/3 mb-8 lg:mb-0">
<div class="flex items-center gap-2 mb-4">
<span class="bg-white/20 px-3 py-1 rounded-full text-sm">核心概念</span>
<span class="bg-red-500 text-white px-3 py-1 rounded-full text-sm flex items-center gap-1">
<i data-lucide="flame" class="w-4 h-4"></i>
舆情热度 20251120
</span>
</div>
<h1 class="text-4xl lg:text-6xl font-bold mb-4">华为AI容器</h1>
<p class="text-xl lg:text-2xl mb-6 opacity-90">算力效率革命的战略突围</p>
<p class="text-lg opacity-80 mb-8">在美国先进制程封锁倒逼下,通过系统级软件创新实现算力效率革命</p>
<div class="flex flex-wrap gap-3">
<div class="glass-effect px-4 py-2 rounded-lg">
<i data-lucide="calendar" class="inline w-5 h-5 mr-2"></i>
2025年11月21日发布
</div>
<div class="glass-effect px-4 py-2 rounded-lg">
<i data-lucide="code-2" class="inline w-5 h-5 mr-2"></i>
开源Flex:ai技术
</div>
<div class="glass-effect px-4 py-2 rounded-lg">
<i data-lucide="target" class="inline w-5 h-5 mr-2"></i>
对标英伟达AI技术
</div>
</div>
</div>
<div class="lg:w-1/3">
<div class="glass-effect rounded-2xl p-6">
<h3 class="text-xl font-semibold mb-4">核心催化剂</h3>
<div class="space-y-3">
<div class="flex items-start gap-3">
<div class="w-8 h-8 bg-white/20 rounded-full flex items-center justify-center flex-shrink-0 pulse-dot">
<span class="text-sm font-bold">1</span>
</div>
<div>
<p class="font-semibold">2025年9月</p>
<p class="text-sm opacity-80">UCM推理加速器开源</p>
</div>
</div>
<div class="flex items-start gap-3">
<div class="w-8 h-8 bg-white/20 rounded-full flex items-center justify-center flex-shrink-0">
<span class="text-sm font-bold">2</span>
</div>
<div>
<p class="font-semibold">2025年11月21日</p>
<p class="text-sm opacity-80">Flex:ai正式发布开源</p>
</div>
</div>
<div class="flex items-start gap-3">
<div class="w-8 h-8 bg-white/20 rounded-full flex items-center justify-center flex-shrink-0">
<span class="text-sm font-bold">3</span>
</div>
<div>
<p class="font-semibold">2027年Q4</p>
<p class="text-sm opacity-80">Atlas 960 SuperPoD发布</p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Navigation Tabs -->
<div class="bg-white shadow-sm sticky top-0 z-40">
<div class="container mx-auto px-4">
<div class="tabs tabs-boxed flex flex-nowrap overflow-x-auto py-4" id="mainTabs">
<a href="#overview" class="tab tab-active" onclick="showSection('overview')">
<i data-lucide="eye" class="w-4 h-4 mr-2"></i>核心洞察
</a>
<a href="#logic" class="tab" onclick="showSection('logic')">
<i data-lucide="brain" class="w-4 h-4 mr-2"></i>核心逻辑
</a>
<a href="#catalyst" class="tab" onclick="showSection('catalyst')">
<i data-lucide="zap" class="w-4 h-4 mr-2"></i>催化剂
</a>
<a href="#industry" class="tab" onclick="showSection('industry')">
<i data-lucide="git-branch" class="w-4 h-4 mr-2"></i>产业链
</a>
<a href="#stocks" class="tab" onclick="showSection('stocks')">
<i data-lucide="line-chart" class="w-4 h-4 mr-2"></i>核心股票
</a>
<a href="#risk" class="tab" onclick="showSection('risk')">
<i data-lucide="alert-triangle" class="w-4 h-4 mr-2"></i>风险提示
</a>
</div>
</div>
</div>
<!-- Overview Section -->
<section id="overview" class="container mx-auto px-4 py-12">
<div class="grid lg:grid-cols-3 gap-6">
<!-- 核心观点 -->
<div class="lg:col-span-2">
<div class="bg-white rounded-2xl shadow-lg p-8 hover-lift">
<div class="flex items-center gap-3 mb-6">
<div class="w-12 h-12 bg-gradient-to-br from-purple-500 to-pink-500 rounded-xl flex items-center justify-center">
<i data-lucide="lightbulb" class="w-6 h-6 text-white"></i>
</div>
<h2 class="text-2xl font-bold">核心观点摘要</h2>
</div>
<div class="prose prose-lg max-w-none">
<p class="text-gray-700 leading-relaxed mb-4">
华为AI容器概念正处于<strong class="text-gradient">"技术突破预期发酵期"</strong>,其核心驱动力并非单一产品发布,而是<strong class="text-gradient">在美国先进制程封锁倒逼下,通过系统级软件创新实现算力效率革命的战略突围</strong>
</p>
<p class="text-gray-700 leading-relaxed mb-4">
当前市场关注度逐步升温,但存在显著<strong class="text-purple-600">预期差</strong>:多数人聚焦昇腾硬件性能,却低估中间层容器技术作为"算力操作系统"的战略价值。
</p>
<p class="text-gray-700 leading-relaxed">
Flex:ai的开源若在性能上真正逼近英伟达生态将重塑国产AI算力价值链使华为从"卖铲子"升级为"制定采矿规则",具备<strong class="text-gradient">从主题投资向基本面驱动跃迁</strong>的潜力。
</p>
</div>
</div>
</div>
<!-- 市场热度评估 -->
<div>
<div class="bg-white rounded-2xl shadow-lg p-6 hover-lift">
<h3 class="text-xl font-bold mb-4 flex items-center">
<i data-lucide="trending-up" class="w-5 h-5 mr-2 text-purple-600"></i>
市场热度评估
</h3>
<div class="space-y-4">
<div>
<div class="flex justify-between mb-2">
<span class="text-sm text-gray-600">舆情热度</span>
<span class="text-sm font-semibold">80%</span>
</div>
<div class="w-full bg-gray-200 rounded-full h-2">
<div class="bg-gradient-to-r from-purple-500 to-pink-500 h-2 rounded-full" style="width: 80%"></div>
</div>
</div>
<div>
<div class="flex justify-between mb-2">
<span class="text-sm text-gray-600">研报覆盖</span>
<span class="text-sm font-semibold">30%</span>
</div>
<div class="w-full bg-gray-200 rounded-full h-2">
<div class="bg-gradient-to-r from-purple-500 to-pink-500 h-2 rounded-full" style="width: 30%"></div>
</div>
</div>
<div>
<div class="flex justify-between mb-2">
<span class="text-sm text-gray-600">交易拥挤度</span>
<span class="text-sm font-semibold">25%</span>
</div>
<div class="w-full bg-gray-200 rounded-full h-2">
<div class="bg-gradient-to-r from-purple-500 to-pink-500 h-2 rounded-full" style="width: 25%"></div>
</div>
</div>
</div>
<div class="mt-6 p-4 bg-purple-50 rounded-lg">
<p class="text-sm text-purple-700">
<i data-lucide="info" class="inline w-4 h-4 mr-1"></i>
距离11月发布尚有8个月属于<strong>预期发酵早期</strong>,尚未达到交易拥挤
</p>
</div>
</div>
</div>
</div>
<!-- 预期差分析 -->
<div class="mt-8 bg-white rounded-2xl shadow-lg p-8">
<h3 class="text-2xl font-bold mb-6 flex items-center">
<i data-lucide="layers" class="w-6 h-6 mr-3 text-purple-600"></i>
预期差深度挖掘
</h3>
<div class="overflow-x-auto">
<table class="table w-full">
<thead>
<tr class="text-left">
<th class="bg-purple-50 text-purple-700">市场普遍认知</th>
<th class="bg-purple-50 text-purple-700">被忽略的关键事实</th>
<th class="bg-purple-50 text-purple-700">预期差影响</th>
</tr>
</thead>
<tbody>
<tr class="hover:bg-gray-50 transition">
<td class="py-4">Flex:ai只是一个容器工具</td>
<td class="py-4">
<span class="inline-block px-2 py-1 bg-blue-100 text-blue-700 rounded text-sm mb-1">UCM9月开源</span>
<span class="inline-block px-2 py-1 bg-blue-100 text-blue-700 rounded text-sm">+ Flex:ai11月发布</span>
<p class="text-sm mt-1">构成"推理+训练"全栈优化</p>
</td>
<td class="py-4 text-green-600">技术价值被系统性低估</td>
</tr>
<tr class="hover:bg-gray-50 transition">
<td class="py-4">华为AI容器主要服务昇腾生态</td>
<td class="py-4">
<span class="inline-block px-2 py-1 bg-green-100 text-green-700 rounded text-sm">兼容K8s/Docker原生接口</span>
<p class="text-sm mt-1">可管理第三方云设施</p>
</td>
<td class="py-4 text-green-600">潜在市场空间从昇腾扩展到全行业</td>
</tr>
<tr class="hover:bg-gray-50 transition">
<td class="py-4">开源=不赚钱</td>
<td class="py-4">
<span class="inline-block px-2 py-1 bg-yellow-100 text-yellow-700 rounded text-sm">博睿数据</span>
<span class="inline-block px-2 py-1 bg-yellow-100 text-yellow-700 rounded text-sm">3000万采购订单</span>
<p class="text-sm mt-1">OEM模式已跑通</p>
</td>
<td class="py-4 text-green-600">商业模式已验证,变现路径清晰</td>
</tr>
</tbody>
</table>
</div>
</div>
</section>
<!-- Logic Section -->
<section id="logic" class="container mx-auto px-4 py-12 hidden">
<div class="mb-8">
<h2 class="text-3xl font-bold mb-4">核心驱动力三维解析</h2>
<p class="text-gray-600">深入剖析华为AI容器背后的战略逻辑</p>
</div>
<div class="grid lg:grid-cols-3 gap-6">
<!-- 地缘政治驱动 -->
<div class="bg-white rounded-2xl shadow-lg overflow-hidden hover-lift">
<div class="bg-gradient-to-br from-red-500 to-orange-500 p-6 text-white">
<i data-lucide="shield-off" class="w-10 h-10 mb-3"></i>
<h3 class="text-xl font-bold">地缘政治驱动</h3>
<p class="text-sm opacity-90 mt-2">被迫创新下的突围</p>
</div>
<div class="p-6">
<div class="space-y-3">
<div class="flex items-start gap-3">
<i data-lucide="check-circle" class="w-5 h-5 text-green-500 mt-0.5"></i>
<div>
<p class="font-semibold">7nm制程限制</p>
<p class="text-sm text-gray-600">无法追赶英伟达最新GPU</p>
</div>
</div>
<div class="flex items-start gap-3">
<i data-lucide="check-circle" class="w-5 h-5 text-green-500 mt-0.5"></i>
<div>
<p class="font-semibold">软件定义硬件</p>
<p class="text-sm text-gray-600">系统级创新突破物理限制</p>
</div>
</div>
<div class="flex items-start gap-3">
<i data-lucide="check-circle" class="w-5 h-5 text-green-500 mt-0.5"></i>
<div>
<p class="font-semibold">CloudMatrix架构</p>
<p class="text-sm text-gray-600">384颗NPU全对等互联</p>
</div>
</div>
</div>
</div>
</div>
<!-- AI算力需求驱动 -->
<div class="bg-white rounded-2xl shadow-lg overflow-hidden hover-lift">
<div class="bg-gradient-to-br from-blue-500 to-cyan-500 p-6 text-white">
<i data-lucide="cpu" class="w-10 h-10 mb-3"></i>
<h3 class="text-xl font-bold">AI算力需求驱动</h3>
<p class="text-sm opacity-90 mt-2">场景驱动的爆发增长</p>
</div>
<div class="p-6">
<div class="space-y-3">
<div class="flex items-start gap-3">
<i data-lucide="trending-up" class="w-5 h-5 text-blue-500 mt-0.5"></i>
<div>
<p class="font-semibold">中国市场增速55%</p>
<p class="text-sm text-gray-600">AI服务器市场2023H1达30亿美元</p>
</div>
</div>
<div class="flex items-start gap-3">
<i data-lucide="trending-up" class="w-5 h-5 text-blue-500 mt-0.5"></i>
<div>
<p class="font-semibold">智能算力增速3-3.9倍</p>
<p class="text-sm text-gray-600">远超通用算力16.6%</p>
</div>
</div>
<div class="flex items-start gap-3">
<i data-lucide="trending-up" class="w-5 h-5 text-blue-500 mt-0.5"></i>
<div>
<p class="font-semibold">成本降低30%+</p>
<p class="text-sm text-gray-600">容器技术优化万卡集群效率</p>
</div>
</div>
</div>
</div>
</div>
<!-- 生态构建驱动 -->
<div class="bg-white rounded-2xl shadow-lg overflow-hidden hover-lift">
<div class="bg-gradient-to-br from-purple-500 to-indigo-500 p-6 text-white">
<i data-lucide="globe" class="w-10 h-10 mb-3"></i>
<h3 class="text-xl font-bold">生态构建驱动</h3>
<p class="text-sm opacity-90 mt-2">标准制定的战略布局</p>
</div>
<div class="p-6">
<div class="space-y-3">
<div class="flex items-start gap-3">
<i data-lucide="git-merge" class="w-5 h-5 text-purple-500 mt-0.5"></i>
<div>
<p class="font-semibold">开源复制TensorFlow路径</p>
<p class="text-sm text-gray-600">建立开发者生态</p>
</div>
</div>
<div class="flex items-start gap-3">
<i data-lucide="git-merge" class="w-5 h-5 text-purple-500 mt-0.5"></i>
<div>
<p class="font-semibold">20+万卡集群客户基础</p>
<p class="text-sm text-gray-600">锁定昇腾硬件采购</p>
</div>
</div>
<div class="flex items-start gap-3">
<i data-lucide="git-merge" class="w-5 h-5 text-purple-500 mt-0.5"></i>
<div>
<p class="font-semibold">软件-硬件-云服务闭环</p>
<p class="text-sm text-gray-600">类比CUDA锁定NV GPU</p>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- Catalyst Section -->
<section id="catalyst" class="container mx-auto px-4 py-12 hidden">
<div class="mb-8">
<h2 class="text-3xl font-bold mb-4">关键催化剂与时间轴</h2>
<p class="text-gray-600">把握华为AI容器发展的关键节点</p>
</div>
<!-- Timeline -->
<div class="relative">
<div class="absolute left-1/2 transform -translate-x-1/2 w-1 h-full timeline-line"></div>
<!-- 2025年Q3 -->
<div class="relative flex items-center mb-8">
<div class="w-1/2 pr-8 text-right">
<div class="bg-white rounded-xl shadow-lg p-6 hover-lift">
<span class="inline-block px-3 py-1 bg-blue-100 text-blue-700 rounded-full text-sm mb-2">近期催化剂</span>
<h3 class="text-xl font-bold mb-2">2025年9月 UCM正式开源</h3>
<p class="text-gray-600 text-sm">推理记忆数据管理器开源作为Flex:ai的前奏</p>
<div class="mt-3 flex justify-end gap-2">
<span class="text-xs bg-gray-100 px-2 py-1 rounded">金融场景试点</span>
<span class="text-xs bg-gray-100 px-2 py-1 rounded">GitHub Star数</span>
</div>
</div>
</div>
<div class="absolute left-1/2 transform -translate-x-1/2 w-8 h-8 bg-blue-500 rounded-full border-4 border-white flex items-center justify-center">
<i data-lucide="calendar" class="w-4 h-4 text-white"></i>
</div>
<div class="w-1/2 pl-8"></div>
</div>
<!-- 2025年11月 -->
<div class="relative flex items-center mb-8">
<div class="w-1/2 pr-8"></div>
<div class="absolute left-1/2 transform -translate-x-1/2 w-8 h-8 bg-purple-500 rounded-full border-4 border-white flex items-center justify-center">
<i data-lucide="rocket" class="w-4 h-4 text-white"></i>
</div>
<div class="w-1/2 pl-8">
<div class="bg-white rounded-xl shadow-lg p-6 hover-lift">
<span class="inline-block px-3 py-1 bg-purple-100 text-purple-700 rounded-full text-sm mb-2">核心事件</span>
<h3 class="text-xl font-bold mb-2">2025年11月21日 Flex:ai发布</h3>
<p class="text-gray-600 text-sm">上海论坛正式发布并开源对标英伟达AI技术</p>
<div class="mt-3 flex gap-2">
<span class="text-xs bg-gray-100 px-2 py-1 rounded">性能测试数据</span>
<span class="text-xs bg-gray-100 px-2 py-1 rounded">社区活跃度</span>
</div>
</div>
</div>
</div>
<!-- 2026-2027 -->
<div class="relative flex items-center">
<div class="w-1/2 pr-8 text-right">
<div class="bg-white rounded-xl shadow-lg p-6 hover-lift">
<span class="inline-block px-3 py-1 bg-green-100 text-green-700 rounded-full text-sm mb-2">长期发展</span>
<h3 class="text-xl font-bold mb-2">2026-2027 生态爆发期</h3>
<p class="text-gray-600 text-sm">Atlas 960 SuperPoD发布15,488张加速卡</p>
<div class="mt-3 flex justify-end gap-2">
<span class="text-xs bg-gray-100 px-2 py-1 rounded">标准输出</span>
<span class="text-xs bg-gray-100 px-2 py-1 rounded">全球引领</span>
</div>
</div>
</div>
<div class="absolute left-1/2 transform -translate-x-1/2 w-8 h-8 bg-green-500 rounded-full border-4 border-white flex items-center justify-center">
<i data-lucide="target" class="w-4 h-4 text-white"></i>
</div>
<div class="w-1/2 pl-8"></div>
</div>
</div>
<!-- Key Metrics -->
<div class="grid lg:grid-cols-4 gap-4 mt-12">
<div class="bg-white rounded-xl shadow-lg p-6 text-center metric-card">
<div class="text-3xl font-bold text-gradient mb-2">3000万</div>
<p class="text-gray-600 text-sm">博睿数据订单金额</p>
</div>
<div class="bg-white rounded-xl shadow-lg p-6 text-center metric-card">
<div class="text-3xl font-bold text-gradient mb-2">20+</div>
<p class="text-gray-600 text-sm">CloudMatrix超级节点</p>
</div>
<div class="bg-white rounded-xl shadow-lg p-6 text-center metric-card">
<div class="text-3xl font-bold text-gradient mb-2">8192</div>
<p class="text-gray-600 text-sm">Atlas 950加速卡数</p>
</div>
<div class="bg-white rounded-xl shadow-lg p-6 text-center metric-card">
<div class="text-3xl font-bold text-gradient mb-2">245TB</div>
<p class="text-gray-600 text-sm">AI SSD单盘容量</p>
</div>
</div>
</section>
<!-- Industry Chain Section -->
<section id="industry" class="container mx-auto px-4 py-12 hidden">
<div class="mb-8">
<h2 class="text-3xl font-bold mb-4">产业链全景图</h2>
<p class="text-gray-600">华为AI容器的完整生态体系</p>
</div>
<div class="bg-white rounded-2xl shadow-lg p-8">
<!-- 上游:基础设施层 -->
<div class="mb-8">
<div class="flex items-center gap-3 mb-4">
<div class="w-10 h-10 bg-gradient-to-br from-orange-500 to-red-500 rounded-lg flex items-center justify-center">
<i data-lucide="server" class="w-6 h-6 text-white"></i>
</div>
<h3 class="text-xl font-bold">上游:基础设施层</h3>
</div>
<div class="grid lg:grid-cols-4 gap-4">
<div class="bg-gray-50 rounded-lg p-4 hover:shadow-md transition">
<h4 class="font-semibold mb-2 text-orange-600">昇腾芯片</h4>
<p class="text-sm text-gray-600">昇腾910/950处理器<br>华为海思自主研发</p>
</div>
<div class="bg-gray-50 rounded-lg p-4 hover:shadow-md transition">
<h4 class="font-semibold mb-2 text-orange-600">CloudMatrix</h4>
<p class="text-sm text-gray-600">384超级节点架构<br>全对等互联技术</p>
</div>
<div class="bg-gray-50 rounded-lg p-4 hover:shadow-md transition">
<h4 class="font-semibold mb-2 text-orange-600">Atlas集群</h4>
<p class="text-sm text-gray-600">950/960 SuperPoD<br>万卡级算力集群</p>
</div>
<div class="bg-gray-50 rounded-lg p-4 hover:shadow-md transition">
<h4 class="font-semibold mb-2 text-orange-600">AI存储</h4>
<p class="text-sm text-gray-600">245TB AI SSD<br>"以存代算"技术</p>
</div>
</div>
</div>
<div class="border-t-2 border-dashed my-8"></div>
<!-- 中游AI容器平台层 -->
<div class="mb-8">
<div class="flex items-center gap-3 mb-4">
<div class="w-10 h-10 bg-gradient-to-br from-blue-500 to-purple-500 rounded-lg flex items-center justify-center">
<i data-lucide="layers" class="w-6 h-6 text-white"></i>
</div>
<h3 class="text-xl font-bold">中游AI容器平台层</h3>
</div>
<div class="grid lg:grid-cols-4 gap-4">
<div class="bg-blue-50 rounded-lg p-4 hover:shadow-md transition">
<h4 class="font-semibold mb-2 text-blue-600">Flex:ai引擎</h4>
<p class="text-sm text-gray-600">开源AI容器引擎<br>核心调度算法</p>
</div>
<div class="bg-blue-50 rounded-lg p-4 hover:shadow-md transition">
<h4 class="font-semibold mb-2 text-blue-600">UCS管理平台</h4>
<p class="text-sm text-gray-600">华为云统一管理<br>分布式集群管控</p>
</div>
<div class="bg-blue-50 rounded-lg p-4 hover:shadow-md transition">
<h4 class="font-semibold mb-2 text-blue-600">UCM加速套件</h4>
<p class="text-sm text-gray-600">KV Cache优化<br>推理性能提升</p>
</div>
<div class="bg-blue-50 rounded-lg p-4 hover:shadow-md transition">
<h4 class="font-semibold mb-2 text-blue-600">中间件适配</h4>
<p class="text-sm text-gray-600">东方通/中国软件<br>信创生态整合</p>
</div>
</div>
</div>
<div class="border-t-2 border-dashed my-8"></div>
<!-- 下游:行业应用 -->
<div>
<div class="flex items-center gap-3 mb-4">
<div class="w-10 h-10 bg-gradient-to-br from-green-500 to-teal-500 rounded-lg flex items-center justify-center">
<i data-lucide="globe-2" class="w-6 h-6 text-white"></i>
</div>
<h3 class="text-xl font-bold">下游:行业应用与解决方案</h3>
</div>
<div class="grid lg:grid-cols-4 gap-4">
<div class="bg-green-50 rounded-lg p-4 hover:shadow-md transition">
<h4 class="font-semibold mb-2 text-green-600">智慧医疗</h4>
<p class="text-sm text-gray-600">DCS AI解决方案<br>华大系/塞力医疗</p>
</div>
<div class="bg-green-50 rounded-lg p-4 hover:shadow-md transition">
<h4 class="font-semibold mb-2 text-green-600">金融科技</h4>
<p class="text-sm text-gray-600">银联UCM试点<br>博睿数据运维</p>
</div>
<div class="bg-green-50 rounded-lg p-4 hover:shadow-md transition">
<h4 class="font-semibold mb-2 text-green-600">政务云</h4>
<p class="text-sm text-gray-600">混合云容器服务<br>电科数字/青云科技</p>
</div>
<div class="bg-green-50 rounded-lg p-4 hover:shadow-md transition">
<h4 class="font-semibold mb-2 text-green-600">企业服务</h4>
<p class="text-sm text-gray-600">企业级容器云<br>行业定制方案</p>
</div>
</div>
</div>
</div>
</section>
<!-- Stocks Section -->
<section id="stocks" class="container mx-auto px-4 py-12 hidden">
<div class="mb-8">
<h2 class="text-3xl font-bold mb-4">核心股票池</h2>
<p class="text-gray-600">华为AI容器产业链核心标的</p>
</div>
<!-- Stock Table -->
<div class="bg-white rounded-2xl shadow-lg overflow-hidden">
<div class="p-4 bg-gradient-to-r from-purple-600 to-indigo-600 text-white">
<h3 class="text-xl font-bold">股票数据详情</h3>
</div>
<div class="stock-table">
<table class="table w-full">
<thead>
<tr class="bg-gray-50">
<th class="text-left p-4">股票名称</th>
<th class="text-left p-4">分类</th>
<th class="text-left p-4">相关性描述</th>
<th class="text-left p-4">信源</th>
<th class="text-center p-4">强度</th>
</tr>
</thead>
<tbody>
<tr class="border-b hover:bg-purple-50 transition">
<td class="p-4 font-semibold">博睿数据</td>
<td class="p-4">
<span class="badge badge-info">技术服务</span>
</td>
<td class="p-4 text-sm">华为云UCS可观测软件框架供应商3000万采购订单已落地</td>
<td class="p-4 text-sm">互动</td>
<td class="p-4 text-center">
<div class="flex justify-center gap-1">
<i data-lucide="star" class="w-4 h-4 text-yellow-500 fill-current"></i>
<i data-lucide="star" class="w-4 h-4 text-yellow-500 fill-current"></i>
<i data-lucide="star" class="w-4 h-4 text-yellow-500 fill-current"></i>
<i data-lucide="star" class="w-4 h-4 text-yellow-500 fill-current"></i>
<i data-lucide="star" class="w-4 h-4 text-yellow-500 fill-current"></i>
</div>
</td>
</tr>
<tr class="border-b hover:bg-purple-50 transition">
<td class="p-4 font-semibold">飞荣达</td>
<td class="p-4">
<span class="badge badge-secondary">散热</span>
</td>
<td class="p-4 text-sm">华为服务器液冷散热核心供应商受益Atlas集群放量</td>
<td class="p-4 text-sm">路演</td>
<td class="p-4 text-center">
<div class="flex justify-center gap-1">
<i data-lucide="star" class="w-4 h-4 text-yellow-500 fill-current"></i>
<i data-lucide="star" class="w-4 h-4 text-yellow-500 fill-current"></i>
<i data-lucide="star" class="w-4 h-4 text-yellow-500 fill-current"></i>
<i data-lucide="star" class="w-4 h-4 text-yellow-500 fill-current"></i>
<i data-lucide="star" class="w-4 h-4 text-gray-300"></i>
</div>
</td>
</tr>
<tr class="border-b hover:bg-purple-50 transition">
<td class="p-4 font-semibold">青云科技</td>
<td class="p-4">
<span class="badge badge-primary">容器云</span>
</td>
<td class="p-4 text-sm">KubeSphere容器平台华为云原生生态伙伴</td>
<td class="p-4 text-sm">官网</td>
<td class="p-4 text-center">
<div class="flex justify-center gap-1">
<i data-lucide="star" class="w-4 h-4 text-yellow-500 fill-current"></i>
<i data-lucide="star" class="w-4 h-4 text-yellow-500 fill-current"></i>
<i data-lucide="star" class="w-4 h-4 text-yellow-500 fill-current"></i>
<i data-lucide="star" class="w-4 h-4 text-gray-300"></i>
<i data-lucide="star" class="w-4 h-4 text-gray-300"></i>
</div>
</td>
</tr>
<tr class="border-b hover:bg-purple-50 transition">
<td class="p-4 font-semibold">神州数码</td>
<td class="p-4">
<span class="badge badge-primary">容器云</span>
</td>
<td class="p-4 text-sm">推出首个基于鲲鹏环境的开源容器云发行版</td>
<td class="p-4 text-sm">公告</td>
<td class="p-4 text-center">
<div class="flex justify-center gap-1">
<i data-lucide="star" class="w-4 h-4 text-yellow-500 fill-current"></i>
<i data-lucide="star" class="w-4 h-4 text-yellow-500 fill-current"></i>
<i data-lucide="star" class="w-4 h-4 text-yellow-500 fill-current"></i>
<i data-lucide="star" class="w-4 h-4 text-gray-300"></i>
<i data-lucide="star" class="w-4 h-4 text-gray-300"></i>
</div>
</td>
</tr>
<tr class="border-b hover:bg-purple-50 transition">
<td class="p-4 font-semibold">电科数字</td>
<td class="p-4">
<span class="badge badge-primary">容器云</span>
</td>
<td class="p-4 text-sm">华讯容器云平台,华为云高级别合作伙伴</td>
<td class="p-4 text-sm">官微/互动</td>
<td class="p-4 text-center">
<div class="flex justify-center gap-1">
<i data-lucide="star" class="w-4 h-4 text-yellow-500 fill-current"></i>
<i data-lucide="star" class="w-4 h-4 text-yellow-500 fill-current"></i>
<i data-lucide="star" class="w-4 h-4 text-yellow-500 fill-current"></i>
<i data-lucide="star" class="w-4 h-4 text-gray-300"></i>
<i data-lucide="star" class="w-4 h-4 text-gray-300"></i>
</div>
</td>
</tr>
<tr class="border-b hover:bg-purple-50 transition">
<td class="p-4 font-semibold">蜂助手</td>
<td class="p-4">
<span class="badge badge-success">技术服务</span>
</td>
<td class="p-4 text-sm">容器虚拟化核心技术,加强与华为产品级技术合作</td>
<td class="p-4 text-sm">互动</td>
<td class="p-4 text-center">
<div class="flex justify-center gap-1">
<i data-lucide="star" class="w-4 h-4 text-yellow-500 fill-current"></i>
<i data-lucide="star" class="w-4 h-4 text-yellow-500 fill-current"></i>
<i data-lucide="star" class="w-4 h-4 text-yellow-500 fill-current"></i>
<i data-lucide="star" class="w-4 h-4 text-gray-300"></i>
<i data-lucide="star" class="w-4 h-4 text-gray-300"></i>
</div>
</td>
</tr>
<tr class="border-b hover:bg-purple-50 transition">
<td class="p-4 font-semibold">东方通</td>
<td class="p-4">
<span class="badge badge-warning">中间件</span>
</td>
<td class="p-4 text-sm">云原生中间件平台TongCNMP已应用于华为云</td>
<td class="p-4 text-sm">公告/互动</td>
<td class="p-4 text-center">
<div class="flex justify-center gap-1">
<i data-lucide="star" class="w-4 h-4 text-yellow-500 fill-current"></i>
<i data-lucide="star" class="w-4 h-4 text-yellow-500 fill-current"></i>
<i data-lucide="star" class="w-4 h-4 text-gray-300"></i>
<i data-lucide="star" class="w-4 h-4 text-gray-300"></i>
<i data-lucide="star" class="w-4 h-4 text-gray-300"></i>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<!-- Investment Advice -->
<div class="mt-8 bg-gradient-to-br from-purple-50 to-indigo-50 rounded-2xl p-8">
<h3 class="text-2xl font-bold mb-4">投资建议</h3>
<div class="grid lg:grid-cols-3 gap-6">
<div class="bg-white rounded-xl p-6">
<h4 class="font-semibold mb-3 text-green-600">首选</h4>
<p class="text-sm">博睿数据唯一明确获得华为云AI容器平台采购订单的公司OEM模式深度绑定收入确定性最高</p>
</div>
<div class="bg-white rounded-xl p-6">
<h4 class="font-semibold mb-3 text-blue-600">次选</h4>
<p class="text-sm">飞荣达算力效率提升必然带来功耗密度增加Atlas集群的万卡级部署对液冷需求爆发</p>
</div>
<div class="bg-white rounded-xl p-6">
<h4 class="font-semibold mb-3 text-yellow-600">备选</h4>
<p class="text-sm">华大系/塞力医疗华为医疗军团的DCS AI方案已明确集成容器技术需关注临床落地进展</p>
</div>
</div>
</div>
</section>
<!-- Risk Section -->
<section id="risk" class="container mx-auto px-4 py-12 hidden">
<div class="mb-8">
<h2 class="text-3xl font-bold mb-4">风险提示</h2>
<p class="text-gray-600">投资需关注的关键风险点</p>
</div>
<div class="grid lg:grid-cols-3 gap-6">
<!-- 技术风险 -->
<div class="bg-white rounded-2xl shadow-lg p-6 border-l-4 border-red-500">
<div class="flex items-center gap-3 mb-4">
<i data-lucide="alert-triangle" class="w-6 h-6 text-red-500"></i>
<h3 class="text-xl font-bold">技术风险</h3>
</div>
<ul class="space-y-2">
<li class="flex items-start gap-2">
<i data-lucide="chevron-right" class="w-4 h-4 text-red-500 mt-0.5"></i>
<span class="text-sm">Flex:ai性能能否真正对标英伟达存疑</span>
</li>
<li class="flex items-start gap-2">
<i data-lucide="chevron-right" class="w-4 h-4 text-red-500 mt-0.5"></i>
<span class="text-sm">开源社区活跃度不及预期</span>
</li>
<li class="flex items-start gap-2">
<i data-lucide="chevron-right" class="w-4 h-4 text-red-500 mt-0.5"></i>
<span class="text-sm">ISV生态构建速度缓慢</span>
</li>
</ul>
</div>
<!-- 商业化风险 -->
<div class="bg-white rounded-2xl shadow-lg p-6 border-l-4 border-orange-500">
<div class="flex items-center gap-3 mb-4">
<i data-lucide="trending-down" class="w-6 h-6 text-orange-500"></i>
<h3 class="text-xl font-bold">商业化风险</h3>
</div>
<ul class="space-y-2">
<li class="flex items-start gap-2">
<i data-lucide="chevron-right" class="w-4 h-4 text-orange-500 mt-0.5"></i>
<span class="text-sm">变现路径不清晰</span>
</li>
<li class="flex items-start gap-2">
<i data-lucide="chevron-right" class="w-4 h-4 text-orange-500 mt-0.5"></i>
<span class="text-sm">客户迁移成本高</span>
</li>
<li class="flex items-start gap-2">
<i data-lucide="chevron-right" class="w-4 h-4 text-orange-500 mt-0.5"></i>
<span class="text-sm">华为云容器收入占比低(<5%</span>
</li>
</ul>
</div>
<!-- 政策竞争风险 -->
<div class="bg-white rounded-2xl shadow-lg p-6 border-l-4 border-yellow-500">
<div class="flex items-center gap-3 mb-4">
<i data-lucide="shield" class="w-6 h-6 text-yellow-500"></i>
<h3 class="text-xl font-bold">政策与竞争风险</h3>
</div>
<ul class="space-y-2">
<li class="flex items-start gap-2">
<i data-lucide="chevron-right" class="w-4 h-4 text-yellow-500 mt-0.5"></i>
<span class="text-sm">阿里云、腾讯云快速跟进</span>
</li>
<li class="flex items-start gap-2">
<i data-lucide="chevron-right" class="w-4 h-4 text-yellow-500 mt-0.5"></i>
<span class="text-sm">国内云CR3市场份额超70%</span>
</li>
<li class="flex items-start gap-2">
<i data-lucide="chevron-right" class="w-4 h-4 text-yellow-500 mt-0.5"></i>
<span class="text-sm">开源软件出口管制风险</span>
</li>
</ul>
</div>
</div>
<!-- Risk Warning Box -->
<div class="mt-8 bg-red-50 border-2 border-red-200 rounded-xl p-6">
<div class="flex items-start gap-3">
<i data-lucide="alert-circle" class="w-6 h-6 text-red-500 mt-0.5"></i>
<div>
<h4 class="font-bold text-red-700 mb-2">重要提示</h4>
<p class="text-sm text-red-600">
距离11月Flex:ai发布尚有8个月时间窗口存在重大不确定性。历史上华为曾延期发布产品需警惕"预期过度前置"风险。
建议在9月UCM开源后根据社区热度动态调整仓位若技术反馈正面可加仓若平淡则减仓锁定收益。
</p>
</div>
</div>
</div>
</section>
<!-- Footer -->
<footer class="bg-gray-900 text-white py-12 mt-20">
<div class="container mx-auto px-4">
<div class="text-center">
<p class="text-sm opacity-75">© 2025 华为AI容器概念分析 | 数据来源:公开信息整理</p>
<p class="text-xs opacity-50 mt-2">投资有风险,入市需谨慎</p>
</div>
</div>
</footer>
<script>
// Initialize Lucide icons
lucide.createIcons();
// Tab navigation
function showSection(sectionId) {
// Hide all sections
const sections = document.querySelectorAll('section');
sections.forEach(section => {
section.classList.add('hidden');
});
// Show selected section
const selectedSection = document.getElementById(sectionId);
if (selectedSection) {
selectedSection.classList.remove('hidden');
}
// Update tab active state
const tabs = document.querySelectorAll('.tab');
tabs.forEach(tab => {
tab.classList.remove('tab-active');
});
event.target.classList.add('tab-active');
// Reinitialize icons for newly shown content
setTimeout(() => lucide.createIcons(), 100);
}
// Add smooth scroll
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
anchor.addEventListener('click', function (e) {
e.preventDefault();
const target = document.querySelector(this.getAttribute('href'));
if (target) {
target.scrollIntoView({ behavior: 'smooth' });
}
});
});
// Add animation on scroll
const observerOptions = {
threshold: 0.1,
rootMargin: '0px 0px -50px 0px'
};
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.style.opacity = '1';
entry.target.style.transform = 'translateY(0)';
}
});
}, observerOptions);
// Observe all metric cards and hover-lift elements
document.querySelectorAll('.metric-card, .hover-lift').forEach(el => {
el.style.opacity = '0';
el.style.transform = 'translateY(20px)';
el.style.transition = 'all 0.6s ease';
observer.observe(el);
});
</script>
</body>
</html>
这个HTML页面完整展示了华为AI容器概念的深度分析主要特点包括
## 核心功能:
1. **详实的内容保留** - 完整呈现了Insight中的核心观点、逻辑分析、催化剂时间轴等
2. **炫酷的视觉设计** - 使用渐变色、玻璃态效果、动画过渡等现代设计元素
3. **股票数据表格** - 清晰展示相关股票及其关联度,使用星级评价系统
4. **响应式布局** - 完美适配移动端和桌面端
5. **交互式导航** - 标签页切换不同内容模块
6. **数据可视化** - 进度条、时间轴、卡片等多种数据展示方式
## 设计亮点:
- 渐变色主题贯穿全站
- 卡片悬浮效果增强交互感
- 时间轴清晰展示发展路径
- 星级评价直观展示股票关联度
- 风险提示醒目突出
- 移动端友好的触控交互
页面内容深度与视觉效果并重,既保留了专业金融分析的严谨性,又具有现代化的审美体验。

615
public/htmls/寒潮.html Normal file
View File

@@ -0,0 +1,615 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>寒潮投资概念深度解析 - 季节性事件驱动的短期机遇</title>
<link href="https://cdn.jsdelivr.net/npm/daisyui@4.4.0/dist/full.min.css" rel="stylesheet" type="text/css" />
<script src="https://cdn.tailwindcss.com"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<style>
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&display=swap');
body {
font-family: 'Inter', sans-serif;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
min-height: 100vh;
}
.glass-morphism {
background: rgba(255, 255, 255, 0.95);
backdrop-filter: blur(10px);
border: 1px solid rgba(255, 255, 255, 0.18);
}
.hero-gradient {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
}
.card-hover {
transition: all 0.3s ease;
}
.card-hover:hover {
transform: translateY(-5px);
box-shadow: 0 20px 40px rgba(0,0,0,0.1);
}
.pulse-animation {
animation: pulse 2s infinite;
}
@keyframes pulse {
0% { transform: scale(1); }
50% { transform: scale(1.05); }
100% { transform: scale(1); }
}
.timeline-item::before {
content: '';
position: absolute;
left: -8px;
top: 50%;
transform: translateY(-50%);
width: 16px;
height: 16px;
border-radius: 50%;
background: #667eea;
box-shadow: 0 0 0 4px rgba(102, 126, 234, 0.2);
}
.timeline-line {
position: absolute;
left: 0;
top: 0;
bottom: 0;
width: 2px;
background: linear-gradient(180deg, #667eea, #764ba2);
}
.stock-table {
display: block;
overflow-x: auto;
white-space: nowrap;
}
@media (max-width: 768px) {
.stock-table {
font-size: 0.75rem;
}
}
.floating-icon {
animation: float 3s ease-in-out infinite;
}
@keyframes float {
0%, 100% { transform: translateY(0); }
50% { transform: translateY(-10px); }
}
.gradient-text {
background: linear-gradient(135deg, #667eea, #764ba2);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
</style>
</head>
<body class="bg-gray-50">
<!-- Hero Section -->
<div class="hero-gradient text-white py-20">
<div class="container mx-auto px-4">
<div class="flex flex-col md:flex-row items-center justify-between">
<div class="md:w-2/3 mb-10 md:mb-0">
<div class="flex items-center mb-4">
<i class="fas fa-snowflake text-4xl mr-4 floating-icon"></i>
<h1 class="text-5xl font-bold">寒潮投资概念</h1>
</div>
<p class="text-xl mb-6">季节性事件驱动的短期机遇分析</p>
<div class="grid grid-cols-2 md:grid-cols-4 gap-4">
<div class="bg-white/20 backdrop-blur rounded-lg p-4">
<div class="text-3xl font-bold">15-30</div>
<div class="text-sm">有效窗口期(天)</div>
</div>
<div class="bg-white/20 backdrop-blur rounded-lg p-4">
<div class="text-3xl font-bold">3次</div>
<div class="text-sm">2024-25预警峰值</div>
</div>
<div class="bg-white/20 backdrop-blur rounded-lg p-4">
<div class="text-3xl font-bold">10%</div>
<div class="text-sm">波司登单日涨幅</div>
</div>
<div class="bg-white/20 backdrop-blur rounded-lg p-4">
<div class="text-3xl font-bold">60万吨</div>
<div class="text-sm">东三省日耗峰值</div>
</div>
</div>
</div>
<div class="md:w-1/3">
<div class="bg-white/10 backdrop-blur rounded-2xl p-6">
<h3 class="text-xl font-semibold mb-4">当前阶段判断</h3>
<div class="space-y-3">
<div class="flex items-center">
<i class="fas fa-fire text-yellow-400 mr-3"></i>
<span>季节性事件驱动高峰期</span>
</div>
<div class="flex items-center">
<i class="fas fa-chart-line text-green-400 mr-3"></i>
<span>短期主题投资机会</span>
</div>
<div class="flex items-center">
<i class="fas fa-exclamation-triangle text-orange-400 mr-3"></i>
<span>非长期产业趋势</span>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Main Content -->
<div class="container mx-auto px-4 py-10">
<!-- 时间轴 -->
<div class="glass-morphism rounded-2xl p-8 mb-8">
<h2 class="text-3xl font-bold gradient-text mb-6">概念事件时间轴</h2>
<div class="relative">
<div class="timeline-line"></div>
<div class="space-y-6">
<div class="timeline-item relative pl-8">
<div class="bg-blue-50 rounded-lg p-4">
<div class="font-semibold text-blue-600">2024年11月下旬</div>
<div>首轮预警启动寒潮蓝色预警0℃线南压至苏皖北部</div>
</div>
</div>
<div class="timeline-item relative pl-8">
<div class="bg-orange-50 rounded-lg p-4">
<div class="font-semibold text-orange-600">2025年1月23日</div>
<div>中国气象局启动寒潮暴雪Ⅲ级应急响应局地降温超20℃</div>
</div>
</div>
<div class="timeline-item relative pl-8">
<div class="bg-purple-50 rounded-lg p-4">
<div class="font-semibold text-purple-600">2025年1-2月</div>
<div>欧美同步寒潮德国天然气消费激增TTF价格突破50美元</div>
</div>
</div>
<div class="timeline-item relative pl-8">
<div class="bg-green-50 rounded-lg p-4">
<div class="font-semibold text-green-600">2025年3月</div>
<div>寒潮延续至春季北京发布蓝色预警0℃线南压至秦岭</div>
</div>
</div>
</div>
</div>
</div>
<!-- 核心逻辑 -->
<div class="grid md:grid-cols-3 gap-6 mb-8">
<div class="glass-morphism rounded-xl p-6 card-hover">
<div class="text-blue-500 text-4xl mb-4">
<i class="fas fa-cloud-showers-heavy"></i>
</div>
<h3 class="text-xl font-bold mb-3">气象灾害冲击</h3>
<p class="text-gray-600">全国大部降温6-10℃局地超20℃官方定调"极端天气事件"</p>
<div class="mt-4 pt-4 border-t">
<span class="text-sm text-gray-500">东三省日耗从35万→60万吨/天</span>
</div>
</div>
<div class="glass-morphism rounded-xl p-6 card-hover">
<div class="text-purple-500 text-4xl mb-4">
<i class="fas fa-link"></i>
</div>
<h3 class="text-xl font-bold mb-3">供应链脆弱性</h3>
<p class="text-gray-600">上游原料紧张、中游订单爆单、下游需求即时</p>
<div class="mt-4 pt-4 border-t">
<span class="text-sm text-gray-500">古麒绒材羽绒收入占比99.27%</span>
</div>
</div>
<div class="glass-morphism rounded-xl p-6 card-hover">
<div class="text-green-500 text-4xl mb-4">
<i class="fas fa-bolt"></i>
</div>
<h3 class="text-xl font-bold mb-3">能源刚性需求</h3>
<p class="text-gray-600">空调制热+煤炭/天然气供暖叠加,需求非线性增长</p>
<div class="mt-4 pt-4 border-t">
<span class="text-sm text-gray-500">提前10天供暖多耗5000万吨煤</span>
</div>
</div>
</div>
<!-- 产业链分析 -->
<div class="glass-morphism rounded-2xl p-8 mb-8">
<h2 class="text-3xl font-bold gradient-text mb-6">产业链四象限模型</h2>
<div class="grid md:grid-cols-2 gap-6">
<div class="bg-gradient-to-br from-blue-50 to-indigo-50 rounded-xl p-6">
<h3 class="text-lg font-bold text-blue-700 mb-4">能源链(需求强度:★★★★★)</h3>
<div class="space-y-2">
<div class="flex justify-between">
<span>上游资源:</span>
<span class="font-semibold">中国神华、陕西煤业</span>
</div>
<div class="flex justify-between">
<span>中游制造:</span>
<span class="font-semibold">古麒绒材</span>
</div>
<div class="flex justify-between">
<span>下游消费:</span>
<span class="font-semibold">波司登</span>
</div>
</div>
</div>
<div class="bg-gradient-to-br from-green-50 to-emerald-50 rounded-xl p-6">
<h3 class="text-lg font-bold text-green-700 mb-4">设备链(需求强度:★★★★)</h3>
<div class="space-y-2">
<div class="flex justify-between">
<span>核心原料:</span>
<span class="font-semibold">棉花/鸭绒</span>
</div>
<div class="flex justify-between">
<span>热泵设备:</span>
<span class="font-semibold">日出东方、双良节能</span>
</div>
<div class="flex justify-between">
<span>终端零售:</span>
<span class="font-semibold">彩虹集团</span>
</div>
</div>
</div>
<div class="bg-gradient-to-br from-purple-50 to-pink-50 rounded-xl p-6">
<h3 class="text-lg font-bold text-purple-700 mb-4">服务链(需求强度:★★★)</h3>
<div class="space-y-2">
<div class="flex justify-between">
<span>电力供应:</span>
<span class="font-semibold">华能、华电</span>
</div>
<div class="flex justify-between">
<span>智能温控:</span>
<span class="font-semibold">瑞纳智能</span>
</div>
<div class="flex justify-between">
<span>热力服务:</span>
<span class="font-semibold">联美控股</span>
</div>
</div>
</div>
<div class="bg-gradient-to-br from-orange-50 to-yellow-50 rounded-xl p-6">
<h3 class="text-lg font-bold text-orange-700 mb-4">消费品链(需求强度:★★)</h3>
<div class="space-y-2">
<div class="flex justify-between">
<span>品牌服装:</span>
<span class="font-semibold">波司登、太平鸟</span>
</div>
<div class="flex justify-between">
<span>家居保暖:</span>
<span class="font-semibold">真爱美家</span>
</div>
<div class="flex justify-between">
<span>小家电:</span>
<span class="font-semibold">彩虹集团</span>
</div>
</div>
</div>
</div>
</div>
<!-- 股票数据表格 -->
<div class="glass-morphism rounded-2xl p-8 mb-8">
<h2 class="text-3xl font-bold gradient-text mb-6">相关上市公司一览</h2>
<!-- 供热/暖板块 -->
<div class="mb-8">
<h3 class="text-xl font-semibold mb-4 text-blue-600">
<i class="fas fa-fire mr-2"></i>供热/暖板块
</h3>
<div class="stock-table">
<table class="table table-zebra table-compact w-full">
<thead>
<tr class="bg-blue-100">
<th>股票代码</th>
<th>公司名称</th>
<th>相关性描述</th>
<th>核心逻辑</th>
</tr>
</thead>
<tbody>
<tr>
<td>-</td>
<td>联美控股</td>
<td>2025H1供暖及蒸汽收入14.16亿元占比74.62%</td>
<td>供暖收入占比高,直接受益寒潮</td>
</tr>
<tr>
<td>-</td>
<td>惠天热电</td>
<td>沈阳市大型专业供热上市公司2025H1供暖供热气11.66亿元占比96.35%</td>
<td>专业供热且收入占比极高</td>
</tr>
<tr>
<td>-</td>
<td>京能热力</td>
<td>实控人北京市国资委持股28.46%2025H1热力服务收入6.55亿元占比84.67%</td>
<td>国资控股保障,区域垄断性强</td>
</tr>
<tr>
<td>-</td>
<td>金房能源</td>
<td>2025H1供热行业6.55亿元占比97.59%北京地区占比62.11%</td>
<td>供热收入占比极高,区域集中</td>
</tr>
<tr>
<td>-</td>
<td>瑞纳智能</td>
<td>2025H1供热节能服务0.74亿元占比79.59%</td>
<td>智慧供暖,技术壁垒高</td>
</tr>
</tbody>
</table>
</div>
</div>
<!-- 热泵板块 -->
<div class="mb-8">
<h3 class="text-xl font-semibold mb-4 text-green-600">
<i class="fas fa-temperature-high mr-2"></i>热泵板块
</h3>
<div class="stock-table">
<table class="table table-zebra table-compact w-full">
<thead>
<tr class="bg-green-100">
<th>股票代码</th>
<th>公司名称</th>
<th>相关性描述</th>
<th>核心逻辑</th>
</tr>
</thead>
<tbody>
<tr>
<td>-</td>
<td>日出东方</td>
<td>推进以空气能热泵为龙头业务的战略布局空气能热泵产能10万套左右</td>
<td>热泵为核心业务西藏项目17.67亿</td>
</tr>
<tr>
<td>-</td>
<td>万和电气</td>
<td>2024年推出的R290热泵产品成为行业内的佼佼者</td>
<td>R290热泵技术领先</td>
</tr>
<tr>
<td>-</td>
<td>双良节能</td>
<td>中国最大的溴化锂制冷机、吸收式热泵和空冷器生产商和集成商</td>
<td>溴化锂热泵领域龙头</td>
</tr>
<tr>
<td>-</td>
<td>振邦智能</td>
<td>空气能热泵是公司主要产品智能电器控制器的主要应用之一</td>
<td>热泵控制器核心供应商</td>
</tr>
</tbody>
</table>
</div>
</div>
<!-- 御寒产品板块 -->
<div class="mb-8">
<h3 class="text-xl font-semibold mb-4 text-purple-600">
<i class="fas fa-tshirt mr-2"></i>御寒产品板块
</h3>
<div class="stock-table">
<table class="table table-zebra table-compact w-full">
<thead>
<tr class="bg-purple-100">
<th>股票代码</th>
<th>公司名称</th>
<th>相关性描述</th>
<th>核心逻辑</th>
</tr>
</thead>
<tbody>
<tr>
<td>-</td>
<td>古麒绒材</td>
<td>主要产品为高规格羽绒材料2025H1羽绒行业5.33亿元占比99.27%</td>
<td>最纯粹的羽绒原料标的</td>
</tr>
<tr>
<td>-</td>
<td>华英农业</td>
<td>2025H1羽绒13.55亿元占比65.43%</td>
<td>羽绒收入占比较高</td>
</tr>
<tr>
<td>-</td>
<td>真爱美家</td>
<td>2025H1毛毯3.45亿元占比88%,保暖性和舒适度高</td>
<td>毛毯收入占比极高</td>
</tr>
<tr>
<td>-</td>
<td>彩虹集团</td>
<td>电热毯行业龙头2025H1家用柔性取暖系列3.56亿元占比65.73%</td>
<td>电热毯龙头,需求反馈最快</td>
</tr>
</tbody>
</table>
</div>
</div>
<!-- 能源板块 -->
<div class="mb-8">
<h3 class="text-xl font-semibold mb-4 text-orange-600">
<i class="fas fa-oil-can mr-2"></i>能源板块
</h3>
<div class="stock-table">
<table class="table table-zebra table-compact w-full">
<thead>
<tr class="bg-orange-100">
<th>股票代码</th>
<th>公司名称</th>
<th>相关性描述</th>
<th>核心逻辑</th>
</tr>
</thead>
<tbody>
<tr>
<td>601088</td>
<td>中国神华</td>
<td>煤炭产业链龙头股息率4.8%</td>
<td>长协煤保供能力强,现金流稳定</td>
</tr>
<tr>
<td>601225</td>
<td>陕西煤业</td>
<td>煤炭产业链股息率4.5%</td>
<td>资源禀赋优秀,成本优势明显</td>
</tr>
<tr>
<td>600188</td>
<td>兖矿能源</td>
<td>煤炭产业链,澳洲产能占比高</td>
<td>受益国际煤价上涨,弹性大</td>
</tr>
<tr>
<td>601018</td>
<td>中煤能源</td>
<td>煤炭产业链,央企背景</td>
<td>产能规模大,保供主力</td>
</tr>
<tr>
<td>600997</td>
<td>开滦股份</td>
<td>焦炭产业链,煤焦一体化</td>
<td>焦煤涨价受益,弹性较好</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<!-- 投资策略 -->
<div class="grid md:grid-cols-2 gap-6 mb-8">
<div class="glass-morphism rounded-xl p-6">
<h3 class="text-xl font-bold mb-4 text-green-600">
<i class="fas fa-chess-rook mr-2"></i>操作策略
</h3>
<div class="space-y-4">
<div class="bg-green-50 rounded-lg p-4">
<div class="font-semibold mb-2">三日法则</div>
<p class="text-sm text-gray-600">每3日评估一次若数据未达预期立即减半</p>
</div>
<div class="bg-yellow-50 rounded-lg p-4">
<div class="font-semibold mb-2">止损纪律</div>
<p class="text-sm text-gray-600">买入3日内若下跌超5%,立即止损</p>
</div>
<div class="bg-blue-50 rounded-lg p-4">
<div class="font-semibold mb-2">仓位控制</div>
<p class="text-sm text-gray-600">主题配置不超过10%,卫星策略定位</p>
</div>
</div>
</div>
<div class="glass-morphism rounded-xl p-6">
<h3 class="text-xl font-bold mb-4 text-red-600">
<i class="fas fa-exclamation-triangle mr-2"></i>关键风险
</h3>
<div class="space-y-4">
<div class="bg-red-50 rounded-lg p-4">
<div class="font-semibold mb-2">可持续性风险</div>
<p class="text-sm text-gray-600">天气红利难持续,寒潮结束需求断崖</p>
</div>
<div class="bg-orange-50 rounded-lg p-4">
<div class="font-semibold mb-2">技术风险</div>
<p class="text-sm text-gray-600">热泵低温性能衰减,-10℃以下COP降至2.5</p>
</div>
<div class="bg-purple-50 rounded-lg p-4">
<div class="font-semibold mb-2">政策风险</div>
<p class="text-sm text-gray-600">保供压制煤价长协上限770元/吨</p>
</div>
</div>
</div>
</div>
<!-- 关键跟踪指标 -->
<div class="glass-morphism rounded-2xl p-8">
<h2 class="text-3xl font-bold gradient-text mb-6">关键跟踪指标</h2>
<div class="grid md:grid-cols-3 gap-6">
<div class="bg-gradient-to-r from-red-500 to-orange-500 text-white rounded-xl p-6">
<div class="text-2xl font-bold mb-2">一级指标(每日)</div>
<ul class="space-y-2 text-sm">
<li>• 中央气象台预警等级</li>
<li>• 东三省电厂日耗(>60万吨</li>
<li>• 生猪日屠宰量(>17万头</li>
</ul>
</div>
<div class="bg-gradient-to-r from-blue-500 to-indigo-500 text-white rounded-xl p-6">
<div class="text-2xl font-bold mb-2">二级指标(每周)</div>
<ul class="space-y-2 text-sm">
<li>• 秦皇岛港库存(<500万吨</li>
<li>• 羽绒原料价格指数(周涨>5%</li>
<li>• 小家电换手率(>5%</li>
</ul>
</div>
<div class="bg-gradient-to-r from-green-500 to-teal-500 text-white rounded-xl p-6">
<div class="text-2xl font-bold mb-2">三级指标(每月)</div>
<ul class="space-y-2 text-sm">
<li>• 天猫京东羽绒服销量</li>
<li>• 企业月度经营数据</li>
<li>• 能源库存变动</li>
</ul>
</div>
</div>
</div>
</div>
<!-- Footer -->
<footer class="hero-gradient text-white py-8 mt-20">
<div class="container mx-auto px-4 text-center">
<p class="mb-2">寒潮投资概念解析 - 数据更新至2025年</p>
<p class="text-sm opacity-75">本内容仅供参考,不构成投资建议</p>
</div>
</footer>
<script>
// 动态效果
document.addEventListener('DOMContentLoaded', function() {
// 滚动动画
const observerOptions = {
threshold: 0.1,
rootMargin: '0px 0px -100px 0px'
};
const observer = new IntersectionObserver(function(entries) {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.style.opacity = '1';
entry.target.style.transform = 'translateY(0)';
}
});
}, observerOptions);
document.querySelectorAll('.card-hover').forEach(el => {
el.style.opacity = '0';
el.style.transform = 'translateY(20px)';
el.style.transition = 'all 0.6s ease';
observer.observe(el);
});
// 表格行悬停效果
document.querySelectorAll('tbody tr').forEach(row => {
row.addEventListener('mouseenter', function() {
this.style.transform = 'scale(1.02)';
this.style.transition = 'all 0.2s ease';
});
row.addEventListener('mouseleave', function() {
this.style.transform = 'scale(1)';
});
});
});
</script>
</body>
</html>

View File

@@ -0,0 +1,746 @@
我将为您创建一个专业的金融投资分析页面,展示"对日反制"投资概念的深度分析。这个页面将融合金融严谨性与现代设计美学。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>对日反制投资概念深度分析</title>
<script src="https://cdn.tailwindcss.com"></script>
<link href="https://cdn.jsdelivr.net/npm/daisyui@4.4.19/dist/full.min.css" rel="stylesheet" type="text/css" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<style>
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&display=swap');
* {
font-family: 'Inter', system-ui, -apple-system, sans-serif;
}
.glass-morphism {
background: rgba(255, 255, 255, 0.1);
backdrop-filter: blur(10px);
border: 1px solid rgba(255, 255, 255, 0.2);
}
.gradient-border {
position: relative;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
padding: 2px;
border-radius: 1rem;
}
.gradient-border-inner {
background: #0f172a;
border-radius: calc(1rem - 2px);
padding: 1.5rem;
}
.timeline-line {
background: linear-gradient(180deg, #3b82f6 0%, #8b5cf6 100%);
}
.hover-card {
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}
.hover-card:hover {
transform: translateY(-4px);
box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.3);
}
.pulse-dot {
animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
}
@keyframes pulse {
0%, 100% { opacity: 1; }
50% { opacity: .5; }
}
.stock-table {
overflow-x: auto;
}
.stock-table::-webkit-scrollbar {
height: 8px;
}
.stock-table::-webkit-scrollbar-track {
background: rgba(255, 255, 255, 0.05);
border-radius: 4px;
}
.stock-table::-webkit-scrollbar-thumb {
background: linear-gradient(135deg, #3b82f6 0%, #8b5cf6 100%);
border-radius: 4px;
}
.tag-primary {
background: linear-gradient(135deg, #3b82f6 0%, #2563eb 100%);
}
.tag-secondary {
background: linear-gradient(135deg, #8b5cf6 0%, #7c3aed 100%);
}
.tag-accent {
background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);
}
.number-stat {
background: linear-gradient(135deg, #10b981 0%, #059669 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.risk-high { border-left: 4px solid #ef4444; }
.risk-medium { border-left: 4px solid #f59e0b; }
.risk-low { border-left: 4px solid #10b981; }
</style>
</head>
<body class="bg-gray-950 text-white">
<!-- Hero Section -->
<div class="relative min-h-screen flex items-center justify-center overflow-hidden">
<div class="absolute inset-0 bg-gradient-to-br from-blue-900/20 via-purple-900/20 to-gray-950"></div>
<div class="absolute inset-0 bg-[url('data:image/svg+xml,%3Csvg width="60" height="60" viewBox="0 0 60 60" xmlns="http://www.w3.org/2000/svg"%3E%3Cg fill="none" fill-rule="evenodd"%3E%3Cg fill="%239C92AC" fill-opacity="0.05"%3E%3Cpath d="M36 34v-4h-2v4h-4v2h4v4h2v-4h4v-2h-4zm0-30V0h-2v4h-4v2h4v4h2V6h4V4h-4zM6 34v-4H4v4H0v2h4v4h2v-4h4v-2H6zM6 4V0H4v4H0v2h4v4h2V6h4V4H6z"/%3E%3C/g%3E%3C/g%3E%3C/svg%3E')]"></div>
<div class="relative z-10 max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-20">
<div class="text-center mb-12">
<div class="inline-flex items-center px-4 py-2 rounded-full bg-gradient-to-r from-blue-500/20 to-purple-500/20 backdrop-blur-sm mb-6">
<span class="pulse-dot w-2 h-2 bg-green-400 rounded-full mr-2"></span>
<span class="text-sm font-medium text-gray-300">2025年下半年地缘政治驱动的投资机会</span>
</div>
<h1 class="text-5xl md:text-7xl font-bold mb-6 bg-gradient-to-r from-blue-400 via-purple-400 to-pink-400 bg-clip-text text-transparent">
对日反制概念
</h1>
<p class="text-xl text-gray-400 max-w-3xl mx-auto leading-relaxed">
地缘政治博弈下的国产替代加速,从精准制裁到产业链重构的投资逻辑梳理
</p>
</div>
<div class="grid grid-cols-1 md:grid-cols-3 gap-6 mt-16">
<div class="glass-morphism rounded-2xl p-6 hover-card">
<div class="flex items-center mb-4">
<div class="w-12 h-12 rounded-xl bg-gradient-to-r from-red-500 to-orange-500 flex items-center justify-center">
<i class="fas fa-exclamation-triangle text-white text-xl"></i>
</div>
<h3 class="ml-4 text-lg font-semibold">风险警示</h3>
</div>
<p class="text-gray-400">主题炒作早期阶段,警惕情绪退潮风险,政策不确定性高</p>
</div>
<div class="glass-morphism rounded-2xl p-6 hover-card">
<div class="flex items-center mb-4">
<div class="w-12 h-12 rounded-xl bg-gradient-to-r from-blue-500 to-cyan-500 flex items-center justify-center">
<i class="fas fa-industry text-white text-xl"></i>
</div>
<h3 class="ml-4 text-lg font-semibold">核心机会</h3>
</div>
<p class="text-gray-400">资源管制 > 材料替代 > 水产出口,关注实质性国产替代标的</p>
</div>
<div class="glass-morphism rounded-2xl p-6 hover-card">
<div class="flex items-center mb-4">
<div class="w-12 h-12 rounded-xl bg-gradient-to-r from-purple-500 to-pink-500 flex items-center justify-center">
<i class="fas fa-chart-line text-white text-xl"></i>
</div>
<h3 class="ml-4 text-lg font-semibold">时间窗口</h3>
</div>
<p class="text-gray-400">3-6个月关键观察期等待政策验证不赌情绪溢价</p>
</div>
</div>
</div>
</div>
<!-- Timeline Section -->
<div class="py-20 px-4 sm:px-6 lg:px-8">
<div class="max-w-7xl mx-auto">
<h2 class="text-3xl md:text-4xl font-bold mb-12 text-center">
<span class="bg-gradient-to-r from-blue-400 to-purple-400 bg-clip-text text-transparent">
关键事件时间轴
</span>
</h2>
<div class="relative">
<div class="absolute left-1/2 transform -translate-x-1/2 w-1 h-full timeline-line rounded-full"></div>
<div class="space-y-12">
<!-- Event 1 -->
<div class="flex items-center justify-center">
<div class="w-full md:w-5/12 text-right pr-8 hidden md:block">
<div class="gradient-border">
<div class="gradient-border-inner">
<div class="text-sm text-purple-400 mb-2">2025年5月19日</div>
<h4 class="text-lg font-semibold mb-2">背景伏笔:资源管制启动</h4>
<p class="text-gray-400 text-sm">缅甸成为日本T金属第一大供应国但货源依赖中国境内非法走私中方加强全链条管控</p>
</div>
</div>
</div>
<div class="absolute left-1/2 transform -translate-x-1/2 w-4 h-4 bg-blue-500 rounded-full border-4 border-gray-950"></div>
<div class="w-full md:w-5/12 pl-8 md:hidden">
<div class="gradient-border">
<div class="gradient-border-inner">
<div class="text-sm text-purple-400 mb-2">2025年5月19日</div>
<h4 class="text-lg font-semibold mb-2">背景伏笔:资源管制启动</h4>
<p class="text-gray-400 text-sm">缅甸成为日本T金属第一大供应国但货源依赖中国境内非法走私中方加强全链条管控</p>
</div>
</div>
</div>
</div>
<!-- Event 2 -->
<div class="flex items-center justify-center">
<div class="w-full md:w-5/12 text-right pr-8 hidden md:block">
<div class="gradient-border">
<div class="gradient-border-inner">
<div class="text-sm text-orange-400 mb-2">2025年9月8日</div>
<h4 class="text-lg font-semibold mb-2">精准制裁落地</h4>
<p class="text-gray-400 text-sm">外交部依据《反外国制裁法》对日本参议员石平实施制裁,冻结资产、禁止交易、人员禁入</p>
</div>
</div>
</div>
<div class="absolute left-1/2 transform -translate-x-1/2 w-4 h-4 bg-orange-500 rounded-full border-4 border-gray-950 pulse-dot"></div>
<div class="w-full md:w-5/12 pl-8 md:hidden">
<div class="gradient-border">
<div class="gradient-border-inner">
<div class="text-sm text-orange-400 mb-2">2025年9月8日</div>
<h4 class="text-lg font-semibold mb-2">精准制裁落地</h4>
<p class="text-gray-400 text-sm">外交部依据《反外国制裁法》对日本参议员石平实施制裁,冻结资产、禁止交易、人员禁入</p>
</div>
</div>
</div>
</div>
<!-- Event 3 -->
<div class="flex items-center justify-center">
<div class="w-full md:w-5/12 text-right pr-8 hidden md:block">
<div class="gradient-border">
<div class="gradient-border-inner">
<div class="text-sm text-red-400 mb-2">2025年11月15日</div>
<h4 class="text-lg font-semibold mb-2">事态升级信号</h4>
<p class="text-gray-400 text-sm">"玉渊谭天"发布:针对高市早苗挑衅,中方表态从"敦促"升级为"一切后果由日方承担"</p>
</div>
</div>
</div>
<div class="absolute left-1/2 transform -translate-x-1/2 w-4 h-4 bg-red-500 rounded-full border-4 border-gray-950 pulse-dot"></div>
<div class="w-full md:w-5/12 pl-8 md:hidden">
<div class="gradient-border">
<div class="gradient-border-inner">
<div class="text-sm text-red-400 mb-2">2025年11月15日</div>
<h4 class="text-lg font-semibold mb-2">事态升级信号</h4>
<p class="text-gray-400 text-sm">"玉渊谭天"发布:针对高市早苗挑衅,中方表态从"敦促"升级为"一切后果由日方承担"</p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Core Logic Section -->
<div class="py-20 px-4 sm:px-6 lg:px-8 bg-gradient-to-b from-gray-950 to-gray-900">
<div class="max-w-7xl mx-auto">
<h2 class="text-3xl md:text-4xl font-bold mb-12 text-center">
<span class="bg-gradient-to-r from-cyan-400 to-blue-400 bg-clip-text text-transparent">
核心逻辑三层递进
</span>
</h2>
<div class="grid grid-cols-1 lg:grid-cols-3 gap-8">
<div class="relative">
<div class="absolute inset-0 bg-gradient-to-r from-blue-500/20 to-transparent rounded-2xl blur-xl"></div>
<div class="relative glass-morphism rounded-2xl p-8 h-full">
<div class="flex items-center mb-4">
<div class="w-10 h-10 rounded-lg bg-blue-500/20 flex items-center justify-center">
<span class="text-2xl font-bold text-blue-400">1</span>
</div>
<h3 class="ml-3 text-xl font-semibold">政治惩戒必要性</h3>
</div>
<p class="text-gray-400 mb-4">
石平案开创对日政治人物精准制裁先例,法律依据明确,手段涵盖资产冻结、人员禁入、供应链隔离,形成强力震慑。
</p>
<div class="flex flex-wrap gap-2">
<span class="px-3 py-1 rounded-full text-xs font-medium tag-primary">《反外国制裁法》</span>
<span class="px-3 py-1 rounded-full text-xs font-medium tag-primary">精准制裁</span>
<span class="px-3 py-1 rounded-full text-xs font-medium tag-primary">民意基础</span>
</div>
</div>
</div>
<div class="relative">
<div class="absolute inset-0 bg-gradient-to-r from-purple-500/20 to-transparent rounded-2xl blur-xl"></div>
<div class="relative glass-morphism rounded-2xl p-8 h-full">
<div class="flex items-center mb-4">
<div class="w-10 h-10 rounded-lg bg-purple-500/20 flex items-center justify-center">
<span class="text-2xl font-bold text-purple-400">2</span>
</div>
<h3 class="ml-3 text-xl font-semibold">资源反制可行性</h3>
</div>
<p class="text-gray-400 mb-4">
日本在半导体材料、高性能陶瓷、OLED材料等领域深度依赖中国供应链。中方已在战略矿产实施全链条管控具备"卡脖子"能力。
</p>
<div class="flex flex-wrap gap-2">
<span class="px-3 py-1 rounded-full text-xs font-medium tag-secondary">半导体材料</span>
<span class="px-3 py-1 rounded-full text-xs font-medium tag-secondary">稀土管制</span>
<span class="px-3 py-1 rounded-full text-xs font-medium tag-secondary">全链条管控</span>
</div>
</div>
</div>
<div class="relative">
<div class="absolute inset-0 bg-gradient-to-r from-orange-500/20 to-transparent rounded-2xl blur-xl"></div>
<div class="relative glass-morphism rounded-2xl p-8 h-full">
<div class="flex items-center mb-4">
<div class="w-10 h-10 rounded-lg bg-orange-500/20 flex items-center justify-center">
<span class="text-2xl font-bold text-orange-400">3</span>
</div>
<h3 class="ml-3 text-xl font-semibold">国力博弈战略性</h3>
</div>
<p class="text-gray-400 mb-4">
日本面临"美关税压力+国内加息+经济疲软"三重困境GDP连续负增长对华出口依存度超20%,此时反制可精准打击其执政基础。
</p>
<div class="flex flex-wrap gap-2">
<span class="px-3 py-1 rounded-full text-xs font-medium tag-accent">两线承压</span>
<span class="px-3 py-1 rounded-full text-xs font-medium tag-accent">战略筹码</span>
<span class="px-3 py-1 rounded-full text-xs font-medium tag-accent">以点破面</span>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Stock Data Tables -->
<div class="py-20 px-4 sm:px-6 lg:px-8">
<div class="max-w-7xl mx-auto">
<h2 class="text-3xl md:text-4xl font-bold mb-12 text-center">
<span class="bg-gradient-to-r from-green-400 to-emerald-400 bg-clip-text text-transparent">
核心标的深度剖析
</span>
</h2>
<div class="space-y-8">
<!-- Semiconductor Materials -->
<div class="gradient-border">
<div class="gradient-border-inner">
<h3 class="text-2xl font-bold mb-6 flex items-center">
<i class="fas fa-microchip mr-3 text-blue-400"></i>
半导体材料板块
</h3>
<div class="stock-table">
<table class="w-full text-sm">
<thead>
<tr class="border-b border-gray-700">
<th class="text-left py-3 px-4 font-semibold text-gray-300">股票代码</th>
<th class="text-left py-3 px-4 font-semibold text-gray-300">细分领域</th>
<th class="text-left py-3 px-4 font-semibold text-gray-300">日本产业地位</th>
<th class="text-left py-3 px-4 font-semibold text-gray-300">核心竞争力</th>
<th class="text-left py-3 px-4 font-semibold text-gray-300">风险等级</th>
</tr>
</thead>
<tbody>
<tr class="border-b border-gray-800 hover:bg-gray-800/50 transition-colors">
<td class="py-3 px-4 font-medium text-blue-400">彤程新材</td>
<td class="py-3 px-4">ArF/KrF光刻胶</td>
<td class="py-3 px-4">日系及杜邦主导</td>
<td class="py-3 px-4">KrF量产ArF验证中</td>
<td class="py-3 px-4"><span class="px-2 py-1 rounded text-xs bg-yellow-500/20 text-yellow-400">中等</span></td>
</tr>
<tr class="border-b border-gray-800 hover:bg-gray-800/50 transition-colors">
<td class="py-3 px-4 font-medium text-blue-400">南大光电</td>
<td class="py-3 px-4">ArF光刻胶</td>
<td class="py-3 px-4">日系及杜邦主导</td>
<td class="py-3 px-4">通过02专项验收</td>
<td class="py-3 px-4"><span class="px-2 py-1 rounded text-xs bg-yellow-500/20 text-yellow-400">中等</span></td>
</tr>
<tr class="border-b border-gray-800 hover:bg-gray-800/50 transition-colors">
<td class="py-3 px-4 font-medium text-purple-400">华懋科技</td>
<td class="py-3 px-4">PSPI</td>
<td class="py-3 px-4">日本东丽、旭化成主导</td>
<td class="py-3 px-4">收购徐州博康PSPI量产</td>
<td class="py-3 px-4"><span class="px-2 py-1 rounded text-xs bg-red-500/20 text-red-400"></span></td>
</tr>
<tr class="border-b border-gray-800 hover:bg-gray-800/50 transition-colors">
<td class="py-3 px-4 font-medium text-purple-400">鼎龙股份</td>
<td class="py-3 px-4">PSPI</td>
<td class="py-3 px-4">日本东丽、旭化成主导</td>
<td class="py-3 px-4">PSPI产品国内领先</td>
<td class="py-3 px-4"><span class="px-2 py-1 rounded text-xs bg-red-500/20 text-red-400"></span></td>
</tr>
<tr class="border-b border-gray-800 hover:bg-gray-800/50 transition-colors">
<td class="py-3 px-4 font-medium text-green-400">华海诚科</td>
<td class="py-3 px-4">环氧塑封料EMC</td>
<td class="py-3 px-4">日本住友电工、力森诺科主导</td>
<td class="py-3 px-4">H1营收占比92.8%</td>
<td class="py-3 px-4"><span class="px-2 py-1 rounded text-xs bg-green-500/20 text-green-400"></span></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<!-- High Performance Ceramics -->
<div class="gradient-border">
<div class="gradient-border-inner">
<h3 class="text-2xl font-bold mb-6 flex items-center">
<i class="fas fa-cube mr-3 text-purple-400"></i>
高性能陶瓷板块
</h3>
<div class="stock-table">
<table class="w-full text-sm">
<thead>
<tr class="border-b border-gray-700">
<th class="text-left py-3 px-4 font-semibold text-gray-300">股票代码</th>
<th class="text-left py-3 px-4 font-semibold text-gray-300">细分领域</th>
<th class="text-left py-3 px-4 font-semibold text-gray-300">日本产业地位</th>
<th class="text-left py-3 px-4 font-semibold text-gray-300">技术优势</th>
<th class="text-left py-3 px-4 font-semibold text-gray-300">风险等级</th>
</tr>
</thead>
<tbody>
<tr class="border-b border-gray-800 hover:bg-gray-800/50 transition-colors">
<td class="py-3 px-4 font-medium text-purple-400">国瓷材料</td>
<td class="py-3 px-4">MLCC陶瓷粉体</td>
<td class="py-3 px-4">日本京瓷、TDK主导</td>
<td class="py-3 px-4">全球MLCC粉体龙头</td>
<td class="py-3 px-4"><span class="px-2 py-1 rounded text-xs bg-green-500/20 text-green-400"></span></td>
</tr>
<tr class="border-b border-gray-800 hover:bg-gray-800/50 transition-colors">
<td class="py-3 px-4 font-medium text-purple-400">三环集团</td>
<td class="py-3 px-4">陶瓷电容</td>
<td class="py-3 px-4">日本京瓷、TDK主导</td>
<td class="py-3 px-4">国内MLCC龙头</td>
<td class="py-3 px-4"><span class="px-2 py-1 rounded text-xs bg-green-500/20 text-green-400"></span></td>
</tr>
<tr class="border-b border-gray-800 hover:bg-gray-800/50 transition-colors">
<td class="py-3 px-4 font-medium text-purple-400">中瓷电子</td>
<td class="py-3 px-4">电子陶瓷外壳</td>
<td class="py-3 px-4">日本京瓷、TDK主导</td>
<td class="py-3 px-4">军用电子陶瓷领先</td>
<td class="py-3 px-4"><span class="px-2 py-1 rounded text-xs bg-yellow-500/20 text-yellow-400">中等</span></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<!-- Other Related Stocks -->
<div class="gradient-border">
<div class="gradient-border-inner">
<h3 class="text-2xl font-bold mb-6 flex items-center">
<i class="fas fa-water mr-3 text-cyan-400"></i>
其他相关板块
</h3>
<div class="stock-table">
<table class="w-full text-sm">
<thead>
<tr class="border-b border-gray-700">
<th class="text-left py-3 px-4 font-semibold text-gray-300">股票代码</th>
<th class="text-left py-3 px-4 font-semibold text-gray-300">细分领域</th>
<th class="text-left py-3 px-4 font-semibold text-gray-300">关联逻辑</th>
<th class="text-left py-3 px-4 font-semibold text-gray-300">实际受益度</th>
<th class="text-left py-3 px-4 font-semibold text-gray-300">投资建议</th>
</tr>
</thead>
<tbody>
<tr class="border-b border-gray-800 hover:bg-gray-800/50 transition-colors">
<td class="py-3 px-4 font-medium text-cyan-400">中水渔业</td>
<td class="py-3 px-4">水产养殖</td>
<td class="py-3 px-4">对日出口占比10%</td>
<td class="py-3 px-4"><span class="text-red-400">受损方</span></td>
<td class="py-3 px-4"><span class="px-2 py-1 rounded text-xs bg-red-500/20 text-red-400">规避</span></td>
</tr>
<tr class="border-b border-gray-800 hover:bg-gray-800/50 transition-colors">
<td class="py-3 px-4 font-medium text-cyan-400">乐凯胶片</td>
<td class="py-3 px-4">偏光片TAC膜</td>
<td class="py-3 px-4">唯一国产TFT-TAC膜</td>
<td class="py-3 px-4">技术突破但规模小</td>
<td class="py-3 px-4"><span class="px-2 py-1 rounded text-xs bg-yellow-500/20 text-yellow-400">观察</span></td>
</tr>
<tr class="border-b border-gray-800 hover:bg-gray-800/50 transition-colors">
<td class="py-3 px-4 font-medium text-cyan-400">中国稀土</td>
<td class="py-3 px-4">稀土资源</td>
<td class="py-3 px-4">潜在反制工具</td>
<td class="py-3 px-4"><span class="text-green-400"></span></td>
<td class="py-3 px-4"><span class="px-2 py-1 rounded text-xs bg-green-500/20 text-green-400">关注</span></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Risk Analysis -->
<div class="py-20 px-4 sm:px-6 lg:px-8 bg-gradient-to-b from-gray-900 to-gray-950">
<div class="max-w-7xl mx-auto">
<h2 class="text-3xl md:text-4xl font-bold mb-12 text-center">
<span class="bg-gradient-to-r from-red-400 to-orange-400 bg-clip-text text-transparent">
风险提示与挑战
</span>
</h2>
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
<div class="glass-morphism rounded-2xl p-6 risk-high hover-card">
<div class="flex items-center mb-4">
<div class="w-10 h-10 rounded-lg bg-red-500/20 flex items-center justify-center">
<i class="fas fa-exclamation-triangle text-red-400"></i>
</div>
<h3 class="ml-3 text-lg font-semibold">技术风险</h3>
</div>
<p class="text-gray-400 text-sm mb-3">
光刻胶需12-18个月验证期国产良率低、价格高20-30%,若日方断供将导致停产风险
</p>
<div class="text-xs text-gray-500">
关键指标:良率稳定性 &lt; 90%
</div>
</div>
<div class="glass-morphism rounded-2xl p-6 risk-high hover-card">
<div class="flex items-center mb-4">
<div class="w-10 h-10 rounded-lg bg-red-500/20 flex items-center justify-center">
<i class="fas fa-sync-alt text-red-400"></i>
</div>
<h3 class="ml-3 text-lg font-semibold">反制螺旋风险</h3>
</div>
<p class="text-gray-400 text-sm mb-3">
日本可能对半导体设备、精密仪器实施出口管制,影响长江存储、中芯国际扩产计划
</p>
<div class="text-xs text-gray-500">
关键指标:东京电子设备出口许可
</div>
</div>
<div class="glass-morphism rounded-2xl p-6 risk-medium hover-card">
<div class="flex items-center mb-4">
<div class="w-10 h-10 rounded-lg bg-yellow-500/20 flex items-center justify-center">
<i class="fas fa-dollar-sign text-yellow-400"></i>
</div>
<h3 class="ml-3 text-lg font-semibold">商业化风险</h3>
</div>
<p class="text-gray-400 text-sm mb-3">
规模不经济导致国产替代成本高,晶圆厂替换动力不足,商业化进程缓慢
</p>
<div class="text-xs text-gray-500">
关键指标:国产替代成本差异 &gt; 15%
</div>
</div>
<div class="glass-morphism rounded-2xl p-6 risk-medium hover-card">
<div class="flex items-center mb-4">
<div class="w-10 h-10 rounded-lg bg-yellow-500/20 flex items-center justify-center">
<i class="fas fa-users text-yellow-400"></i>
</div>
<h3 class="ml-3 text-lg font-semibold">客户集中度风险</h3>
</div>
<p class="text-gray-400 text-sm mb-3">
华海诚科等公司前五大客户占比超70%,若终端需求下滑将大幅影响业绩
</p>
<div class="text-xs text-gray-500">
关键指标CR5 &gt; 70%
</div>
</div>
<div class="glass-morphism rounded-2xl p-6 risk-low hover-card">
<div class="flex items-center mb-4">
<div class="w-10 h-10 rounded-lg bg-green-500/20 flex items-center justify-center">
<i class="fas fa-shield-alt text-green-400"></i>
</div>
<h3 class="ml-3 text-lg font-semibold">政策持续性</h3>
</div>
<p class="text-gray-400 text-sm mb-3">
国产替代政策具有长期性,即使地缘缓和,产业链安全仍是核心诉求
</p>
<div class="text-xs text-gray-500">
关键指标:"十四五"规划延续性
</div>
</div>
<div class="glass-morphism rounded-2xl p-6 risk-low hover-card">
<div class="flex items-center mb-4">
<div class="w-10 h-10 rounded-lg bg-green-500/20 flex items-center justify-center">
<i class="fas fa-chart-line text-green-400"></i>
</div>
<h3 class="ml-3 text-lg font-semibold">市场需求确定</h3>
</div>
<p class="text-gray-400 text-sm mb-3">
半导体、新能源等下游需求旺盛,为国产替代提供确定的市场空间
</p>
<div class="text-xs text-gray-500">
关键指标半导体CAPEX增速 &gt; 10%
</div>
</div>
</div>
</div>
</div>
<!-- Investment Strategy -->
<div class="py-20 px-4 sm:px-6 lg:px-8">
<div class="max-w-7xl mx-auto">
<div class="gradient-border mb-12">
<div class="gradient-border-inner text-center">
<h2 class="text-3xl md:text-4xl font-bold mb-4">
<span class="bg-gradient-to-r from-emerald-400 to-cyan-400 bg-clip-text text-transparent">
投资策略与操作建议
</span>
</h2>
<p class="text-gray-400 text-lg">
当前阶段,观望优于参与。等待政策验证,不赌情绪溢价
</p>
</div>
</div>
<div class="grid grid-cols-1 lg:grid-cols-3 gap-8 mb-12">
<div class="glass-morphism rounded-2xl p-6 hover-card">
<div class="text-center mb-6">
<div class="inline-flex items-center justify-center w-16 h-16 rounded-full bg-gradient-to-r from-green-500 to-emerald-500 mb-4">
<i class="fas fa-check-circle text-white text-2xl"></i>
</div>
<h3 class="text-xl font-bold mb-2">重点配置</h3>
<p class="text-sm text-gray-400">资源管制 > 材料替代 > 水产出口</p>
</div>
<div class="space-y-3">
<div class="flex items-center">
<span class="w-2 h-2 bg-green-400 rounded-full mr-3"></span>
<span class="text-sm">中国稀土(资源定价权)</span>
</div>
<div class="flex items-center">
<span class="w-2 h-2 bg-green-400 rounded-full mr-3"></span>
<span class="text-sm">华海诚科EMC龙头</span>
</div>
<div class="flex items-center">
<span class="w-2 h-2 bg-green-400 rounded-full mr-3"></span>
<span class="text-sm">鼎龙股份PSPI量产</span>
</div>
</div>
</div>
<div class="glass-morphism rounded-2xl p-6 hover-card">
<div class="text-center mb-6">
<div class="inline-flex items-center justify-center w-16 h-16 rounded-full bg-gradient-to-r from-yellow-500 to-orange-500 mb-4">
<i class="fas fa-eye text-white text-2xl"></i>
</div>
<h3 class="text-xl font-bold mb-2">观察等待</h3>
<p class="text-sm text-gray-400">技术突破但规模尚小</p>
</div>
<div class="space-y-3">
<div class="flex items-center">
<span class="w-2 h-2 bg-yellow-400 rounded-full mr-3"></span>
<span class="text-sm">彤程新材(光刻胶验证)</span>
</div>
<div class="flex items-center">
<span class="w-2 h-2 bg-yellow-400 rounded-full mr-3"></span>
<span class="text-sm">乐凯胶片TAC膜研发</span>
</div>
<div class="flex items-center">
<span class="w-2 h-2 bg-yellow-400 rounded-full mr-3"></span>
<span class="text-sm">南大光电ArF进展</span>
</div>
</div>
</div>
<div class="glass-morphism rounded-2xl p-6 hover-card">
<div class="text-center mb-6">
<div class="inline-flex items-center justify-center w-16 h-16 rounded-full bg-gradient-to-r from-red-500 to-pink-500 mb-4">
<i class="fas fa-times-circle text-white text-2xl"></i>
</div>
<h3 class="text-xl font-bold mb-2">坚决规避</h3>
<p class="text-sm text-gray-400">逻辑错误,将直接受损</p>
</div>
<div class="space-y-3">
<div class="flex items-center">
<span class="w-2 h-2 bg-red-400 rounded-full mr-3"></span>
<span class="text-sm">中水渔业(水产出口)</span>
</div>
<div class="flex items-center">
<span class="w-2 h-2 bg-red-400 rounded-full mr-3"></span>
<span class="text-sm">国联水产(对日依赖)</span>
</div>
<div class="flex items-center">
<span class="w-2 h-2 bg-red-400 rounded-full mr-3"></span>
<span class="text-sm">獐子岛(贸易风险)</span>
</div>
</div>
</div>
</div>
<!-- Key Metrics -->
<div class="glass-morphism rounded-2xl p-8">
<h3 class="text-2xl font-bold mb-6">关键跟踪指标</h3>
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6">
<div class="text-center">
<div class="text-3xl font-bold number-stat mb-2">≥2次/月</div>
<div class="text-sm text-gray-400">部级官员提及反制</div>
</div>
<div class="text-center">
<div class="text-3xl font-bold number-stat mb-2">≥1项</div>
<div class="text-sm text-gray-400">贸易救济立案</div>
</div>
<div class="text-center">
<div class="text-3xl font-bold number-stat mb-2">>30天</div>
<div class="text-sm text-gray-400">出口许可周期</div>
</div>
<div class="text-center">
<div class="text-3xl font-bold number-stat mb-2">>15%</div>
<div class="text-sm text-gray-400">概念股换手率</div>
</div>
</div>
</div>
</div>
</div>
<!-- Footer -->
<footer class="py-12 px-4 border-t border-gray-800">
<div class="max-w-7xl mx-auto text-center">
<p class="text-gray-500 text-sm">
* 本分析基于公开信息整理,不构成投资建议。投资有风险,决策需谨慎。
</p>
<p class="text-gray-600 text-xs mt-4">
数据来源:外交部、产业库、公司财报、机构调研 | 更新时间2025年11月
</p>
</div>
</footer>
<script>
// Add smooth scroll behavior
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
anchor.addEventListener('click', function (e) {
e.preventDefault();
const target = document.querySelector(this.getAttribute('href'));
if (target) {
target.scrollIntoView({ behavior: 'smooth' });
}
});
});
// Add intersection observer for fade-in animations
const observerOptions = {
threshold: 0.1,
rootMargin: '0px 0px -50px 0px'
};
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.style.opacity = '1';
entry.target.style.transform = 'translateY(0)';
}
});
}, observerOptions);
document.querySelectorAll('.hover-card').forEach(card => {
card.style.opacity = '0';
card.style.transform = 'translateY(20px)';
card.style.transition = 'opacity 0.6s ease, transform 0.6s ease';
observer.observe(card);
});
</script>
</body>
</html>

604
public/htmls/忆阻器.html Normal file
View File

@@ -0,0 +1,604 @@
我将为您生成一个专业、详实的忆阻器概念分析页面,融合金融分析深度与现代前端美学。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>忆阻器 - 下一代AI硬件的颠覆性力量</title>
<script src="https://cdn.tailwindcss.com"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<style>
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&display=swap');
* {
font-family: 'Inter', system-ui, -apple-system, sans-serif;
}
.glass-effect {
background: rgba(255, 255, 255, 0.1);
backdrop-filter: blur(10px);
border: 1px solid rgba(255, 255, 255, 0.2);
}
.gradient-text {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.tech-card {
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}
.tech-card:hover {
transform: translateY(-8px) scale(1.02);
box-shadow: 0 20px 40px rgba(0, 0, 0, 0.15);
}
.timeline-line {
background: linear-gradient(180deg, transparent, #667eea, #764ba2, transparent);
}
.pulse-dot {
animation: pulse 2s infinite;
}
@keyframes pulse {
0%, 100% {
opacity: 1;
transform: scale(1);
}
50% {
opacity: 0.5;
transform: scale(1.5);
}
}
.stock-table {
font-size: 14px;
}
.stock-table th {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
font-weight: 600;
}
.risk-badge {
animation: glow 2s ease-in-out infinite alternate;
}
@keyframes glow {
from { box-shadow: 0 0 5px #ef4444; }
to { box-shadow: 0 0 20px #ef4444, 0 0 30px #ef4444; }
}
.hero-gradient {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
position: relative;
overflow: hidden;
}
.hero-gradient::before {
content: '';
position: absolute;
top: -50%;
right: -50%;
width: 200%;
height: 200%;
background: radial-gradient(circle, rgba(255,255,255,0.1) 0%, transparent 70%);
animation: rotate 30s linear infinite;
}
@keyframes rotate {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
.tech-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 20px;
}
@media (max-width: 768px) {
.stock-table {
font-size: 12px;
}
.tech-grid {
grid-template-columns: 1fr;
}
}
</style>
</head>
<body class="bg-gray-50">
<!-- Hero Section -->
<header class="hero-gradient text-white relative">
<div class="container mx-auto px-4 py-16 relative z-10">
<div class="text-center">
<div class="inline-block mb-4">
<span class="glass-effect px-4 py-2 rounded-full text-sm">
<i class="fas fa-microchip mr-2"></i>前沿科技 · 金融洞察
</span>
</div>
<h1 class="text-5xl md:text-6xl font-bold mb-6">
忆阻器
<span class="block text-3xl md:text-4xl mt-2 opacity-90">
Memristor - 破解AI算力能耗之谜
</span>
</h1>
<p class="text-xl max-w-3xl mx-auto mb-8 opacity-90">
第四代无源电路元件存算一体架构核心将AI芯片能耗降低57.2%
</p>
<div class="flex flex-wrap justify-center gap-4">
<span class="bg-white/20 px-4 py-2 rounded-lg">
<i class="fas fa-chart-line mr-2"></i>Gartner技术成熟度期望膨胀期
</span>
<span class="bg-white/20 px-4 py-2 rounded-lg">
<i class="fas fa-fire mr-2"></i>市场热度:脉冲式上升
</span>
<span class="bg-white/20 px-4 py-2 rounded-lg">
<i class="fas fa-shield-alt mr-2"></i>投资策略:早布局 · 长周期
</span>
</div>
</div>
</div>
</header>
<!-- 核心观点摘要 -->
<section class="py-16 bg-white">
<div class="container mx-auto px-4">
<h2 class="text-4xl font-bold text-center mb-12 gradient-text">
核心观点摘要
</h2>
<div class="tech-grid">
<div class="tech-card bg-gradient-to-br from-purple-50 to-indigo-50 p-6 rounded-xl border border-purple-200">
<div class="text-purple-600 mb-4">
<i class="fas fa-bolt text-3xl"></i>
</div>
<h3 class="text-xl font-semibold mb-3">技术突破验证期</h3>
<p class="text-gray-700">
已从理论验证进入工程化突破关键期AI芯片能耗锐减57.2%,脑机接口实现四自由度操控
</p>
</div>
<div class="tech-card bg-gradient-to-br from-blue-50 to-cyan-50 p-6 rounded-xl border border-blue-200">
<div class="text-blue-600 mb-4">
<i class="fas fa-industry text-3xl"></i>
</div>
<h3 class="text-xl font-semibold mb-3">0到1的幼稚期</h3>
<p class="text-gray-700">
产业整体处于"0到1"幼稚期,代工厂缺失构成最大瓶颈,创业公司被迫自建产线
</p>
</div>
<div class="tech-card bg-gradient-to-br from-green-50 to-emerald-50 p-6 rounded-xl border border-green-200">
<div class="text-green-600 mb-4">
<i class="fas fa-chart-line text-3xl"></i>
</div>
<h3 class="text-xl font-semibold mb-3">研报零覆盖</h3>
<p class="text-gray-700">
市场关注度极低6份研报零提及存在巨大预期差属于典型的"高壁垒、长周期"主题
</p>
</div>
<div class="tech-card bg-gradient-to-br from-orange-50 to-red-50 p-6 rounded-xl border border-orange-200">
<div class="text-orange-600 mb-4">
<i class="fas fa-exclamation-triangle text-3xl"></i>
</div>
<h3 class="text-xl font-semibold mb-3">核心风险</h3>
<p class="text-gray-700">
代工厂断链、材料可靠性、技术路线竞争,从实验室到商业化仍需跨越"死亡谷"
</p>
</div>
</div>
</div>
</section>
<!-- 技术突破时间轴 -->
<section class="py-16 bg-gray-100">
<div class="container mx-auto px-4">
<h2 class="text-4xl font-bold text-center mb-12">
<span class="gradient-text">技术突破时间轴</span>
</h2>
<div class="relative max-w-4xl mx-auto">
<div class="timeline-line absolute left-8 md:left-1/2 transform md:-translate-x-1/2 w-1 h-full"></div>
<!-- 2023年5月 -->
<div class="relative flex items-center mb-12">
<div class="absolute left-8 md:left-1/2 transform md:-translate-x-1/2 w-4 h-4 bg-indigo-600 rounded-full pulse-dot"></div>
<div class="ml-16 md:ml-0 md:w-1/2 md:pr-8 md:text-right">
<div class="bg-white p-4 rounded-lg shadow-lg">
<h3 class="font-semibold text-indigo-600">2023年5月29日</h3>
<p class="text-gray-700">中国移动联合清华大学完成业界首次忆阻器存算一体芯片端到端技术验证</p>
</div>
</div>
</div>
<!-- 2025年2月 -->
<div class="relative flex items-center mb-12 md:flex-row-reverse">
<div class="absolute left-8 md:left-1/2 transform md:-translate-x-1/2 w-4 h-4 bg-purple-600 rounded-full pulse-dot"></div>
<div class="ml-16 md:ml-0 md:w-1/2 md:pl-8">
<div class="bg-white p-4 rounded-lg shadow-lg">
<h3 class="font-semibold text-purple-600">2025年2月17日</h3>
<p class="text-gray-700">清华-天大团队在《自然·电子》发表基于忆阻器的"双环路"脑机接口系统</p>
</div>
</div>
</div>
<!-- 2025年7月 -->
<div class="relative flex items-center mb-12">
<div class="absolute left-8 md:left-1/2 transform md:-translate-x-1/2 w-4 h-4 bg-green-600 rounded-full pulse-dot"></div>
<div class="ml-16 md:ml-0 md:w-1/2 md:pr-8 md:text-right">
<div class="bg-white p-4 rounded-lg shadow-lg">
<h3 class="font-semibold text-green-600">2025年7月29日</h3>
<p class="text-gray-700">福晶科技披露少量供应镍酸锂晶体,忆阻器关键功能层材料量产突破</p>
</div>
</div>
</div>
<!-- 2025年11月 -->
<div class="relative flex items-center mb-12">
<div class="absolute left-8 md:left-1/2 transform md:-translate-x-1/2 w-4 h-4 bg-red-600 rounded-full pulse-dot"></div>
<div class="ml-16 md:ml-0 md:w-1/2 md:pr-8 md:text-right">
<div class="bg-white p-4 rounded-lg shadow-lg">
<h3 class="font-semibold text-red-600">2025年11月17日</h3>
<p class="text-gray-700">港大团队宣布忆阻器AI芯片能耗锐减57.2%,能效比展现颠覆性潜力</p>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- 产业链图谱 -->
<section class="py-16 bg-white">
<div class="container mx-auto px-4">
<h2 class="text-4xl font-bold text-center mb-12 gradient-text">
产业链图谱
</h2>
<div class="bg-gradient-to-r from-indigo-50 to-purple-50 rounded-xl p-8 mb-8">
<div class="grid md:grid-cols-3 gap-6">
<div class="text-center">
<div class="bg-white rounded-lg p-6 shadow-md">
<i class="fas fa-layer-group text-4xl text-indigo-600 mb-4"></i>
<h3 class="font-semibold text-lg mb-2">上游:材料与设备</h3>
<p class="text-sm text-gray-600">功能材料、制造设备、EDA工具</p>
<div class="mt-4 space-y-2">
<div class="text-sm bg-indigo-100 rounded px-2 py-1">天通股份(镍酸锂薄膜)</div>
<div class="text-sm bg-indigo-100 rounded px-2 py-1">福晶科技(晶体供应)</div>
</div>
</div>
</div>
<div class="text-center">
<div class="bg-white rounded-lg p-6 shadow-md">
<i class="fas fa-microchip text-4xl text-purple-600 mb-4"></i>
<h3 class="font-semibold text-lg mb-2">中游:器件与芯片</h3>
<p class="text-sm text-gray-600">技术验证、设计制造、代工厂</p>
<div class="mt-4 space-y-2">
<div class="text-sm bg-purple-100 rounded px-2 py-1">亿铸科技(POC芯片)</div>
<div class="text-sm bg-red-100 rounded px-2 py-1">代工厂:空缺(核心瓶颈)</div>
</div>
</div>
</div>
<div class="text-center">
<div class="bg-white rounded-lg p-6 shadow-md">
<i class="fas fa-robot text-4xl text-green-600 mb-4"></i>
<h3 class="font-semibold text-lg mb-2">下游:系统与应用</h3>
<p class="text-sm text-gray-600">脑机接口、AI芯片、边缘设备</p>
<div class="mt-4 space-y-2">
<div class="text-sm bg-green-100 rounded px-2 py-1">中国移动(边缘计算)</div>
<div class="text-sm bg-green-100 rounded px-2 py-1">清华-天大(脑机接口)</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- 股票数据表格 -->
<section class="py-16 bg-gray-100">
<div class="container mx-auto px-4">
<h2 class="text-4xl font-bold text-center mb-12 gradient-text">
核心相关公司
</h2>
<div class="bg-white rounded-xl shadow-xl overflow-hidden">
<div class="overflow-x-auto">
<table class="stock-table w-full">
<thead>
<tr>
<th class="px-4 py-3 text-left">股票名称</th>
<th class="px-4 py-3 text-left">产业链定位</th>
<th class="px-4 py-3 text-left">具体项目</th>
<th class="px-4 py-3 text-left">信源</th>
<th class="px-4 py-3 text-left">纯度评级</th>
<th class="px-4 py-3 text-left">关键逻辑</th>
</tr>
</thead>
<tbody>
<tr class="border-b hover:bg-gray-50">
<td class="px-4 py-3 font-semibold text-indigo-600">天通股份</td>
<td class="px-4 py-3">镍酸锂晶片薄膜(材料)</td>
<td class="px-4 py-3">大尺寸镍酸锂晶片</td>
<td class="px-4 py-3">互动/研报</td>
<td class="px-4 py-3">
<span class="bg-yellow-500 text-white px-2 py-1 rounded">★★★★★</span>
</td>
<td class="px-4 py-3 text-sm">销量国内第一,受益于忆阻器放量的核心材料商</td>
</tr>
<tr class="border-b hover:bg-gray-50">
<td class="px-4 py-3 font-semibold text-indigo-600">盛视科技</td>
<td class="px-4 py-3">参股亿铸科技(3.42%)</td>
<td class="px-4 py-3">基于忆阻器ReRAM的POC芯片</td>
<td class="px-4 py-3">公告</td>
<td class="px-4 py-3">
<span class="bg-blue-500 text-white px-2 py-1 rounded">★★★☆☆</span>
</td>
<td class="px-4 py-3 text-sm">财务投资+业务协同,参股国内领先忆阻器芯片公司</td>
</tr>
<tr class="border-b hover:bg-gray-50">
<td class="px-4 py-3 font-semibold text-indigo-600">中国移动</td>
<td class="px-4 py-3">产品验证方</td>
<td class="px-4 py-3">忆阻器存算一体芯片端到端技术验证</td>
<td class="px-4 py-3">新闻</td>
<td class="px-4 py-3">
<span class="bg-blue-500 text-white px-2 py-1 rounded">★★★☆☆</span>
</td>
<td class="px-4 py-3 text-sm">央企龙头,完成技术验证,具备采购拉动能力</td>
</tr>
<tr class="border-b hover:bg-gray-50">
<td class="px-4 py-3 font-semibold text-indigo-600">福晶科技</td>
<td class="px-4 py-3">镍酸锂晶体(材料)</td>
<td class="px-4 py-3">少量供应镍酸锂晶体</td>
<td class="px-4 py-3">互动</td>
<td class="px-4 py-3">
<span class="bg-orange-500 text-white px-2 py-1 rounded">★★☆☆☆</span>
</td>
<td class="px-4 py-3 text-sm">少量供应,非核心业务,贡献有限</td>
</tr>
<tr class="border-b hover:bg-gray-50">
<td class="px-4 py-3 font-semibold text-indigo-600">金百泽</td>
<td class="px-4 py-3">设计制造服务</td>
<td class="px-4 py-3">高校忆阻器研究的电子服务</td>
<td class="px-4 py-3">互动</td>
<td class="px-4 py-3">
<span class="bg-orange-500 text-white px-2 py-1 rounded">★★☆☆☆</span>
</td>
<td class="px-4 py-3 text-sm">"卖铲人"角色,为学术团队提供原型服务</td>
</tr>
<tr class="hover:bg-gray-50">
<td class="px-4 py-3 font-semibold text-indigo-600">风华高科</td>
<td class="px-4 py-3">产品</td>
<td class="px-4 py-3">忆阻器研究</td>
<td class="px-4 py-3">互动</td>
<td class="px-4 py-3">
<span class="bg-gray-500 text-white px-2 py-1 rounded">★☆☆☆☆</span>
</td>
<td class="px-4 py-3 text-sm">明确无专项投入,概念纯度最低</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</section>
<!-- 风险与挑战 -->
<section class="py-16 bg-white">
<div class="container mx-auto px-4">
<h2 class="text-4xl font-bold text-center mb-12 gradient-text">
核心风险与挑战
</h2>
<div class="grid md:grid-cols-2 gap-8">
<div class="bg-red-50 rounded-xl p-6 border-l-4 border-red-500">
<h3 class="text-xl font-semibold text-red-700 mb-4">
<i class="fas fa-exclamation-circle mr-2"></i>技术风险
</h3>
<ul class="space-y-3 text-gray-700">
<li class="flex items-start">
<i class="fas fa-times-circle text-red-500 mt-1 mr-2"></i>
<span>代工厂缺失:创业公司被迫自建产线,良率可能&lt;30%</span>
</li>
<li class="flex items-start">
<i class="fas fa-times-circle text-red-500 mt-1 mr-2"></i>
<span>材料可靠性循环寿命仅10⁵次远低于DRAM的10¹⁵次</span>
</li>
<li class="flex items-start">
<i class="fas fa-times-circle text-red-500 mt-1 mr-2"></i>
<span>集成密度当前1Kb-1Mb商业需&gt;1Gb差3个数量级</span>
</li>
</ul>
</div>
<div class="bg-orange-50 rounded-xl p-6 border-l-4 border-orange-500">
<h3 class="text-xl font-semibold text-orange-700 mb-4">
<i class="fas fa-coins mr-2"></i>商业化风险
</h3>
<ul class="space-y-3 text-gray-700">
<li class="flex items-start">
<i class="fas fa-times-circle text-orange-500 mt-1 mr-2"></i>
<span>成本倒挂:自建产线成本&gt;$100边缘AI芯片仅$5-10</span>
</li>
<li class="flex items-start">
<i class="fas fa-times-circle text-orange-500 mt-1 mr-2"></i>
<span>市场错配:脑机接口市场规模&lt;1亿无法支撑量产</span>
</li>
<li class="flex items-start">
<i class="fas fa-times-circle text-orange-500 mt-1 mr-2"></i>
<span>路线竞争SRAM/MRAM/PCRAM多路线竞争忆阻器无绝对优势</span>
</li>
</ul>
</div>
<div class="bg-yellow-50 rounded-xl p-6 border-l-4 border-yellow-500">
<h3 class="text-xl font-semibold text-yellow-700 mb-4">
<i class="fas fa-gavel mr-2"></i>政策与竞争风险
</h3>
<ul class="space-y-3 text-gray-700">
<li class="flex items-start">
<i class="fas fa-times-circle text-yellow-500 mt-1 mr-2"></i>
<span>政策优先度:未在"卡脖子"清单明确提及</span>
</li>
<li class="flex items-start">
<i class="fas fa-times-circle text-yellow-500 mt-1 mr-2"></i>
<span>国际竞争IBM/惠普专利储备领先,可能封锁代工渠道</span>
</li>
<li class="flex items-start">
<i class="fas fa-times-circle text-yellow-500 mt-1 mr-2"></i>
<span>知识产权:基础专利到期,但工艺改进专利仍在快速申请</span>
</li>
</ul>
</div>
<div class="bg-purple-50 rounded-xl p-6 border-l-4 border-purple-500">
<h3 class="text-xl font-semibold text-purple-700 mb-4">
<i class="fas fa-chart-line mr-2"></i>投资风险
</h3>
<ul class="space-y-3 text-gray-700">
<li class="flex items-start">
<i class="fas fa-times-circle text-purple-500 mt-1 mr-2"></i>
<span>预期差:新闻乐观叙事与路演负面现实形成矛盾</span>
</li>
<li class="flex items-start">
<i class="fas fa-times-circle text-purple-500 mt-1 mr-2"></i>
<span>信息真空0篇研报覆盖财务模型无法建立</span>
</li>
<li class="flex items-start">
<i class="fas fa-times-circle text-purple-500 mt-1 mr-2"></i>
<span>概念混淆:市场存在大量"伪概念股"需仔细甄别</span>
</li>
</ul>
</div>
</div>
</div>
</section>
<!-- 投资建议 -->
<section class="py-16 bg-gradient-to-br from-indigo-600 to-purple-600 text-white">
<div class="container mx-auto px-4">
<h2 class="text-4xl font-bold text-center mb-12">
投资策略建议
</h2>
<div class="grid md:grid-cols-3 gap-8">
<div class="glass-effect rounded-xl p-6">
<h3 class="text-2xl font-bold mb-4">
<i class="fas fa-lightbulb mr-2"></i>当前策略
</h3>
<p class="mb-4">
轻仓配置天通股份,作为"不对称期权"。仓位控制2-3%,向下有底,向上空间巨大。
</p>
<div class="bg-white/10 rounded-lg p-4">
<p class="text-sm">
天通股份作为材料龙头,无论技术路线如何,薄膜外延材料都是刚性需求。
</p>
</div>
</div>
<div class="glass-effect rounded-xl p-6">
<h3 class="text-2xl font-bold mb-4">
<i class="fas fa-rocket mr-2"></i>加仓条件
</h3>
<ul class="space-y-2 mb-4">
<li>✓ 中芯国际宣布忆阻器工艺平台</li>
<li>✓ 天通股份单季采购额>1000万</li>
<li>✓ 科技部设立忆阻器重大专项</li>
</ul>
<div class="bg-green-500/20 rounded-lg p-4">
<p class="text-sm">
满足任一条件仓位可提升至5-8%
</p>
</div>
</div>
<div class="glass-effect rounded-xl p-6">
<h3 class="text-2xl font-bold mb-4">
<i class="fas fa-shield-alt mr-2"></i>风控纪律
</h3>
<p class="mb-4">
若2年内未现代工厂合作或亿铸科技等头部公司倒闭应清仓离场。
</p>
<div class="bg-red-500/20 rounded-lg p-4">
<p class="text-sm">
保持70%观察、20%研究、10%参与的"狙击手"姿态
</p>
</div>
</div>
</div>
<div class="mt-12 text-center">
<p class="text-xl opacity-90">
忆阻器的命运不取决于技术多先进而取决于产业生态能否在2026年前疏通
</p>
<div class="mt-4 flex justify-center gap-4">
<span class="bg-white/20 px-4 py-2 rounded-lg">
<i class="fas fa-clock mr-2"></i>耐心等待基本面质变
</span>
<span class="bg-white/20 px-4 py-2 rounded-lg">
<i class="fas fa-chart-pie mr-2"></i>不宜重仓 · 适合配置
</span>
</div>
</div>
</div>
</section>
<!-- Footer -->
<footer class="bg-gray-900 text-gray-300 py-8">
<div class="container mx-auto px-4 text-center">
<p class="mb-2">
<i class="fas fa-info-circle mr-2"></i>
本页面基于公开信息整理,不构成投资建议
</p>
<p class="text-sm">
数据来源:新闻、路演、公司公告 | 更新时间2025年11月
</p>
</div>
</footer>
<script>
// 添加滚动动画
const observerOptions = {
threshold: 0.1,
rootMargin: '0px 0px -50px 0px'
};
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.style.opacity = '1';
entry.target.style.transform = 'translateY(0)';
}
});
}, observerOptions);
document.querySelectorAll('.tech-card, section').forEach(el => {
el.style.opacity = '0';
el.style.transform = 'translateY(20px)';
el.style.transition = 'opacity 0.6s ease, transform 0.6s ease';
observer.observe(el);
});
// 平滑滚动
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
anchor.addEventListener('click', function (e) {
e.preventDefault();
document.querySelector(this.getAttribute('href')).scrollIntoView({
behavior: 'smooth'
});
});
});
</script>
</body>
</html>

View File

@@ -0,0 +1,736 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>林地资源:战略资产的三重价值重构</title>
<script src="https://cdn.tailwindcss.com"></script>
<link href="https://cdn.jsdelivr.net/npm/daisyui@4.4.19/dist/full.min.css" rel="stylesheet" type="text/css" />
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<style>
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800;900&display=swap');
body {
font-family: 'Inter', sans-serif;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
min-height: 100vh;
}
.glass-morphism {
background: rgba(255, 255, 255, 0.1);
backdrop-filter: blur(10px);
border: 1px solid rgba(255, 255, 255, 0.2);
}
.timeline-dot {
animation: pulse 2s infinite;
}
@keyframes pulse {
0% {
box-shadow: 0 0 0 0 rgba(99, 102, 241, 0.7);
}
70% {
box-shadow: 0 0 0 10px rgba(99, 102, 241, 0);
}
100% {
box-shadow: 0 0 0 0 rgba(99, 102, 241, 0);
}
}
.gradient-text {
background: linear-gradient(90deg, #667eea 0%, #764ba2 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.card-hover {
transition: all 0.3s ease;
}
.card-hover:hover {
transform: translateY(-5px);
box-shadow: 0 20px 40px rgba(0, 0, 0, 0.1);
}
.number-highlight {
font-size: 2.5rem;
font-weight: 800;
line-height: 1;
}
.progress-bar {
position: relative;
overflow: hidden;
}
.progress-bar::after {
content: '';
position: absolute;
top: 0;
left: 0;
bottom: 0;
right: 0;
background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.3), transparent);
animation: shimmer 2s infinite;
}
@keyframes shimmer {
0% { transform: translateX(-100%); }
100% { transform: translateX(100%); }
}
.sticky-nav {
position: sticky;
top: 0;
z-index: 40;
backdrop-filter: blur(10px);
background: rgba(255, 255, 255, 0.95);
}
.section-divider {
height: 1px;
background: linear-gradient(90deg, transparent, #e5e7eb, transparent);
margin: 3rem 0;
}
</style>
</head>
<body>
<!-- 导航栏 -->
<div class="sticky-nav shadow-lg">
<div class="navbar bg-base-100 px-4 lg:px-8">
<div class="flex-1">
<a href="#" class="btn btn-ghost text-xl font-bold gradient-text">
<i class="fas fa-tree mr-2"></i>林地资源分析
</a>
</div>
<div class="flex-none">
<button class="btn btn-circle btn-ghost">
<i class="fas fa-chart-line"></i>
</button>
<button class="btn btn-circle btn-ghost">
<i class="fas fa-share-alt"></i>
</button>
</div>
</div>
</div>
<!-- Hero Section -->
<section class="relative overflow-hidden">
<div class="container mx-auto px-4 py-16">
<div class="glass-morphism rounded-3xl p-8 lg:p-12">
<div class="flex flex-col lg:flex-row items-center gap-8">
<div class="flex-1 text-white">
<div class="badge badge-warning badge-lg mb-4">战略资产重构</div>
<h1 class="text-4xl lg:text-6xl font-bold mb-6">
林地资源:从传统资产到<span class="text-yellow-300">三重价值</span>跃迁
</h1>
<p class="text-lg lg:text-xl mb-8 opacity-90">
政策市场化改革 + 产业链上游紧缩 + 碳汇价值商业化,开启林地资源新时代
</p>
<div class="flex flex-wrap gap-4">
<div class="stat bg-white/20 rounded-lg px-4 py-3">
<div class="stat-title text-white/80">2024年</div>
<div class="stat-value text-2xl text-white">政策破冰期</div>
</div>
<div class="stat bg-white/20 rounded-lg px-4 py-3">
<div class="stat-title text-white/80">2025年</div>
<div class="stat-value text-2xl text-white">碳汇元年</div>
</div>
<div class="stat bg-white/20 rounded-lg px-4 py-3">
<div class="stat-title text-white/80">2027年</div>
<div class="stat-value text-2xl text-white">价值爆发期</div>
</div>
</div>
</div>
<div class="flex-1">
<div class="bg-white/10 rounded-2xl p-6">
<canvas id="trendChart" width="400" height="300"></canvas>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- 时间轴 -->
<section class="container mx-auto px-4 py-12">
<h2 class="text-3xl font-bold text-white mb-8">概念事件与背景时间轴</h2>
<div class="timeline">
<div class="relative">
<!-- 时间轴线 -->
<div class="absolute left-8 top-0 bottom-0 w-0.5 bg-white/30"></div>
<!-- 时间节点 -->
<div class="relative flex items-center mb-8">
<div class="timeline-dot absolute left-8 w-4 h-4 bg-yellow-400 rounded-full -translate-x-1/2"></div>
<div class="ml-16 glass-morphism rounded-xl p-6 card-hover flex-1">
<div class="text-yellow-400 font-bold text-lg mb-2">2024年6月</div>
<h3 class="text-xl font-semibold text-white mb-2">政策破冰期</h3>
<p class="text-white/80">国家林草局印发《集体林地经营权流转管理办法》,确立市场化机制</p>
</div>
</div>
<div class="relative flex items-center mb-8">
<div class="timeline-dot absolute left-8 w-4 h-4 bg-blue-400 rounded-full -translate-x-1/2"></div>
<div class="ml-16 glass-morphism rounded-xl p-6 card-hover flex-1">
<div class="text-blue-400 font-bold text-lg mb-2">2023-2024年</div>
<h3 class="text-xl font-semibold text-white mb-2">产业觉醒期</h3>
<p class="text-white/80">全球新增商品浆产能超800万吨木片资源日趋紧张</p>
</div>
</div>
<div class="relative flex items-center mb-8">
<div class="timeline-dot absolute left-8 w-4 h-4 bg-green-400 rounded-full -translate-x-1/2"></div>
<div class="ml-16 glass-morphism rounded-xl p-6 card-hover flex-1">
<div class="text-green-400 font-bold text-lg mb-2">2024年9月10日</div>
<h3 class="text-xl font-semibold text-white mb-2">碳汇商业化元年</h3>
<p class="text-white/80">CCER交易规则最终确定岳阳林纸中标云南254.4万亩林业碳汇项目</p>
</div>
</div>
<div class="relative flex items-center">
<div class="timeline-dot absolute left-8 w-4 h-4 bg-red-400 rounded-full -translate-x-1/2"></div>
<div class="ml-16 glass-morphism rounded-xl p-6 card-hover flex-1">
<div class="text-red-400 font-bold text-lg mb-2">2024年</div>
<h3 class="text-xl font-semibold text-white mb-2">地缘政治映射</h3>
<p class="text-white/80">印尼通过林地许可查封部分镍矿,林地成为资源国调控工具</p>
</div>
</div>
</div>
</div>
</section>
<!-- 核心观点 -->
<section class="container mx-auto px-4 py-12">
<h2 class="text-3xl font-bold text-white mb-8">核心观点摘要</h2>
<div class="grid md:grid-cols-2 gap-6">
<div class="glass-morphism rounded-2xl p-6 card-hover">
<div class="text-6xl mb-4">📊</div>
<h3 class="text-2xl font-bold text-white mb-3">市场认知严重滞后</h3>
<p class="text-white/80 mb-4">10篇主流研报中0篇涉及林地资源关注度处于冰点</p>
<div class="flex gap-2">
<span class="badge badge-error">预期差极大</span>
<span class="badge badge-warning">主题发酵期</span>
</div>
</div>
<div class="glass-morphism rounded-2xl p-6 card-hover">
<div class="text-6xl mb-4">💰</div>
<h3 class="text-2xl font-bold text-white mb-3">三重价值重构</h3>
<p class="text-white/80 mb-4">造纸产业链成本护城河 + 双碳战略绿色金融资产 + 地缘政策缓冲器</p>
<div class="flex gap-2">
<span class="badge badge-success">成本优势</span>
<span class="badge badge-info">碳汇价值</span>
</div>
</div>
</div>
<div class="mt-8 p-8 bg-gradient-to-r from-purple-500/20 to-pink-500/20 rounded-2xl border border-white/20">
<p class="text-xl text-white font-medium italic">
"林地资源已不再是传统意义上的农林资产,而是造纸产业链的'成本护城河'、双碳战略下的'绿色金融资产'以及资源民族主义的'政策缓冲器'"
</p>
</div>
</section>
<!-- 核心逻辑 -->
<section class="container mx-auto px-4 py-12">
<h2 class="text-3xl font-bold text-white mb-8">三重核心驱动力</h2>
<div class="space-y-8">
<!-- 政策市场化 -->
<div class="glass-morphism rounded-2xl p-8">
<div class="flex items-center gap-4 mb-4">
<div class="w-12 h-12 bg-yellow-500 rounded-full flex items-center justify-center">
<i class="fas fa-gavel text-white text-xl"></i>
</div>
<h3 class="text-2xl font-bold text-white">政策市场化改革</h3>
</div>
<div class="grid md:grid-cols-3 gap-4 mt-6">
<div class="bg-white/10 rounded-lg p-4">
<div class="text-yellow-400 font-semibold mb-2">确权到流转闭环</div>
<p class="text-white/80 text-sm">林地可从分散农户集中至企业,实现规模化经营</p>
</div>
<div class="bg-white/10 rounded-lg p-4">
<div class="text-yellow-400 font-semibold mb-2">金融属性激活</div>
<p class="text-white/80 text-sm">经营权可抵押、可融资,资产估值转向现金流折现</p>
</div>
<div class="bg-white/10 rounded-lg p-4">
<div class="text-yellow-400 font-semibold mb-2">流动性溢价</div>
<p class="text-white/80 text-sm">拥有流转渠道的企业将获得流动性溢价</p>
</div>
</div>
</div>
<!-- 产业链紧缩 -->
<div class="glass-morphism rounded-2xl p-8">
<div class="flex items-center gap-4 mb-4">
<div class="w-12 h-12 bg-blue-500 rounded-full flex items-center justify-center">
<i class="fas fa-industry text-white text-xl"></i>
</div>
<h3 class="text-2xl font-bold text-white">产业链上游资源紧缩</h3>
</div>
<div class="grid md:grid-cols-2 gap-6 mt-6">
<div>
<div class="text-3xl font-bold text-blue-400 mb-2">2027年前无新增项目</div>
<p class="text-white/80">全球新增商品浆产能超800万吨下一个大型项目需等到2027年</p>
</div>
<div>
<div class="text-3xl font-bold text-blue-400 mb-2">成本差100美元+</div>
<p class="text-white/80">太阳纸业自制木片成本50-100美元/吨外购价150-200美元/吨</p>
</div>
</div>
<div class="mt-6">
<div class="flex justify-between text-white/80 mb-2">太阳纸业老挝木片自供率</div>
<div class="w-full bg-white/20 rounded-full h-6 progress-bar">
<div class="bg-gradient-to-r from-blue-400 to-blue-600 h-6 rounded-full flex items-center justify-center text-white font-semibold" style="width: 60%">
60% (2024年)
</div>
</div>
</div>
</div>
<!-- 碳汇价值 -->
<div class="glass-morphism rounded-2xl p-8">
<div class="flex items-center gap-4 mb-4">
<div class="w-12 h-12 bg-green-500 rounded-full flex items-center justify-center">
<i class="fas fa-leaf text-white text-xl"></i>
</div>
<h3 class="text-2xl font-bold text-white">碳汇价值商业化</h3>
</div>
<div class="stats shadow w-full">
<div class="stat place-items-center bg-white/10 rounded-lg">
<div class="stat-title">碳汇毛利率</div>
<div class="stat-value text-green-400">70-80%</div>
</div>
<div class="stat place-items-center bg-white/10 rounded-lg">
<div class="stat-title">岳阳林纸储备</div>
<div class="stat-value text-green-400">8000万亩+</div>
</div>
<div class="stat place-items-center bg-white/10 rounded-lg">
<div class="stat-title">CCER价格预期</div>
<div class="stat-value text-green-400">年增30-40%</div>
</div>
</div>
</div>
</div>
</section>
<!-- 核心公司对比 -->
<section class="container mx-auto px-4 py-12">
<h2 class="text-3xl font-bold text-white mb-8">核心玩家深度对比</h2>
<div class="overflow-x-auto">
<table class="table w-full glass-morphism rounded-2xl overflow-hidden">
<thead class="bg-white/20">
<tr>
<th class="text-white">公司</th>
<th class="text-white">核心逻辑</th>
<th class="text-white">资源规模</th>
<th class="text-white">商业模式</th>
<th class="text-white">竞争优势</th>
<th class="text-white">投资价值</th>
</tr>
</thead>
<tbody>
<tr class="hover:bg-white/10">
<td class="font-bold text-yellow-400">太阳纸业</td>
<td>林浆纸一体化</td>
<td>老挝6万公顷</td>
<td>木片自给降本</td>
<td>16年深耕成本优势</td>
<td><span class="badge badge-success badge-lg">★★★★★</span></td>
</tr>
<tr class="hover:bg-white/10">
<td class="font-bold text-green-400">岳阳林纸</td>
<td>林业碳汇第一股</td>
<td>8000万亩储备</td>
<td>碳汇高毛利</td>
<td>央企背景,开发能力</td>
<td><span class="badge badge-success badge-lg">★★★★☆</span></td>
</tr>
<tr class="hover:bg-white/10">
<td class="font-bold text-blue-400">仙鹤股份</td>
<td>特种纸原料锁定</td>
<td>100万亩桉树</td>
<td>政府排他支持</td>
<td>运输成本最低</td>
<td><span class="badge badge-warning badge-lg">★★★★☆</span></td>
</tr>
<tr class="hover:bg-white/10">
<td class="font-bold">永安林业</td>
<td>纯资源持有</td>
<td>114.1万亩</td>
<td>传统采伐</td>
<td>区域垄断</td>
<td><span class="badge badge-warning badge-lg">★★☆☆☆</span></td>
</tr>
<tr class="hover:bg-white/10">
<td class="font-bold">东珠生态</td>
<td>碳汇开发服务</td>
<td>421.5万亩</td>
<td>轻资产模式</td>
<td>快速扩张</td>
<td><span class="badge badge-error badge-lg">★★☆☆☆</span></td>
</tr>
</tbody>
</table>
</div>
</section>
<!-- 股票数据表格 -->
<section class="container mx-auto px-4 py-12">
<h2 class="text-3xl font-bold text-white mb-8">林地资源相关股票数据</h2>
<div class="glass-morphism rounded-2xl p-6 overflow-x-auto">
<table class="table table-zebra w-full text-white">
<thead class="bg-white/20">
<tr>
<th class="text-white">股票代码</th>
<th class="text-white">股票名称</th>
<th class="text-white">分类</th>
<th class="text-white">项目详情</th>
<th class="text-white">地理位置</th>
<th class="text-white">股东背景</th>
<th class="text-white">持股比例</th>
</tr>
</thead>
<tbody>
<tr class="hover:bg-white/10">
<td class="font-bold">岳阳林纸</td>
<td>岳阳林纸</td>
<td><span class="badge badge-info">自有林地</span></td>
<td>公司拥有林业面积180万亩</td>
<td>-</td>
<td>国务院国资委</td>
<td>30.9%</td>
</tr>
<tr class="hover:bg-white/10">
<td class="font-bold">岳阳林纸</td>
<td>岳阳林纸</td>
<td><span class="badge badge-success">林业碳汇</span></td>
<td>累计完成项目储备8246.79万亩</td>
<td>-</td>
<td>-</td>
<td>-</td>
</tr>
<tr class="hover:bg-white/10">
<td class="font-bold">康欣新材</td>
<td>康欣新材</td>
<td><span class="badge badge-info">自有林地</span></td>
<td>速生杨林地等138万余亩</td>
<td>-</td>
<td>无锡国资委</td>
<td>19.86%</td>
</tr>
<tr class="hover:bg-white/10">
<td class="font-bold">永安林业</td>
<td>永安林业</td>
<td><span class="badge badge-info">自有林地</span></td>
<td>森林资源总面积114.1万亩</td>
<td>福建永安市</td>
<td>国务院国资委</td>
<td>5.31%</td>
</tr>
<tr class="hover:bg-white/10">
<td class="font-bold">福建金森</td>
<td>福建金森</td>
<td><span class="badge badge-info">自有林地</span></td>
<td>森林资源面积近80万亩</td>
<td>福建省将乐县</td>
<td>将乐县财政局</td>
<td>63.83%</td>
</tr>
<tr class="hover:bg-white/10">
<td class="font-bold">平潭发展</td>
<td>平潭发展</td>
<td><span class="badge badge-info">自有林地</span></td>
<td>自有林地约60万亩、托管约30万亩</td>
<td>福建省平潭综合实验区</td>
<td>-</td>
<td>-</td>
</tr>
<tr class="hover:bg-white/10">
<td class="font-bold">丰林集团</td>
<td>丰林集团</td>
<td><span class="badge badge-info">自有林地</span></td>
<td>拥有近20万亩产权林地</td>
<td>-</td>
<td>-</td>
<td>-</td>
</tr>
<tr class="hover:bg-white/10">
<td class="font-bold">东珠生态</td>
<td>东珠生态</td>
<td><span class="badge badge-success">林业碳汇</span></td>
<td>开发面积林地421.5万亩</td>
<td>-</td>
<td>-</td>
<td>-</td>
</tr>
<tr class="hover:bg-white/10">
<td class="font-bold">海南橡胶</td>
<td>海南橡胶</td>
<td><span class="badge badge-warning">其他</span></td>
<td>公司胶园土地390万亩</td>
<td>-</td>
<td>海南国资委</td>
<td>57.92%</td>
</tr>
<tr class="hover:bg-white/10">
<td class="font-bold">泉阳泉</td>
<td>泉阳泉</td>
<td><span class="badge badge-warning">其他</span></td>
<td>控股股东拥有林地128.96万公顷</td>
<td>-</td>
<td>吉林国资委</td>
<td>15.99%</td>
</tr>
</tbody>
</table>
</div>
</section>
<!-- 关键催化剂 -->
<section class="container mx-auto px-4 py-12">
<h2 class="text-3xl font-bold text-white mb-8">关键催化剂</h2>
<div class="grid md:grid-cols-2 gap-6">
<div class="bg-gradient-to-br from-yellow-500/20 to-orange-500/20 glass-morphism rounded-2xl p-6 border border-yellow-500/30">
<div class="flex items-center gap-3 mb-4">
<i class="fas fa-clock text-yellow-400 text-2xl"></i>
<h3 class="text-xl font-bold text-white">近期催化剂3-6个月</h3>
</div>
<ul class="space-y-3 text-white/80">
<li class="flex items-start gap-2">
<i class="fas fa-circle text-xs mt-2 text-yellow-400"></i>
<span>岳阳林纸2024年报碳汇利润达5000万+</span>
</li>
<li class="flex items-start gap-2">
<i class="fas fa-circle text-xs mt-2 text-yellow-400"></i>
<span>CCER价格落地80-100元/吨</span>
</li>
<li class="flex items-start gap-2">
<i class="fas fa-circle text-xs mt-2 text-yellow-400"></i>
<span>太阳纸业中报:木片自供率提升</span>
</li>
<li class="flex items-start gap-2">
<i class="fas fa-circle text-xs mt-2 text-yellow-400"></i>
<span>仙鹤股份:广西林地协议签署</span>
</li>
</ul>
</div>
<div class="bg-gradient-to-br from-blue-500/20 to-purple-500/20 glass-morphism rounded-2xl p-6 border border-blue-500/30">
<div class="flex items-center gap-3 mb-4">
<i class="fas fa-rocket text-blue-400 text-2xl"></i>
<h3 class="text-xl font-bold text-white">长期发展路径2025-2030</h3>
</div>
<div class="space-y-4">
<div class="flex items-center gap-3">
<div class="w-8 h-8 bg-blue-500 rounded-full flex items-center justify-center text-white font-bold">1</div>
<div>
<div class="text-white font-semibold">2025-2026商业模式兑现期</div>
<div class="text-white/60 text-sm">木片自给率80%+碳汇收入占比15-20%</div>
</div>
</div>
<div class="flex items-center gap-3">
<div class="w-8 h-8 bg-purple-500 rounded-full flex items-center justify-center text-white font-bold">2</div>
<div>
<div class="text-white font-semibold">2027-2028证券化与金融化</div>
<div class="text-white/60 text-sm">林地经营权ABS、碳汇期货</div>
</div>
</div>
<div class="flex items-center gap-3">
<div class="w-8 h-8 bg-pink-500 rounded-full flex items-center justify-center text-white font-bold">3</div>
<div>
<div class="text-white font-semibold">2029-2030产业整合</div>
<div class="text-white/60 text-sm">国内并购潮,海外基地复制</div>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- 风险提示 -->
<section class="container mx-auto px-4 py-12">
<h2 class="text-3xl font-bold text-white mb-8">潜在风险与挑战</h2>
<div class="grid md:grid-cols-3 gap-6">
<div class="glass-morphism rounded-2xl p-6 border-red-500/30 border">
<div class="flex items-center gap-3 mb-4">
<i class="fas fa-exclamation-triangle text-red-400 text-xl"></i>
<h3 class="text-xl font-bold text-white">政策风险</h3>
</div>
<ul class="text-white/80 space-y-2 text-sm">
<li>• CCER政策变动</li>
<li>• 海外林地租约不确定性</li>
<li>• 碳汇价格波动</li>
</ul>
</div>
<div class="glass-morphism rounded-2xl p-6 border-orange-500/30 border">
<div class="flex items-center gap-3 mb-4">
<i class="fas fa-tools text-orange-400 text-xl"></i>
<h3 class="text-xl font-bold text-white">执行风险</h3>
</div>
<ul class="text-white/80 space-y-2 text-sm">
<li>• 砍伐面积爬坡不及预期</li>
<li>• 碳汇项目签发周期长</li>
<li>• 本土化运营挑战</li>
</ul>
</div>
<div class="glass-morphism rounded-2xl p-6 border-yellow-500/30 border">
<div class="flex items-center gap-3 mb-4">
<i class="fas fa-globe text-yellow-400 text-xl"></i>
<h3 class="text-xl font-bold text-white">地缘风险</h3>
</div>
<ul class="text-white/80 space-y-2 text-sm">
<li>• 资源民族主义蔓延</li>
<li>• 政权更迭影响</li>
<li>• 社区关系维护</li>
</ul>
</div>
</div>
</section>
<!-- 投资建议 -->
<section class="container mx-auto px-4 py-12 mb-12">
<h2 class="text-3xl font-bold text-white mb-8">投资启示</h2>
<div class="glass-morphism rounded-2xl p-8 bg-gradient-to-br from-green-500/20 to-blue-500/20 border-green-400/30 border">
<div class="grid md:grid-cols-2 gap-8">
<div>
<h3 class="text-2xl font-bold text-white mb-4">阶段判断</h3>
<p class="text-white/80 mb-4">
当前处于"主题发酵期向基本面兑现期过渡"的关键节点。与纯主题概念不同,林地资源具备明确的成本节约和利润贡献。
</p>
<div class="flex gap-2">
<span class="badge badge-success">PB普遍1-2倍</span>
<span class="badge badge-info">修复空间>50%</span>
</div>
</div>
<div>
<h3 class="text-2xl font-bold text-white mb-4">核心配置</h3>
<div class="space-y-3">
<div class="flex items-center justify-between bg-white/10 rounded-lg p-3">
<span class="text-white font-semibold">第一顺位</span>
<span class="text-yellow-400">太阳纸业</span>
</div>
<div class="flex items-center justify-between bg-white/10 rounded-lg p-3">
<span class="text-white font-semibold">第二顺位</span>
<span class="text-green-400">岳阳林纸</span>
</div>
<div class="flex items-center justify-between bg-white/10 rounded-lg p-3">
<span class="text-white font-semibold">第三顺位</span>
<span class="text-blue-400">仙鹤股份</span>
</div>
</div>
</div>
</div>
<div class="mt-8 p-6 bg-white/10 rounded-xl">
<p class="text-xl text-white font-medium text-center">
"2025年是林地资源基本面兑现元年静待估值修复与戴维斯双击"
</p>
</div>
</div>
</section>
<!-- Footer -->
<footer class="glass-morphism py-8">
<div class="container mx-auto px-4 text-center text-white/80">
<p>© 2024 林地资源概念分析 | 数据来源:公开信息整理</p>
<p class="mt-2 text-sm">投资有风险,入市需谨慎</p>
</div>
</footer>
<script>
// 趋势图表
const ctx = document.getElementById('trendChart').getContext('2d');
const gradient = ctx.createLinearGradient(0, 0, 0, 300);
gradient.addColorStop(0, 'rgba(255, 255, 255, 0.5)');
gradient.addColorStop(1, 'rgba(255, 255, 255, 0.1)');
new Chart(ctx, {
type: 'line',
data: {
labels: ['2023', '2024', '2025', '2026', '2027', '2028'],
datasets: [{
label: '林地资源价值指数',
data: [100, 135, 180, 250, 350, 480],
borderColor: 'rgba(255, 255, 255, 0.8)',
backgroundColor: gradient,
tension: 0.4,
fill: true
}]
},
options: {
responsive: true,
maintainAspectRatio: false,
plugins: {
legend: {
display: false
},
tooltip: {
backgroundColor: 'rgba(0, 0, 0, 0.8)',
titleColor: '#fff',
bodyColor: '#fff',
borderColor: 'rgba(255, 255, 255, 0.2)',
borderWidth: 1
}
},
scales: {
x: {
grid: {
color: 'rgba(255, 255, 255, 0.1)'
},
ticks: {
color: 'rgba(255, 255, 255, 0.8)'
}
},
y: {
grid: {
color: 'rgba(255, 255, 255, 0.1)'
},
ticks: {
color: 'rgba(255, 255, 255, 0.8)'
}
}
}
}
});
// 平滑滚动
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
anchor.addEventListener('click', function (e) {
e.preventDefault();
document.querySelector(this.getAttribute('href')).scrollIntoView({
behavior: 'smooth'
});
});
});
// 滚动动画
const observerOptions = {
threshold: 0.1,
rootMargin: '0px 0px -50px 0px'
};
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.style.opacity = '1';
entry.target.style.transform = 'translateY(0)';
}
});
}, observerOptions);
document.querySelectorAll('.card-hover').forEach(card => {
card.style.opacity = '0';
card.style.transform = 'translateY(20px)';
card.style.transition = 'opacity 0.6s ease, transform 0.6s ease';
observer.observe(card);
});
</script>
</body>
</html>

876
public/htmls/海军.html Normal file
View File

@@ -0,0 +1,876 @@
<!DOCTYPE html>
<html lang="zh-CN" data-theme="dark">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>海军装备产业链深度分析 - 投资洞察</title>
<link href="https://cdn.jsdelivr.net/npm/daisyui@4.4.24/dist/full.min.css" rel="stylesheet" type="text/css" />
<link href="https://cdn.jsdelivr.net/npm/tailwindcss@3.4.1/dist/tailwind.min.css" rel="stylesheet" type="text/css" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css">
<style>
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800;900&display=swap');
* {
font-family: 'Inter', sans-serif;
}
.hero-gradient {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
}
.card-hover {
transition: all 0.3s ease;
}
.card-hover:hover {
transform: translateY(-5px);
box-shadow: 0 20px 40px rgba(0,0,0,0.3);
}
.timeline-line {
background: linear-gradient(180deg, #667eea 0%, #764ba2 100%);
width: 3px;
position: absolute;
left: 20px;
top: 0;
bottom: 0;
}
.timeline-dot {
width: 16px;
height: 16px;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
border: 3px solid #1e293b;
border-radius: 50%;
position: absolute;
left: 14px;
}
.progress-ring {
transform: rotate(-90deg);
}
.navy-blue {
background: linear-gradient(135deg, #1e3a8a 0%, #1e40af 100%);
}
.glass-effect {
background: rgba(30, 41, 59, 0.8);
backdrop-filter: blur(10px);
border: 1px solid rgba(255, 255, 255, 0.1);
}
.table-scroll {
overflow-x: auto;
-webkit-overflow-scrolling: touch;
}
.table-scroll::-webkit-scrollbar {
height: 8px;
}
.table-scroll::-webkit-scrollbar-track {
background: #1e293b;
}
.table-scroll::-webkit-scrollbar-thumb {
background: #475569;
border-radius: 4px;
}
.badge-glow {
animation: glow 2s ease-in-out infinite;
}
@keyframes glow {
0%, 100% { box-shadow: 0 0 5px rgba(102, 126, 234, 0.5); }
50% { box-shadow: 0 0 20px rgba(102, 126, 234, 0.8); }
}
.metric-card {
background: linear-gradient(135deg, rgba(30, 58, 138, 0.5) 0%, rgba(30, 64, 175, 0.5) 100%);
border: 1px solid rgba(147, 197, 253, 0.3);
}
.stock-table {
font-size: 0.875rem;
}
.stock-table th {
background: rgba(30, 58, 138, 0.9);
position: sticky;
top: 0;
z-index: 10;
}
.stock-table td {
border-bottom: 1px solid rgba(71, 85, 105, 0.5);
}
.stock-table tr:hover {
background: rgba(51, 65, 85, 0.3);
}
.section-divider {
height: 2px;
background: linear-gradient(90deg, transparent, #667eea, transparent);
margin: 3rem 0;
}
</style>
</head>
<body class="bg-slate-950 text-slate-100">
<!-- Navigation -->
<div class="navbar glass-effect fixed top-0 z-50 px-4">
<div class="navbar-start">
<a href="#" class="btn btn-ghost text-xl font-bold">
<i class="fas fa-ship mr-2"></i>海军装备分析
</a>
</div>
<div class="navbar-center hidden lg:flex">
<ul class="menu menu-horizontal px-1">
<li><a href="#overview">核心观点</a></li>
<li><a href="#timeline">事件时间线</a></li>
<li><a href="#logic">投资逻辑</a></li>
<li><a href="#industry">产业链</a></li>
<li><a href="#stocks">标的池</a></li>
</ul>
</div>
<div class="navbar-end">
<div class="badge badge-accent badge-glow">深度研究</div>
</div>
</div>
<!-- Hero Section -->
<section class="hero min-h-screen hero-gradient flex items-center">
<div class="hero-content text-center">
<div class="max-w-5xl">
<h1 class="text-5xl font-bold mb-6 text-white">
<i class="fas fa-anchor mr-3"></i>海军装备产业链
</h1>
<p class="text-2xl mb-8 text-slate-200">战略需求刚性化 · 装备结构拐点化 · 业绩兑现初期化</p>
<div class="stats shadow-2xl bg-slate-900/80 backdrop-blur rounded-box w-full">
<div class="stat">
<div class="stat-figure text-primary">
<svg width="48" height="48" fill="currentColor"><path d="M24 2l5.453 11.146 12.298 1.787-8.876 8.654 2.095 12.224L24 30.077 13.13 35.811l2.095-12.224-8.876-8.654 12.298-1.787L24 2z"/></svg>
</div>
<div class="stat-title">优先级</div>
<div class="stat-value text-primary">极高</div>
<div class="stat-desc">十四五重点建设方向</div>
</div>
<div class="stat">
<div class="stat-figure text-secondary">
<svg class="progress-ring" width="48" height="48" viewBox="0 0 36 36">
<path class="text-slate-700" stroke="currentColor" stroke-width="3" fill="none" d="M18 2.0845 a 15.9155 15.9155 0 0 1 0 31.831 a 15.9155 15.9155 0 0 1 0 -31.831"/>
<path class="text-slate-100" stroke="currentColor" stroke-width="3" stroke-dasharray="75, 100" fill="none" d="M18 2.0845 a 15.9155 15.9155 0 0 1 0 31.831 a 15.9155 15.9155 0 0 1 0 -31.831"/>
</svg>
</div>
<div class="stat-title">发展阶段</div>
<div class="stat-value text-secondary">初期</div>
<div class="stat-desc">0-1的蓝海市场</div>
</div>
<div class="stat">
<div class="stat-figure text-accent">
<i class="fas fa-chart-line text-4xl"></i>
</div>
<div class="stat-title">业绩弹性</div>
<div class="stat-value text-accent">25%+</div>
<div class="stat-desc">2025年预期增速</div>
</div>
</div>
<div class="mt-8 flex justify-center gap-4">
<button class="btn btn-primary btn-lg">
<i class="fas fa-download mr-2"></i>下载研报
</button>
<button class="btn btn-secondary btn-lg">
<i class="fas fa-play-circle mr-2"></i>观看路演
</button>
</div>
</div>
</div>
</section>
<!-- Key Metrics -->
<section class="py-16 px-4">
<div class="max-w-7xl mx-auto">
<h2 class="text-4xl font-bold text-center mb-12" id="overview">核心数据洞察</h2>
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6">
<div class="metric-card rounded-xl p-6 card-hover">
<div class="flex items-center justify-between">
<div>
<p class="text-slate-400">水下装备市场空间</p>
<p class="text-3xl font-bold text-blue-400">近千亿</p>
</div>
<i class="fas fa-water text-4xl text-blue-400/30"></i>
</div>
<div class="mt-4">
<div class="text-sm text-slate-500">未来10年需求</div>
</div>
</div>
<div class="metric-card rounded-xl p-6 card-hover">
<div class="flex items-center justify-between">
<div>
<p class="text-slate-400">电磁弹射弹性</p>
<p class="text-3xl font-bold text-purple-400">5-8亿</p>
</div>
<i class="fas fa-bolt text-4xl text-purple-400/30"></i>
</div>
<div class="mt-4">
<div class="text-sm text-slate-500">2025年增量收入</div>
</div>
</div>
<div class="metric-card rounded-xl p-6 card-hover">
<div class="flex items-center justify-between">
<div>
<p class="text-slate-400">市占率龙头</p>
<p class="text-3xl font-bold text-green-400">70-80%</p>
</div>
<i class="fas fa-crown text-4xl text-green-400/30"></i>
</div>
<div class="mt-4">
<div class="text-sm text-slate-500">中国海防水声业务</div>
</div>
</div>
<div class="metric-card rounded-xl p-6 card-hover">
<div class="flex items-center justify-between">
<div>
<p class="text-slate-400">装备增速</p>
<p class="text-3xl font-bold text-orange-400">20-30%</p>
</div>
<i class="fas fa-rocket text-4xl text-orange-400/30"></i>
</div>
<div class="mt-4">
<div class="text-sm text-slate-500">十四五后期预期</div>
</div>
</div>
</div>
</div>
</section>
<!-- Timeline -->
<section class="py-16 px-4" id="timeline">
<div class="max-w-4xl mx-auto">
<h2 class="text-4xl font-bold text-center mb-12">重要事件时间线</h2>
<div class="relative">
<div class="timeline-line"></div>
<div class="relative mb-8 ml-12">
<div class="timeline-dot" style="top: 8px;"></div>
<div class="card glass-effect rounded-lg p-4 card-hover">
<div class="flex justify-between items-start">
<div>
<span class="badge badge-primary">2024年8月</span>
<h3 class="text-xl font-semibold mt-2">伊朗海军演习</h3>
<p class="text-slate-400 mt-1">在阿曼海举行"力量1404"导弹演习,展示反舰能力</p>
</div>
</div>
</div>
</div>
<div class="relative mb-8 ml-12">
<div class="timeline-dot" style="top: 8px;"></div>
<div class="card glass-effect rounded-lg p-4 card-hover">
<div class="flex justify-between items-start">
<div>
<span class="badge badge-primary">2024年9月</span>
<h3 class="text-xl font-semibold mt-2">以色列军事行动</h3>
<p class="text-slate-400 mt-1">摧毁叙利亚舰队,地区紧张局势升级</p>
</div>
</div>
</div>
</div>
<div class="relative mb-8 ml-12">
<div class="timeline-dot" style="top: 8px;"></div>
<div class="card glass-effect rounded-lg p-4 card-hover">
<div class="flex justify-between items-start">
<div>
<span class="badge badge-secondary">2024年12月</span>
<h3 class="text-xl font-semibold mt-2">076型四川舰出坞</h3>
<p class="text-slate-400 mt-1">首创双舰岛+电磁弹射技术排水量4万余吨</p>
</div>
</div>
</div>
</div>
<div class="relative mb-8 ml-12">
<div class="timeline-dot" style="top: 8px;"></div>
<div class="card glass-effect rounded-lg p-4 card-hover">
<div class="flex justify-between items-start">
<div>
<span class="badge badge-accent">2024年12月</span>
<h3 class="text-xl font-semibold mt-2">国防部长任命</h3>
<p class="text-slate-400 mt-1">董军(原海军首长)任国防部长,海军重点建设预期强化</p>
</div>
</div>
</div>
</div>
<div class="relative mb-8 ml-12">
<div class="timeline-dot" style="top: 8px;"></div>
<div class="card glass-effect rounded-lg p-4 card-hover">
<div class="flex justify-between items-start">
<div>
<span class="badge badge-info">2025年3月</span>
<h3 class="text-xl font-semibold mt-2">俄罗斯海军战略</h3>
<p class="text-slate-400 mt-1">普京批准《2050年前俄罗斯海军发展战略》</p>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- Investment Logic -->
<section class="py-16 px-4" id="logic">
<div class="max-w-7xl mx-auto">
<h2 class="text-4xl font-bold text-center mb-12">投资逻辑分析</h2>
<div class="grid grid-cols-1 lg:grid-cols-3 gap-6">
<div class="card navy-blue rounded-xl p-6">
<div class="card-title">
<i class="fas fa-globe-americas text-3xl mr-3"></i>
<span>地缘政治倒逼</span>
</div>
<div class="card-body">
<p>美军"印太战略"持续施压弗吉尼亚级潜艇年产目标从1.3艘提升至2.5艘,直接刺激中国水下攻防体系建设</p>
<div class="mt-4">
<span class="badge badge-error">高优先级</span>
<span class="badge badge-warning">紧迫性强</span>
</div>
</div>
</div>
<div class="card navy-blue rounded-xl p-6">
<div class="card-title">
<i class="fas fa-exchange-alt text-3xl mr-3"></i>
<span>战略范式转型</span>
</div>
<div class="card-body">
<p>从"黄水海军"到"蓝水海军"质变水面防御向水下进攻转变10年潜艇改造市场近千亿</p>
<div class="mt-4">
<span class="badge badge-success">结构性机会</span>
<span class="badge badge-info">长期趋势</span>
</div>
</div>
</div>
<div class="card navy-blue rounded-xl p-6">
<div class="card-title">
<i class="fas fa-microchip text-3xl mr-3"></i>
<span>技术代际突破</span>
</div>
<div class="card-body">
<p>076型电磁弹射平台型创新光纤水听器替代压电水听器技术壁垒高市场空间巨大</p>
<div class="mt-4">
<span class="badge badge-primary">核心技术</span>
<span class="badge badge-accent">高壁垒</span>
</div>
</div>
</div>
</div>
<div class="section-divider"></div>
<h3 class="text-2xl font-bold mb-6">预期差分析</h3>
<div class="grid grid-cols-1 md:grid-cols-3 gap-4">
<div class="alert alert-info">
<i class="fas fa-info-circle"></i>
<div>
<h4 class="font-bold">业绩兑现节奏</h4>
<p>潜艇改造周期18-24个月远快于新造5-7年</p>
</div>
</div>
<div class="alert alert-warning">
<i class="fas fa-exclamation-triangle"></i>
<div>
<h4 class="font-bold">民用市场空间</h4>
<p>电磁弹射技术可延伸至海上风电等民用领域</p>
</div>
</div>
<div class="alert alert-success">
<i class="fas fa-shield-alt"></i>
<div>
<h4 class="font-bold">竞争壁垒</h4>
<p>设计锁定+耗材更换的双重护城河</p>
</div>
</div>
</div>
</div>
</section>
<!-- Industry Chain -->
<section class="py-16 px-4" id="industry">
<div class="max-w-7xl mx-auto">
<h2 class="text-4xl font-bold text-center mb-12">产业链图谱</h2>
<div class="grid grid-cols-1 lg:grid-cols-2 gap-8">
<div class="card glass-effect rounded-xl p-6">
<h3 class="text-2xl font-bold mb-4 text-blue-400">
<i class="fas fa-anchor mr-2"></i>水面舰艇产业链
</h3>
<div class="space-y-3">
<div class="flex justify-between items-center p-3 bg-slate-800/50 rounded-lg">
<span class="font-medium">上游材料</span>
<div class="flex gap-2">
<span class="badge badge-outline">西部材料</span>
<span class="badge badge-outline">亚星锚链</span>
</div>
</div>
<div class="flex justify-between items-center p-3 bg-slate-800/50 rounded-lg">
<span class="font-medium">中游设备</span>
<div class="flex gap-2">
<span class="badge badge-primary">湘电股份</span>
<span class="badge badge-primary">王子新材</span>
</div>
</div>
<div class="flex justify-between items-center p-3 bg-slate-800/50 rounded-lg">
<span class="font-medium">下游总装</span>
<div class="flex gap-2">
<span class="badge badge-secondary">中国船舶</span>
<span class="badge badge-secondary">中船防务</span>
</div>
</div>
</div>
</div>
<div class="card glass-effect rounded-xl p-6">
<h3 class="text-2xl font-bold mb-4 text-purple-400">
<i class="fas fa-water mr-2"></i>水下攻防产业链
</h3>
<div class="space-y-3">
<div class="flex justify-between items-center p-3 bg-slate-800/50 rounded-lg">
<span class="font-medium">上游材料</span>
<div class="flex gap-2">
<span class="badge badge-outline">西部材料</span>
<span class="badge badge-outline">宝钛股份</span>
</div>
</div>
<div class="flex justify-between items-center p-3 bg-slate-800/50 rounded-lg">
<span class="font-medium">中游核心系统</span>
<div class="flex gap-2">
<span class="badge badge-accent">中国海防</span>
<span class="badge badge-accent">中科海讯</span>
</div>
</div>
<div class="flex justify-between items-center p-3 bg-slate-800/50 rounded-lg">
<span class="font-medium">下游平台</span>
<div class="flex gap-2">
<span class="badge badge-info">中国重工</span>
<span class="badge badge-info">天海防务</span>
</div>
</div>
</div>
</div>
</div>
<div class="mt-8">
<h3 class="text-2xl font-bold mb-6">核心玩家对比</h3>
<div class="table-scroll">
<table class="table w-full stock-table">
<thead>
<tr>
<th>公司</th>
<th>核心逻辑</th>
<th>竞争优势</th>
<th>业绩弹性</th>
<th>关键风险</th>
</tr>
</thead>
<tbody>
<tr>
<td class="font-bold text-primary">中国海防</td>
<td>水下攻防装备龙头</td>
<td>70-80%市占率</td>
<td>⭐⭐⭐⭐⭐</td>
<td>订单验证周期长</td>
</tr>
<tr>
<td class="font-bold text-primary">湘电股份</td>
<td>电磁弹射平台技术</td>
<td>综合电力系统垄断</td>
<td>⭐⭐⭐⭐</td>
<td>技术可靠性待检验</td>
</tr>
<tr>
<td class="font-bold text-primary">西部材料</td>
<td>水下装备材料</td>
<td>钛合金核心供应商</td>
<td>⭐⭐⭐</td>
<td>军品占比低</td>
</tr>
<tr>
<td class="font-bold text-primary">中国船舶</td>
<td>海军装备总装</td>
<td>航母唯一建造商</td>
<td>⭐⭐</td>
<td>弹性相对较小</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</section>
<!-- Stock Pool -->
<section class="py-16 px-4" id="stocks">
<div class="max-w-7xl mx-auto">
<h2 class="text-4xl font-bold text-center mb-12">海军概念股票池</h2>
<div class="table-scroll">
<table class="table w-full stock-table">
<thead>
<tr>
<th class="sticky left-0 bg-slate-900">股票名称</th>
<th>所属行业</th>
<th>核心项目</th>
<th>产业链环节</th>
<th>投资逻辑</th>
<th>数据来源</th>
</tr>
</thead>
<tbody>
<tr>
<td class="sticky left-0 font-bold bg-slate-800">中国船舶</td>
<td>船舶制造</td>
<td>航母、核潜艇、大型驱逐舰</td>
<td>海军装备研发生产</td>
<td>民用商用船舶制造营收第一,承担海军主战装备科研生产任务</td>
<td><span class="badge badge-outline">公开资料</span></td>
</tr>
<tr>
<td class="sticky left-0 font-bold bg-slate-800">中船防务</td>
<td>船舶制造</td>
<td>055型驱逐舰</td>
<td>护卫舰市场</td>
<td>在护卫舰市场占据领先地位,参与多个重点型号建造</td>
<td><span class="badge badge-outline">公开资料</span></td>
</tr>
<tr>
<td class="sticky left-0 font-bold bg-slate-800">中国海防</td>
<td>海洋防务</td>
<td>声纳装备</td>
<td>水声电子系统</td>
<td>国内海洋防务声纳装备核心供应商市占率70-80%</td>
<td><span class="badge badge-outline">互动</span></td>
</tr>
<tr>
<td class="sticky left-0 font-bold bg-slate-800">湘电股份</td>
<td>船舶动力</td>
<td>电磁弹射系统</td>
<td>舰船电力推进</td>
<td>国内唯一舰船综合电力系统供应商,电磁弹射核心分包商</td>
<td><span class="badge badge-outline">路演数据</span></td>
</tr>
<tr>
<td class="sticky left-0 font-bold bg-slate-800">西部材料</td>
<td>金属材料</td>
<td>钛合金结构件</td>
<td>特种材料</td>
<td>钛合金用于核潜艇壳体、声纳结构件单艘价值量5-6亿</td>
<td><span class="badge badge-outline">路演数据</span></td>
</tr>
<tr>
<td class="sticky left-0 font-bold bg-slate-800">中国动力</td>
<td>船舶动力</td>
<td>海军舰船动力</td>
<td>动力系统</td>
<td>海军作战舰艇动力系统排名第一,主要供应商</td>
<td><span class="badge badge-outline">互动</span></td>
</tr>
<tr>
<td class="sticky left-0 font-bold bg-slate-800">中国重工</td>
<td>船舶制造</td>
<td>核潜艇</td>
<td>水下装备总装</td>
<td>承担核潜艇建造任务,水下装备核心总装单位</td>
<td><span class="badge badge-outline">公开资料</span></td>
</tr>
<tr>
<td class="sticky left-0 font-bold bg-slate-800">中科海讯</td>
<td>声纳装备</td>
<td>水声目标探测</td>
<td>水声电子</td>
<td>产品应用于声纳装备领域,最终用户为国家特种部门</td>
<td><span class="badge badge-outline">互动</span></td>
</tr>
<tr>
<td class="sticky left-0 font-bold bg-slate-800">天海防务</td>
<td>特种无人船</td>
<td>无人潜航器</td>
<td>无人装备平台</td>
<td>子公司金海运研发多类型特种无人船,无人装备标的</td>
<td><span class="badge badge-outline">互动</span></td>
</tr>
<tr>
<td class="sticky left-0 font-bold bg-slate-800">久之洋</td>
<td>光电设备</td>
<td>红外、激光、光学产品</td>
<td>舰载光电系统</td>
<td>中船集团旗下光电上市公司,产品涵盖四大类光电设备</td>
<td><span class="badge badge-outline">互动</span></td>
</tr>
<tr>
<td class="sticky left-0 font-bold bg-slate-800">亚光科技</td>
<td>军用小艇</td>
<td>冲锋舟、指挥艇</td>
<td>特种舰艇</td>
<td>军用冲锋舟、指挥艇等特种小艇市占率领先</td>
<td><span class="badge badge-outline">公开资料</span></td>
</tr>
<tr>
<td class="sticky left-0 font-bold bg-slate-800">亚星锚链</td>
<td>链条生产</td>
<td>船用锚链</td>
<td>船舶配套</td>
<td>全球最大链条生产企业船用锚链市占率超70%</td>
<td><span class="badge badge-outline">公开资料</span></td>
</tr>
<tr>
<td class="sticky left-0 font-bold bg-slate-800">中船科技</td>
<td>船舶设计</td>
<td>船舶工业规划设计</td>
<td>设计研发</td>
<td>全资子公司中船九院为中国船舶工业规划设计国家队</td>
<td><span class="badge badge-outline">公开资料</span></td>
</tr>
<tr>
<td class="sticky left-0 font-bold bg-slate-800">海兰信</td>
<td>船舶电子</td>
<td>首艘航母辽宁舰</td>
<td>舰船电子系统</td>
<td>产品已应用于包括辽宁舰在内的各类舰船</td>
<td><span class="badge badge-outline">公告</span></td>
</tr>
<tr>
<td class="sticky left-0 font-bold bg-slate-800">国瑞科技</td>
<td>船舶电子</td>
<td>雷达、电子战系统</td>
<td>军工电子信息系统</td>
<td>参股公司中电华瑞产品涵盖雷达、电子战系统</td>
<td><span class="badge badge-outline">网传纪要</span></td>
</tr>
<tr>
<td class="sticky left-0 font-bold bg-slate-800">泰豪科技</td>
<td>舰载作战辅助系统</td>
<td>航母及海军舰艇</td>
<td>作战支持系统</td>
<td>相关产品已应用于航母及海军舰艇</td>
<td><span class="badge badge-outline">互动</span></td>
</tr>
<tr>
<td class="sticky left-0 font-bold bg-slate-800">潍柴重机</td>
<td>船舶动力</td>
<td>船舶动力系统</td>
<td>动力设备</td>
<td>开发销售船舶动力和发电设备,市场覆盖广泛</td>
<td><span class="badge badge-outline">互动</span></td>
</tr>
<tr>
<td class="sticky left-0 font-bold bg-slate-800">江龙船艇</td>
<td>公务执法船艇</td>
<td>海事海警装备</td>
<td>特种船艇</td>
<td>产品广泛应用于海事、海关、海警等维护海洋主权领域</td>
<td><span class="badge badge-outline">互动</span></td>
</tr>
<tr>
<td class="sticky left-0 font-bold bg-slate-800">王子新材</td>
<td>船舶电子</td>
<td>舰船电子信息系统</td>
<td>电子配套</td>
<td>全资子公司中电华瑞从事舰船电子信息系统领域</td>
<td><span class="badge badge-outline">互动</span></td>
</tr>
<tr>
<td class="sticky left-0 font-bold bg-slate-800">*ST宝实</td>
<td>船舶电器</td>
<td>船舶消磁器</td>
<td>船舶配套</td>
<td>船舶消磁器业务市场占有率居首位</td>
<td><span class="badge badge-outline">年报</span></td>
</tr>
</tbody>
</table>
</div>
</div>
</section>
<!-- Investment Strategy -->
<section class="py-16 px-4">
<div class="max-w-7xl mx-auto">
<h2 class="text-4xl font-bold text-center mb-12">投资策略建议</h2>
<div class="grid grid-cols-1 lg:grid-cols-2 gap-8">
<div class="card bg-gradient-to-r from-green-900/50 to-green-800/30 rounded-xl p-6">
<h3 class="text-2xl font-bold mb-4 text-green-400">
<i class="fas fa-thumbs-up mr-2"></i>重点配置
</h3>
<div class="space-y-3">
<div class="p-3 bg-slate-800/50 rounded-lg">
<div class="flex items-center justify-between">
<span class="font-bold">中国海防</span>
<span class="badge badge-success">首选标的</span>
</div>
<p class="text-sm text-slate-400 mt-1">70%市占率+资产注入预期+业绩拐点三重逻辑</p>
</div>
<div class="p-3 bg-slate-800/50 rounded-lg">
<div class="flex items-center justify-between">
<span class="font-bold">湘电股份</span>
<span class="badge badge-success">弹性标的</span>
</div>
<p class="text-sm text-slate-400 mt-1">电磁弹射0到1突破2025年收入确认高峰</p>
</div>
<div class="p-3 bg-slate-800/50 rounded-lg">
<div class="flex items-center justify-between">
<span class="font-bold">西部材料</span>
<span class="badge badge-success">稳健标的</span>
</div>
<p class="text-sm text-slate-400 mt-1">钛合金刚需,不受军品定价机制约束</p>
</div>
</div>
</div>
<div class="card bg-gradient-to-r from-red-900/50 to-red-800/30 rounded-xl p-6">
<h3 class="text-2xl font-bold mb-4 text-red-400">
<i class="fas fa-exclamation-triangle mr-2"></i>规避标的
</h3>
<div class="space-y-3">
<div class="p-3 bg-slate-800/50 rounded-lg">
<div class="flex items-center justify-between">
<span class="font-bold">王子新材</span>
<span class="badge badge-error">伪概念</span>
</div>
<p class="text-sm text-slate-400 mt-1">军品占比不足5%,与电磁弹射无技术关联</p>
</div>
<div class="p-3 bg-slate-800/50 rounded-lg">
<div class="flex items-center justify-between">
<span class="font-bold">久之洋</span>
<span class="badge badge-error">业绩下滑</span>
</div>
<p class="text-sm text-slate-400 mt-1">民用海监设备为主2024H1收入同比-22%</p>
</div>
<div class="p-3 bg-slate-800/50 rounded-lg">
<div class="flex items-center justify-between">
<span class="font-bold">海兰信</span>
<span class="badge badge-error">ST风险</span>
</div>
<p class="text-sm text-slate-400 mt-1">军品资质不全2024年亏损1.2亿</p>
</div>
</div>
</div>
</div>
<div class="section-divider"></div>
<div class="alert alert-info">
<i class="fas fa-info-circle text-2xl"></i>
<div>
<h4 class="font-bold text-lg">关键验证指标</h4>
<div class="grid grid-cols-1 md:grid-cols-2 gap-4 mt-4">
<div>
<span class="font-semibold">订单指标:</span>
<p>全军装备采购信息网海军装备招标金额</p>
</div>
<div>
<span class="font-semibold">财务指标:</span>
<p>中国海防合同负债环比增速需持续增长30%+</p>
</div>
<div>
<span class="font-semibold">技术节点:</span>
<p>076型舰海试进度与电磁弹射测试结果</p>
</div>
<div>
<span class="font-semibold">政策信号:</span>
<p>2025年国防预算海军科目增速需超20%</p>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- Footer -->
<footer class="footer footer-center p-10 bg-slate-900 text-base-content">
<div>
<p class="font-bold text-2xl">
<i class="fas fa-ship mr-2"></i>海军装备产业链深度分析
</p>
<p class="text-slate-400">专业投资研究 · 数据驱动决策</p>
</div>
<div>
<div class="grid grid-flow-col gap-4">
<a class="btn btn-ghost btn-circle">
<i class="fab fa-twitter"></i>
</a>
<a class="btn btn-ghost btn-circle">
<i class="fab fa-github"></i>
</a>
<a class="btn btn-ghost btn-circle">
<i class="fab fa-linkedin"></i>
</a>
</div>
</div>
<div>
<p>Copyright © 2025 - 保留所有权利</p>
</div>
</footer>
<script>
// Smooth scroll for navigation links
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
anchor.addEventListener('click', function (e) {
e.preventDefault();
const target = document.querySelector(this.getAttribute('href'));
if (target) {
target.scrollIntoView({
behavior: 'smooth',
block: 'start'
});
}
});
});
// Add scroll effect to navbar
window.addEventListener('scroll', () => {
const navbar = document.querySelector('.navbar');
if (window.scrollY > 100) {
navbar.classList.add('shadow-xl');
} else {
navbar.classList.remove('shadow-xl');
}
});
// Animate elements on scroll
const observerOptions = {
threshold: 0.1,
rootMargin: '0px 0px -50px 0px'
};
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.style.opacity = '1';
entry.target.style.transform = 'translateY(0)';
}
});
}, observerOptions);
// Observe all cards
document.querySelectorAll('.card').forEach(card => {
card.style.opacity = '0';
card.style.transform = 'translateY(20px)';
card.style.transition = 'opacity 0.5s ease, transform 0.5s ease';
observer.observe(card);
});
</script>
</body>
</html>

675
public/htmls/牛肉.html Normal file
View File

@@ -0,0 +1,675 @@
我将为您创建一个专业且炫酷的牛肉概念投资分析页面。这个页面将整合所有深度insight、新闻数据和股票信息采用现代化的设计风格。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>牛肉产业投资分析 - 周期反转与全球共振</title>
<script src="https://cdn.tailwindcss.com"></script>
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<style>
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&display=swap');
* {
font-family: 'Inter', sans-serif;
}
.gradient-bg {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
}
.dark-gradient {
background: linear-gradient(180deg, #1a1c20 0%, #2d3436 100%);
}
.card-hover {
transition: all 0.3s ease;
}
.card-hover:hover {
transform: translateY(-5px);
box-shadow: 0 20px 40px rgba(0,0,0,0.3);
}
.timeline-line {
background: linear-gradient(180deg, #667eea 0%, #764ba2 100%);
width: 2px;
position: absolute;
left: 50%;
transform: translateX(-50%);
height: 100%;
}
.pulse {
animation: pulse 2s infinite;
}
@keyframes pulse {
0% { transform: scale(1); }
50% { transform: scale(1.05); }
100% { transform: scale(1); }
}
.scroll-smooth {
scroll-behavior: smooth;
}
.text-gradient {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.neon-border {
box-shadow: 0 0 20px rgba(102, 126, 234, 0.5),
inset 0 0 20px rgba(102, 126, 234, 0.1);
}
.data-card {
background: rgba(255, 255, 255, 0.05);
backdrop-filter: blur(10px);
border: 1px solid rgba(255, 255, 255, 0.1);
}
@media (max-width: 768px) {
.timeline-line {
left: 20px;
}
}
.table-container {
overflow-x: auto;
}
.sticky-header {
position: sticky;
top: 0;
z-index: 10;
}
</style>
</head>
<body class="bg-gray-900 text-white scroll-smooth">
<!-- Hero Section -->
<section class="gradient-bg py-20 px-6">
<div class="max-w-7xl mx-auto">
<div class="text-center">
<h1 class="text-5xl md:text-6xl font-bold mb-6 text-white">
<i class="fas fa-chart-line mr-4"></i>牛肉产业投资分析
</h1>
<p class="text-xl md:text-2xl text-purple-100 mb-8">周期反转与全球共振的黄金投资机遇</p>
<div class="flex flex-wrap justify-center gap-4 mb-8">
<span class="bg-white/20 px-6 py-3 rounded-full text-lg">
<i class="fas fa-arrow-trend-up mr-2"></i>价格弹性: +70-80%
</span>
<span class="bg-white/20 px-6 py-3 rounded-full text-lg">
<i class="fas fa-calendar mr-2"></i>周期长度: 2-3年
</span>
<span class="bg-white/20 px-6 py-3 rounded-full text-lg">
<i class="fas fa-globe mr-2"></i>全球共振
</span>
</div>
</div>
</div>
</section>
<!-- 核心观点摘要 -->
<section class="py-16 px-6 dark-gradient">
<div class="max-w-7xl mx-auto">
<h2 class="text-4xl font-bold mb-8 text-gradient">核心观点</h2>
<div class="data-card rounded-2xl p-8 neon-border">
<p class="text-xl leading-relaxed">
当前牛肉概念处于<span class="text-purple-400 font-bold">周期反转初期</span>,驱动逻辑从政策主题转向基本面改善。
<span class="text-purple-400 font-bold">未来2-3年景气度将持续上行</span>,价格弹性或超预期。
</p>
<div class="grid md:grid-cols-3 gap-6 mt-8">
<div class="bg-gradient-to-r from-purple-600/20 to-pink-600/20 p-6 rounded-xl">
<i class="fas fa-industry text-3xl text-purple-400 mb-3"></i>
<h3 class="text-xl font-semibold mb-2">深度去化</h3>
<p class="text-gray-300">母牛存栏降3% · 犊牛降8% · 产业根基受损</p>
</div>
<div class="bg-gradient-to-r from-blue-600/20 to-cyan-600/20 p-6 rounded-xl">
<i class="fas fa-shield-halved text-3xl text-blue-400 mb-3"></i>
<h3 class="text-xl font-semibold mb-2">政策约束</h3>
<p class="text-gray-300">商务部保障措施 · 关税加征 · 进口收缩</p>
</div>
<div class="bg-gradient-to-r from-green-600/20 to-emerald-600/20 p-6 rounded-xl">
<i class="fas fa-earth-americas text-3xl text-green-400 mb-3"></i>
<h3 class="text-xl font-semibold mb-2">全球共振</h3>
<p class="text-gray-300">国际价格涨40% · 美国供给缺口 · 巴西减产</p>
</div>
</div>
</div>
</div>
</section>
<!-- 时间轴 -->
<section class="py-16 px-6 bg-gray-800">
<div class="max-w-7xl mx-auto">
<h2 class="text-4xl font-bold mb-12 text-center">核心事件时间轴</h2>
<div class="relative">
<div class="timeline-line"></div>
<!-- 2020-2022 -->
<div class="flex items-center mb-12">
<div class="w-1/2 md:pr-8 text-right">
<div class="data-card p-6 rounded-xl card-hover">
<h3 class="text-2xl font-bold mb-2 text-purple-400">2020-2022年</h3>
<p class="text-lg">景气高点与产能扩张</p>
<ul class="mt-3 text-gray-300 text-sm">
<li>• 牛肉价格达历史峰值 86.21元/公斤</li>
<li>• 2020-2024年产量CAGR 3.5%</li>
<li>• 地方政府鼓励大规模补栏</li>
</ul>
</div>
</div>
<div class="w-12 h-12 bg-purple-600 rounded-full flex items-center justify-center pulse">
<i class="fas fa-arrow-up text-white"></i>
</div>
<div class="w-1/2 md:pl-8"></div>
</div>
<!-- 2023年 -->
<div class="flex items-center mb-12">
<div class="w-1/2 md:pr-8"></div>
<div class="w-12 h-12 bg-red-600 rounded-full flex items-center justify-center pulse">
<i class="fas fa-arrow-down text-white"></i>
</div>
<div class="w-1/2 md:pl-8">
<div class="data-card p-6 rounded-xl card-hover">
<h3 class="text-2xl font-bold mb-2 text-red-400">2023年</h3>
<p class="text-lg">供需反转,价格崩塌</p>
<ul class="mt-3 text-gray-300 text-sm">
<li>• 3月开启持续下跌跌幅超13%</li>
<li>• 能繁母牛存栏下降1.9%</li>
<li>• 产能去化信号初现</li>
</ul>
</div>
</div>
</div>
<!-- 2024年 -->
<div class="flex items-center mb-12">
<div class="w-1/2 md:pr-8 text-right">
<div class="data-card p-6 rounded-xl card-hover">
<h3 class="text-2xl font-bold mb-2 text-orange-400">2024年</h3>
<p class="text-lg">深度亏损,产业动摇</p>
<ul class="mt-3 text-gray-300 text-sm">
<li>• 连续8个月亏损超1000元/头</li>
<li>• 65%以上养殖场户亏损</li>
<li>• 12月商务部启动保障措施调查</li>
</ul>
</div>
</div>
<div class="w-12 h-12 bg-orange-600 rounded-full flex items-center justify-center pulse">
<i class="fas fa-exclamation-triangle text-white"></i>
</div>
<div class="w-1/2 md:pl-8"></div>
</div>
<!-- 2025年 -->
<div class="flex items-center">
<div class="w-1/2 md:pr-8"></div>
<div class="w-12 h-12 bg-green-600 rounded-full flex items-center justify-center pulse">
<i class="fas fa-chart-line text-white"></i>
</div>
<div class="w-1/2 md:pl-8">
<div class="data-card p-6 rounded-xl card-hover">
<h3 class="text-2xl font-bold mb-2 text-green-400">2025年</h3>
<p class="text-lg">周期拐点显现</p>
<ul class="mt-3 text-gray-300 text-sm">
<li>• 1-2月进口量同比下降17.4%</li>
<li>• 3月起价格淡季不淡上涨8.67%</li>
<li>• 11月预期政策落地核心催化剂</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- 供需与价格分析 -->
<section class="py-16 px-6 dark-gradient">
<div class="max-w-7xl mx-auto">
<h2 class="text-4xl font-bold mb-12">供需格局深度分析</h2>
<div class="grid md:grid-cols-2 gap-8 mb-12">
<!-- 供给端 -->
<div class="data-card p-8 rounded-2xl">
<h3 class="text-2xl font-bold mb-6 text-purple-400">
<i class="fas fa-boxes-stacked mr-3"></i>供给端变化
</h3>
<div class="space-y-4">
<div>
<div class="flex justify-between mb-2">
<span>能繁母牛存栏</span>
<span class="text-red-400">↓ 3%</span>
</div>
<div class="bg-gray-700 rounded-full h-3">
<div class="bg-gradient-to-r from-red-500 to-red-600 h-3 rounded-full" style="width: 3%"></div>
</div>
</div>
<div>
<div class="flex justify-between mb-2">
<span>新生犊牛</span>
<span class="text-red-400">↓ 8%</span>
</div>
<div class="bg-gray-700 rounded-full h-3">
<div class="bg-gradient-to-r from-red-500 to-red-600 h-3 rounded-full" style="width: 8%"></div>
</div>
</div>
<div>
<div class="flex justify-between mb-2">
<span>全国牛存栏</span>
<span class="text-red-400">↓ 4.4%</span>
</div>
<div class="bg-gray-700 rounded-full h-3">
<div class="bg-gradient-to-r from-red-500 to-red-600 h-3 rounded-full" style="width: 4.4%"></div>
</div>
</div>
<div>
<div class="flex justify-between mb-2">
<span>进口量</span>
<span class="text-red-400">↓ 17.4%</span>
</div>
<div class="bg-gray-700 rounded-full h-3">
<div class="bg-gradient-to-r from-red-500 to-red-600 h-3 rounded-full" style="width: 17.4%"></div>
</div>
</div>
</div>
</div>
<!-- 价格预测 -->
<div class="data-card p-8 rounded-2xl">
<h3 class="text-2xl font-bold mb-6 text-green-400">
<i class="fas fa-chart-column mr-3"></i>价格走势预测
</h3>
<canvas id="priceChart" width="400" height="200"></canvas>
<div class="mt-6 space-y-2">
<p class="text-sm"><span class="text-green-400">2025年:</span> 26-28元/公斤 (↑10-15%)</p>
<p class="text-sm"><span class="text-yellow-400">2026年:</span> 32-35元/公斤 (↑30-40%)</p>
<p class="text-sm"><span class="text-red-400">2027年:</span> 38-42元/公斤 (↑70-80%)</p>
</div>
</div>
</div>
</div>
</section>
<!-- 核心催化剂 -->
<section class="py-16 px-6 bg-gray-800">
<div class="max-w-7xl mx-auto">
<h2 class="text-4xl font-bold mb-12 text-center">关键催化剂</h2>
<div class="grid md:grid-cols-2 lg:grid-cols-4 gap-6">
<div class="data-card p-6 rounded-xl text-center card-hover">
<div class="text-5xl mb-4 text-purple-400">
<i class="fas fa-gavel"></i>
</div>
<h3 class="text-xl font-bold mb-3">政策落地</h3>
<p class="text-gray-300">2025年11月商务部保障措施终裁</p>
<div class="mt-4 text-2xl font-bold text-purple-400">核心催化</div>
</div>
<div class="data-card p-6 rounded-xl text-center card-hover">
<div class="text-5xl mb-4 text-blue-400">
<i class="fas fa-snowflake"></i>
</div>
<h3 class="text-xl font-bold mb-3">消费旺季</h3>
<p class="text-gray-300">Q4传统旺季需求环比提升30%</p>
<div class="mt-4 text-2xl font-bold text-blue-400">季节催化</div>
</div>
<div class="data-card p-6 rounded-xl text-center card-hover">
<div class="text-5xl mb-4 text-green-400">
<i class="fas fa-globe"></i>
</div>
<h3 class="text-xl font-bold mb-3">海外涨价</h3>
<p class="text-gray-300">国际价格已涨40%,传导效应显现</p>
<div class="mt-4 text-2xl font-bold text-green-400">外部催化</div>
</div>
<div class="data-card p-6 rounded-xl text-center card-hover">
<div class="text-5xl mb-4 text-orange-400">
<i class="fas fa-file-invoice-dollar"></i>
</div>
<h3 class="text-xl font-bold mb-3">业绩预增</h3>
<p class="text-gray-300">龙头Q3利润或增200%+</p>
<div class="mt-4 text-2xl font-bold text-orange-400">业绩催化</div>
</div>
</div>
</div>
</section>
<!-- 产业链分析 -->
<section class="py-16 px-6 dark-gradient">
<div class="max-w-7xl mx-auto">
<h2 class="text-4xl font-bold mb-12">产业链价值分布</h2>
<div class="grid md:grid-cols-3 gap-8">
<!-- 上游 -->
<div class="data-card p-8 rounded-2xl text-center">
<h3 class="text-2xl font-bold mb-4 text-purple-400">上游</h3>
<p class="text-lg mb-4">种源与饲料</p>
<div class="text-3xl font-bold mb-4">15-25% 毛利率</div>
<div class="space-y-2 text-left">
<p>• 天山生物(育种)</p>
<p>• 禾丰股份、海大集团(饲料)</p>
<p>• 福成股份、西部牧业(养殖)</p>
</div>
</div>
<!-- 中游 -->
<div class="data-card p-8 rounded-2xl text-center">
<h3 class="text-2xl font-bold mb-4 text-blue-400">中游</h3>
<p class="text-lg mb-4">屠宰加工</p>
<div class="text-3xl font-bold mb-4">6-13% 毛利率</div>
<div class="space-y-2 text-left">
<p>• 光明肉业(银蕨农场)</p>
<p>• 得利斯(产能利用率关键)</p>
</div>
</div>
<!-- 下游 -->
<div class="data-card p-8 rounded-2xl text-center">
<h3 class="text-2xl font-bold mb-4 text-green-400">下游</h3>
<p class="text-lg mb-4">品牌与渠道</p>
<div class="text-3xl font-bold mb-4">25-35% 毛利率</div>
<div class="space-y-2 text-left">
<p>• 福成股份(肥牛品牌)</p>
<p>• 光明肉业(银蕨品牌)</p>
<p>• 味知香(预制菜)</p>
</div>
</div>
</div>
</div>
</section>
<!-- 核心公司股票数据 -->
<section class="py-16 px-6 bg-gray-800">
<div class="max-w-7xl mx-auto">
<h2 class="text-4xl font-bold mb-12 text-center">核心上市公司分析</h2>
<div class="table-container">
<table class="w-full data-card rounded-lg overflow-hidden">
<thead class="sticky-header bg-gradient-to-r from-purple-600 to-pink-600">
<tr>
<th class="p-4 text-left">股票代码</th>
<th class="p-4 text-left">股票名称</th>
<th class="p-4 text-left">业务分类</th>
<th class="p-4 text-left">核心业务</th>
<th class="p-4 text-left">投资逻辑</th>
<th class="p-4 text-center">推荐评级</th>
</tr>
</thead>
<tbody>
<tr class="border-b border-gray-700 hover:bg-gray-700/50 transition">
<td class="p-4">600965</td>
<td class="p-4 font-bold text-green-400">福成股份</td>
<td class="p-4"><span class="bg-purple-600/30 px-2 py-1 rounded">养殖</span></td>
<td class="p-4 text-sm">三个养牛场活牛存栏容纳能力达到四万头2025年上半年活牛存栏3.44万头</td>
<td class="p-4 text-sm">全产业链区域龙头,华北渠道强,"福成肥牛"品牌知名度高</td>
<td class="p-4 text-center">
<span class="text-2xl">⭐⭐⭐⭐</span>
</td>
</tr>
<tr class="border-b border-gray-700 hover:bg-gray-700/50 transition">
<td class="p-4">300313</td>
<td class="p-4 font-bold text-blue-400">天山生物</td>
<td class="p-4"><span class="bg-orange-600/30 px-2 py-1 rounded">育种</span></td>
<td class="p-4 text-sm">我国唯一专业从事牛品种改良的上市公司,将打造自有鲜牛肉品牌</td>
<td class="p-4 text-sm">稀缺育种标的,掌握核心种源,长期成长确定</td>
<td class="p-4 text-center">
<span class="text-2xl">⭐⭐⭐</span>
</td>
</tr>
<tr class="border-b border-gray-700 hover:bg-gray-700/50 transition">
<td class="p-4">600073</td>
<td class="p-4 font-bold text-purple-400">光明肉业</td>
<td class="p-4"><span class="bg-green-600/30 px-2 py-1 rounded">加工</span></td>
<td class="p-4 text-sm">控股新西兰银蕨农场市占率30%2025Q1净利润同比+312%</td>
<td class="p-4 text-sm">海外资源龙头,直接受益全球涨价,业绩弹性最大</td>
<td class="p-4 text-center">
<span class="text-2xl">⭐⭐⭐⭐⭐</span>
</td>
</tr>
<tr class="border-b border-gray-700 hover:bg-gray-700/50 transition">
<td class="p-4">002330</td>
<td class="p-4 font-bold text-yellow-400">得利斯</td>
<td class="p-4"><span class="bg-blue-600/30 px-2 py-1 rounded">加工</span></td>
<td class="p-4 text-sm">主要业务之一为牛肉精深加工行业</td>
<td class="p-4 text-sm">纯屠宰企业,当前仍亏损,产能利用率是关键</td>
<td class="p-4 text-center">
<span class="text-2xl">⭐⭐</span>
</td>
</tr>
<tr class="border-b border-gray-700 hover:bg-gray-700/50 transition">
<td class="p-4">605089</td>
<td class="p-4 font-bold text-cyan-400">味知香</td>
<td class="p-4"><span class="bg-green-600/30 px-2 py-1 rounded">预制菜</span></td>
<td class="p-4 text-sm">牛肉类产品占比较大(预制菜)</td>
<td class="p-4 text-sm">受益消费升级,牛肉预制菜需求增长</td>
<td class="p-4 text-center">
<span class="text-2xl">⭐⭐⭐</span>
</td>
</tr>
<tr class="border-b border-gray-700 hover:bg-gray-700/50 transition">
<td class="p-4">300106</td>
<td class="p-4 font-bold text-green-400">西部牧业</td>
<td class="p-4"><span class="bg-purple-600/30 px-2 py-1 rounded">养殖</span></td>
<td class="p-4 text-sm">建设肉牛专业育肥基地,与肉牛养殖专业合作社建立合作关系</td>
<td class="p-4 text-sm">乳肉兼营,受益原奶+牛肉双周期</td>
<td class="p-4 text-center">
<span class="text-2xl">⭐⭐⭐</span>
</td>
</tr>
<tr class="border-b border-gray-700 hover:bg-gray-700/50 transition">
<td class="p-4">000061</td>
<td class="p-4 font-bold text-red-400">农产品</td>
<td class="p-4"><span class="bg-red-600/30 px-2 py-1 rounded">贸易</span></td>
<td class="p-4 text-sm">引进的南美牛肉等核心品类的规模稳健增长</td>
<td class="p-4 text-sm">进口贸易商,政策收紧直接受损,建议规避</td>
<td class="p-4 text-center">
<span class="text-2xl"></span>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</section>
<!-- 投资策略 -->
<section class="py-16 px-6 dark-gradient">
<div class="max-w-7xl mx-auto">
<h2 class="text-4xl font-bold mb-12 text-center">投资策略建议</h2>
<div class="grid md:grid-cols-3 gap-8 mb-12">
<!-- 第一梯队 -->
<div class="data-card p-8 rounded-2xl neon-border">
<div class="text-3xl font-bold mb-4 text-green-400">第一梯队</div>
<div class="text-xl mb-4">海外资源型(首选)</div>
<div class="bg-green-600/20 p-4 rounded-lg mb-4">
<p class="font-bold text-green-400 mb-2">核心标的:光明肉业</p>
<p class="text-sm">逻辑最顺 · 弹性最大</p>
<p class="text-sm mt-2">2027年利润或达5亿元对应PE仅5-6倍</p>
</div>
<div class="text-sm space-y-1">
<p>• 仓位建议60%</p>
<p>• 持有周期至2027年景气高点</p>
</div>
</div>
<!-- 第二梯队 -->
<div class="data-card p-8 rounded-2xl neon-border">
<div class="text-3xl font-bold mb-4 text-blue-400">第二梯队</div>
<div class="text-xl mb-4">全产业链型(次优)</div>
<div class="bg-blue-600/20 p-4 rounded-lg mb-4">
<p class="font-bold text-blue-400 mb-2">核心标的:福成股份</p>
<p class="text-sm">双轮驱动 · 品牌护城河</p>
<p class="text-sm mt-2">存栏3.44万头具备扩张潜力</p>
</div>
<div class="text-sm space-y-1">
<p>• 仓位建议30%</p>
<p>• 持有周期:中期配置</p>
</div>
</div>
<!-- 第三梯队 -->
<div class="data-card p-8 rounded-2xl neon-border">
<div class="text-3xl font-bold mb-4 text-purple-400">第三梯队</div>
<div class="text-xl mb-4">育种核心(长期)</div>
<div class="bg-purple-600/20 p-4 rounded-lg mb-4">
<p class="font-bold text-purple-400 mb-2">核心标的:天山生物</p>
<p class="text-sm">产业升级 · 种源卡脖子</p>
<p class="text-sm mt-2">技术壁垒高,业绩释放慢</p>
</div>
<div class="text-sm space-y-1">
<p>• 仓位建议10%</p>
<p>• 持有周期:卫星仓位</p>
</div>
</div>
</div>
<!-- 风险提示 -->
<div class="bg-red-900/30 border border-red-600 p-6 rounded-xl">
<h3 class="text-2xl font-bold mb-4 text-red-400">
<i class="fas fa-triangle-exclamation mr-2"></i>风险提示
</h3>
<div class="grid md:grid-cols-2 gap-6">
<div>
<h4 class="font-bold mb-2 text-red-300">需求风险</h4>
<ul class="text-sm text-gray-300 space-y-1">
<li>• 消费降级导致高价蛋白需求萎缩</li>
<li>• 餐饮端恢复不及预期</li>
</ul>
</div>
<div>
<h4 class="font-bold mb-2 text-red-300">政策风险</h4>
<ul class="text-sm text-gray-300 space-y-1">
<li>• 保障措施力度不及预期</li>
<li>• 贸易反制措施</li>
</ul>
</div>
</div>
</div>
</div>
</section>
<!-- Footer -->
<footer class="bg-gray-900 border-t border-gray-800 py-8 px-6">
<div class="max-w-7xl mx-auto text-center">
<p class="text-gray-400">© 2025 牛肉产业投资分析报告 | 数据来源:公开信息整理</p>
<p class="text-gray-500 text-sm mt-2">投资有风险,入市需谨慎</p>
</div>
</footer>
<script>
// 价格走势图表
const ctx = document.getElementById('priceChart').getContext('2d');
const priceChart = new Chart(ctx, {
type: 'line',
data: {
labels: ['2024', '2025', '2026', '2027', '2028'],
datasets: [{
label: '牛肉价格预测(元/公斤)',
data: [24, 27, 34, 40, 38],
borderColor: 'rgb(168, 85, 247)',
backgroundColor: 'rgba(168, 85, 247, 0.1)',
tension: 0.4,
fill: true
}]
},
options: {
responsive: true,
plugins: {
legend: {
labels: {
color: 'white'
}
}
},
scales: {
y: {
beginAtZero: false,
grid: {
color: 'rgba(255, 255, 255, 0.1)'
},
ticks: {
color: 'white'
}
},
x: {
grid: {
color: 'rgba(255, 255, 255, 0.1)'
},
ticks: {
color: 'white'
}
}
}
}
});
// 滚动动画
const observerOptions = {
threshold: 0.1,
rootMargin: '0px 0px -50px 0px'
};
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.style.opacity = '1';
entry.target.style.transform = 'translateY(0)';
}
});
}, observerOptions);
// 为所有卡片添加滚动动画
document.querySelectorAll('.card-hover').forEach(el => {
el.style.opacity = '0';
el.style.transform = 'translateY(20px)';
el.style.transition = 'opacity 0.6s ease, transform 0.6s ease';
observer.observe(el);
});
// 平滑滚动
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
anchor.addEventListener('click', function (e) {
e.preventDefault();
document.querySelector(this.getAttribute('href')).scrollIntoView({
behavior: 'smooth'
});
});
});
</script>
</body>
</html>
这个HTML页面提供了一个专业、炫酷且功能丰富的牛肉产业投资分析界面。主要特点包括
## 🎯 核心功能
1. **完整的内容展示** - 整合了所有insight分析、新闻数据和股票信息
2. **交互式时间轴** - 展示核心事件演进过程
3. **数据可视化** - 包含价格走势图表和供需进度条
4. **详细股票表格** - 清晰展示相关上市公司信息,支持水平滚动
5. **投资策略建议** - 分梯队展示投资标的和建议
## 💫 设计亮点
- **渐变色主题** - 紫色到粉色的渐变,营造专业金融感
- **玻璃态效果** - 半透明卡片配合模糊背景
- **霓虹光效** - 重要元素添加发光边框
- **响应式布局** - 完美适配桌面和移动设备
- **平滑动画** - 滚动触发的渐入效果
- **微交互** - 悬停效果和脉冲动画
## 📊 数据展示
- 三重共振驱动逻辑的可视化
- 供需端变化进度条
- 价格预测折线图
- 产业链价值分布
- 核心公司评级表格
页面保留了insight的绝大部分关键内容包括周期分析、产能去化、政策影响、全球格局等核心观点并通过现代化的设计语言让信息更易理解和吸收。

624
public/htmls/羽绒.html Normal file
View File

@@ -0,0 +1,624 @@
<!DOCTYPE html>
<html lang="zh-CN" data-theme="dark">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>羽绒行业深度分析报告</title>
<link href="https://cdn.jsdelivr.net/npm/daisyui@4.4.24/dist/full.min.css" rel="stylesheet" type="text/css" />
<link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<script src="https://cdn.tailwindcss.com"></script>
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<style>
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&display=swap');
* {
font-family: 'Inter', sans-serif;
}
.gradient-bg {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
}
.glass-effect {
background: rgba(255, 255, 255, 0.1);
backdrop-filter: blur(10px);
border: 1px solid rgba(255, 255, 255, 0.2);
}
.timeline-dot {
animation: pulse 2s infinite;
}
@keyframes pulse {
0% {
box-shadow: 0 0 0 0 rgba(147, 51, 234, 0.7);
}
70% {
box-shadow: 0 0 0 10px rgba(147, 51, 234, 0);
}
100% {
box-shadow: 0 0 0 0 rgba(147, 51, 234, 0);
}
}
.hover-scale {
transition: transform 0.3s ease;
}
.hover-scale:hover {
transform: scale(1.05);
}
.gradient-text {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.table-container {
width: 100%;
overflow-x: auto;
-webkit-overflow-scrolling: touch;
}
.custom-scrollbar::-webkit-scrollbar {
height: 8px;
width: 8px;
}
.custom-scrollbar::-webkit-scrollbar-track {
background: #1f2937;
border-radius: 10px;
}
.custom-scrollbar::-webkit-scrollbar-thumb {
background: #4b5563;
border-radius: 10px;
}
.custom-scrollbar::-webkit-scrollbar-thumb:hover {
background: #6b7280;
}
@media (max-width: 768px) {
.hero-text {
font-size: 2rem !important;
}
}
.card-hover {
transition: all 0.3s ease;
}
.card-hover:hover {
transform: translateY(-5px);
box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.3);
}
.price-up {
animation: priceUp 1s ease-out;
}
@keyframes priceUp {
from {
transform: translateY(20px);
opacity: 0;
}
to {
transform: translateY(0);
opacity: 1;
}
}
</style>
</head>
<body class="bg-gray-900 text-white">
<!-- Hero Section -->
<div class="gradient-bg min-h-screen flex items-center justify-center relative overflow-hidden">
<div class="absolute inset-0 bg-black opacity-50"></div>
<div class="container mx-auto px-6 relative z-10">
<div class="text-center">
<h1 class="hero-text text-6xl md:text-8xl font-bold mb-6 text-white animate-pulse">
羽绒行业
</h1>
<p class="text-2xl md:text-3xl mb-8 text-gray-200">供需失衡下的史诗级行情</p>
<div class="flex justify-center space-x-4 mb-12">
<div class="glass-effect rounded-lg px-6 py-3">
<i class="fas fa-chart-line text-yellow-400 mr-2"></i>
<span class="text-xl font-semibold">价格涨幅 <span class="text-3xl">241%</span></span>
</div>
<div class="glass-effect rounded-lg px-6 py-3">
<i class="fas fa-snowflake text-blue-400 mr-2"></i>
<span class="text-xl font-semibold">冷冬催化</span>
</div>
<div class="glass-effect rounded-lg px-6 py-3">
<i class="fas fa-industry text-green-400 mr-2"></i>
<span class="text-xl font-semibold">产业升级</span>
</div>
</div>
<button onclick="scrollToSection('timeline')" class="bg-purple-600 hover:bg-purple-700 px-8 py-4 rounded-full text-xl font-semibold transition-all hover-scale">
深度解析 <i class="fas fa-arrow-down ml-2"></i>
</button>
</div>
</div>
<div class="absolute bottom-0 left-0 right-0">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1440 320">
<path fill="#111827" fill-opacity="1" d="M0,96L48,112C96,128,192,160,288,160C384,160,480,128,576,117.3C672,107,768,117,864,138.7C960,160,1056,192,1152,192C1248,192,1344,160,1392,144L1440,128L1440,320L1392,320C1344,320,1248,320,1152,320C1056,320,960,320,864,320C768,320,672,320,576,320C480,320,384,320,288,320C192,320,96,320,48,320L0,320Z"></path>
</svg>
</div>
</div>
<!-- Timeline Section -->
<section id="timeline" class="py-20 bg-gray-900">
<div class="container mx-auto px-6">
<h2 class="text-4xl md:text-5xl font-bold text-center mb-16 gradient-text">概念事件时间轴</h2>
<div class="space-y-8">
<div class="flex items-start space-x-4">
<div class="flex-shrink-0 w-12 h-12 bg-purple-600 rounded-full flex items-center justify-center timeline-dot">
<span class="text-sm font-bold">2023</span>
</div>
<div class="flex-grow glass-effect rounded-lg p-6 card-hover">
<h3 class="text-xl font-semibold mb-2">价格基础奠定期</h3>
<p class="text-gray-300">白鸭绒价格从3,500元/吨涨至5,380元/吨涨幅超53%。供给端产能去化,需求端冰雪经济推动。</p>
</div>
</div>
<div class="flex items-start space-x-4">
<div class="flex-shrink-0 w-12 h-12 bg-red-600 rounded-full flex items-center justify-center timeline-dot">
<span class="text-sm font-bold">2024.11</span>
</div>
<div class="flex-grow glass-effect rounded-lg p-6 card-hover">
<h3 class="text-xl font-semibold mb-2">央视曝光造假事件</h3>
<p class="text-gray-300">央视曝光羽绒造假黑幕,以"飞丝"冒充羽绒成本差距50%+。行业监管趋严,劣币出清加速。</p>
</div>
</div>
<div class="flex items-start space-x-4">
<div class="flex-shrink-0 w-12 h-12 bg-green-600 rounded-full flex items-center justify-center timeline-dot">
<span class="text-sm font-bold">2025.05</span>
</div>
<div class="flex-grow glass-effect rounded-lg p-6 card-hover">
<h3 class="text-xl font-semibold mb-2">古麒绒材上市</h3>
<p class="text-gray-300">羽绒材料龙头古麒绒材登陆A股上市首日大涨222.85%触发临停,概念情绪达到高点。</p>
</div>
</div>
<div class="flex items-start space-x-4">
<div class="flex-shrink-0 w-12 h-12 bg-yellow-600 rounded-full flex items-center justify-center timeline-dot">
<span class="text-sm font-bold">2025.10-11</span>
</div>
<div class="flex-grow glass-effect rounded-lg p-6 card-hover price-up">
<h3 class="text-xl font-semibold mb-2">价格暴涨期</h3>
<p class="text-gray-300">寒潮提前来临90%白鸭绒价格从17万元/吨飙升至58万元/吨鹅绒达98万元/吨。</p>
</div>
</div>
<div class="flex items-start space-x-4">
<div class="flex-shrink-0 w-12 h-12 bg-blue-600 rounded-full flex items-center justify-center timeline-dot">
<span class="text-sm font-bold">2025.11.20</span>
</div>
<div class="flex-grow glass-effect rounded-lg p-6 card-hover">
<h3 class="text-xl font-semibold mb-2">机构密集推荐</h3>
<p class="text-gray-300">多家机构同步推荐波司登,关注古麒绒材,明确"冷冬逐步确认"交易逻辑。</p>
</div>
</div>
</div>
</div>
</section>
<!-- Core Logic Section -->
<section class="py-20 bg-gray-800">
<div class="container mx-auto px-6">
<h2 class="text-4xl md:text-5xl font-bold text-center mb-16 gradient-text">核心逻辑三维解析</h2>
<div class="grid md:grid-cols-3 gap-8">
<div class="glass-effect rounded-xl p-8 card-hover">
<div class="text-4xl mb-4">📉</div>
<h3 class="text-2xl font-bold mb-4 text-purple-400">供给侧刚性收缩</h3>
<ul class="space-y-2 text-gray-300">
<li>• 养殖产能历史低位40-42亿羽</li>
<li>• 较高峰期减少16.7%</li>
<li>• 环保政策挤出中小屠宰场</li>
<li>• 羽毛分流效应(羽毛球原料)</li>
</ul>
</div>
<div class="glass-effect rounded-xl p-8 card-hover">
<div class="text-4xl mb-4">📈</div>
<h3 class="text-2xl font-bold mb-4 text-green-400">需求侧结构性升级</h3>
<ul class="space-y-2 text-gray-300">
<li>• 冰雪经济1.5万亿市场空间</li>
<li>• 新国标实际成本增加15-20%</li>
<li>• 高充绒量300克/件)成标配</li>
<li>• 渗透率仅9%vs 欧美35%</li>
</ul>
</div>
<div class="glass-effect rounded-xl p-8 card-hover">
<div class="text-4xl mb-4">⚖️</div>
<h3 class="text-2xl font-bold mb-4 text-blue-400">监管侧劣币出清</h3>
<ul class="space-y-2 text-gray-300">
<li>• 央视曝光行业造假乱象</li>
<li>• 成本铁底420-550元/千克</li>
<li>• 从"价格战"转向"价值战"</li>
<li>• 头部企业市占率加速提升</li>
</ul>
</div>
</div>
</div>
</section>
<!-- Industry Chain Section -->
<section class="py-20 bg-gray-900">
<div class="container mx-auto px-6">
<h2 class="text-4xl md:text-5xl font-bold text-center mb-16 gradient-text">产业链图谱</h2>
<div class="overflow-x-auto custom-scrollbar">
<div class="flex space-x-6 pb-4" style="min-width: max-content;">
<!-- 上游 -->
<div class="bg-gray-800 rounded-lg p-6 min-w-[280px] card-hover">
<h3 class="text-xl font-bold mb-4 text-purple-400">上游:水禽养殖与屠宰</h3>
<div class="space-y-3">
<div class="bg-gray-700 rounded p-3">
<div class="font-semibold">益客食品</div>
<div class="text-sm text-gray-400">全球第二大肉鸭供应商</div>
<div class="text-sm text-gray-400">年屠宰3.5亿只</div>
</div>
<div class="bg-gray-700 rounded p-3">
<div class="font-semibold">立华股份</div>
<div class="text-sm text-gray-400">商品鹅年销210万只</div>
<div class="text-sm text-gray-400">鹅绒高端原料</div>
</div>
<div class="bg-gray-700 rounded p-3">
<div class="font-semibold">华英农业</div>
<div class="text-sm text-gray-400">自产约8%原毛</div>
<div class="text-sm text-gray-400">其余90%外采</div>
</div>
</div>
</div>
<!-- 中游 -->
<div class="bg-gray-800 rounded-lg p-6 min-w-[280px] card-hover">
<h3 class="text-xl font-bold mb-4 text-green-400">中游:羽绒加工与水洗</h3>
<div class="space-y-3">
<div class="bg-gray-700 rounded p-3">
<div class="font-semibold">古麒绒材</div>
<div class="text-sm text-gray-400">A股次新龙头</div>
<div class="text-sm text-gray-400">产能2288吨</div>
</div>
<div class="bg-gray-700 rounded p-3">
<div class="font-semibold">华英农业</div>
<div class="text-sm text-gray-400">市占率国内15%</div>
<div class="text-sm text-gray-400">全球接近10%</div>
</div>
<div class="bg-gray-700 rounded p-3">
<div class="font-semibold">柳桥集团</div>
<div class="text-sm text-gray-400">非上市龙头</div>
<div class="text-sm text-gray-400">出口占比高</div>
</div>
</div>
</div>
<!-- 下游 -->
<div class="bg-gray-800 rounded-lg p-6 min-w-[320px] card-hover">
<h3 class="text-xl font-bold mb-4 text-blue-400">下游:品牌服饰与家纺</h3>
<div class="space-y-3">
<div class="bg-gray-700 rounded p-3">
<div class="font-semibold">波司登</div>
<div class="text-sm text-gray-400">全球羽绒服专家</div>
<div class="text-sm text-gray-400">品牌定价权最强</div>
</div>
<div class="bg-gray-700 rounded p-3">
<div class="font-semibold">富安娜/罗莱生活</div>
<div class="text-sm text-gray-400">家纺龙头</div>
<div class="text-sm text-gray-400">羽绒被渗透率提升</div>
</div>
<div class="bg-gray-700 rounded p-3">
<div class="font-semibold">安踏/李宁</div>
<div class="text-sm text-gray-400">运动品牌</div>
<div class="text-sm text-gray-400">冬季羽绒品类增量</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- Core Companies Comparison -->
<section class="py-20 bg-gray-800">
<div class="container mx-auto px-6">
<h2 class="text-4xl md:text-5xl font-bold text-center mb-16 gradient-text">核心玩家四维对比</h2>
<div class="overflow-x-auto custom-scrollbar">
<table class="w-full bg-gray-900 rounded-lg overflow-hidden">
<thead>
<tr class="bg-purple-600">
<th class="px-6 py-4 text-left">公司</th>
<th class="px-6 py-4 text-center">业务纯度</th>
<th class="px-6 py-4 text-center">定价权</th>
<th class="px-6 py-4 text-center">资金实力</th>
<th class="px-6 py-4 text-center">风险敞口</th>
<th class="px-6 py-4 text-center">核心逻辑</th>
</tr>
</thead>
<tbody>
<tr class="border-b border-gray-700 hover:bg-gray-800">
<td class="px-6 py-4 font-semibold">古麒绒材</td>
<td class="px-6 py-4 text-center">⭐⭐⭐⭐⭐<br><span class="text-sm text-gray-400">99%羽绒业务</span></td>
<td class="px-6 py-4 text-center">⭐⭐⭐<br><span class="text-sm text-gray-400">技术溢价但账期被动</span></td>
<td class="px-6 py-4 text-center">⭐⭐⭐<br><span class="text-sm text-gray-400">IPO募资5亿</span></td>
<td class="px-6 py-4 text-center">⭐⭐⭐⭐⭐<br><span class="text-sm text-gray-400">原材料占比96%+</span></td>
<td class="px-6 py-4 text-sm">技术龙头+产能扩张<br><span class="text-red-400">需警惕现金流恶化</span></td>
</tr>
<tr class="border-b border-gray-700 hover:bg-gray-800">
<td class="px-6 py-4 font-semibold">华英农业</td>
<td class="px-6 py-4 text-center">⭐⭐⭐⭐<br><span class="text-sm text-gray-400">70%羽绒+30%食品</span></td>
<td class="px-6 py-4 text-center">⭐⭐<br><span class="text-sm text-gray-400">加工费模式毛利率7-9%</span></td>
<td class="px-6 py-4 text-center">⭐⭐<br><span class="text-sm text-gray-400">依赖融资</span></td>
<td class="px-6 py-4 text-center">⭐⭐⭐⭐<br><span class="text-sm text-gray-400">订单锁定+库存跌价</span></td>
<td class="px-6 py-4 text-sm">规模优势+出清受益<br><span class="text-yellow-400">但盈利能力脆弱</span></td>
</tr>
<tr class="border-b border-gray-700 hover:bg-gray-800">
<td class="px-6 py-4 font-semibold">波司登</td>
<td class="px-6 py-4 text-center">⭐⭐⭐<br><span class="text-sm text-gray-400">主品牌+多元化</span></td>
<td class="px-6 py-4 text-center">⭐⭐⭐⭐⭐<br><span class="text-sm text-gray-400">品牌溢价,可提价传导</span></td>
<td class="px-6 py-4 text-center">⭐⭐⭐⭐<br><span class="text-sm text-gray-400">港股龙头,现金充裕</span></td>
<td class="px-6 py-4 text-center">⭐⭐<br><span class="text-sm text-gray-400">成本占比<45%</span></td>
<td class="px-6 py-4 text-sm">品牌护城河最深<br><span class="text-green-400">估值已反映预期</span></td>
</tr>
<tr class="hover:bg-gray-800">
<td class="px-6 py-4 font-semibold">益客食品</td>
<td class="px-6 py-4 text-center">⭐⭐<br><span class="text-sm text-gray-400">羽绒为辅,食品为主</span></td>
<td class="px-6 py-4 text-center"><br><span class="text-sm text-gray-400">副产品,无单独定价</span></td>
<td class="px-6 py-4 text-center">⭐⭐⭐<br><span class="text-sm text-gray-400">肉鸭龙头</span></td>
<td class="px-6 py-4 text-center"><br><span class="text-sm text-gray-400">成本内部化</span></td>
<td class="px-6 py-4 text-sm">上游资源隐形标的<br><span class="text-blue-400">业务纯度不足</span></td>
</tr>
</tbody>
</table>
</div>
</div>
</section>
<!-- Stock Data Section -->
<section class="py-20 bg-gray-900">
<div class="container mx-auto px-6">
<h2 class="text-4xl md:text-5xl font-bold text-center mb-16 gradient-text">相关股票数据</h2>
<div class="overflow-x-auto custom-scrollbar">
<table class="w-full bg-gray-800 rounded-lg overflow-hidden text-sm">
<thead>
<tr class="bg-gradient-to-r from-purple-600 to-purple-700">
<th class="px-4 py-3 text-left">股票名称</th>
<th class="px-4 py-3 text-left">分类</th>
<th class="px-4 py-3 text-left">行业</th>
<th class="px-4 py-3 text-left">项目</th>
<th class="px-4 py-3 text-left">产业链/地位</th>
<th class="px-4 py-3 text-left">关键数据</th>
<th class="px-4 py-3 text-left">投资逻辑</th>
</tr>
</thead>
<tbody>
<tr class="border-b border-gray-700 hover:bg-gray-700 transition-colors">
<td class="px-4 py-3 font-semibold text-purple-400">古麒绒材</td>
<td class="px-4 py-3">相关业务</td>
<td class="px-4 py-3">羽绒产品</td>
<td class="px-4 py-3">高规格羽绒产品研产销</td>
<td class="px-4 py-3">原材料-研发-生产-销售</td>
<td class="px-4 py-3">营收占比99.27%2024年营收9.59亿</td>
<td class="px-4 py-3">A股唯一纯羽绒材料标的技术龙头</td>
</tr>
<tr class="border-b border-gray-700 hover:bg-gray-700 transition-colors">
<td class="px-4 py-3 font-semibold text-purple-400">华英农业</td>
<td class="px-4 py-3">相关业务</td>
<td class="px-4 py-3">羽绒产品</td>
<td class="px-4 py-3">羽绒加工</td>
<td class="px-4 py-3">中国羽绒行业出口十强</td>
<td class="px-4 py-3">营收占比67.22%2024年营收31.8亿</td>
<td class="px-4 py-3">规模优势市占率国内15%,军工订单</td>
</tr>
<tr class="border-b border-gray-700 hover:bg-gray-700 transition-colors">
<td class="px-4 py-3 font-semibold text-purple-400">益客食品</td>
<td class="px-4 py-3">相关业务</td>
<td class="px-4 py-3">羽绒产品</td>
<td class="px-4 py-3">原料绒生产</td>
<td class="px-4 py-3">原料绒-毛梗/毛片副产品</td>
<td class="px-4 py-3">2024年羽绒营收9.19亿元</td>
<td class="px-4 py-3">上游资源隐形标的年屠宰3.5亿只</td>
</tr>
<tr class="border-b border-gray-700 hover:bg-gray-700 transition-colors">
<td class="px-4 py-3 font-semibold text-purple-400">立华股份</td>
<td class="px-4 py-3">相关业务</td>
<td class="px-4 py-3">养鹅业务</td>
<td class="px-4 py-3">种鹅繁育/商品鹅养殖</td>
<td class="px-4 py-3">育种-种鹅繁育-商品鹅养殖及销售</td>
<td class="px-4 py-3">2024年销售商品鹅209.63万只,同比+21.73%</td>
<td class="px-4 py-3">鹅绒高端原料,羽毛制作羽毛球</td>
</tr>
<tr class="border-b border-gray-700 hover:bg-gray-700 transition-colors">
<td class="px-4 py-3 font-semibold text-purple-400">煌上煌</td>
<td class="px-4 py-3">相关业务</td>
<td class="px-4 py-3">羽绒加工</td>
<td class="px-4 py-3">羽绒加工</td>
<td class="px-4 py-3">子公司加工</td>
<td class="px-4 py-3">持股51%子公司丰城煌鹏羽绒</td>
<td class="px-4 py-3">业务占比较小,弹性有限</td>
</tr>
<tr class="border-b border-gray-700 hover:bg-gray-700 transition-colors">
<td class="px-4 py-3 font-semibold text-blue-400">森马服饰</td>
<td class="px-4 py-3">羽绒服</td>
<td class="px-4 py-3">羽绒服</td>
<td class="px-4 py-3">品牌运营</td>
<td class="px-4 py-3">品牌设计-生产-销售</td>
<td class="px-4 py-3">古麒绒材大客户占比约20%</td>
<td class="px-4 py-3">下游品牌商,拥有定价权</td>
</tr>
<tr class="border-b border-gray-700 hover:bg-gray-700 transition-colors">
<td class="px-4 py-3 font-semibold text-blue-400">海澜之家</td>
<td class="px-4 py-3">羽绒服</td>
<td class="px-4 py-3">羽绒服</td>
<td class="px-4 py-3">品牌运营</td>
<td class="px-4 py-3">品牌设计-生产-销售</td>
<td class="px-4 py-3">古麒绒材大客户占比约20%</td>
<td class="px-4 py-3">下游品牌商,拥有定价权</td>
</tr>
<tr class="border-b border-gray-700 hover:bg-gray-700 transition-colors">
<td class="px-4 py-3 font-semibold text-blue-400">探路者</td>
<td class="px-4 py-3">羽绒服</td>
<td class="px-4 py-3">羽绒服</td>
<td class="px-4 py-3">户外服装</td>
<td class="px-4 py-3">户外品牌-羽绒服产品</td>
<td class="px-4 py-3">专业户外羽绒服市场</td>
<td class="px-4 py-3">户外领域羽绒服,细分市场龙头</td>
</tr>
<tr class="border-b border-gray-700 hover:bg-gray-700 transition-colors">
<td class="px-4 py-3 font-semibold text-blue-400">嘉曼服饰</td>
<td class="px-4 py-3">羽绒服</td>
<td class="px-4 py-3">羽绒服</td>
<td class="px-4 py-3">品牌运营</td>
<td class="px-4 py-3">品牌设计-生产-销售</td>
<td class="px-4 py-3">童装羽绒服市场</td>
<td class="px-4 py-3">儿童羽绒服细分市场</td>
</tr>
</tbody>
</table>
</div>
</div>
</section>
<!-- Investment Advice Section -->
<section class="py-20 bg-gray-800">
<div class="container mx-auto px-6">
<h2 class="text-4xl md:text-5xl font-bold text-center mb-16 gradient-text">投资建议与风险提示</h2>
<div class="grid md:grid-cols-2 gap-8">
<div class="glass-effect rounded-xl p-8">
<h3 class="text-2xl font-bold mb-6 text-green-400">投资优先级</h3>
<div class="space-y-4">
<div class="flex items-center space-x-3">
<span class="text-3xl">🥇</span>
<div>
<div class="font-semibold">超配:波司登、益客食品</div>
<div class="text-sm text-gray-400">品牌护城河+上游资源</div>
</div>
</div>
<div class="flex items-center space-x-3">
<span class="text-3xl">🥈</span>
<div>
<div class="font-semibold">标配:华英农业</div>
<div class="text-sm text-gray-400">规模优势+军工订单</div>
</div>
</div>
<div class="flex items-center space-x-3">
<span class="text-3xl">🥉</span>
<div>
<div class="font-semibold">低配:古麒绒材、富安娜</div>
<div class="text-sm text-gray-400">情绪溢价高、逻辑不纯</div>
</div>
</div>
</div>
</div>
<div class="glass-effect rounded-xl p-8">
<h3 class="text-2xl font-bold mb-6 text-red-400">关键风险</h3>
<div class="space-y-4">
<div class="flex items-start space-x-3">
<i class="fas fa-exclamation-triangle text-yellow-400 mt-1"></i>
<div>
<div class="font-semibold">价格数据混乱</div>
<div class="text-sm text-gray-400">新闻涨幅241% vs 实际涨幅53%</div>
</div>
</div>
<div class="flex items-start space-x-3">
<i class="fas fa-exclamation-triangle text-yellow-400 mt-1"></i>
<div>
<div class="font-semibold">中游毛利率压缩</div>
<div class="text-sm text-gray-400">订单锁定导致毛利率仅7-9%</div>
</div>
</div>
<div class="flex items-start space-x-3">
<i class="fas fa-exclamation-triangle text-yellow-400 mt-1"></i>
<div>
<div class="font-semibold">库存周期错配</div>
<div class="text-sm text-gray-400">囤货压力与资金占用</div>
</div>
</div>
<div class="flex items-start space-x-3">
<i class="fas fa-exclamation-triangle text-yellow-400 mt-1"></i>
<div>
<div class="font-semibold">暖冬风险</div>
<div class="text-sm text-gray-400">2025年Q1业绩证伪概率高</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- Footer -->
<footer class="py-12 bg-gray-900 border-t border-gray-800">
<div class="container mx-auto px-6 text-center">
<p class="text-gray-400 mb-4">本报告仅供参考,不构成投资建议</p>
<p class="text-sm text-gray-500">数据来源:公开新闻、路演记录、研报 | 更新时间2025年11月</p>
</div>
</footer>
<script>
// Smooth scroll function
function scrollToSection(sectionId) {
const section = document.getElementById(sectionId);
section.scrollIntoView({ behavior: 'smooth' });
}
// Add animation on scroll
const observerOptions = {
threshold: 0.1,
rootMargin: '0px 0px -100px 0px'
};
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.classList.add('price-up');
}
});
}, observerOptions);
document.querySelectorAll('.card-hover').forEach(el => {
observer.observe(el);
});
// Dynamic date update
const updateDate = () => {
const now = new Date();
const options = { year: 'numeric', month: 'long', day: 'numeric' };
document.getElementById('currentDate').textContent = now.toLocaleDateString('zh-CN', options);
};
// Initialize
document.addEventListener('DOMContentLoaded', () => {
updateDate();
// Add hover effect to table rows
const tableRows = document.querySelectorAll('tbody tr');
tableRows.forEach(row => {
row.addEventListener('mouseenter', function() {
this.style.transform = 'scale(1.02)';
this.style.transition = 'transform 0.2s ease';
});
row.addEventListener('mouseleave', function() {
this.style.transform = 'scale(1)';
});
});
});
// Parallax effect for hero section
window.addEventListener('scroll', () => {
const scrolled = window.pageYOffset;
const hero = document.querySelector('.gradient-bg');
if (hero) {
hero.style.transform = `translateY(${scrolled * 0.5}px)`;
}
});
</script>
</body>
</html>

576
public/htmls/谷歌.html Normal file
View File

@@ -0,0 +1,576 @@
我将为您创建一个专业的金融科技风格HTML页面展示谷歌AI转型的完整投资分析。这个页面将融合数据可视化、动态效果和响应式设计。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>谷歌AI产业链投资分析 - 战略蜕变与价值重估</title>
<script src="https://cdn.tailwindcss.com"></script>
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
<style>
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&display=swap');
* {
font-family: 'Inter', sans-serif;
}
.gradient-bg {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
}
.card-hover {
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}
.card-hover:hover {
transform: translateY(-4px);
box-shadow: 0 20px 40px rgba(0,0,0,0.1);
}
.pulse-dot {
animation: pulse 2s infinite;
}
@keyframes pulse {
0%, 100% {
transform: scale(1);
opacity: 1;
}
50% {
transform: scale(1.1);
opacity: 0.7;
}
}
.number-animate {
animation: countUp 1s ease-out;
}
@keyframes countUp {
from {
opacity: 0;
transform: translateY(20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.timeline-item {
position: relative;
padding-left: 40px;
}
.timeline-item::before {
content: '';
position: absolute;
left: 0;
top: 8px;
width: 12px;
height: 12px;
border-radius: 50%;
background: #667eea;
box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.1);
}
.timeline-item::after {
content: '';
position: absolute;
left: 5px;
top: 20px;
width: 2px;
height: calc(100% + 10px);
background: #e5e7eb;
}
.timeline-item:last-child::after {
display: none;
}
.glass-effect {
background: rgba(255, 255, 255, 0.1);
backdrop-filter: blur(10px);
border: 1px solid rgba(255, 255, 255, 0.2);
}
.glow-text {
text-shadow: 0 0 20px rgba(102, 126, 234, 0.5);
}
.scroll-hidden::-webkit-scrollbar {
display: none;
}
.badge-glow {
animation: badgeGlow 2s ease-in-out infinite alternate;
}
@keyframes badgeGlow {
from {
box-shadow: 0 0 5px rgba(102, 126, 234, 0.5);
}
to {
box-shadow: 0 0 20px rgba(102, 126, 234, 0.8);
}
}
</style>
</head>
<body class="bg-gray-50">
<!-- Hero Section -->
<section class="gradient-bg text-white py-20 px-4">
<div class="max-w-7xl mx-auto">
<div class="text-center mb-10">
<div class="inline-flex items-center justify-center w-16 h-16 bg-white/20 rounded-full mb-6 badge-glow">
<i class="fab fa-google text-3xl"></i>
</div>
<h1 class="text-5xl md:text-6xl font-bold mb-6 glow-text">
谷歌AI产业链投资分析
</h1>
<p class="text-xl md:text-2xl text-blue-100 max-w-3xl mx-auto">
从"搜索广告公司"向"AI基础设施+应用生态平台"的战略蜕变
</p>
</div>
<div class="grid md:grid-cols-4 gap-6 mt-16">
<div class="glass-effect rounded-xl p-6 card-hover">
<div class="text-3xl font-bold number-animate">450<span class="text-xl"></span></div>
<div class="text-blue-200 mt-2">等效H100算力</div>
<div class="text-sm text-blue-300 mt-1">2025年预期</div>
</div>
<div class="glass-effect rounded-xl p-6 card-hover">
<div class="text-3xl font-bold number-animate">1300<span class="text-xl">万亿</span></div>
<div class="text-blue-200 mt-2">月均Token处理量</div>
<div class="text-sm text-blue-300 mt-1">环比增长30%</div>
</div>
<div class="glass-effect rounded-xl p-6 card-hover">
<div class="text-3xl font-bold number-animate">23.7<span class="text-xl">%</span></div>
<div class="text-blue-200 mt-2">云业务利润率</div>
<div class="text-sm text-blue-300 mt-1">Q3 2025</div>
</div>
<div class="glass-effect rounded-xl p-6 card-hover">
<div class="text-3xl font-bold number-animate">1550<span class="text-xl">亿美元</span></div>
<div class="text-blue-200 mt-2">云积压订单</div>
<div class="text-sm text-blue-300 mt-1">环比增长46.2%</div>
</div>
</div>
</div>
</section>
<!-- Key Timeline -->
<section class="py-16 px-4 bg-white">
<div class="max-w-7xl mx-auto">
<h2 class="text-3xl font-bold text-gray-800 mb-8 text-center">
<i class="fas fa-clock text-purple-600 mr-3"></i>关键时间轴
</h2>
<div class="grid md:grid-cols-2 lg:grid-cols-3 gap-8">
<div class="timeline-item">
<div class="text-sm text-purple-600 font-semibold mb-2">2024年2-3月</div>
<div class="text-lg font-semibold text-gray-800 mb-2">AI Overview大规模推广</div>
<div class="text-gray-600 text-sm">Token消耗量达480万亿/月</div>
</div>
<div class="timeline-item">
<div class="text-sm text-purple-600 font-semibold mb-2">2024年5月</div>
<div class="text-lg font-semibold text-gray-800 mb-2">Gemini 2.5 Pro发布</div>
<div class="text-gray-600 text-sm">AI Mode上线月活破1亿</div>
</div>
<div class="timeline-item">
<div class="text-sm text-purple-600 font-semibold mb-2">2024年8月</div>
<div class="text-lg font-semibold text-gray-800 mb-2">Pixel 9搭载Gemini Nano</div>
<div class="text-gray-600 text-sm">Gemini Live对标Apple Intelligence</div>
</div>
<div class="timeline-item">
<div class="text-sm text-purple-600 font-semibold mb-2">2024年9月</div>
<div class="text-lg font-semibold text-gray-800 mb-2">反垄断判决超预期</div>
<div class="text-gray-600 text-sm">保留Chrome消除不确定性</div>
</div>
<div class="timeline-item">
<div class="text-sm text-purple-600 font-semibold mb-2">2024年10月</div>
<div class="text-lg font-semibold text-gray-800 mb-2">Q3财报验证AI正循环</div>
<div class="text-gray-600 text-sm">搜索收入增速创2-3年新高</div>
</div>
<div class="timeline-item">
<div class="text-sm text-purple-600 font-semibold mb-2">2024年11月</div>
<div class="text-lg font-semibold text-gray-800 mb-2">TPU外供重大突破</div>
<div class="text-gray-600 text-sm">OpenAI/META成为客户</div>
</div>
</div>
</div>
</section>
<!-- Core Logic Section -->
<section class="py-16 px-4 bg-gray-100">
<div class="max-w-7xl mx-auto">
<h2 class="text-3xl font-bold text-gray-800 mb-12 text-center">
<i class="fas fa-brain text-purple-600 mr-3"></i>核心逻辑分析
</h2>
<div class="grid md:grid-cols-3 gap-8 mb-12">
<div class="bg-white rounded-2xl p-8 card-hover shadow-lg">
<div class="w-14 h-14 bg-gradient-to-br from-blue-500 to-purple-600 rounded-full flex items-center justify-center mb-6">
<i class="fas fa-microchip text-white text-2xl"></i>
</div>
<h3 class="text-xl font-bold text-gray-800 mb-4">算力自主化</h3>
<p class="text-gray-600 leading-relaxed">
自研TPU芯片性能对标英伟达B200凭借功耗和成本优势云业务利润率从11%提升至23.7%单季度利润率提升超12个百分点
</p>
<div class="mt-6 flex items-center text-purple-600 font-semibold">
<span>450万等效H100</span>
<i class="fas fa-arrow-trend-up ml-2"></i>
</div>
</div>
<div class="bg-white rounded-2xl p-8 card-hover shadow-lg">
<div class="w-14 h-14 bg-gradient-to-br from-green-500 to-teal-600 rounded-full flex items-center justify-center mb-6">
<i class="fas fa-robot text-white text-2xl"></i>
</div>
<h3 class="text-xl font-bold text-gray-800 mb-4">模型代际领先</h3>
<p class="text-gray-600 leading-relaxed">
Gemini 2.5 Pro在LMArena测评中ELO分数达1448分Veo 3、Imagen 4、Genie模型在多模态领域实现突破性进展
</p>
<div class="mt-6 flex items-center text-green-600 font-semibold">
<span>多模态原生能力</span>
<i class="fas fa-trophy ml-2"></i>
</div>
</div>
<div class="bg-white rounded-2xl p-8 card-hover shadow-lg">
<div class="w-14 h-14 bg-gradient-to-br from-orange-500 to-red-600 rounded-full flex items-center justify-center mb-6">
<i class="fas fa-chart-line text-white text-2xl"></i>
</div>
<h3 class="text-xl font-bold text-gray-800 mb-4">流量护城河转化</h3>
<p class="text-gray-600 leading-relaxed">
AI Overview覆盖15-20亿月活AI Mode Token消耗是传统模式的2-3倍重构搜索商业模式提升广告ROI
</p>
<div class="mt-6 flex items-center text-orange-600 font-semibold">
<span>20亿月活用户</span>
<i class="fas fa-users ml-2"></i>
</div>
</div>
</div>
<!-- Market Sentiment -->
<div class="bg-gradient-to-r from-purple-50 to-blue-50 rounded-2xl p-8">
<h3 class="text-2xl font-bold text-gray-800 mb-6">
<i class="fas fa-chart-pie text-purple-600 mr-3"></i>市场预期差
</h3>
<div class="grid md:grid-cols-2 gap-8">
<div>
<h4 class="font-semibold text-gray-700 mb-4">当前市场认知</h4>
<ul class="space-y-3">
<li class="flex items-start">
<span class="text-red-500 mr-2"><i class="fas fa-times-circle"></i></span>
<span class="text-gray-600">估值便宜但增长乏力PE 18倍</span>
</li>
<li class="flex items-start">
<span class="text-red-500 mr-2"><i class="fas fa-times-circle"></i></span>
<span class="text-gray-600">担忧AI搜索冲击广告收入</span>
</li>
<li class="flex items-start">
<span class="text-red-500 mr-2"><i class="fas fa-times-circle"></i></span>
<span class="text-gray-600">机构低配,情绪偏谨慎</span>
</li>
</ul>
</div>
<div>
<h4 class="font-semibold text-gray-700 mb-4">产业实际进展</h4>
<ul class="space-y-3">
<li class="flex items-start">
<span class="text-green-500 mr-2"><i class="fas fa-check-circle"></i></span>
<span class="text-gray-600">产业链订单上修30-50%</span>
</li>
<li class="flex items-start">
<span class="text-green-500 mr-2"><i class="fas fa-check-circle"></i></span>
<span class="text-gray-600">TPU外供打开第二增长曲线</span>
</li>
<li class="flex items-start">
<span class="text-green-500 mr-2"><i class="fas fa-check-circle"></i></span>
<span class="text-gray-600">进入"业绩饥渴"状态</span>
</li>
</ul>
</div>
</div>
</div>
</div>
</section>
<!-- Stock Chain Table -->
<section class="py-16 px-4 bg-white">
<div class="max-w-7xl mx-auto">
<h2 class="text-3xl font-bold text-gray-800 mb-8 text-center">
<i class="fas fa-network-wired text-purple-600 mr-3"></i>谷歌产业链核心标的
</h2>
<div class="mb-8 flex flex-wrap gap-4 justify-center">
<button onclick="filterCategory('all')" class="px-6 py-2 bg-purple-600 text-white rounded-full hover:bg-purple-700 transition">
全部
</button>
<button onclick="filterCategory('光模块')" class="px-6 py-2 bg-gray-200 text-gray-700 rounded-full hover:bg-gray-300 transition">
光模块
</button>
<button onclick="filterCategory('PCB')" class="px-6 py-2 bg-gray-200 text-gray-700 rounded-full hover:bg-gray-300 transition">
PCB
</button>
<button onclick="filterCategory('OCS')" class="px-6 py-2 bg-gray-200 text-gray-700 rounded-full hover:bg-gray-300 transition">
OCS
</button>
<button onclick="filterCategory('液冷散热')" class="px-6 py-2 bg-gray-200 text-gray-700 rounded-full hover:bg-gray-300 transition">
液冷散热
</button>
</div>
<div class="overflow-x-auto">
<table class="w-full border-collapse" id="stockTable">
<thead>
<tr class="bg-gradient-to-r from-purple-600 to-blue-600 text-white">
<th class="p-4 text-left font-semibold">分类</th>
<th class="p-4 text-left font-semibold">个股</th>
<th class="p-4 text-left font-semibold">相关性描述</th>
<th class="p-4 text-left font-semibold">消息来源</th>
<th class="p-4 text-center font-semibold">投资评级</th>
</tr>
</thead>
<tbody id="stockTableBody">
<!-- Table content will be dynamically generated -->
</tbody>
</table>
</div>
</div>
</section>
<!-- Risk Analysis -->
<section class="py-16 px-4 bg-gradient-to-br from-red-50 to-orange-50">
<div class="max-w-7xl mx-auto">
<h2 class="text-3xl font-bold text-gray-800 mb-12 text-center">
<i class="fas fa-exclamation-triangle text-red-600 mr-3"></i>风险提示
</h2>
<div class="grid md:grid-cols-3 gap-8">
<div class="bg-white rounded-xl p-6 border-l-4 border-red-500">
<h3 class="text-xl font-bold text-gray-800 mb-4">
<i class="fas fa-microchip text-red-500 mr-2"></i>技术风险
</h3>
<ul class="space-y-2 text-gray-600">
<li>• AI Mode幻觉率达15-20%</li>
<li>• Agent识别第三方应用仅30%</li>
<li>• Agent to Agent协议推进缓慢</li>
</ul>
</div>
<div class="bg-white rounded-xl p-6 border-l-4 border-orange-500">
<h3 class="text-xl font-bold text-gray-800 mb-4">
<i class="fas fa-dollar-sign text-orange-500 mr-2"></i>商业化风险
</h3>
<ul class="space-y-2 text-gray-600">
<li>• AI Ultra月费245美元过高</li>
<li>• 广告展示次数或降30-40%</li>
<li>• Gemini Advanced仅3000万用户</li>
</ul>
</div>
<div class="bg-white rounded-xl p-6 border-l-4 border-yellow-500">
<h3 class="text-xl font-bold text-gray-800 mb-4">
<i class="fas fa-gavel text-yellow-600 mr-2"></i>政策风险
</h3>
<ul class="space-y-2 text-gray-600">
<li>• 美国司法部终极裁决未定</li>
<li>• 欧盟数字税反制风险</li>
<li>• 广告业务拆分风险犹存</li>
</ul>
</div>
</div>
</div>
</section>
<!-- Investment Advice -->
<section class="py-16 px-4 gradient-bg text-white">
<div class="max-w-7xl mx-auto">
<h2 class="text-3xl font-bold mb-12 text-center glow-text">
<i class="fas fa-lightbulb mr-3"></i>投资建议
</h2>
<div class="grid md:grid-cols-2 gap-8">
<div class="glass-effect rounded-2xl p-8">
<h3 class="text-2xl font-bold mb-6">谷歌本体 (GOOGL)</h3>
<div class="mb-6">
<div class="text-4xl font-bold mb-2">增持评级</div>
<div class="text-blue-200">目标价:$233-250</div>
</div>
<ul class="space-y-3 text-blue-100">
<li class="flex items-start">
<i class="fas fa-check-circle mr-3 mt-1"></i>
<span>当前18倍PE未反映TPU外供价值</span>
</li>
<li class="flex items-start">
<i class="fas fa-check-circle mr-3 mt-1"></i>
<span>监管出清后估值向25倍PE修复</span>
</li>
<li class="flex items-start">
<i class="fas fa-check-circle mr-3 mt-1"></i>
<span>AI订阅带来第二增长曲线</span>
</li>
</ul>
</div>
<div class="glass-effect rounded-2xl p-8">
<h3 class="text-2xl font-bold mb-6">A股产业链配置</h3>
<div class="mb-6">
<div class="text-4xl font-bold mb-2">重点配置</div>
<div class="text-blue-200">硬件链业绩确定性最强</div>
</div>
<div class="space-y-4">
<div class="flex items-center justify-between bg-white/10 rounded-lg p-3">
<span>光库科技</span>
<span class="text-green-300 font-semibold">第一优先级</span>
</div>
<div class="flex items-center justify-between bg-white/10 rounded-lg p-3">
<span>中际旭创</span>
<span class="text-green-300 font-semibold">第二优先级</span>
</div>
<div class="flex items-center justify-between bg-white/10 rounded-lg p-3">
<span>沪电股份</span>
<span class="text-green-300 font-semibold">第三优先级</span>
</div>
</div>
</div>
</div>
<div class="mt-12 text-center">
<div class="inline-flex items-center bg-white/20 rounded-full px-8 py-4">
<i class="fas fa-chart-line text-3xl mr-4 pulse-dot"></i>
<div class="text-left">
<div class="text-sm text-blue-200">关键跟踪指标</div>
<div class="text-xl font-bold">Q4云业务利润率 & Token环比增速</div>
</div>
</div>
</div>
</div>
</section>
<!-- Footer -->
<footer class="bg-gray-900 text-white py-8 px-4">
<div class="max-w-7xl mx-auto text-center">
<p class="text-gray-400">© 2024 谷歌AI产业链投资分析 | 数据来源:公开研报、路演纪要、产业链调研</p>
<p class="text-gray-500 text-sm mt-2">风险提示:投资有风险,入市需谨慎</p>
</div>
</footer>
<script>
// Stock data processing
const stockData = [
{category: '光模块', name: '中际旭创', desc: '供货谷歌800G光模块份额A股第一2025年谷歌光模块采购量约350万只中际旭创占其采购份额的70%', source: '网传纪要', rating: '强烈推荐'},
{category: '光模块', name: '新易盛', desc: '供货谷歌800G光模块份额A股第二2025年首次切入谷歌800G供应链', source: '网传纪要', rating: '推荐'},
{category: '光模块', name: '长芯盛创', desc: '800G硅光模块已通过谷歌多轮验证计划2025年第三季度量产预计年出货量超50万只', source: '网传纪要', rating: '推荐'},
{category: 'PCB', name: '沪电股份', desc: '供货谷歌PCB份额A股第一谷歌TPU PCB的核心供应商在谷歌TPU供应商中占比约30%', source: '网传纪要', rating: '强烈推荐'},
{category: 'PCB', name: '胜宏科技', desc: '谷歌V7大份额一供', source: '机构研报', rating: '推荐'},
{category: 'OCS', name: '腾景科技', desc: '谷歌OCS交换机的核心光学器件供应商,业务收入占比已达28%', source: '公开资料', rating: '推荐'},
{category: 'OCS', name: '光库科技', desc: '2025年6月份并购的武汉捷普工厂是过去谷歌OCS交换机方案的独家代工厂商', source: '网传纪要', rating: '强烈推荐'},
{category: '液冷散热', name: '英维克', desc: '公司推出基于谷歌Descartes 5 CDU规格的CDU产品同时展示26MW全链路液冷案例', source: '公开资料', rating: '推荐'}
];
// Populate table
function populateTable(data) {
const tbody = document.getElementById('stockTableBody');
tbody.innerHTML = '';
data.forEach((stock, index) => {
const row = document.createElement('tr');
row.className = 'border-b hover:bg-gray-50 transition-colors';
row.innerHTML = `
<td class="p-4">
<span class="inline-block px-3 py-1 bg-purple-100 text-purple-700 rounded-full text-sm font-medium">
${stock.category}
</span>
</td>
<td class="p-4 font-semibold text-gray-800">${stock.name}</td>
<td class="p-4 text-gray-600 max-w-md">${stock.desc}</td>
<td class="p-4 text-gray-500 text-sm">${stock.source}</td>
<td class="p-4 text-center">
<span class="inline-block px-3 py-1 ${
stock.rating === '强烈推荐' ? 'bg-green-100 text-green-700' : 'bg-blue-100 text-blue-700'
} rounded-full text-sm font-medium">
${stock.rating}
</span>
</td>
`;
tbody.appendChild(row);
});
}
// Filter category
function filterCategory(category) {
const buttons = document.querySelectorAll('button');
buttons.forEach(btn => {
if (btn.textContent === '全部' && category === 'all' ||
btn.textContent === category) {
btn.className = 'px-6 py-2 bg-purple-600 text-white rounded-full hover:bg-purple-700 transition';
} else if (btn.textContent !== '全部') {
btn.className = 'px-6 py-2 bg-gray-200 text-gray-700 rounded-full hover:bg-gray-300 transition';
}
});
const filtered = category === 'all' ? stockData : stockData.filter(s => s.category === category);
populateTable(filtered);
}
// Initialize
document.addEventListener('DOMContentLoaded', function() {
populateTable(stockData);
// Add smooth scroll
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
anchor.addEventListener('click', function (e) {
e.preventDefault();
document.querySelector(this.getAttribute('href')).scrollIntoView({
behavior: 'smooth'
});
});
});
// Animate numbers on scroll
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.classList.add('number-animate');
}
});
});
document.querySelectorAll('.number-animate').forEach(el => {
observer.observe(el);
});
});
</script>
</body>
</html>
这个HTML页面完整展示了谷歌AI转型的投资分析包含以下核心特性
## 🎯 核心亮点
1. **动态数据可视化**Hero区域展示关键数据指标带动画效果
2. **时间轴展示**清晰呈现谷歌AI发展的关键节点
3. **产业链分析**:交互式表格展示核心标的,支持分类筛选
4. **风险提示矩阵**:三维度风险分析(技术、商业化、政策)
5. **投资建议卡片**:玻璃拟态设计展示具体配置建议
## 💫 设计特色
- **渐变色彩系统**:紫色到蓝色的科技感渐变
- **卡片悬浮效果**鼠标悬停时的3D浮起动画
- **脉冲动画**:重要指标的呼吸灯效果
- **响应式布局**:完美适配移动端和桌面端
- **微交互设计**:按钮点击、表格筛选等细节动画
## 📊 数据展示
- 完整保留了insight中的核心数据和逻辑
- 股票产业链表格支持动态筛选
- 关键数据突出显示450万算力、1300万亿Token等
- 风险和投资建议分层展示
这个页面不仅是一个信息展示工具更是一个专业的投资决策辅助界面通过视觉化设计帮助投资者快速把握谷歌AI产业链的投资机会。

View File

@@ -0,0 +1,648 @@
# 谷歌概念深度解析:技术霸权与算力革命
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>谷歌概念AI技术霸权与算力革命</title>
<script src="https://cdn.tailwindcss.com"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<style>
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&display=swap');
* {
font-family: 'Inter', sans-serif;
}
.gradient-text {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.glass-effect {
background: rgba(255, 255, 255, 0.1);
backdrop-filter: blur(10px);
border: 1px solid rgba(255, 255, 255, 0.2);
}
.hover-lift {
transition: all 0.3s ease;
}
.hover-lift:hover {
transform: translateY(-5px);
box-shadow: 0 20px 40px rgba(0, 0, 0, 0.1);
}
.timeline-dot {
position: relative;
}
.timeline-dot::after {
content: '';
position: absolute;
width: 2px;
height: 100%;
background: linear-gradient(180deg, #667eea 0%, #764ba2 100%);
top: 100%;
left: 50%;
transform: translateX(-50%);
}
.timeline-dot:last-child::after {
display: none;
}
.pulse-animation {
animation: pulse 2s infinite;
}
@keyframes pulse {
0% {
box-shadow: 0 0 0 0 rgba(102, 126, 234, 0.7);
}
70% {
box-shadow: 0 0 0 10px rgba(102, 126, 234, 0);
}
100% {
box-shadow: 0 0 0 0 rgba(102, 126, 234, 0);
}
}
.scroll-smooth {
scroll-behavior: smooth;
}
.table-scroll {
overflow-x: auto;
}
.table-scroll::-webkit-scrollbar {
height: 8px;
}
.table-scroll::-webkit-scrollbar-track {
background: #f1f1f1;
}
.table-scroll::-webkit-scrollbar-thumb {
background: #888;
border-radius: 4px;
}
.badge-glow {
animation: glow 2s ease-in-out infinite alternate;
}
@keyframes glow {
from {
box-shadow: 0 0 5px #667eea;
}
to {
box-shadow: 0 0 20px #667eea, 0 0 30px #667eea;
}
}
</style>
</head>
<body class="bg-gray-50 scroll-smooth">
<!-- Hero Section -->
<section class="relative bg-gradient-to-br from-purple-900 via-blue-900 to-indigo-900 text-white overflow-hidden">
<div class="absolute inset-0 bg-black opacity-40"></div>
<div class="relative max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-24">
<div class="text-center">
<div class="inline-flex items-center justify-center w-20 h-20 bg-gradient-to-r from-purple-500 to-pink-500 rounded-full mb-6 pulse-animation">
<i class="fab fa-google text-3xl"></i>
</div>
<h1 class="text-5xl md:text-7xl font-bold mb-6">
<span class="gradient-text bg-gradient-to-r from-yellow-400 via-red-500 to-pink-500 text-transparent bg-clip-text">
谷歌概念
</span>
</h1>
<p class="text-xl md:text-2xl mb-8 text-gray-200">
AI技术霸权 × 算力基建革命 × Token经济范式
</p>
<div class="flex flex-wrap justify-center gap-4">
<span class="px-4 py-2 bg-green-500 bg-opacity-20 border border-green-400 rounded-full text-sm">
<i class="fas fa-rocket mr-2"></i>Gemini 3 Pro 登顶
</span>
<span class="px-4 py-2 bg-blue-500 bg-opacity-20 border border-blue-400 rounded-full text-sm">
<i class="fas fa-microchip mr-2"></i>930亿美金 CAPEX
</span>
<span class="px-4 py-2 bg-purple-500 bg-opacity-20 border border-purple-400 rounded-full text-sm">
<i class="fas fa-bolt mr-2"></i>480万亿 Token/月
</span>
</div>
</div>
</div>
<div class="absolute bottom-0 left-0 right-0">
<svg class="w-full h-20" viewBox="0 0 1440 120" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0 120L60 110C120 100 240 80 360 70C480 60 600 60 720 65C840 70 960 80 1080 85C1200 90 1320 90 1380 90L1440 90V120H1380C1320 120 1200 120 1080 120C960 120 840 120 720 120C600 120 480 120 360 120C240 120 120 120 60 120H0V120Z" fill="#F9FAFB"/>
</svg>
</div>
</section>
<!-- 核心数据指标 -->
<section class="py-12 bg-white">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<h2 class="text-3xl font-bold text-center mb-8 text-gray-800">核心数据指标</h2>
<div class="grid grid-cols-2 md:grid-cols-4 gap-6">
<div class="text-center p-6 bg-gradient-to-br from-purple-50 to-pink-50 rounded-xl hover-lift">
<div class="text-4xl font-bold text-purple-600 mb-2">1501</div>
<div class="text-gray-600">LMArena 评分</div>
</div>
<div class="text-center p-6 bg-gradient-to-br from-blue-50 to-indigo-50 rounded-xl hover-lift">
<div class="text-4xl font-bold text-blue-600 mb-2">930亿</div>
<div class="text-gray-600">2025 CAPEX</div>
</div>
<div class="text-center p-6 bg-gradient-to-br from-green-50 to-emerald-50 rounded-xl hover-lift">
<div class="text-4xl font-bold text-green-600 mb-2">480万亿</div>
<div class="text-gray-600">月Token消耗</div>
</div>
<div class="text-center p-6 bg-gradient-to-br from-yellow-50 to-orange-50 rounded-xl hover-l">
<div class="text-4xl font-bold text-yellow-600 mb-2">15亿</div>
<div class="text-gray-600">AI搜索月活</div>
</div>
</div>
</div>
</section>
<!-- 事件时间轴 -->
<section class="py-16 bg-gray-50">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<h2 class="text-3xl font-bold text-center mb-12 text-gray-800">概念事件时间轴</h2>
<div class="relative">
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
<div class="timeline-dot">
<div class="bg-white p-6 rounded-xl shadow-lg hover-lift">
<div class="flex items-center mb-4">
<span class="px-3 py-1 bg-purple-100 text-purple-700 rounded-full text-sm font-semibold">2024年2月</span>
</div>
<h3 class="text-lg font-bold mb-2">产品发布</h3>
<p class="text-gray-600">推出ImageFX图像工具、Bard文生图功能基于Imagen 2模型</p>
</div>
</div>
<div class="timeline-dot">
<div class="bg-white p-6 rounded-xl shadow-lg hover-lift">
<div class="flex items-center mb-4">
<span class="px-3 py-1 bg-blue-100 text-blue-700 rounded-full text-sm font-semibold">2024年4月</span>
</div>
<h3 class="text-lg font-bold mb-2">战略发布</h3>
<p class="text-gray-600">Cloud Next大会发布Axion Arm CPU、TPU v5p</p>
</div>
</div>
<div class="timeline-dot">
<div class="bg-white p-6 rounded-xl shadow-lg hover-lift">
<div class="flex items-center mb-4">
<span class="px-3 py-1 bg-green-100 text-green-700 rounded-full text-sm font-semibold">2024年8月</span>
</div>
<h3 class="text-lg font-bold mb-2">产品发布</h3>
<p class="text-gray-600">Pixel 9系列Gemini Live语音助手端侧AI商业化</p>
</div>
</div>
<div class="timeline-dot">
<div class="bg-white p-6 rounded-xl shadow-lg hover-lift">
<div class="flex items-center mb-4">
<span class="px-3 py-1 bg-red-100 text-red-700 rounded-full text-sm font-semibold">2024年11月</span>
</div>
<h3 class="text-lg font-bold mb-2 badge-glow">技术突破</h3>
<p class="text-gray-600">Gemini 3 Pro登顶LMArena 1501分Nano Banana 2发布</p>
</div>
</div>
<div class="timeline-dot">
<div class="bg-white p-6 rounded-xl shadow-lg hover-lift">
<div class="flex items-center mb-4">
<span class="px-3 py-1 bg-yellow-100 text-yellow-700 rounded-full text-sm font-semibold">2025年1月</span>
</div>
<h3 class="text-lg font-bold mb-2">业绩验证</h3>
<p class="text-gray-600">Q1营收902亿美元资本开支172亿美元</p>
</div>
</div>
<div class="timeline-dot">
<div class="bg-white p-6 rounded-xl shadow-lg hover-lift">
<div class="flex items-center mb-4">
<span class="px-3 py-1 bg-indigo-100 text-indigo-700 rounded-full text-sm font-semibold">2025年10月</span>
</div>
<h3 class="text-lg font-bold mb-2">资本扩张</h3>
<p class="text-gray-600">CAPEX指引上调至910-930亿美元</p>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- 核心逻辑 -->
<section class="py-16 bg-white">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<h2 class="text-3xl font-bold text-center mb-12 text-gray-800">核心逻辑</h2>
<div class="grid grid-cols-1 md:grid-cols-3 gap-8">
<div class="bg-gradient-to-br from-purple-600 to-purple-800 text-white p-8 rounded-2xl">
<div class="text-4xl mb-4">👑</div>
<h3 class="text-2xl font-bold mb-4">技术霸权确立</h3>
<ul class="space-y-2">
<li class="flex items-start">
<i class="fas fa-check-circle mt-1 mr-2 text-green-300"></i>
<span>Gemini 3 Pro LMArena 1501分历史最高</span>
</li>
<li class="flex items-start">
<i class="fas fa-check-circle mt-1 mr-2 text-green-300"></i>
<span>Nano Banana 2图像生成顶尖</span>
</li>
<li class="flex items-start">
<i class="fas fa-check-circle mt-1 mr-2 text-green-300"></i>
<span>TPU v7算力4610 TOPS持平H100</span>
</li>
</ul>
</div>
<div class="bg-gradient-to-br from-blue-600 to-blue-800 text-white p-8 rounded-2xl">
<div class="text-4xl mb-4">💰</div>
<h3 class="text-2xl font-bold mb-4">资本开支暴力扩张</h3>
<ul class="space-y-2">
<li class="flex items-start">
<i class="fas fa-check-circle mt-1 mr-2 text-green-300"></i>
<span>2025 CAPEX 910-930亿美元</span>
</li>
<li class="flex items-start">
<i class="fas fa-check-circle mt-1 mr-2 text-green-300"></i>
<span>TPU电源单卡价值量1000+元</span>
</li>
<li class="flex items-start">
<i class="fas fa-check-circle mt-1 mr-2 text-green-300"></i>
<span>2026年500万颗对应50亿市场</span>
</li>
</ul>
</div>
<div class="bg-gradient-to-br from-green-600 to-green-800 text-white p-8 rounded-2xl">
<div class="text-4xl mb-4">🚀</div>
<h3 class="text-2xl font-bold mb-4">商业化闭环验证</h3>
<ul class="space-y-2">
<li class="flex items-start">
<i class="fas fa-check-circle mt-1 mr-2 text-green-300"></i>
<span>月Token消耗480万亿</span>
</li>
<li class="flex items-start">
<i class="fas fa-check-circle mt-1 mr-2 text-green-300"></i>
<span>Q3搜索增速创15%新高</span>
</li>
<li class="flex items-start">
<i class="fas fa-check-circle mt-1 mr-2 text-green-300"></i>
<span>云业务积压订单1550亿美元</span>
</li>
</ul>
</div>
</div>
</div>
</section>
<!-- 产业链图谱 -->
<section class="py-16 bg-gray-50">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<h2 class="text-3xl font-bold text-center mb-12 text-gray-800">产业链图谱</h2>
<div class="grid grid-cols-1 lg:grid-cols-2 gap-8">
<div class="bg-white p-8 rounded-xl shadow-lg">
<h3 class="text-xl font-bold mb-6 text-purple-600">上游(芯片/元器件)</h3>
<div class="space-y-3">
<div class="flex items-center p-3 bg-purple-50 rounded-lg">
<i class="fas fa-microchip text-purple-600 text-xl mr-3"></i>
<span>TPU芯片谷歌自研</span>
</div>
<div class="flex items-center p-3 bg-purple-50 rounded-lg">
<i class="fas fa-bolt text-purple-600 text-xl mr-3"></i>
<span>电源模块(新雷能、中富电路)</span>
</div>
<div class="flex items-center p-3 bg-purple-50 rounded-lg">
<i class="fas fa-network-wired text-purple-600 text-xl mr-3"></i>
<span>光器件(赛微电子、腾景科技)</span>
</div>
<div class="flex items-center p-3 bg-purple-50 rounded-lg">
<i class="fas fa-wind text-purple-600 text-xl mr-3"></i>
<span>液冷散热(英维克、博杰股份)</span>
</div>
</div>
</div>
<div class="bg-white p-8 rounded-xl shadow-lg">
<h3 class="text-xl font-bold mb-6 text-blue-600">下游(应用/服务)</h3>
<div class="space-y-3">
<div class="flex items-center p-3 bg-blue-50 rounded-lg">
<i class="fas fa-search text-blue-600 text-xl mr-3"></i>
<span>AI搜索15亿月活</span>
</div>
<div class="flex items-center p-3 bg-blue-50 rounded-lg">
<i class="fas fa-cloud text-blue-600 text-xl mr-3"></i>
<span>云计算GCP+Gemini API</span>
</div>
<div class="flex items-center p-3 bg-blue-50 rounded-lg">
<i class="fas fa-ad text-blue-600 text-xl mr-3"></i>
<span>AI营销易点天下、蓝色光标</span>
</div>
<div class="flex items-center p-3 bg-blue-50 rounded-lg">
<i class="fas fa-paint-brush text-blue-600 text-xl mr-3"></i>
<span>内容创作(万兴科技、视觉中国)</span>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- 股票池表格 -->
<section class="py-16 bg-white">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<h2 class="text-3xl font-bold text-center mb-12 text-gray-800">谷歌概念核心股票池</h2>
<div class="table-scroll">
<table class="w-full bg-white rounded-xl shadow-lg overflow-hidden">
<thead class="bg-gradient-to-r from-purple-600 to-blue-600 text-white">
<tr>
<th class="px-6 py-4 text-left">股票代码</th>
<th class="px-6 py-4 text-left">股票名称</th>
<th class="px-6 py-4 text-left">分类</th>
<th class="px-6 py-4 text-left">关联项目</th>
<th class="px-6 py-4 text-left">合作原因</th>
</tr>
</thead>
<tbody>
<tr class="border-b hover:bg-gray-50 transition-colors">
<td class="px-6 py-4 font-semibold">300058.SZ</td>
<td class="px-6 py-4">
<div class="flex items-center">
<span class="mr-2">蓝色光标</span>
<span class="px-2 py-1 bg-purple-100 text-purple-700 rounded-full text-xs">核心</span>
</div>
</td>
<td class="px-6 py-4">AI营销</td>
<td class="px-6 py-4">谷歌合作伙伴</td>
<td class="px-6 py-4">通过运用谷歌营销产品实现出海价值</td>
</tr>
<tr class="border-b hover:bg-gray-50 transition-colors">
<td class="px-6 py-4 font-semibold">301171.SZ</td>
<td class="px-6 py-4">
<div class="flex items-center">
<span class="mr-2">易点天下</span>
<span class="px-2 py-1 bg-green-100 text-green-700 rounded-full text-xs">高弹性</span>
</div>
</td>
<td class="px-6 py-4">AI营销</td>
<td class="px-6 py-4">Google一级代理</td>
<td class="px-6 py-4">Google广告在国内的一级代理提供H5广告变现方案</td>
</tr>
<tr class="border-b hover:bg-gray-50 transition-colors">
<td class="px-6 py-4 font-semibold">300624.SZ</td>
<td class="px-6 py-4">
<div class="flex items-center">
<span class="mr-2">万兴科技</span>
<span class="px-2 py-1 bg-blue-100 text-blue-700 rounded-full text-xs">应用</span>
</div>
</td>
<td class="px-6 py-4">AI应用</td>
<td class="px-6 py-4">接入谷歌Gemini</td>
<td class="px-6 py-4">已接入谷歌Gemini、Veo3、Nano banana等模型</td>
</tr>
<tr class="border-b hover:bg-gray-50 transition-colors">
<td class="px-6 py-4 font-semibold">300456.SZ</td>
<td class="px-6 py-4">
<div class="flex items-center">
<span class="mr-2">赛微电子</span>
<span class="px-2 py-1 bg-purple-100 text-purple-700 rounded-full text-xs">核心</span>
</div>
</td>
<td class="px-6 py-4">OCS</td>
<td class="px-6 py-4">MEMS-OCS量产</td>
<td class="px-6 py-4">2023年并表后获谷歌批量采购订单</td>
</tr>
<tr class="border-b hover:bg-gray-50 transition-colors">
<td class="px-6 py-4 font-semibold">300308.SZ</td>
<td class="px-6 py-4">
<div class="flex items-center">
<span class="mr-2">中际旭创</span>
<span class="px-2 py-1 bg-green-100 text-green-700 rounded-full text-xs">龙头</span>
</div>
</td>
<td class="px-6 py-4">光模块</td>
<td class="px-6 py-4">800G光模块</td>
<td class="px-6 py-4">2025年谷歌光模块采购量350万只占70%份额</td>
</tr>
<tr class="border-b hover:bg-gray-50 transition-colors">
<td class="px-6 py-4 font-semibold">002463.SZ</td>
<td class="px-6 py-4">
<div class="flex items-center">
<span class="mr-2">沪电股份</span>
<span class="px-2 py-1 bg-blue-100 text-blue-700 rounded-full text-xs">PCB</span>
</div>
</td>
<td class="px-6 py-4">PCB</td>
<td class="px-6 py-4">TPU PCB核心供应商</td>
<td class="px-6 py-4">谷歌TPU PCB核心供应商占TPU供应链约30%份额</td>
</tr>
<tr class="border-b hover:bg-gray-50 transition-colors">
<td class="px-6 py-4 font-semibold">301183.SZ</td>
<td class="px-6 py-4">
<div class="flex items-center">
<span class="mr-2">东田微</span>
<span class="px-2 py-1 bg-purple-100 text-purple-700 rounded-full text-xs">核心</span>
</div>
</td>
<td class="px-6 py-4">OCS</td>
<td class="px-6 py-4">OCS光学方案</td>
<td class="px-6 py-4">为谷歌OCS光学引擎提供核心光学元件解决方案</td>
</tr>
<tr class="border-b hover:bg-gray-50 transition-colors">
<td class="px-6 py-4 font-semibold">300676.SZ</td>
<td class="px-6 py-4">
<div class="flex items-center">
<span class="mr-2">华大九天</span>
<span class="px-2 py-1 bg-blue-100 text-blue-700 rounded-full text-xs">EDA</span>
</div>
</td>
<td class="px-6 py-4">芯片设计</td>
<td class="px-6 py-4">EDA工具支持</td>
<td class="px-6 py-4">为谷歌TPU芯片设计提供EDA工具链支持</td>
</tr>
<tr class="border-b hover:bg-gray-50 transition-colors">
<td class="px-6 py-4 font-semibold">603803.SH</td>
<td class="px-6 py-4">
<div class="flex items-center">
<span class="mr-2">瑞松科技</span>
<span class="px-2 py-1 bg-green-100 text-green-700 rounded-full text-xs">精密制造</span>
</div>
</td>
<td class="px-6 py-4">精密制造</td>
<td class="px-6 py-4">AI服务器制造</td>
<td class="px-6 py-4">参与谷歌AI服务器精密结构件制造</td>
</tr>
<tr class="border-b hover:bg-gray-50 transition-colors">
<td class="px-6 py-4 font-semibold">301387.SZ</td>
<td class="px-6 py-4">
<div class="flex items-center">
<span class="mr-2">新雷能</span>
<span class="px-2 py-1 bg-purple-100 text-purple-700 rounded-full text-xs">电源</span>
</div>
</td>
<td class="px-6 py-4">电源</td>
<td class="px-6 py-4">TPU电源模块</td>
<td class="px-6 py-4">为谷歌TPU提供二次和三次电源模块单瓦价格比台系低20%</td>
</tr>
</tbody>
</table>
</div>
</div>
</section>
<!-- 投资建议 -->
<section class="py-16 bg-gradient-to-br from-purple-50 to-blue-50">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<h2 class="text-3xl font-bold text-center mb-12 text-gray-800">投资建议与策略</h2>
<div class="grid grid-cols-1 md:grid-cols-2 gap-8">
<div class="bg-white p-8 rounded-xl shadow-lg">
<h3 class="text-2xl font-bold mb-6 text-green-600">最具投资价值方向</h3>
<div class="space-y-4">
<div class="flex items-start">
<span class="flex-shrink-0 w-8 h-8 bg-green-100 text-green-600 rounded-full flex items-center justify-center font-bold mr-3">1</span>
<div>
<h4 class="font-semibold mb-1">TPU电源产业链最高优先级</h4>
<p class="text-gray-600 text-sm">电源是TPU扩产最大瓶颈26年50亿市场新雷能15亿收入弹性</p>
</div>
</div>
<div class="flex items-start">
<span class="flex-shrink-0 w-8 h-8 bg-green-100 text-green-600 rounded-full flex items-center justify-center font-bold mr-3">2</span>
<div>
<h4 class="font-semibold mb-1">OCS光交换产业链次高优先级</h4>
<p class="text-gray-600 text-sm">LightCounting预测2029年5万台15% CAGR国产供应商已获订单</p>
</div>
</div>
<div class="flex items-start">
<span class="flex-shrink-0 w-8 h-8 bg-green-100 text-green-600 rounded-full flex items-center justify-center font-bold mr-3">3</span>
<div>
<h4 class="font-semibold mb-1">AI搜索营销产业链中优先级</h4>
<p class="text-gray-600 text-sm">一级代理商受益于谷歌减少中间环节毛利率提升2-3pct</p>
</div>
</div>
</div>
</div>
<div class="bg-white p-8 rounded-xl shadow-lg">
<h3 class="text-2xl font-bold mb-6 text-red-600">需规避的方向</h3>
<div class="space-y-4">
<div class="flex items-start">
<span class="flex-shrink-0 w-8 h-8 bg-red-100 text-red-600 rounded-full flex items-center justify-center font-bold mr-3">×</span>
<div>
<h4 class="font-semibold mb-1">纯模型接入方</h4>
<p class="text-gray-600 text-sm">Nano Banana中文生成不稳定API成本高毛利率承压</p>
</div>
</div>
<div class="flex items-start">
<span class="flex-shrink-0 w-8 h-8 bg-red-100 text-red-600 rounded-full flex items-center justify-center font-bold mr-3">×</span>
<div>
<h4 class="font-semibold mb-1">广告联盟依赖方</h4>
<p class="text-gray-600 text-sm">谷歌联盟广告持续萎缩,收入端受损</p>
</div>
</div>
<div class="flex items-start">
<span class="flex-shrink-0 w-8 h-8 bg-red-100 text-red-600 rounded-full flex items-center justify-center font-bold mr-3">×</span>
<div>
<h4 class="font-semibold mb-1">硬件代工</h4>
<p class="text-gray-600 text-sm">Pixel手机份额仅4.6%,硬件逻辑不纯</p>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- 风险提示 -->
<section class="py-16 bg-gray-900 text-white">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<h2 class="text-3xl font-bold text-center mb-12">风险提示</h2>
<div class="grid grid-cols-1 md:grid-cols-3 gap-6">
<div class="glass-effect p-6 rounded-xl">
<i class="fas fa-exclamation-triangle text-yellow-400 text-3xl mb-4"></i>
<h3 class="text-xl font-bold mb-3">技术风险</h3>
<ul class="space-y-2 text-gray-300">
<li>• 与GPT-4o应用差距</li>
<li>• 多模态生成稳定性</li>
<li>• 算力瓶颈制约</li>
</ul>
</div>
<div class="glass-effect p-6 rounded-xl">
<i class="fas fa-chart-line text-red-400 text-3xl mb-4"></i>
<h3 class="text-xl font-bold mb-3">商业化风险</h3>
<ul class="space-y-2 text-gray-300">
<li>• 广告联盟萎缩</li>
<li>• 订阅变现不及预期</li>
<li>• Agent协议推广困难</li>
</ul>
</div>
<div class="glass-effect p-6 rounded-xl">
<i class="fas fa-gavel text-blue-400 text-3xl mb-4"></i>
<h3 class="text-xl font-bold mb-3">政策风险</h3>
<ul class="space-y-2 text-gray-300">
<li>• 反垄断最终判决</li>
<li>• OpenAI竞争冲击</li>
<li>• 中国应用适配不足</li>
</ul>
</div>
</div>
</div>
</section>
<!-- Footer -->
<footer class="bg-gray-800 text-white py-8">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 text-center">
<p class="text-gray-400">© 2024 谷歌概念深度解析 | 数据来源:公开研究报告、路演记录、新闻资讯</p>
<p class="text-gray-500 text-sm mt-2">投资有风险,入市需谨慎 | 本报告仅供参考,不构成投资建议</p>
</div>
</footer>
<script>
// 添加滚动动画
window.addEventListener('scroll', function() {
const elements = document.querySelectorAll('.hover-lift');
elements.forEach(element => {
const elementTop = element.getBoundingClientRect().top;
const elementBottom = element.getBoundingClientRect().bottom;
if (elementTop < window.innerHeight && elementBottom > 0) {
element.style.opacity = '1';
element.style.transform = 'translateY(0)';
}
});
});
// 初始化动画
document.addEventListener('DOMContentLoaded', function() {
const elements = document.querySelectorAll('.hover-lift');
elements.forEach(element => {
element.style.opacity = '0';
element.style.transform = 'translateY(20px)';
element.style.transition = 'all 0.6s ease';
});
});
// 表格行点击高亮
document.querySelectorAll('tbody tr').forEach(row => {
row.addEventListener('click', function() {
// 移除其他行的高亮
document.querySelectorAll('tbody tr').forEach(r => r.classList.remove('bg-blue-50'));
// 添加当前行高亮
this.classList.add('bg-blue-50');
});
});
// 平滑滚动到锚点
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
anchor.addEventListener('click', function (e) {
e.preventDefault();
const target = document.querySelector(this.getAttribute('href'));
if (target) {
target.scrollIntoView({
behavior: 'smooth',
block: 'start'
});
}
});
});
</script>
</body>
</html>

View File

@@ -0,0 +1,824 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>远程火力 - 概念深度解析</title>
<script src="https://cdn.tailwindcss.com"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<style>
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&display=swap');
* {
font-family: 'Inter', sans-serif;
}
.gradient-bg {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
}
.glass-morphism {
background: rgba(255, 255, 255, 0.1);
backdrop-filter: blur(10px);
border: 1px solid rgba(255, 255, 255, 0.2);
}
.hover-lift {
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}
.hover-lift:hover {
transform: translateY(-4px);
box-shadow: 0 20px 40px rgba(0, 0, 0, 0.15);
}
.timeline-item {
position: relative;
padding-left: 40px;
}
.timeline-item::before {
content: '';
position: absolute;
left: 0;
top: 8px;
width: 12px;
height: 12px;
background: #667eea;
border-radius: 50%;
}
.timeline-item::after {
content: '';
position: absolute;
left: 5px;
top: 20px;
width: 2px;
height: calc(100% + 10px);
background: #e5e7eb;
}
.timeline-item:last-child::after {
display: none;
}
@keyframes fadeInUp {
from {
opacity: 0;
transform: translateY(20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.fade-in-up {
animation: fadeInUp 0.6s ease-out;
}
.stock-table {
font-size: 12px;
}
.stock-table th {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
position: sticky;
top: 0;
z-index: 10;
}
.stock-table tr:nth-child(even) {
background-color: #f9fafb;
}
.stock-table tr:hover {
background-color: #f3f4f6;
transform: scale(1.01);
transition: all 0.2s;
}
.badge-gradient {
background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
}
.chain-arrow {
display: inline-block;
margin: 0 10px;
color: #9ca3af;
}
.floating {
animation: float 3s ease-in-out infinite;
}
@keyframes float {
0% { transform: translateY(0px); }
50% { transform: translateY(-10px); }
100% { transform: translateY(0px); }
}
.pulse-dot {
animation: pulse 2s infinite;
}
@keyframes pulse {
0% {
box-shadow: 0 0 0 0 rgba(102, 126, 234, 0.7);
}
70% {
box-shadow: 0 0 0 10px rgba(102, 126, 234, 0);
}
100% {
box-shadow: 0 0 0 0 rgba(102, 126, 234, 0);
}
}
.risk-high { border-left: 4px solid #ef4444; }
.risk-medium { border-left: 4px solid #f59e0b; }
.risk-low { border-left: 4px solid #10b981; }
</style>
</head>
<body class="bg-gray-50">
<!-- Hero Section -->
<div class="gradient-bg text-white py-20 px-4">
<div class="max-w-7xl mx-auto">
<div class="text-center fade-in-up">
<h1 class="text-5xl md:text-6xl font-bold mb-4 floating">
<i class="fas fa-rocket mr-4"></i>远程火力
</h1>
<p class="text-xl md:text-2xl opacity-90 mb-8">现代陆军第四代核心骨干装备 · 高效费比战争撒手锏</p>
<div class="flex flex-wrap justify-center gap-4">
<span class="glass-morphism px-4 py-2 rounded-full">
<i class="fas fa-crosshairs mr-2"></i>射程 70-500km
</span>
<span class="glass-morphism px-4 py-2 rounded-full">
<i class="fas fa-bullseye mr-2"></i>CEP精度 30m
</span>
<span class="glass-morphism px-4 py-2 rounded-full">
<i class="fas fa-dollar-sign mr-2"></i>成本仅为导弹1/10
</span>
</div>
</div>
</div>
</div>
<!-- Main Content -->
<div class="max-w-7xl mx-auto px-4 py-12">
<!-- 概念定义与背景 -->
<section class="mb-12 fade-in-up">
<div class="bg-white rounded-2xl shadow-xl p-8 hover-lift">
<h2 class="text-3xl font-bold mb-6 text-gray-800">
<i class="fas fa-info-circle text-purple-600 mr-3"></i>概念定义与背景
</h2>
<div class="prose max-w-none text-gray-600">
<p class="text-lg leading-relaxed mb-4">
<strong>远程火力</strong>(简称"远火")在军事领域特指远程火箭炮武器系统,是现代陆军第四代核心骨干装备。该系统通过远程火箭弹实现<strong>70-500公里射程</strong>的精确打击能力有效填补传统身管火炮20-50公里与战术弹道导弹千公里级之间的火力空白。
</p>
<div class="grid md:grid-cols-3 gap-6 mt-6">
<div class="bg-gradient-to-br from-blue-50 to-purple-50 p-6 rounded-xl">
<h3 class="font-bold text-lg mb-3 text-blue-800"><i class="fas fa-bolt mr-2"></i>核心特征</h3>
<ul class="space-y-2 text-sm">
<li>• 低成本高效费比</li>
<li>• 模块化设计</li>
<li>• 精准制导能力</li>
<li>• 快速部署机动</li>
</ul>
</div>
<div class="bg-gradient-to-br from-green-50 to-teal-50 p-6 rounded-xl">
<h3 class="font-bold text-lg mb-3 text-green-800"><i class="fas fa-shield-alt mr-2"></i>战略地位</h3>
<ul class="space-y-2 text-sm">
<li>• 填补火力空白</li>
<li>• 战争消耗主力</li>
<li>• 精打要害利器</li>
<li>• 破击体系关键</li>
</ul>
</div>
<div class="bg-gradient-to-br from-orange-50 to-red-50 p-6 rounded-xl">
<h3 class="font-bold text-lg mb-3 text-orange-800"><i class="fas fa-globe mr-2"></i>国际形势</h3>
<ul class="space-y-2 text-sm">
<li>• 美军扩编500套</li>
<li>• 欧盟2030战备计划</li>
<li>• 俄乌冲突验证价值</li>
<li>• 全球军贸需求爆发</li>
</ul>
</div>
</div>
</div>
</div>
</section>
<!-- 核心观点 -->
<section class="mb-12 fade-in-up">
<div class="bg-white rounded-2xl shadow-xl p-8 hover-lift">
<h2 class="text-3xl font-bold mb-6 text-gray-800">
<i class="fas fa-lightbulb text-yellow-500 mr-3"></i>核心观点
</h2>
<div class="grid md:grid-cols-2 gap-6">
<div class="border-l-4 border-purple-500 pl-6">
<h3 class="font-bold text-lg mb-3">三大驱动力共振</h3>
<ul class="space-y-3 text-gray-600">
<li class="flex items-start">
<i class="fas fa-check-circle text-green-500 mt-1 mr-2"></i>
<span><strong>军事战略重构</strong>美军将其与高超音速导弹并列为优先事项预算300亿美元</span>
</li>
<li class="flex items-start">
<i class="fas fa-check-circle text-green-500 mt-1 mr-2"></i>
<span><strong>技术成熟度突破</strong>模块化装填效率提升6倍精度达30米级</span>
</li>
<li class="flex items-start">
<i class="fas fa-check-circle text-green-500 mt-1 mr-2"></i>
<span><strong>实战验证需求</strong>单套海马斯消耗500-625枚弹药储备严重不足</span>
</li>
</ul>
</div>
<div class="border-l-4 border-blue-500 pl-6">
<h3 class="font-bold text-lg mb-3">三大预期差</h3>
<ul class="space-y-3 text-gray-600">
<li class="flex items-start">
<i class="fas fa-exclamation-triangle text-yellow-500 mt-1 mr-2"></i>
<span><strong>市场空间VS订单节奏</strong>:研报"万台"预期 vs 实际年产20套</span>
</li>
<li class="flex items-start">
<i class="fas fa-exclamation-triangle text-yellow-500 mt-1 mr-2"></i>
<span><strong>垄断VS竞争</strong>:北方导航"独供"仅限大口径型号</span>
</li>
<li class="flex items-start">
<i class="fas fa-exclamation-triangle text-yellow-500 mt-1 mr-2"></i>
<span><strong>成本优势VS价格风险</strong>:军采阶梯降价或冲击毛利率</span>
</li>
</ul>
</div>
</div>
</div>
</section>
<!-- 催化事件时间轴 -->
<section class="mb-12 fade-in-up">
<div class="bg-white rounded-2xl shadow-xl p-8 hover-lift">
<h2 class="text-3xl font-bold mb-6 text-gray-800">
<i class="fas fa-timeline text-indigo-600 mr-3"></i>催化事件时间轴
</h2>
<div class="space-y-6">
<div class="timeline-item">
<div class="bg-gradient-to-r from-purple-50 to-pink-50 p-4 rounded-lg">
<span class="text-sm font-semibold text-purple-600">2024年7月-10月</span>
<h3 class="font-bold mt-1">研究机构密集发布深度研报</h3>
<p class="text-gray-600 text-sm mt-2">长江军工、东兴证券等7-10份报告系统构建分析框架将远火定位为新时期陆军"战争之神"</p>
</div>
</div>
<div class="timeline-item">
<div class="bg-gradient-to-r from-blue-50 to-cyan-50 p-4 rounded-lg">
<span class="text-sm font-semibold text-blue-600">2024年9月</span>
<h3 class="font-bold mt-1">美军扩编计划曝光</h3>
<p class="text-gray-600 text-sm mt-2">将远程火力战略地位提升至与高超音速导弹同级采购量从105套增至500套</p>
</div>
</div>
<div class="timeline-item">
<div class="bg-gradient-to-r from-green-50 to-emerald-50 p-4 rounded-lg">
<span class="text-sm font-semibold text-green-600">2025年2月</span>
<h3 class="font-bold mt-1">技术路线明确</h3>
<p class="text-gray-600 text-sm mt-2">确立固体火箭发动机、多脉冲发动机、碳纤维壳体为技术核心</p>
</div>
</div>
<div class="timeline-item">
<div class="bg-gradient-to-r from-orange-50 to-red-50 p-4 rounded-lg">
<span class="text-sm font-semibold text-orange-600">2025年5月</span>
<h3 class="font-bold mt-1">军贸订单实证</h3>
<p class="text-gray-600 text-sm mt-2">巴基斯坦采购中国远程火箭弹及自行加榴炮,获得实战验证</p>
</div>
</div>
</div>
</div>
</section>
<!-- 产业链图谱 -->
<section class="mb-12 fade-in-up">
<div class="bg-white rounded-2xl shadow-xl p-8 hover-lift">
<h2 class="text-3xl font-bold mb-6 text-gray-800">
<i class="fas fa-sitemap text-teal-600 mr-3"></i>产业链图谱
</h2>
<div class="overflow-x-auto">
<div class="min-w-max">
<div class="flex items-center justify-between mb-4">
<div class="text-center bg-gray-100 p-3 rounded-lg">
<h3 class="font-bold">上游材料及元器件</h3>
<p class="text-sm text-gray-600">价值占比15-20%</p>
</div>
<i class="fas fa-arrow-right text-2xl text-gray-400"></i>
<div class="text-center bg-purple-100 p-3 rounded-lg">
<h3 class="font-bold">中游核心系统</h3>
<p class="text-sm text-gray-600">价值占比60-70%</p>
<span class="badge-gradient text-white text-xs px-2 py-1 rounded-full">战略制高点</span>
</div>
<i class="fas fa-arrow-right text-2xl text-gray-400"></i>
<div class="text-center bg-gray-100 p-3 rounded-lg">
<h3 class="font-bold">下游总装及平台</h3>
<p class="text-sm text-gray-600">价值占比15-20%</p>
</div>
</div>
<div class="grid grid-cols-1 md:grid-cols-3 gap-4 text-sm">
<div class="space-y-2">
<div class="flex items-center"><span class="w-2 h-2 bg-blue-500 rounded-full mr-2"></span>碳纤维:光威复材</div>
<div class="flex items-center"><span class="w-2 h-2 bg-blue-500 rounded-full mr-2"></span>MLCC电容鸿远电子</div>
<div class="flex items-center"><span class="w-2 h-2 bg-blue-500 rounded-full mr-2"></span>连接器:航天电器</div>
<div class="flex items-center"><span class="w-2 h-2 bg-blue-500 rounded-full mr-2"></span>火工品:北化股份</div>
</div>
<div class="space-y-2">
<div class="flex items-center"><span class="w-2 h-2 bg-purple-500 rounded-full mr-2"></span>制导系统:北方导航</div>
<div class="flex items-center"><span class="w-2 h-2 bg-purple-500 rounded-full mr-2"></span>动力模块:国科军工</div>
<div class="flex items-center"><span class="w-2 h-2 bg-purple-500 rounded-full mr-2"></span>光纤环:长盈通</div>
</div>
<div class="space-y-2">
<div class="flex items-center"><span class="w-2 h-2 bg-green-500 rounded-full mr-2"></span>火箭炮总装:中兵红箭</div>
<div class="flex items-center"><span class="w-2 h-2 bg-green-500 rounded-full mr-2"></span>系统总体:航天彩虹</div>
<div class="flex items-center"><span class="w-2 h-2 bg-green-500 rounded-full mr-2"></span>外贸出口:北方工业</div>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- 核心公司对比 -->
<section class="mb-12 fade-in-up">
<div class="bg-white rounded-2xl shadow-xl p-8 hover-lift">
<h2 class="text-3xl font-bold mb-6 text-gray-800">
<i class="fas fa-crown text-yellow-500 mr-3"></i>核心公司对比分析
</h2>
<div class="overflow-x-auto">
<table class="w-full text-sm">
<thead class="bg-gradient-to-r from-purple-600 to-blue-600 text-white">
<tr>
<th class="px-4 py-3 text-left">公司</th>
<th class="px-4 py-3 text-left">卡位环节</th>
<th class="px-4 py-3 text-left">核心优势</th>
<th class="px-4 py-3 text-left">潜在风险</th>
<th class="px-4 py-3 text-center">投资评级</th>
</tr>
</thead>
<tbody>
<tr class="border-b hover:bg-gray-50">
<td class="px-4 py-3 font-bold">北方导航</td>
<td class="px-4 py-3">制导舱(中段+末段)</td>
<td class="px-4 py-3">独供制导舱280/500km射程核心供应商</td>
<td class="px-4 py-3">订单节奏不确定,价格承压</td>
<td class="px-4 py-3 text-center"><span class="bg-green-100 text-green-800 px-3 py-1 rounded-full">超配</span></td>
</tr>
<tr class="border-b hover:bg-gray-50">
<td class="px-4 py-3 font-bold">国科军工</td>
<td class="px-4 py-3">动力模块(固体发动机)</td>
<td class="px-4 py-3">稀缺军工牌照弹载动力模块CAGR 35.56%</td>
<td class="px-4 py-3">产能扩张慢,军品交付不及预期</td>
<td class="px-4 py-3 text-center"><span class="bg-blue-100 text-blue-800 px-3 py-1 rounded-full">标配</span></td>
</tr>
<tr class="border-b hover:bg-gray-50">
<td class="px-4 py-3 font-bold">长盈通</td>
<td class="px-4 py-3">光纤环(陀螺仪核心)</td>
<td class="px-4 py-3">军用光纤环龙头军民两用占比90%</td>
<td class="px-4 py-3">MEMS技术替代风险民品波动</td>
<td class="px-4 py-3 text-center"><span class="bg-blue-100 text-blue-800 px-3 py-1 rounded-full">标配</span></td>
</tr>
<tr class="hover:bg-gray-50">
<td class="px-4 py-3 font-bold">中兵红箭</td>
<td class="px-4 py-3">整弹总装</td>
<td class="px-4 py-3">兵器集团唯一弹药平台特种装备占比50%+</td>
<td class="px-4 py-3">传统弹药拖累估值,转型进度慢</td>
<td class="px-4 py-3 text-center"><span class="bg-yellow-100 text-yellow-800 px-3 py-1 rounded-full">观望</span></td>
</tr>
</tbody>
</table>
</div>
</div>
</section>
<!-- 股票数据表格 -->
<section class="mb-12 fade-in-up">
<div class="bg-white rounded-2xl shadow-xl p-8 hover-lift">
<h2 class="text-3xl font-bold mb-6 text-gray-800">
<i class="fas fa-table text-indigo-600 mr-3"></i>远程火力概念股票全览
</h2>
<div class="overflow-x-auto">
<table class="stock-table w-full">
<thead>
<tr>
<th class="px-2 py-2 text-left">股票名称</th>
<th class="px-2 py-2 text-left">分类</th>
<th class="px-2 py-2 text-left">产业链</th>
<th class="px-2 py-2 text-left">项目</th>
<th class="px-2 py-2 text-left">关联逻辑</th>
</tr>
</thead>
<tbody>
<tr>
<td class="px-2 py-2 font-semibold">航天电子</td>
<td class="px-2 py-2">导弹</td>
<td class="px-2 py-2">总装</td>
<td class="px-2 py-2">精确制导导弹</td>
<td class="px-2 py-2">稀缺主机厂</td>
</tr>
<tr>
<td class="px-2 py-2 font-semibold">中兵红箭</td>
<td class="px-2 py-2">导弹</td>
<td class="px-2 py-2">总装</td>
<td class="px-2 py-2">弹药总装</td>
<td class="px-2 py-2">唯一弹药平台</td>
</tr>
<tr>
<td class="px-2 py-2 font-semibold">航天彩虹</td>
<td class="px-2 py-2">导弹</td>
<td class="px-2 py-2">总装</td>
<td class="px-2 py-2">多用途模块化导弹</td>
<td class="px-2 py-2">填补国内空白</td>
</tr>
<tr>
<td class="px-2 py-2 font-semibold">洪都航空</td>
<td class="px-2 py-2">导弹</td>
<td class="px-2 py-2">总装</td>
<td class="px-2 py-2">导弹业务</td>
<td class="px-2 py-2">厂所合一平台</td>
</tr>
<tr>
<td class="px-2 py-2 font-semibold">高德红外</td>
<td class="px-2 py-2">导弹</td>
<td class="px-2 py-2">导引头</td>
<td class="px-2 py-2">多款型号产品</td>
<td class="px-2 py-2">精确制导优势</td>
</tr>
<tr>
<td class="px-2 py-2 font-semibold">菲利华</td>
<td class="px-2 py-2">导弹</td>
<td class="px-2 py-2">材料</td>
<td class="px-2 py-2">军工配套</td>
<td class="px-2 py-2">军工蓝宝石球罩</td>
</tr>
<tr>
<td class="px-2 py-2 font-semibold">铂力特</td>
<td class="px-2 py-2">导弹</td>
<td class="px-2 py-2">金属3D打印</td>
<td class="px-2 py-2">3D打印零件</td>
<td class="px-2 py-2">导弹型号应用</td>
</tr>
<tr>
<td class="px-2 py-2 font-semibold">派克新材</td>
<td class="px-2 py-2">导弹</td>
<td class="px-2 py-2">锻造</td>
<td class="px-2 py-2">导弹配套</td>
<td class="px-2 py-2">型号研制配套</td>
</tr>
<tr>
<td class="px-2 py-2 font-semibold">航宇科技</td>
<td class="px-2 py-2">导弹</td>
<td class="px-2 py-2">锻造</td>
<td class="px-2 py-2">导弹配套</td>
<td class="px-2 py-2">锻件应用</td>
</tr>
<tr>
<td class="px-2 py-2 font-semibold">钢研高纳</td>
<td class="px-2 py-2">导弹</td>
<td class="px-2 py-2">材料</td>
<td class="px-2 py-2">高温合金</td>
<td class="px-2 py-2">导弹应用</td>
</tr>
<tr>
<td class="px-2 py-2 font-semibold">光威复材</td>
<td class="px-2 py-2">导弹</td>
<td class="px-2 py-2">材料</td>
<td class="px-2 py-2">碳纤维</td>
<td class="px-2 py-2">发动机壳体</td>
</tr>
<tr>
<td class="px-2 py-2 font-semibold">抚顺特钢</td>
<td class="px-2 py-2">导弹</td>
<td class="px-2 py-2">材料</td>
<td class="px-2 py-2">高强度钢</td>
<td class="px-2 py-2">关键材料</td>
</tr>
<tr>
<td class="px-2 py-2 font-semibold">甘化科工</td>
<td class="px-2 py-2">导弹</td>
<td class="px-2 py-2">钨合金</td>
<td class="px-2 py-2">钨合金预制破片</td>
<td class="px-2 py-2">导弹配套</td>
</tr>
<tr>
<td class="px-2 py-2 font-semibold">国泰集团</td>
<td class="px-2 py-2">导弹</td>
<td class="px-2 py-2">钨合金</td>
<td class="px-2 py-2">军用钨基材料</td>
<td class="px-2 py-2">毁伤材料</td>
</tr>
<tr>
<td class="px-2 py-2 font-semibold">北方长龙</td>
<td class="px-2 py-2">导弹</td>
<td class="px-2 py-2">其他</td>
<td class="px-2 py-2">弹药装备</td>
<td class="px-2 py-2">复合材料弹药箱</td>
</tr>
<tr>
<td class="px-2 py-2 font-semibold">北化股份</td>
<td class="px-2 py-2">战斗部系统</td>
<td class="px-2 py-2">发射药</td>
<td class="px-2 py-2">硝化棉</td>
<td class="px-2 py-2">硝化棉龙头</td>
</tr>
<tr>
<td class="px-2 py-2 font-semibold">长城军工</td>
<td class="px-2 py-2">战斗部系统</td>
<td class="px-2 py-2">弹药</td>
<td class="px-2 py-2">传统弹药</td>
<td class="px-2 py-2">老牌弹药公司</td>
</tr>
<tr>
<td class="px-2 py-2 font-semibold">新余国科</td>
<td class="px-2 py-2">战斗部系统</td>
<td class="px-2 py-2">火工品</td>
<td class="px-2 py-2">军用火工品</td>
<td class="px-2 py-2">火工元件</td>
</tr>
<tr>
<td class="px-2 py-2 font-semibold">国科军工</td>
<td class="px-2 py-2">战斗部系统</td>
<td class="px-2 py-2">火工品</td>
<td class="px-2 py-2">导弹配套</td>
<td class="px-2 py-2">二三级配套</td>
</tr>
<tr>
<td class="px-2 py-2 font-semibold">北方导航</td>
<td class="px-2 py-2">惯性制导(中段)</td>
<td class="px-2 py-2">导航</td>
<td class="px-2 py-2">惯性导航系统</td>
<td class="px-2 py-2">成本竞争优势</td>
</tr>
<tr>
<td class="px-2 py-2 font-semibold">星网宇达</td>
<td class="px-2 py-2">惯性制导(中段)</td>
<td class="px-2 py-2">导航</td>
<td class="px-2 py-2">惯性导航系统</td>
<td class="px-2 py-2">远程制导炸弹</td>
</tr>
<tr>
<td class="px-2 py-2 font-semibold">理工导航</td>
<td class="px-2 py-2">惯性制导(中段)</td>
<td class="px-2 py-2">导航</td>
<td class="px-2 py-2">惯性导航系统</td>
<td class="px-2 py-2">制导炸弹配套</td>
</tr>
<tr>
<td class="px-2 py-2 font-semibold">长盈通</td>
<td class="px-2 py-2">卫星制导(中段)</td>
<td class="px-2 py-2">光纤</td>
<td class="px-2 py-2">军用光纤陀螺</td>
<td class="px-2 py-2">光纤环供应商</td>
</tr>
<tr>
<td class="px-2 py-2 font-semibold">芯动联科</td>
<td class="px-2 py-2">卫星制导(中段)</td>
<td class="px-2 py-2">MEMS惯性传感器</td>
<td class="px-2 py-2">MEMS惯性传感器</td>
<td class="px-2 py-2">高性能传感器</td>
</tr>
<tr>
<td class="px-2 py-2 font-semibold">盟升电子</td>
<td class="px-2 py-2">卫星制导(中段)</td>
<td class="px-2 py-2">卫星导航</td>
<td class="px-2 py-2">卫星导航系统</td>
<td class="px-2 py-2">导航系统</td>
</tr>
<tr>
<td class="px-2 py-2 font-semibold">振芯科技</td>
<td class="px-2 py-2">卫星制导(中段)</td>
<td class="px-2 py-2">卫星导航</td>
<td class="px-2 py-2">卫星导航系统</td>
<td class="px-2 py-2">导航系统</td>
</tr>
<tr>
<td class="px-2 py-2 font-semibold">亚光科技</td>
<td class="px-2 py-2">卫星制导(中段)</td>
<td class="px-2 py-2">微波电子</td>
<td class="px-2 py-2">微波电子元器件</td>
<td class="px-2 py-2">导弹导引头</td>
</tr>
<tr>
<td class="px-2 py-2 font-semibold">天箭科技</td>
<td class="px-2 py-2">制导系统</td>
<td class="px-2 py-2">微波/毫米波</td>
<td class="px-2 py-2">微波固态发射机</td>
<td class="px-2 py-2">推进稀布阵</td>
</tr>
<tr>
<td class="px-2 py-2 font-semibold">雷电微力</td>
<td class="px-2 py-2">制导系统</td>
<td class="px-2 py-2">微波/毫米波</td>
<td class="px-2 py-2">毫米波有源相控阵</td>
<td class="px-2 py-2">相控阵</td>
</tr>
<tr>
<td class="px-2 py-2 font-semibold">臻镭科技</td>
<td class="px-2 py-2">制导系统</td>
<td class="px-2 py-2">微波/毫米波</td>
<td class="px-2 py-2">射频芯片</td>
<td class="px-2 py-2">射频前端</td>
</tr>
<tr>
<td class="px-2 py-2 font-semibold">国博电子</td>
<td class="px-2 py-2">制导系统</td>
<td class="px-2 py-2">微波/毫米波</td>
<td class="px-2 py-2">射频模块</td>
<td class="px-2 py-2">射频模块</td>
</tr>
<tr>
<td class="px-2 py-2 font-semibold">高德红外</td>
<td class="px-2 py-2">红外制导(末段)</td>
<td class="px-2 py-2">红外</td>
<td class="px-2 py-2">制冷探测器</td>
<td class="px-2 py-2">批量应用</td>
</tr>
<tr>
<td class="px-2 py-2 font-semibold">睿创微纳</td>
<td class="px-2 py-2">红外制导(末段)</td>
<td class="px-2 py-2">红外</td>
<td class="px-2 py-2">非制冷红外热成像</td>
<td class="px-2 py-2">MEMS芯片</td>
</tr>
<tr>
<td class="px-2 py-2 font-semibold">光谱股份</td>
<td class="px-2 py-2">光学制导(末段)</td>
<td class="px-2 py-2">光学</td>
<td class="px-2 py-2">光学制导</td>
<td class="px-2 py-2">导引头</td>
</tr>
<tr>
<td class="px-2 py-2 font-semibold">新光光电</td>
<td class="px-2 py-2">光学制导(末段)</td>
<td class="px-2 py-2">光学</td>
<td class="px-2 py-2">光学制导</td>
<td class="px-2 py-2">导弹型号</td>
</tr>
<tr>
<td class="px-2 py-2 font-semibold">智明达</td>
<td class="px-2 py-2">嵌入式计算机</td>
<td class="px-2 py-2">计算机</td>
<td class="px-2 py-2">嵌入式计算机</td>
<td class="px-2 py-2">弹载应用</td>
</tr>
<tr>
<td class="px-2 py-2 font-semibold">雷科防务</td>
<td class="px-2 py-2">嵌入式计算机</td>
<td class="px-2 py-2">计算机</td>
<td class="px-2 py-2">嵌入式计算机</td>
<td class="px-2 py-2">国防应用</td>
</tr>
<tr>
<td class="px-2 py-2 font-semibold">鸿远电子</td>
<td class="px-2 py-2">元器件及部件</td>
<td class="px-2 py-2">电容</td>
<td class="px-2 py-2">军用MLCC</td>
<td class="px-2 py-2">高可靠MLCC</td>
</tr>
<tr>
<td class="px-2 py-2 font-semibold">宏达电子</td>
<td class="px-2 py-2">元器件及部件</td>
<td class="px-2 py-2">电容</td>
<td class="px-2 py-2">军用钽电容器</td>
<td class="px-2 py-2">钽电容龙头</td>
</tr>
<tr>
<td class="px-2 py-2 font-semibold">航天电器</td>
<td class="px-2 py-2">元器件及部件</td>
<td class="px-2 py-2">连接器</td>
<td class="px-2 py-2">高端连接器</td>
<td class="px-2 py-2">导弹配套</td>
</tr>
<tr>
<td class="px-2 py-2 font-semibold">中航光电</td>
<td class="px-2 py-2">元器件及部件</td>
<td class="px-2 py-2">连接器</td>
<td class="px-2 py-2">连接器</td>
<td class="px-2 py-2">导弹应用</td>
</tr>
</tbody>
</table>
</div>
</div>
</section>
<!-- 风险提示 -->
<section class="mb-12 fade-in-up">
<div class="bg-white rounded-2xl shadow-xl p-8 hover-lift">
<h2 class="text-3xl font-bold mb-6 text-gray-800">
<i class="fas fa-exclamation-triangle text-red-500 mr-3"></i>风险提示
</h2>
<div class="grid md:grid-cols-3 gap-6">
<div class="risk-high p-4 rounded-lg">
<h3 class="font-bold text-lg mb-3 text-red-700">技术风险</h3>
<ul class="space-y-2 text-sm text-gray-600">
<li>• MEMS陀螺仪军品认证未通过</li>
<li>• 卫星导航抗干扰能力存疑</li>
<li>• 高端制导器件仍有卡脖子环节</li>
</ul>
</div>
<div class="risk-medium p-4 rounded-lg">
<h3 class="font-bold text-lg mb-3 text-yellow-700">商业化风险</h3>
<ul class="space-y-2 text-sm text-gray-600">
<li>• 军采阶梯降价冲击毛利</li>
<li>• 订单能见度极低</li>
<li>• 订单空窗期可能长达18个月</li>
</ul>
</div>
<div class="risk-low p-4 rounded-lg">
<h3 class="font-bold text-lg mb-3 text-green-700">政策风险</h3>
<ul class="space-y-2 text-sm text-gray-600">
<li>• 军贸审批不确定性</li>
<li>• 军工央企内部竞争</li>
<li>• 和平谈判导致需求降温</li>
</ul>
</div>
</div>
</div>
</section>
<!-- 投资启示 -->
<section class="mb-12 fade-in-up">
<div class="bg-gradient-to-r from-indigo-600 to-purple-600 text-white rounded-2xl shadow-xl p-8">
<h2 class="text-3xl font-bold mb-6">
<i class="fas fa-chart-line mr-3"></i>投资启示
</h2>
<div class="grid md:grid-cols-2 gap-8">
<div>
<h3 class="text-xl font-bold mb-4">概念阶段判断</h3>
<p class="mb-4">远程火力正处于从<strong>主题炒作向基本面驱动</strong>过渡的"阵痛期",长期逻辑坚实但短期面临验证挑战。</p>
<div class="bg-white/10 backdrop-blur p-4 rounded-lg">
<p class="text-sm">当前市场过度关注宏大叙事忽视微观订单。建议降低仓位至标配待Q3催化剂落地后再决策。</p>
</div>
</div>
<div>
<h3 class="text-xl font-bold mb-4">配置建议</h3>
<ul class="space-y-3">
<li class="flex items-center">
<i class="fas fa-arrow-up text-green-400 mr-3"></i>
<span><strong>超配:</strong>北方导航(制导系统龙头)</span>
</li>
<li class="flex items-center">
<i class="fas fa-minus text-yellow-400 mr-3"></i>
<span><strong>标配:</strong>国科军工、长盈通</span>
</li>
<li class="flex items-center">
<i class="fas fa-arrow-down text-red-400 mr-3"></i>
<span><strong>规避:</strong>间接受益标的(航亚科技等)</span>
</li>
</ul>
</div>
</div>
<div class="mt-8 text-center">
<div class="inline-flex items-center bg-white/20 backdrop-blur px-6 py-3 rounded-full">
<span class="pulse-dot w-3 h-3 bg-green-400 rounded-full mr-3"></span>
<span class="font-semibold">一句话总结:值得长期跟踪,但当前处于"证伪窗口期",不见订单不撒鹰</span>
</div>
</div>
</div>
</section>
</div>
<!-- Footer -->
<footer class="bg-gray-800 text-white py-8">
<div class="max-w-7xl mx-auto px-4 text-center">
<p class="text-sm opacity-75">本页面信息仅供参考,不构成投资建议</p>
<p class="text-xs mt-2 opacity-50">数据来源:研报、路演、公告等公开信息</p>
</div>
</footer>
<script>
// 添加滚动动画
const observerOptions = {
threshold: 0.1,
rootMargin: '0px 0px -50px 0px'
};
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.classList.add('fade-in-up');
}
});
}, observerOptions);
document.querySelectorAll('section').forEach(section => {
observer.observe(section);
});
// 表格行高亮
document.querySelectorAll('.stock-table tr').forEach(row => {
row.addEventListener('mouseenter', function() {
this.style.transform = 'scale(1.01)';
});
row.addEventListener('mouseleave', function() {
this.style.transform = 'scale(1)';
});
});
</script>
</body>
</html>

View File

@@ -0,0 +1,643 @@
<!DOCTYPE html>
<html lang="zh-CN" data-theme="dark">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>阿里AI千问、灵光 - 概念深度分析</title>
<link href="https://cdn.jsdelivr.net/npm/daisyui@4.4.19/dist/full.min.css" rel="stylesheet" type="text/css" />
<script src="https://cdn.tailwindcss.com"></script>
<link href="https://cdn.jsdelivr.net/npm/remixicon@3.5.0/fonts/remixicon.css" rel="stylesheet">
<style>
.gradient-text {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.timeline-dot::before {
content: '';
position: absolute;
width: 16px;
height: 16px;
border-radius: 50%;
background: #3b82f6;
top: 50%;
left: -8px;
transform: translateY(-50%);
}
.scrollbar-hide::-webkit-scrollbar {
display: none;
}
.scrollbar-hide {
-ms-overflow-style: none;
scrollbar-width: none;
}
@keyframes float {
0% { transform: translateY(0px); }
50% { transform: translateY(-10px); }
100% { transform: translateY(0px); }
}
.float-animation {
animation: float 3s ease-in-out infinite;
}
.glass-effect {
background: rgba(255, 255, 255, 0.05);
backdrop-filter: blur(10px);
border: 1px solid rgba(255, 255, 255, 0.1);
}
.table-responsive {
overflow-x: auto;
-webkit-overflow-scrolling: touch;
}
@media (max-width: 640px) {
.table-responsive {
font-size: 12px;
}
.table-responsive th,
.table-responsive td {
padding: 4px;
}
}
</style>
</head>
<body class="bg-base-300 text-base-content">
<!-- Hero Section -->
<section class="hero min-h-screen bg-gradient-to-br from-purple-900 via-blue-900 to-indigo-900">
<div class="hero-content text-center text-neutral-content">
<div class="max-w-4xl">
<h1 class="text-6xl font-bold mb-4 gradient-text">阿里AI千问、灵光</h1>
<p class="text-xl mb-8 opacity-90">从B端技术输出到C端生态入口的历史性拐点</p>
<div class="stats shadow-lg glass-effect">
<div class="stat">
<div class="stat-title">下载量</div>
<div class="stat-value text-primary">1000万+</div>
<div class="stat-desc">千问APP公测一周</div>
</div>
<div class="stat">
<div class="stat-title">App Store排名</div>
<div class="stat-value text-secondary">Top 3</div>
<div class="stat-desc">2天冲榜</div>
</div>
<div class="stat">
<div class="stat-title">开源模型</div>
<div class="stat-value">200+</div>
<div class="stat-desc">全球下载量超3亿次</div>
</div>
</div>
</div>
</div>
</section>
<!-- Core Insights -->
<section class="py-16 bg-base-200">
<div class="container mx-auto px-4">
<h2 class="text-4xl font-bold text-center mb-12">
<i class="ri-lightbulb-flash-line text-yellow-500"></i> 核心观点摘要
</h2>
<div class="alert alert-warning glass-effect shadow-lg">
<svg xmlns="http://www.w3.org/2000/svg" class="stroke-current shrink-0 h-6 w-6" fill="none" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L4.082 15.5c-.77.833.192 2.5 1.732 2.5z" />
</svg>
<div>
<h3 class="font-bold text-lg">核心观点</h3>
<div class="text-sm mt-2">阿里AI战略正经历从B端技术输出到C端生态入口的历史性拐点千问APP的爆发式增长验证了其"开源技术+场景垄断+免费策略"的独特路径有效性。然而当前市场高度聚焦于用户数据和下载量却可能忽视两个关键预期差一是AI收入占比仍处个位数商业化路径尚未跑通二是技术层面虽在开源生态占据第一但推理能力与DeepSeek等竞品仍存在差距。</div>
</div>
</div>
</div>
</section>
<!-- Timeline -->
<section class="py-16 bg-base-300">
<div class="container mx-auto px-4">
<h2 class="text-4xl font-bold text-center mb-12">
<i class="ri-time-line text-blue-500"></i> 关键时间轴
</h2>
<div class="relative">
<div class="absolute left-8 top-0 bottom-0 w-0.5 bg-base-content/20"></div>
<!-- 2024年4月 -->
<div class="mb-8 ml-16 relative timeline-dot">
<div class="timeline-date text-primary font-bold text-lg">2024年4月</div>
<div class="card glass-effect shadow-xl">
<div class="card-body">
<h3 class="card-title">技术基建期</h3>
<ul class="list-disc list-inside space-y-2 text-sm">
<li>阿里云发布通义千问2.5性能追平GPT-4 Turbo</li>
<li>Qwen2.5系列开源,奠定全球第一开源模型族地位</li>
<li>衍生模型超10万下载量突破700万次</li>
</ul>
</div>
</div>
</div>
<!-- 2025年4月 -->
<div class="mb-8 ml-16 relative timeline-dot">
<div class="timeline-date text-primary font-bold text-lg">2025年4月</div>
<div class="card glass-effect shadow-xl">
<div class="card-body">
<h3 class="card-title">Qwen3重磅发布</h3>
<ul class="list-disc list-inside space-y-2 text-sm">
<li>Qwen3-235B-A22B在编程、数学基准测试中超越DeepSeek-R1、GPT-4.1</li>
<li>登顶Hugging Face趋势榜</li>
<li>Qwen3 Coder编程能力达全球SOTAAPI调用量突破千亿级Tokens</li>
</ul>
</div>
</div>
</div>
<!-- 2025年11月 -->
<div class="mb-8 ml-16 relative timeline-dot">
<div class="timeline-date text-error font-bold text-lg">2025年11月 - C端产品爆发期</div>
<div class="card glass-effect shadow-xl">
<div class="card-body">
<h3 class="card-title">里程碑时刻</h3>
<div class="grid grid-cols-1 md:grid-cols-3 gap-4 text-sm">
<div class="badge badge-info p-4">
<div class="font-bold">11月14日</div>
<div>通义App升级为千问App</div>
</div>
<div class="badge badge-success p-4">
<div class="font-bold">11月17日</div>
<div>千问App公测版上线</div>
<div>2天冲榜Top 3</div>
</div>
<div class="badge badge-warning p-4">
<div class="font-bold">11月18日</div>
<div>灵光App发布</div>
<div>4天下载破100万</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- Core Logic -->
<section class="py-16 bg-base-200">
<div class="container mx-auto px-4">
<h2 class="text-4xl font-bold text-center mb-12">
<i class="ri-mind-map text-purple-500"></i> 核心驱动力分析
</h2>
<div class="grid grid-cols-1 md:grid-cols-3 gap-6">
<!-- 技术开源 -->
<div class="card glass-effect shadow-xl hover:shadow-2xl transition-all">
<div class="card-body">
<div class="card-title flex items-center gap-2">
<i class="ri-code-s-slash-line text-2xl text-blue-500"></i>
<span>技术开源战略</span>
<div class="badge badge-info">★★★★☆</div>
</div>
<div class="text-sm space-y-2">
<p>开源200+模型全球下载量超3亿次</p>
<p>衍生模型数量超10万稳居Hugging Face第一</p>
<p>区域性语言处理优势(印尼语、泰语)</p>
<p class="text-warning">短板推理能力与DeepSeek存在差距</p>
</div>
</div>
</div>
<!-- 生态整合 -->
<div class="card glass-effect shadow-xl hover:shadow-2xl transition-all">
<div class="card-body">
<div class="card-title flex items-center gap-2">
<i class="ri-landscape-line text-2xl text-green-500"></i>
<span>C端生态整合</span>
<div class="badge badge-success">★★★★★</div>
</div>
<div class="text-sm space-y-2">
<p>淘宝、高德、支付宝、飞猪全场景覆盖</p>
<p>从聊天到办事的能力闭环</p>
<p>石基信息打通酒店预订系统</p>
<p class="text-success">护城河:竞品无法复制的场景垄断</p>
</div>
</div>
</div>
<!-- 战略投入 -->
<div class="card glass-effect shadow-xl hover:shadow-2xl transition-all">
<div class="card-body">
<div class="card-title flex items-center gap-2">
<i class="ri-rocket-line text-2xl text-red-500"></i>
<span>战略资源投入</span>
<div class="badge badge-error">★★★★★</div>
</div>
<div class="text-sm space-y-2">
<p>3800亿AI基础设施投入三年</p>
<p>吴泳铭定义"AI时代的未来之战"</p>
<p>资本开支2025年预计增长超50%</p>
<p class="text-error">风险ROI压力巨大</p>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- Market Sentiment -->
<section class="py-16 bg-base-300">
<div class="container mx-auto px-4">
<h2 class="text-4xl font-bold text-center mb-12">
<i class="ri-bar-chart-line text-yellow-500"></i> 市场热度与预期差
</h2>
<div class="grid grid-cols-1 lg:grid-cols-2 gap-6">
<div class="card glass-effect shadow-xl">
<div class="card-body">
<h3 class="card-title">
<i class="ri-fire-line text-orange-500"></i> 市场热度
</h3>
<div class="space-y-3 text-sm">
<div class="flex justify-between items-center">
<span>研报覆盖密度</span>
<div class="badge badge-warning">峰值</div>
</div>
<div class="flex justify-between items-center">
<span>概念板块涨幅</span>
<progress class="progress progress-warning w-56" value="85" max="100"></progress>
</div>
<div class="flex justify-between items-center">
<span>乐观情绪占比</span>
<progress class="progress progress-success w-56" value="90" max="100"></progress>
</div>
</div>
</div>
</div>
<div class="card glass-effect shadow-xl">
<div class="card-body">
<h3 class="card-title">
<i class="ri-alert-line text-red-500"></i> 关键预期差
</h3>
<div class="space-y-3 text-sm">
<div class="alert alert-error">
<i class="ri-money-dollar-circle-line"></i>
<div>C端爆发 ≠ 商业化兑现</div>
<div class="text-xs">AI收入占比仍处个位数</div>
</div>
<div class="alert alert-warning">
<i class="ri-git-branch-line"></i>
<div>开源第一 ≠ 性能无敌</div>
<div class="text-xs">Agent能力低于DeepSeek</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- Industry Chain -->
<section class="py-16 bg-base-200">
<div class="container mx-auto px-4">
<h2 class="text-4xl font-bold text-center mb-12">
<i class="ri-links-line text-indigo-500"></i> 产业链图谱
</h2>
<div class="grid grid-cols-1 lg:grid-cols-3 gap-6">
<!-- 上游 -->
<div class="card glass-effect shadow-xl">
<div class="card-body">
<h3 class="card-title text-primary">上游:算力基础设施</h3>
<div class="text-sm space-y-2">
<p class="font-bold">价值占比: 40%</p>
<ul class="list-disc list-inside">
<li>IDC/智算中心: 数据港、杭钢股份、科华数据</li>
<li>AI芯片: 寒武纪、海光信息、平头哥</li>
<li>服务器: 浪潮信息、中科曙光、工业富联</li>
<li>光模块: 中际旭创、新易盛</li>
</ul>
</div>
</div>
</div>
<!-- 中游 -->
<div class="card glass-effect shadow-xl">
<div class="card-body">
<h3 class="card-title text-secondary">中游:模型与平台</h3>
<div class="text-sm space-y-2">
<p class="font-bold">价值占比: 30%(阿里主导)</p>
<ul class="list-disc list-inside">
<li>大模型: 通义千问已开源200+模型)</li>
<li>MaaS平台: 百炼29万企业用户</li>
<li>工具链: 通义灵码(已开始收费)</li>
</ul>
</div>
</div>
</div>
<!-- 下游 -->
<div class="card glass-effect shadow-xl">
<div class="card-body">
<h3 class="card-title text-success">下游:应用与场景</h3>
<div class="text-sm space-y-2">
<p class="font-bold">价值占比: 30%</p>
<ul class="list-disc list-inside">
<li>电商/消费: 光云科技、丽人丽妆</li>
<li>旅游/酒店: 石基信息(核心标的)</li>
<li>交通/物流: 千方科技</li>
<li>数据服务: 值得买</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- Stock Tables -->
<section class="py-16 bg-base-300">
<div class="container mx-auto px-4">
<h2 class="text-4xl font-bold text-center mb-12">
<i class="ri-stock-line text-green-500"></i> 核心关联股票
</h2>
<!-- Table 1 -->
<div class="mb-12">
<h3 class="text-2xl font-bold mb-4 text-center">阿里系参股企业</h3>
<div class="table-responsive">
<table class="table table-xs sm:table-md glass-effect">
<thead>
<tr>
<th>股票名称</th>
<th>分类</th>
<th>行业</th>
<th>相关性</th>
<th>持股比例</th>
</tr>
</thead>
<tbody>
<tr class="hover">
<td class="font-bold">石基信息</td>
<td><span class="badge badge-info">参股消费</span></td>
<td>信息技术</td>
<td>酒店直连核心</td>
<td><span class="badge badge-warning">13.02%</span></td>
</tr>
<tr class="hover">
<td class="font-bold">朗新集团</td>
<td><span class="badge badge-info">参股TMT</span></td>
<td>信息技术</td>
<td>能源数字化</td>
<td><span class="badge badge-warning">16.63%</span></td>
</tr>
<tr class="hover">
<td class="font-bold">千方科技</td>
<td><span class="badge badge-info">参股TMT</span></td>
<td>信息技术</td>
<td>交通领域唯一伙伴</td>
<td><span class="badge badge-warning">14.11%</span></td>
</tr>
<tr class="hover">
<td class="font-bold">分众传媒</td>
<td><span class="badge badge-info">参股TMT</span></td>
<td>传媒</td>
<td>营销合作</td>
<td><span class="badge badge-secondary">6.13%</span></td>
</tr>
<tr class="hover">
<td class="font-bold">三江购物</td>
<td><span class="badge badge-info">参股消费</span></td>
<td>零售</td>
<td>新零售布局</td>
<td><span class="badge badge-warning">30%</span></td>
</tr>
</tbody>
</table>
</div>
</div>
<!-- Table 2 -->
<div class="mb-12">
<h3 class="text-2xl font-bold mb-4 text-center">业务合作企业</h3>
<div class="table-responsive">
<table class="table table-xs sm:table-md glass-effect">
<thead>
<tr>
<th>股票名称</th>
<th>项目/业务</th>
<th>原因</th>
<th>相关性</th>
</tr>
</thead>
<tbody>
<tr class="hover">
<td class="font-bold">恒银科技</td>
<td>灵光</td>
<td>接入千问大模型及灵光</td>
<td><span class="badge badge-success">直接合作</span></td>
</tr>
<tr class="hover">
<td class="font-bold">华策影视</td>
<td>内容制作</td>
<td>已接入千问大模型</td>
<td><span class="badge badge-info">应用合作</span></td>
</tr>
<tr class="hover">
<td class="font-bold">润建股份</td>
<td>智算云业务</td>
<td>与阿里云共同投资智算中心</td>
<td><span class="badge badge-success">基础设施</span></td>
</tr>
<tr class="hover">
<td class="font-bold">数据港</td>
<td>ZH13数据中心</td>
<td>阿里核心数据中心供应商</td>
<td><span class="badge badge-error">核心标的</span></td>
</tr>
<tr class="hover">
<td class="font-bold">杭钢股份</td>
<td>B栋数据中心</td>
<td>已上电机柜1069个</td>
<td><span class="badge badge-warning">算力需求</span></td>
</tr>
</tbody>
</table>
</div>
</div>
<!-- Table 3 -->
<div class="mb-12">
<h3 class="text-2xl font-bold mb-4 text-center">技术供应商</h3>
<div class="table-responsive">
<table class="table table-xs sm:table-md glass-effect">
<thead>
<tr>
<th>股票名称</th>
<th>产品/服务</th>
<th>合作内容</th>
<th>类别</th>
</tr>
</thead>
<tbody>
<tr class="hover">
<td class="font-bold">浪潮信息</td>
<td>服务器</td>
<td>阿里服务器采购份额最高</td>
<td><span class="badge badge-primary">硬件</span></td>
</tr>
<tr class="hover">
<td class="font-bold">中际旭创</td>
<td>光模块</td>
<td>阿里云主要供应商</td>
<td><span class="badge badge-primary">硬件</span></td>
</tr>
<tr class="hover">
<td class="font-bold">紫光股份</td>
<td>交换机</td>
<td>400G交换机大份额</td>
<td><span class="badge badge-primary">硬件</span></td>
</tr>
<tr class="hover">
<td class="font-bold">寒武纪</td>
<td>GPU</td>
<td>云端产品线合作</td>
<td><span class="badge badge-warning">芯片</span></td>
</tr>
<tr class="hover">
<td class="font-bold">英维克</td>
<td>液冷温控</td>
<td>阿里数据中心制冷</td>
<td><span class="badge badge-info">配套</span></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</section>
<!-- Risk Analysis -->
<section class="py-16 bg-base-200">
<div class="container mx-auto px-4">
<h2 class="text-4xl font-bold text-center mb-12">
<i class="ri-error-warning-line text-red-500"></i> 风险提示
</h2>
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4">
<div class="card glass-effect shadow-xl bg-red-900/20">
<div class="card-body text-center">
<i class="ri-code-box-line text-4xl text-red-400 mb-2"></i>
<h3 class="card-title justify-center">技术风险</h3>
<p class="text-xs">推理能力瓶颈</p>
<p class="text-xs">多模态整合瑕疵</p>
<p class="text-xs">自研芯片性能差距</p>
</div>
</div>
<div class="card glass-effect shadow-xl bg-orange-900/20">
<div class="card-body text-center">
<i class="ri-money-cny-circle-line text-4xl text-orange-400 mb-2"></i>
<h3 class="card-title justify-center">商业化风险</h3>
<p class="text-xs">变现模式不清晰</p>
<p class="text-xs">ROI压力巨大</p>
<p class="text-xs">用户留存不确定</p>
</div>
</div>
<div class="card glass-effect shadow-xl bg-yellow-900/20">
<div class="card-body text-center">
<i class="ri-shield-line text-4xl text-yellow-400 mb-2"></i>
<h3 class="card-title justify-center">政策风险</h3>
<p class="text-xs">数据安全监管</p>
<p class="text-xs">跨境数据限制</p>
<p class="text-xs">反垄断压力</p>
</div>
</div>
<div class="card glass-effect shadow-xl bg-purple-900/20">
<div class="card-body text-center">
<i class="ri-team-line text-4xl text-purple-400 mb-2"></i>
<h3 class="card-title justify-center">竞争风险</h3>
<p class="text-xs">字节豆包竞争</p>
<p class="text-xs">价格战内卷</p>
<p class="text-xs">同质化严重</p>
</div>
</div>
</div>
</div>
</section>
<!-- Investment Insights -->
<section class="py-16 bg-base-300">
<div class="container mx-auto px-4">
<h2 class="text-4xl font-bold text-center mb-12">
<i class="ri-lightbulb-line text-yellow-400"></i> 投资启示
</h2>
<div class="alert alert-info shadow-lg glass-effect">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" class="stroke-current shrink-0 w-6 h-6">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path>
</svg>
<div>
<h3 class="font-bold">投资策略建议</h3>
<ul class="list-disc list-inside space-y-2 mt-2 text-sm">
<li><strong>首选标的:</strong>石基信息002153.SZ- 阿里二股东+酒店场景独占50-70%上行空间</li>
<li><strong>次选标的:</strong>数据港603881.SH- 算力需求直接受益PS 4倍存重估空间</li>
<li><strong>防御配置:</strong>值得买300785.SZ- 稳定数据服务10-15%仓位</li>
<li><strong>关键跟踪指标:</strong>千问DAU、AI收入占比、Agent任务完成率</li>
<li><strong>仓位建议:</strong>总体控制在10-15%设置15%止损线</li>
</ul>
</div>
</div>
<div class="mt-8 text-center text-sm opacity-70">
<p>⚠️ 风险提示:本概念当前市梦率成分较重,请谨慎投资</p>
<p>核心观测期2025年4月Q1财报+Qwen4发布</p>
</div>
</div>
</section>
<!-- Footer -->
<footer class="footer footer-center p-10 bg-base-300 text-base-content">
<div>
<p class="font-bold">阿里AI千问、灵光 - 概念深度分析</p>
<p>数据来源:公开信息、路演纪要、研究报告</p>
</div>
<div>
<div class="grid grid-flow-col gap-4">
<a><i class="ri-github-fill text-2xl"></i></a>
<a><i class="ri-twitter-fill text-2xl"></i></a>
<a><i class="ri-wechat-fill text-2xl"></i></a>
</div>
</div>
<div>
<p>© 2025 AI概念分析平台</p>
</div>
</footer>
<script>
// Add smooth scrolling
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
anchor.addEventListener('click', function (e) {
e.preventDefault();
document.querySelector(this.getAttribute('href')).scrollIntoView({
behavior: 'smooth'
});
});
});
// Add animation on scroll
const observerOptions = {
threshold: 0.1
};
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.style.opacity = '1';
entry.target.style.transform = 'translateY(0)';
}
});
}, observerOptions);
document.querySelectorAll('.card, .alert, .timeline-dot').forEach(el => {
el.style.opacity = '0';
el.style.transform = 'translateY(20px)';
el.style.transition = 'opacity 0.5s, transform 0.5s';
observer.observe(el);
});
</script>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 380 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 562 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 279 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 918 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 795 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1017 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 251 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 640 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 315 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 479 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 553 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 556 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 443 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 607 KiB

View File

@@ -1,5 +1,5 @@
<!DOCTYPE html>
<html lang="en" dir="ltr" layout="admin">
<html lang="zh-CN" dir="ltr" layout="admin">
<head>
<meta charset="utf-8" />
<meta
@@ -7,6 +7,177 @@
content="width=device-width, initial-scale=1, shrink-to-fit=no"
/>
<meta name="theme-color" content="#000000" />
<!-- 基本 SEO -->
<title>价值前沿 - 金融AI舆情分析系统 | LLM赋能的智能分析平台</title>
<meta name="description" content="基于金融大语言模型实时监控股市行情、a股、美股提供英伟达、小米等企业舆情分析助力投资决策" />
<meta name="keywords" content="金融AI,舆情分析,股市行情,LLM,价值前沿,a股,美股,投资分析" />
<link rel="canonical" href="https://valuefrontier.cn/" />
<!-- Open Graph / Facebook -->
<meta property="og:type" content="website" />
<meta property="og:url" content="https://valuefrontier.cn/" />
<meta property="og:title" content="价值前沿 - 金融AI舆情分析系统" />
<meta property="og:description" content="基于金融大语言模型实时监控股市行情、a股、美股提供英伟达、小米等企业舆情分析" />
<meta property="og:image" content="https://valuefrontier.cn/og-image.jpg" />
<meta property="og:site_name" content="价值前沿" />
<meta property="og:locale" content="zh_CN" />
<!-- Twitter Card -->
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:url" content="https://valuefrontier.cn/" />
<meta name="twitter:title" content="价值前沿 - 金融AI舆情分析系统" />
<meta name="twitter:description" content="基于金融大语言模型实时监控股市行情、a股、美股" />
<meta name="twitter:image" content="https://valuefrontier.cn/og-image.jpg" />
<!-- SEO 增强 -->
<meta name="robots" content="index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1" />
<meta name="author" content="价值前沿团队" />
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" />
<meta property="og:image:alt" content="价值前沿 - 金融AI舆情分析系统" />
<!-- 性能优化: DNS 预连接 -->
<link rel="preconnect" href="https://valuefrontier.cn" />
<link rel="dns-prefetch" href="https://valuefrontier.cn" />
<!-- JSON-LD 结构化数据: 组织信息 -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "价值前沿",
"url": "https://valuefrontier.cn",
"logo": "https://valuefrontier.cn/logo.png",
"description": "基于金融大语言模型的智能舆情分析平台",
"foundingDate": "2023",
"contactPoint": {
"@type": "ContactPoint",
"contactType": "Customer Service",
"availableLanguage": ["zh-CN"]
},
"sameAs": [
"https://valuefrontier.cn"
]
}
</script>
<!-- JSON-LD 结构化数据: 网站信息 + 搜索功能 -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebSite",
"name": "价值前沿",
"url": "https://valuefrontier.cn",
"description": "金融AI舆情分析系统实时监控股市行情",
"potentialAction": {
"@type": "SearchAction",
"target": {
"@type": "EntryPoint",
"urlTemplate": "https://valuefrontier.cn/search?q={search_term_string}"
},
"query-input": "required name=search_term_string"
}
}
</script>
<!-- JSON-LD 结构化数据: 软件应用产品信息 -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "SoftwareApplication",
"name": "价值前沿",
"applicationCategory": "FinanceApplication",
"operatingSystem": "Web",
"url": "https://valuefrontier.cn",
"description": "基于金融大语言模型实时监控股市行情、a股、美股提供企业舆情分析",
"offers": [
{
"@type": "Offer",
"name": "专业版",
"priceSpecification": {
"@type": "UnitPriceSpecification",
"price": "198",
"priceCurrency": "CNY",
"billingDuration": "P1M",
"referenceQuantity": {
"@type": "QuantitativeValue",
"value": "1",
"unitText": "月"
}
},
"availability": "https://schema.org/InStock",
"url": "https://valuefrontier.cn/home/pages/account/subscription"
},
{
"@type": "Offer",
"name": "旗舰版",
"priceSpecification": {
"@type": "UnitPriceSpecification",
"price": "998",
"priceCurrency": "CNY",
"billingDuration": "P1M",
"referenceQuantity": {
"@type": "QuantitativeValue",
"value": "1",
"unitText": "月"
}
},
"availability": "https://schema.org/InStock",
"url": "https://valuefrontier.cn/home/pages/account/subscription"
}
],
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.8",
"ratingCount": "1250",
"bestRating": "5",
"worstRating": "1"
},
"featureList": [
"实时舆情监控",
"智能事件分析",
"多维度数据可视化",
"AI驱动的投资建议",
"行业板块分析"
]
}
</script>
<!-- JSON-LD 结构化数据: 面包屑导航 -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "首页",
"item": "https://valuefrontier.cn/"
},
{
"@type": "ListItem",
"position": 2,
"name": "事件中心",
"item": "https://valuefrontier.cn/community"
},
{
"@type": "ListItem",
"position": 3,
"name": "概念分析",
"item": "https://valuefrontier.cn/concepts"
},
{
"@type": "ListItem",
"position": 4,
"name": "个股分析",
"item": "https://valuefrontier.cn/stocks"
}
]
}
</script>
<link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
<link rel="shortcut icon" href="%PUBLIC_URL%/favicon.png" />
<link
@@ -15,10 +186,19 @@
href="%PUBLIC_URL%/apple-icon.png"
/>
<link rel="shortcut icon" type="image/x-icon" href="./favicon.png" />
<title>价值前沿——LLM赋能的分析平台</title>
</head>
<body>
<noscript> You need to enable JavaScript to run this app. </noscript>
<noscript>
<div style="display: flex; align-items: center; justify-content: center; height: 100vh; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; text-align: center; padding: 20px;">
<div>
<h1 style="font-size: 2em; margin-bottom: 20px;">⚠️ 需要启用 JavaScript</h1>
<p style="font-size: 1.2em; line-height: 1.6; max-width: 600px; margin: 0 auto;">
价值前沿是一个现代化的 Web 应用,需要 JavaScript 才能正常运行。<br><br>
请在浏览器设置中启用 JavaScript然后刷新页面。
</p>
</div>
</div>
</noscript>
<div id="root"></div>
</body>
</html>

BIN
public/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

View File

@@ -7,7 +7,7 @@
* - Please do NOT modify this file.
*/
const PACKAGE_VERSION = '2.12.0'
const PACKAGE_VERSION = '2.12.2'
const INTEGRITY_CHECKSUM = '4db4a41e972cec1b64cc569c66952d82'
const IS_MOCKED_RESPONSE = Symbol('isMockedResponse')
const activeClientIds = new Set()

BIN
public/og-image.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

2089
report_zt_api.py Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -6,6 +6,8 @@ Flask-Compress==1.14
Flask-SocketIO==5.3.6
Flask-Mail==0.9.1
Flask-Migrate==4.0.5
Flask-Session==0.5.0
redis==5.0.1
pandas==2.0.3
numpy==1.24.3
requests==2.31.0
@@ -20,4 +22,5 @@ gevent-websocket==0.10.1
psutil==5.9.6
Pillow==10.1.0
itsdangerous==2.1.2
APScheduler==3.10.4
APScheduler==3.10.4
elasticsearch==8.15.0

View File

@@ -1,3 +0,0 @@
INFO Accepting connections at http://localhost:58321
INFO Gracefully shutting down. Please wait...

View File

@@ -9,8 +9,9 @@
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Visionware.
*/
import React, { useEffect } from "react";
import React, { useEffect, useRef } from "react";
import { useDispatch } from 'react-redux';
import { useLocation } from 'react-router-dom';
// Routes
import AppRoutes from './routes';
@@ -20,15 +21,71 @@ import AppProviders from './providers/AppProviders';
// Components
import GlobalComponents from './components/GlobalComponents';
import { PerformancePanel } from './components/PerformancePanel';
// Hooks
import { useGlobalErrorHandler } from './hooks/useGlobalErrorHandler';
// Redux
import { initializePostHog } from './store/slices/posthogSlice';
// ⚡ PostHog 延迟加载:移除同步导入,首屏减少 ~180KB
// import { initializePostHog } from './store/slices/posthogSlice';
import { updateScreenSize } from './store/slices/deviceSlice';
import { injectReducer } from './store';
// Utils
import { logger } from './utils/logger';
import { performanceMonitor } from './utils/performanceMonitor';
// ⚡ PostHog 延迟加载:移除同步导入
// import { trackEvent, trackEventAsync } from '@lib/posthog';
// Contexts
import { useAuth } from '@contexts/AuthContext';
// ⚡ PostHog 延迟加载模块(动态导入后缓存)
let posthogModule = null;
let posthogSliceModule = null;
/**
* ⚡ 延迟加载 PostHog 模块
* 返回 { trackEvent, trackEventAsync, initializePostHog, posthogReducer }
*/
const loadPostHogModules = async () => {
if (posthogModule && posthogSliceModule) {
return { posthogModule, posthogSliceModule };
}
try {
const [posthog, posthogSlice] = await Promise.all([
import('@lib/posthog'),
import('./store/slices/posthogSlice'),
]);
posthogModule = posthog;
posthogSliceModule = posthogSlice;
return { posthogModule, posthogSliceModule };
} catch (error) {
logger.error('App', 'PostHog 模块加载失败', error);
return null;
}
};
/**
* ⚡ 异步追踪事件(延迟加载 PostHog 后调用)
* @param {string} eventName - 事件名称
* @param {object} properties - 事件属性
*/
const trackEventLazy = async (eventName, properties = {}) => {
// 等待模块加载完成
if (!posthogModule) {
const modules = await loadPostHogModules();
if (!modules) return;
}
// 使用异步追踪,不阻塞主线程
posthogModule.trackEventAsync(eventName, properties);
};
/**
* AppContent - 应用核心内容
@@ -36,13 +93,150 @@ import { logger } from './utils/logger';
*/
function AppContent() {
const dispatch = useDispatch();
const location = useLocation();
const { isAuthenticated } = useAuth();
// 🎯 PostHog Redux 初始化
// ✅ 使用 Ref 存储页面进入时间和路径(避免闭包问题)
const pageEnterTimeRef = useRef(Date.now());
const currentPathRef = useRef(location.pathname);
// 🎯 ⚡ PostHog 空闲时加载 + Redux 初始化(首屏不加载 ~180KB
useEffect(() => {
dispatch(initializePostHog());
logger.info('App', 'PostHog Redux 初始化已触发');
const initPostHogRedux = async () => {
try {
const modules = await loadPostHogModules();
if (!modules) return;
const { posthogSliceModule } = modules;
// 动态注入 PostHog reducer
injectReducer('posthog', posthogSliceModule.default);
// 初始化 PostHog
dispatch(posthogSliceModule.initializePostHog());
// ⚡ 刷新注入前缓存的事件(避免丢失)
const pendingEvents = posthogSliceModule.flushPendingEventsBeforeInjection();
if (pendingEvents.length > 0) {
logger.info('App', `刷新 ${pendingEvents.length} 个注入前缓存的事件`);
pendingEvents.forEach(({ eventName, properties }) => {
posthogModule.trackEventAsync(eventName, properties);
});
}
logger.info('App', 'PostHog 模块空闲时加载完成Redux 初始化已触发');
} catch (error) {
logger.error('App', 'PostHog 加载失败', error);
}
};
// ⚡ 使用 requestIdleCallback 在浏览器空闲时加载,最长等待 3 秒
if ('requestIdleCallback' in window) {
const idleId = requestIdleCallback(initPostHogRedux, { timeout: 3000 });
return () => cancelIdleCallback(idleId);
} else {
// 降级Safari 等不支持 requestIdleCallback 的浏览器使用 setTimeout
const timer = setTimeout(initPostHogRedux, 1000);
return () => clearTimeout(timer);
}
}, [dispatch]);
// ⚡ 性能监控:标记 React 初始化完成
useEffect(() => {
performanceMonitor.mark('react-ready');
}, []);
// 📱 设备检测:监听窗口尺寸变化
useEffect(() => {
let resizeTimer;
const handleResize = () => {
// 防抖:避免频繁触发
clearTimeout(resizeTimer);
resizeTimer = setTimeout(() => {
dispatch(updateScreenSize());
}, 150);
};
window.addEventListener('resize', handleResize);
window.addEventListener('orientationchange', handleResize);
return () => {
clearTimeout(resizeTimer);
window.removeEventListener('resize', handleResize);
window.removeEventListener('orientationchange', handleResize);
};
}, [dispatch]);
// ✅ 首次访问追踪(🔴 关键事件:立即加载模块,确保数据不丢失)
useEffect(() => {
const hasVisited = localStorage.getItem('has_visited');
if (!hasVisited) {
const urlParams = new URLSearchParams(location.search);
const eventData = {
referrer: document.referrer || 'direct',
utm_source: urlParams.get('utm_source'),
utm_medium: urlParams.get('utm_medium'),
utm_campaign: urlParams.get('utm_campaign'),
landing_page: location.pathname,
timestamp: new Date().toISOString()
};
// 🔴 关键事件:立即加载 PostHog 模块并同步追踪(不使用 trackEventLazy
// 确保首次访问数据不会因用户快速离开而丢失
(async () => {
const modules = await loadPostHogModules();
if (modules) {
// 使用同步追踪trackEvent而非异步追踪trackEventAsync
modules.posthogModule.trackEvent('first_visit', eventData);
logger.info('App', '首次访问事件已同步追踪', eventData);
}
})();
localStorage.setItem('has_visited', 'true');
}
}, [location.search, location.pathname]);
// ✅ 页面浏览时长追踪
useEffect(() => {
// 计算上一个页面的停留时长
const calculateAndTrackDuration = () => {
const exitTime = Date.now();
const duration = Math.round((exitTime - pageEnterTimeRef.current) / 1000); // 秒
// 只追踪停留时间 > 1 秒的页面(过滤快速跳转)
if (duration > 1) {
// ⚡ 使用延迟加载的异步追踪,不阻塞页面切换
trackEventLazy('page_view_duration', {
path: currentPathRef.current,
duration_seconds: duration,
is_authenticated: isAuthenticated,
timestamp: new Date().toISOString()
});
}
};
// 路由切换时追踪上一个页面的时长
if (currentPathRef.current !== location.pathname) {
calculateAndTrackDuration();
// 更新为新页面
currentPathRef.current = location.pathname;
pageEnterTimeRef.current = Date.now();
}
// 页面关闭/刷新时追踪时长
const handleBeforeUnload = () => {
calculateAndTrackDuration();
};
window.addEventListener('beforeunload', handleBeforeUnload);
return () => {
window.removeEventListener('beforeunload', handleBeforeUnload);
};
}, [location.pathname, isAuthenticated]);
return <AppRoutes />;
}
@@ -58,6 +252,7 @@ export default function App() {
<AppProviders>
<AppContent />
<GlobalComponents />
<PerformancePanel />
</AppProviders>
);
}

View File

@@ -1,237 +0,0 @@
/**
* vf_react App.jsx集成示例
*
* 本文件展示如何在vf_react项目中集成Bytedesk客服系统
*
* 集成步骤:
* 1. 将bytedesk-integration文件夹复制到src/目录
* 2. 在App.jsx中导入BytedeskWidget和配置
* 3. 添加BytedeskWidget组件代码如下
* 4. 配置.env文件参考.env.bytedesk.example
*/
import React, { useState, useEffect } from 'react';
import { useLocation } from 'react-router-dom'; // 如果使用react-router
import BytedeskWidget from './bytedesk-integration/components/BytedeskWidget';
import { getBytedeskConfig, shouldShowCustomerService } from './bytedesk-integration/config/bytedesk.config';
// ============================================================================
// 方案一: 全局集成(推荐)
// 适用场景: 客服系统需要在所有页面显示
// ============================================================================
function App() {
// ========== vf_react原有代码保持不变 ==========
// 这里是您原有的App.jsx代码
// 例如: const [user, setUser] = useState(null);
// 例如: const [theme, setTheme] = useState('light');
// ... 保持原有逻辑不变 ...
// ========== Bytedesk集成代码开始 ==========
const location = useLocation(); // 获取当前路径
const [showBytedesk, setShowBytedesk] = useState(false);
// 根据页面路径决定是否显示客服
useEffect(() => {
const shouldShow = shouldShowCustomerService(location.pathname);
setShowBytedesk(shouldShow);
}, [location.pathname]);
// 获取Bytedesk配置
const bytedeskConfig = getBytedeskConfig();
// 客服加载成功回调
const handleBytedeskLoad = (bytedesk) => {
console.log('[App] Bytedesk客服系统加载成功', bytedesk);
};
// 客服加载失败回调
const handleBytedeskError = (error) => {
console.error('[App] Bytedesk客服系统加载失败', error);
};
// ========== Bytedesk集成代码结束 ==========
return (
<div className="App">
{/* ========== vf_react原有内容保持不变 ========== */}
{/* 这里是您原有的App.jsx JSX代码 */}
{/* 例如: <Header /> */}
{/* 例如: <Router> <Routes> ... </Routes> </Router> */}
{/* ... 保持原有结构不变 ... */}
{/* ========== Bytedesk客服Widget ========== */}
{showBytedesk && (
<BytedeskWidget
config={bytedeskConfig}
autoLoad={true}
onLoad={handleBytedeskLoad}
onError={handleBytedeskError}
/>
)}
</div>
);
}
export default App;
// ============================================================================
// 方案二: 带用户信息集成
// 适用场景: 需要将登录用户信息传递给客服端
// ============================================================================
/*
import React, { useState, useEffect, useContext } from 'react';
import { useLocation } from 'react-router-dom';
import BytedeskWidget from './bytedesk-integration/components/BytedeskWidget';
import { getBytedeskConfigWithUser, shouldShowCustomerService } from './bytedesk-integration/config/bytedesk.config';
import { AuthContext } from './contexts/AuthContext'; // 假设您有用户认证Context
function App() {
// 获取登录用户信息
const { user } = useContext(AuthContext);
const location = useLocation();
const [showBytedesk, setShowBytedesk] = useState(false);
useEffect(() => {
const shouldShow = shouldShowCustomerService(location.pathname);
setShowBytedesk(shouldShow);
}, [location.pathname]);
// 根据用户信息生成配置
const bytedeskConfig = user
? getBytedeskConfigWithUser(user)
: getBytedeskConfig();
return (
<div className="App">
// ... 您的原有代码 ...
{showBytedesk && (
<BytedeskWidget
config={bytedeskConfig}
autoLoad={true}
/>
)}
</div>
);
}
export default App;
*/
// ============================================================================
// 方案三: 条件性加载
// 适用场景: 只在特定条件下显示客服(如用户已登录、特定用户角色等)
// ============================================================================
/*
import React, { useState, useEffect } from 'react';
import BytedeskWidget from './bytedesk-integration/components/BytedeskWidget';
import { getBytedeskConfig } from './bytedesk-integration/config/bytedesk.config';
function App() {
const [user, setUser] = useState(null);
const [showBytedesk, setShowBytedesk] = useState(false);
useEffect(() => {
// 只有在用户登录且为普通用户时显示客服
if (user && user.role === 'customer') {
setShowBytedesk(true);
} else {
setShowBytedesk(false);
}
}, [user]);
const bytedeskConfig = getBytedeskConfig();
return (
<div className="App">
// ... 您的原有代码 ...
{showBytedesk && (
<BytedeskWidget
config={bytedeskConfig}
autoLoad={true}
/>
)}
</div>
);
}
export default App;
*/
// ============================================================================
// 方案四: 动态控制显示/隐藏
// 适用场景: 需要通过按钮或其他交互控制客服显示
// ============================================================================
/*
import React, { useState } from 'react';
import BytedeskWidget from './bytedesk-integration/components/BytedeskWidget';
import { getBytedeskConfig } from './bytedesk-integration/config/bytedesk.config';
function App() {
const [showBytedesk, setShowBytedesk] = useState(false);
const bytedeskConfig = getBytedeskConfig();
const toggleBytedesk = () => {
setShowBytedesk(prev => !prev);
};
return (
<div className="App">
// ... 您的原有代码 ...
{/* 自定义客服按钮 *\/}
<button onClick={toggleBytedesk} className="custom-service-button">
{showBytedesk ? '关闭客服' : '联系客服'}
</button>
{/* 客服Widget *\/}
{showBytedesk && (
<BytedeskWidget
config={bytedeskConfig}
autoLoad={true}
/>
)}
</div>
);
}
export default App;
*/
// ============================================================================
// 重要提示
// ============================================================================
/**
* 1. CSS样式兼容性
* - Bytedesk Widget使用Shadow DOM不会影响您的全局样式
* - Widget的样式可通过config中的theme配置调整
*
* 2. 性能优化
* - Widget脚本采用异步加载不会阻塞页面渲染
* - 建议在非关键页面(如登录、支付页)隐藏客服
*
* 3. 错误处理
* - 如果客服脚本加载失败,不会影响主应用
* - 建议添加onError回调进行错误监控
*
* 4. 调试模式
* - 查看浏览器控制台的[Bytedesk]前缀日志
* - 检查Network面板确认脚本加载成功
*
* 5. 生产部署
* - 确保.env文件配置正确特别是REACT_APP_BYTEDESK_API_URL
* - 确保CORS已在后端配置允许您的前端域名
* - 在管理后台配置正确的工作组IDsid
*/

View File

@@ -15,6 +15,10 @@
import { useEffect, useRef } from 'react';
import PropTypes from 'prop-types';
// ⚡ 模块级变量:防止 React StrictMode 双重初始化
let widgetInitialized = false;
let idleCallbackId = null;
const BytedeskWidget = ({
config,
autoLoad = true,
@@ -27,78 +31,151 @@ const BytedeskWidget = ({
useEffect(() => {
// 如果不自动加载或配置未设置,跳过
if (!autoLoad || !config) {
if (!config) {
console.warn('[Bytedesk] 配置未设置,客服组件未加载');
}
return;
}
console.log('[Bytedesk] 开始加载客服Widget...', config);
// ⚡ 防止重复初始化React StrictMode 会双重调用 useEffect
if (widgetInitialized) {
return;
}
// 加载Bytedesk Widget脚本
const script = document.createElement('script');
script.src = 'https://www.weiyuai.cn/embed/bytedesk-web.js';
script.async = true;
script.id = 'bytedesk-web-script';
// ⚡ 使用 requestIdleCallback 延迟加载,不阻塞首屏
const loadWidget = () => {
// 再次检查,防止竞态条件
if (widgetInitialized) return;
widgetInitialized = true;
script.onload = () => {
console.log('[Bytedesk] Widget脚本加载成功');
// 检查脚本是否已存在
if (document.getElementById('bytedesk-web-script')) {
return;
}
try {
if (window.BytedeskWeb) {
console.log('[Bytedesk] 初始化Widget');
const bytedesk = new window.BytedeskWeb(config);
bytedesk.init();
// 加载Bytedesk Widget脚本
const script = document.createElement('script');
script.src = 'https://www.weiyuai.cn/embed/bytedesk-web.js';
script.async = true;
script.id = 'bytedesk-web-script';
widgetRef.current = bytedesk;
console.log('[Bytedesk] Widget初始化成功');
script.onload = () => {
try {
if (window.BytedeskWeb) {
const bytedesk = new window.BytedeskWeb(config);
bytedesk.init();
widgetRef.current = bytedesk;
if (onLoad) {
onLoad(bytedesk);
// ⚡ H5 端样式适配:使用 MutationObserver 立即应用样式(避免闪烁)
const isMobile = window.innerWidth <= 768;
const applyBytedeskStyles = () => {
const allElements = document.querySelectorAll('body > div');
allElements.forEach(el => {
const style = window.getComputedStyle(el);
// 检查是否是右下角固定定位的元素Bytedesk 按钮)
if (style.position === 'fixed' && style.right && style.bottom) {
const rightVal = parseInt(style.right);
const bottomVal = parseInt(style.bottom);
if (rightVal >= 0 && rightVal < 100 && bottomVal >= 0 && bottomVal < 100) {
// H5 端设置按钮尺寸为 48x48只执行一次
if (isMobile && !el.dataset.bytedeskStyled) {
el.dataset.bytedeskStyled = 'true';
const button = el.querySelector('button');
if (button) {
button.style.width = '48px';
button.style.height = '48px';
button.style.minWidth = '48px';
button.style.minHeight = '48px';
}
}
// 提示框 3 秒后隐藏(查找白色气泡框)
const children = el.querySelectorAll('div');
children.forEach(child => {
if (child.dataset.bytedeskTooltip) return; // 已处理过
const childStyle = window.getComputedStyle(child);
// 白色背景的提示框
if (childStyle.backgroundColor === 'rgb(255, 255, 255)') {
child.dataset.bytedeskTooltip = 'true';
setTimeout(() => {
child.style.transition = 'opacity 0.3s';
child.style.opacity = '0';
setTimeout(() => child.remove(), 300);
}, 3000);
}
});
}
}
});
};
// 立即执行一次
applyBytedeskStyles();
// 监听 DOM 变化,新元素出现时立即应用样式
const observer = new MutationObserver(applyBytedeskStyles);
observer.observe(document.body, { childList: true, subtree: true });
// 5 秒后停止监听(避免性能问题)
setTimeout(() => observer.disconnect(), 5000);
// ⚡ 屏蔽 STOMP WebSocket 错误日志(不影响功能)
const originalConsoleError = console.error;
console.error = function(...args) {
const errorMsg = args.join(' ');
if (errorMsg.includes('/stomp') ||
errorMsg.includes('stomp onWebSocketError') ||
(errorMsg.includes('WebSocket connection to') && errorMsg.includes('/stomp'))) {
return;
}
originalConsoleError.apply(console, args);
};
if (onLoad) {
onLoad(bytedesk);
}
} else {
throw new Error('BytedeskWeb对象未定义');
}
} catch (error) {
console.error('[Bytedesk] 初始化失败:', error);
if (onError) {
onError(error);
}
} else {
throw new Error('BytedeskWeb对象未定义');
}
} catch (error) {
console.error('[Bytedesk] Widget初始化失败:', error);
};
script.onerror = (error) => {
console.error('[Bytedesk] 脚本加载失败:', error);
widgetInitialized = false; // 允许重试
if (onError) {
onError(error);
}
}
};
document.body.appendChild(script);
scriptRef.current = script;
};
script.onerror = (error) => {
console.error('[Bytedesk] Widget脚本加载失败:', error);
if (onError) {
onError(error);
}
};
// 添加脚本到页面
document.body.appendChild(script);
scriptRef.current = script;
// ⚡ 使用 requestIdleCallback 在浏览器空闲时加载
if ('requestIdleCallback' in window) {
idleCallbackId = requestIdleCallback(loadWidget, { timeout: 3000 });
} else {
// 降级:使用 setTimeout
idleCallbackId = setTimeout(loadWidget, 100);
}
// 清理函数
return () => {
console.log('[Bytedesk] 清理Widget');
// 移除脚本
if (scriptRef.current && document.body.contains(scriptRef.current)) {
document.body.removeChild(scriptRef.current);
}
// 移除Widget DOM元素
const widgetElements = document.querySelectorAll('[class*="bytedesk"], [id*="bytedesk"]');
widgetElements.forEach(el => {
if (el && el.parentNode) {
el.parentNode.removeChild(el);
// 取消待执行的 idle callback
if (idleCallbackId) {
if ('cancelIdleCallback' in window) {
cancelIdleCallback(idleCallbackId);
} else {
clearTimeout(idleCallbackId);
}
});
// 清理全局对象
if (window.BytedeskWeb) {
delete window.BytedeskWeb;
idleCallbackId = null;
}
// ⚠️ 不重置 widgetInitialized保持单例
// 不清理 DOM因为客服 Widget 应该持久存在
};
}, [config, autoLoad, onLoad, onError]);

View File

@@ -1,27 +1,10 @@
/**
* Bytedesk客服配置文件
* 通过代理访问 Bytedesk 服务器(解决 HTTPS 混合内容问题)
*
* 环境变量配置(.env文件:
* REACT_APP_BYTEDESK_ORG=df_org_uid
* REACT_APP_BYTEDESK_SID=df_wg_uid
*
* 架构说明:
* - iframe 使用完整域名https://valuefrontier.cn/bytedesk/chat/
* - 使用 HTTPS 协议,解决生产环境 Mixed Content 错误
* - 本地CRACO 代理 /bytedesk → valuefrontier.cn/bytedesk
* - 生产:前端 Nginx 代理 /bytedesk → 43.143.189.195
* - baseUrl 保持官方 CDN用于加载 SDK 外部模块)
*
* ⚠️ 注意:需要前端 Nginx 配置 /bytedesk/ 代理规则
*/
// 从环境变量读取配置
const BYTEDESK_ORG = process.env.REACT_APP_BYTEDESK_ORG || 'df_org_uid';
const BYTEDESK_SID = process.env.REACT_APP_BYTEDESK_SID || 'df_wg_uid';
/**
* Bytedesk客服基础配置
- iframe 使用完整域名https://valuefrontier.cn/bytedesk/chat/
- 使用 HTTPS 协议,解决生产环境 Mixed Content 错误
- 生产:前端 Nginx 代理 /bytedesk → 43.143.189.195
- baseUrl 保持官方 CDN用于加载 SDK 外部模块)
*/
export const bytedeskConfig = {
// API服务地址如果 SDK 需要调用 API
@@ -61,9 +44,9 @@ export const bytedeskConfig = {
// 聊天配置(必需)
chatConfig: {
org: BYTEDESK_ORG, // 组织ID
org: 'df_org_uid', // 组织ID
t: '1', // 类型: 1=人工客服, 2=机器人
sid: BYTEDESK_SID, // 工作组ID
sid: 'df_wg_uid', // 工作组ID
},
};
@@ -111,45 +94,8 @@ export const getBytedeskConfigWithUser = (user) => {
return config;
};
/**
* 根据页面路径判断是否显示客服
*
* @param {string} pathname - 当前页面路径
* @returns {boolean} 是否显示客服
*/
export const shouldShowCustomerService = (pathname) => {
// 在以下页面隐藏客服(黑名单)
const blockedPages = [
// '/home', // 登录页
];
// 检查是否在黑名单
if (blockedPages.some(page => pathname.startsWith(page))) {
return false;
}
// 默认所有页面都显示客服
return true;
/* ============================================
白名单模式(备用,需要时取消注释)
============================================
const allowedPages = [
'/', // 首页
'/home', // 主页
'/products', // 产品页
'/pricing', // 价格页
'/contact', // 联系我们
];
// 只在白名单页面显示客服
return allowedPages.some(page => pathname.startsWith(page));
============================================ */
};
export default {
bytedeskConfig,
getBytedeskConfig,
getBytedeskConfigWithUser,
shouldShowCustomerService,
};

View File

@@ -85,15 +85,15 @@ export default function AuthFormContent() {
const [showNicknamePrompt, setShowNicknamePrompt] = useState(false);
const [currentPhone, setCurrentPhone] = useState("");
// 响应式布局配置
// 响应式断点
const isMobile = useBreakpointValue({ base: true, md: false });
const stackDirection = useBreakpointValue({ base: "column", md: "row" });
// 事件追踪
const authEvents = useAuthEvents({
component: 'AuthFormContent',
isMobile: isMobile
isMobile,
});
const stackDirection = useBreakpointValue({ base: "column", md: "row" });
const stackSpacing = useBreakpointValue({ base: 4, md: 2 }); // ✅ 桌面端从32px减至8px更紧凑
// 表单数据
@@ -186,8 +186,6 @@ export default function AuthFormContent() {
purpose: config.api.purpose
};
logger.api.request('POST', '/api/auth/send-verification-code', requestData);
const response = await fetch('/api/auth/send-verification-code', {
method: 'POST',
headers: {
@@ -203,8 +201,6 @@ export default function AuthFormContent() {
const data = await response.json();
logger.api.response('POST', '/api/auth/send-verification-code', response.status, data);
if (!isMountedRef.current) return;
if (!data) {
@@ -220,12 +216,6 @@ export default function AuthFormContent() {
authEvents.trackVerificationCodeSent(credential, config.api.purpose);
}
// ❌ 移除成功 toast静默处理
logger.info('AuthFormContent', '验证码发送成功', {
credential: cleanedCredential.substring(0, 3) + '****' + cleanedCredential.substring(7),
dev_code: data.dev_code
});
// ✅ 开发环境下在控制台显示验证码
if (data.dev_code) {
console.log(`%c✅ [验证码] ${cleanedCredential} -> ${data.dev_code}`, 'color: #16a34a; font-weight: bold; font-size: 14px;');
@@ -309,12 +299,6 @@ export default function AuthFormContent() {
login_type: 'phone',
};
logger.api.request('POST', '/api/auth/login-with-code', {
credential: cleanedPhone.substring(0, 3) + '****' + cleanedPhone.substring(7),
verification_code: verificationCode.substring(0, 2) + '****',
login_type: 'phone'
});
// 调用API根据模式选择不同的endpoint
const response = await fetch('/api/auth/login-with-code', {
method: 'POST',
@@ -331,11 +315,6 @@ export default function AuthFormContent() {
const data = await response.json();
logger.api.response('POST', '/api/auth/login-with-code', response.status, {
...data,
user: data.user ? { id: data.user.id, phone: data.user.phone } : null
});
if (!isMountedRef.current) return;
if (!data) {
@@ -343,37 +322,25 @@ export default function AuthFormContent() {
}
if (response.ok && data.success) {
// ⚡ Mock 模式:先在前端侧写入 localStorage确保时序正确
if (process.env.REACT_APP_ENABLE_MOCK === 'true' && data.user) {
setCurrentUser(data.user);
logger.debug('AuthFormContent', '前端侧设置当前用户(Mock模式)', {
userId: data.user?.id,
phone: data.user?.phone,
mockMode: true
});
}
// 更新session
await checkSession();
// ✅ 兼容后端两种命名格式camelCase (isNewUser) 和 snake_case (is_new_user)
const isNewUser = data.isNewUser ?? data.is_new_user ?? false;
// 追踪登录成功并识别用户
authEvents.trackLoginSuccess(data.user, 'phone', data.isNewUser);
authEvents.trackLoginSuccess(data.user, 'phone', isNewUser);
// ✅ 保留登录成功 toast关键操作提示
toast({
title: data.isNewUser ? '注册成功' : '登录成功',
title: isNewUser ? '注册成功' : '登录成功',
description: config.successDescription,
status: "success",
duration: 2000,
});
logger.info('AuthFormContent', '登录成功', {
isNewUser: data.isNewUser,
userId: data.user?.id
});
// 检查是否为新注册用户
if (data.isNewUser) {
if (isNewUser) {
// 新注册用户,延迟后显示昵称设置引导
setTimeout(() => {
setCurrentPhone(phone);
@@ -493,7 +460,8 @@ export default function AuthFormContent() {
return () => {
isMountedRef.current = false;
};
}, [authEvents]);
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []); // 仅在挂载时执行一次,避免 countdown 倒计时导致重复触发
return (
<>

View File

@@ -1,15 +1,11 @@
// src/components/Auth/AuthModalManager.js
import React from 'react';
import {
Modal,
ModalOverlay,
ModalContent,
ModalBody,
ModalCloseButton,
useBreakpointValue
} from '@chakra-ui/react';
import React, { useEffect, useRef } from 'react';
import { Modal } from 'antd';
import { useBreakpointValue } from '@chakra-ui/react';
import { useAuthModal } from '../../hooks/useAuthModal';
import AuthFormContent from './AuthFormContent';
import { trackEventAsync } from '@lib/posthog';
import { ACTIVATION_EVENTS } from '@lib/constants';
/**
* 全局认证弹窗管理器
@@ -21,85 +17,64 @@ export default function AuthModalManager() {
closeModal
} = useAuthModal();
// 响应式尺寸配置
const modalSize = useBreakpointValue({
base: "md", // 移动端md不占满全屏
sm: "md", // 小屏md
md: "lg", // 中屏lg
lg: "xl" // 大屏xl更紧凑
});
// ✅ 追踪弹窗打开次数(用于漏斗分析)
const hasTrackedOpen = useRef(false);
// 响应式宽度配置
const modalMaxW = useBreakpointValue({
base: "90%", // 移动端屏幕宽度的90%
sm: "90%", // 小屏90%
md: "700px", // 中屏固定700px
lg: "700px" // 大屏固定700px
});
useEffect(() => {
if (isAuthModalOpen && !hasTrackedOpen.current) {
// ✅ 使用异步追踪,不阻塞渲染
trackEventAsync(ACTIVATION_EVENTS.LOGIN_PAGE_VIEWED, {
timestamp: new Date().toISOString(),
modal_type: 'auth_modal',
trigger_source: 'user_action', // 可以通过 props 传递更精确的来源
});
// 响应式水平边距
const modalMx = useBreakpointValue({
base: 4, // 移动端左右各16px边距
md: "auto" // 桌面端:自动居中
});
hasTrackedOpen.current = true;
}
// 响应式垂直边距
const modalMy = useBreakpointValue({
base: 8, // 移动端上下各32px边距
md: 8 // 桌面端上下各32px边距
});
// ✅ 弹窗关闭时重置标记(允许再次追踪)
if (!isAuthModalOpen) {
hasTrackedOpen.current = false;
}
}, [isAuthModalOpen]);
// 条件渲染:只在打开时才渲染 Modal避免创建不必要的 Portal
if (!isAuthModalOpen) {
return null;
}
// 响应式宽度配置Ant Design Modal 使用数字或字符串)
const modalMaxW = useBreakpointValue(
{
base: "90%", // 移动端屏幕宽度的90%
sm: "90%", // 小屏90%
md: "700px", // 中屏固定700px
lg: "700px" // 大屏固定700px
},
{ fallback: "700px", ssr: false }
);
// ✅ 使用 Ant Design Modal完全避开 Chakra UI Portal 的 AnimatePresence 问题
// Ant Design Modal 不使用 Framer Motion不会有 React 18 并发渲染的 insertBefore 错误
return (
<Modal
isOpen={isAuthModalOpen}
onClose={closeModal}
size={modalSize}
isCentered
closeOnOverlayClick={false} // 防止误点击背景关闭
closeOnEsc={true} // 允许ESC键关闭
scrollBehavior="inside" // 内容滚动
zIndex={999} // 低于导航栏(1000),不覆盖导航
open={isAuthModalOpen}
onCancel={closeModal}
footer={null}
width={modalMaxW}
centered
destroyOnHidden={true}
maskClosable={false}
keyboard={true}
zIndex={999}
styles={{
body: {
padding: '24px',
maxHeight: 'calc(90vh - 120px)',
overflowY: 'auto'
},
mask: {
backdropFilter: 'blur(10px)',
backgroundColor: 'rgba(0, 0, 0, 0.7)'
}
}}
>
{/* 半透明背景 + 模糊效果 */}
<ModalOverlay
bg="blackAlpha.700"
backdropFilter="blur(10px)"
/>
{/* 弹窗内容容器 */}
<ModalContent
bg="white"
boxShadow="2xl"
borderRadius="2xl"
maxW={modalMaxW}
mx={modalMx}
my={modalMy}
position="relative"
>
{/* 关闭按钮 */}
<ModalCloseButton
position="absolute"
right={4}
top={4}
zIndex={9999}
color="gray.500"
bg="transparent"
_hover={{ bg: "gray.100" }}
borderRadius="full"
size="lg"
onClick={closeModal}
/>
{/* 弹窗主体内容 */}
<ModalBody p={6}>
<AuthFormContent />
</ModalBody>
</ModalContent>
<AuthFormContent />
</Modal>
);
}

View File

@@ -74,6 +74,7 @@ export default function WechatRegister() {
const isMountedRef = useRef(true); // 追踪组件挂载状态
const containerRef = useRef(null); // 容器DOM引用
const sessionIdRef = useRef(null); // 存储最新的 sessionId避免闭包陷阱
const wechatStatusRef = useRef(WECHAT_STATUS.NONE); // 存储最新的 wechatStatus避免闭包陷阱
const navigate = useNavigate();
const toast = useToast();
@@ -128,12 +129,8 @@ export default function WechatRegister() {
*/
const handleLoginSuccess = useCallback(async (sessionId, status) => {
try {
logger.info('WechatRegister', '开始调用登录接口', { sessionId: sessionId.substring(0, 8) + '...', status });
const response = await authService.loginWithWechat(sessionId);
logger.info('WechatRegister', '登录接口返回', { success: response?.success, hasUser: !!response?.user });
if (response?.success) {
// 追踪微信登录成功
authEvents.trackLoginSuccess(
@@ -182,40 +179,28 @@ export default function WechatRegister() {
const checkWechatStatus = useCallback(async () => {
// 检查组件是否已卸载,使用 ref 获取最新的 sessionId
if (!isMountedRef.current || !sessionIdRef.current) {
logger.debug('WechatRegister', 'checkWechatStatus 跳过', {
isMounted: isMountedRef.current,
hasSessionId: !!sessionIdRef.current
});
return;
}
const currentSessionId = sessionIdRef.current;
logger.debug('WechatRegister', '检查微信状态', { sessionId: currentSessionId });
try {
const response = await authService.checkWechatStatus(currentSessionId);
// 安全检查:确保 response 存在且包含 status
if (!response || typeof response.status === 'undefined') {
logger.warn('WechatRegister', '微信状态检查返回无效数据', { response });
return;
}
const { status } = response;
logger.debug('WechatRegister', '微信状态', { status });
logger.debug('WechatRegister', '检测到微信状态', {
sessionId: wechatSessionId.substring(0, 8) + '...',
status,
userInfo: response.user_info
});
// 组件卸载后不再更新状态
if (!isMountedRef.current) return;
// 追踪状态变化
if (wechatStatus !== status) {
authEvents.trackWechatStatusChanged(currentSessionId, wechatStatus, status);
// 追踪状态变化(使用 ref 获取最新状态,避免闭包陷阱)
const previousStatus = wechatStatusRef.current;
if (previousStatus !== status) {
authEvents.trackWechatStatusChanged(currentSessionId, previousStatus, status);
// 特别追踪扫码事件
if (status === WECHAT_STATUS.SCANNED) {
@@ -227,7 +212,6 @@ export default function WechatRegister() {
// 处理成功状态
if (status === WECHAT_STATUS.LOGIN_SUCCESS || status === WECHAT_STATUS.REGISTER_SUCCESS) {
logger.info('WechatRegister', '检测到登录成功状态,停止轮询', { status });
clearTimers(); // 停止轮询
sessionIdRef.current = null; // 清理 sessionId
@@ -277,6 +261,12 @@ export default function WechatRegister() {
});
}
}
// 处理授权成功AUTHORIZED- 用户已在微信端确认授权,调用登录 API
else if (status === WECHAT_STATUS.AUTHORIZED) {
clearTimers();
sessionIdRef.current = null; // 清理 sessionId
await handleLoginSuccess(currentSessionId, status);
}
} catch (error) {
logger.error('WechatRegister', 'checkWechatStatus', error, { sessionId: currentSessionId });
// 轮询过程中的错误不显示给用户,避免频繁提示
@@ -301,11 +291,6 @@ export default function WechatRegister() {
* 启动轮询
*/
const startPolling = useCallback(() => {
logger.debug('WechatRegister', '启动轮询', {
sessionId: sessionIdRef.current,
interval: POLL_INTERVAL
});
// 清理旧的定时器
clearTimers();
@@ -316,7 +301,6 @@ export default function WechatRegister() {
// 设置超时
timeoutRef.current = setTimeout(() => {
logger.debug('WechatRegister', '二维码超时');
clearTimers();
sessionIdRef.current = null; // 清理 sessionId
setWechatStatus(WECHAT_STATUS.EXPIRED);
@@ -368,11 +352,6 @@ export default function WechatRegister() {
setWechatSessionId(response.data.session_id);
setWechatStatus(WECHAT_STATUS.WAITING);
logger.debug('WechatRegister', '获取二维码成功', {
sessionId: response.data.session_id,
authUrl: response.data.auth_url
});
// 启动轮询检查扫码状态
startPolling();
} catch (error) {
@@ -404,6 +383,14 @@ export default function WechatRegister() {
}
}, [getWechatQRCode]);
/**
* 同步 wechatStatusRef 与 wechatStatus state
* 确保 checkWechatStatus 回调中能获取到最新状态
*/
useEffect(() => {
wechatStatusRef.current = wechatStatus;
}, [wechatStatus]);
/**
* 组件卸载时清理定时器和标记组件状态
*/

View File

@@ -1,40 +1,52 @@
import { Link } from "react-router-dom";
import { svgs } from "./svgs";
import React from 'react';
import { Link } from 'react-router-dom';
import { svgs } from './svgs';
const Button = ({
className,
href,
onClick,
children,
px,
white,
interface ButtonProps {
className?: string;
href?: string;
onClick?: () => void;
children?: React.ReactNode;
px?: string;
white?: boolean;
isPrimary?: boolean;
isSecondary?: boolean;
}
const Button: React.FC<ButtonProps> = ({
className,
href,
onClick,
children,
px,
white,
}) => {
const classes = `button relative inline-flex items-center justify-center h-11 ${
px || "px-7"
} ${white ? "text-n-8" : "text-n-1"} transition-colors hover:text-color-1 ${
className || ""
}`;
const classes = `button relative inline-flex items-center justify-center h-11 ${
px || 'px-7'
} ${white ? 'text-n-8' : 'text-n-1'} transition-colors hover:text-color-1 ${
className || ''
}`;
const spanClasses = `relative z-10`;
const spanClasses = `relative z-10`;
return href ? (
href.startsWith("mailto:") ? (
<a href={href} className={classes}>
<span className={spanClasses}>{children}</span>
{svgs(white)}
</a>
) : (
<Link href={href} className={classes}>
<span className={spanClasses}>{children}</span>
{svgs(white)}
</Link>
)
return href ? (
href.startsWith('mailto:') ? (
<a href={href} className={classes}>
<span className={spanClasses}>{children}</span>
{svgs(white)}
</a>
) : (
<button className={classes} onClick={onClick}>
<span className={spanClasses}>{children}</span>
{svgs(white)}
</button>
);
<Link to={href} className={classes}>
<span className={spanClasses}>{children}</span>
{svgs(white)}
</Link>
)
) : (
<button className={classes} onClick={onClick}>
<span className={spanClasses}>{children}</span>
{svgs(white)}
</button>
);
};
export default Button;

View File

@@ -9,55 +9,80 @@ import * as echarts from 'echarts';
* ECharts 图表渲染组件
* @param {Object} option - ECharts 配置对象
* @param {number} height - 图表高度(默认 400px
* @param {string} variant - 主题变体: 'light' | 'dark' | 'auto' (默认 auto)
*/
export const EChartsRenderer = ({ option, height = 400 }) => {
export const EChartsRenderer = ({ option, height = 400, variant = 'auto' }) => {
const chartRef = useRef(null);
const chartInstance = useRef(null);
const bgColor = useColorModeValue('white', 'gray.800');
// 系统颜色模式
const systemBgColor = useColorModeValue('white', 'transparent');
const systemIsDark = useColorModeValue(false, true);
// 根据 variant 决定实际使用的模式
const isDarkMode = variant === 'dark' ? true : variant === 'light' ? false : systemIsDark;
const bgColor = variant === 'dark' ? 'transparent' : variant === 'light' ? 'white' : systemBgColor;
useEffect(() => {
if (!chartRef.current || !option) return;
// 初始化图表
if (!chartInstance.current) {
chartInstance.current = echarts.init(chartRef.current);
if (!chartRef.current || !option) {
console.warn('[EChartsRenderer] Missing chartRef or option');
return;
}
// 设置默认主题配置
const defaultOption = {
backgroundColor: 'transparent',
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true,
},
...option,
};
// 延迟初始化,确保 DOM 已渲染
const timer = setTimeout(() => {
try {
// 如果已有实例,先销毁
if (chartInstance.current) {
chartInstance.current.dispose();
}
// 设置图表配置
chartInstance.current.setOption(defaultOption, true);
// 初始化图表
chartInstance.current = echarts.init(chartRef.current, isDarkMode ? 'dark' : null);
// 响应式调整大小
// 深色模式下的样式调整
const darkModeStyle = isDarkMode ? {
backgroundColor: 'transparent',
textStyle: { color: '#e5e7eb' },
} : {};
// 合并配置
const finalOption = {
backgroundColor: 'transparent',
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true,
},
...darkModeStyle,
...option,
};
// 设置配置
chartInstance.current.setOption(finalOption);
console.log('[EChartsRenderer] Chart rendered successfully');
} catch (error) {
console.error('[EChartsRenderer] Failed to render chart:', error);
}
}, 100);
// 窗口 resize 处理
const handleResize = () => {
chartInstance.current?.resize();
};
window.addEventListener('resize', handleResize);
return () => {
clearTimeout(timer);
window.removeEventListener('resize', handleResize);
// chartInstance.current?.dispose(); // 不要销毁,避免重新渲染时闪烁
if (chartInstance.current) {
chartInstance.current.dispose();
chartInstance.current = null;
}
};
}, [option]);
// 组件卸载时销毁图表
useEffect(() => {
return () => {
chartInstance.current?.dispose();
chartInstance.current = null;
};
}, []);
}, [option, isDarkMode]);
return (
<Box
@@ -66,7 +91,6 @@ export const EChartsRenderer = ({ option, height = 400 }) => {
height={`${height}px`}
bg={bgColor}
borderRadius="md"
boxShadow="sm"
/>
);
};

View File

@@ -1,52 +1,161 @@
// src/components/ChatBot/MarkdownWithCharts.js
// 支持 ECharts 图表的 Markdown 渲染组件
import React from 'react';
import { Box, Alert, AlertIcon, Text, VStack, Code } from '@chakra-ui/react';
import React, { useMemo } from 'react';
import { Box, Alert, AlertIcon, Text, VStack, Code, useColorModeValue, Table, Thead, Tbody, Tr, Th, Td, TableContainer } from '@chakra-ui/react';
import ReactMarkdown from 'react-markdown';
import remarkGfm from 'remark-gfm';
import { EChartsRenderer } from './EChartsRenderer';
import { logger } from '@utils/logger';
/**
* 稳定的图表组件包装器
* 使用 useMemo 避免 option 对象引用变化导致的重复渲染
*/
const StableChart = React.memo(({ jsonString, height, variant }) => {
const chartOption = useMemo(() => {
try {
return JSON.parse(jsonString);
} catch (e) {
console.error('[StableChart] JSON parse error:', e);
return null;
}
}, [jsonString]);
if (!chartOption) {
return (
<Alert status="warning" borderRadius="md">
<AlertIcon />
<Text fontSize="sm">图表配置解析失败</Text>
</Alert>
);
}
return <EChartsRenderer option={chartOption} height={height} variant={variant} />;
});
/**
* 解析 Markdown 内容,提取 ECharts 代码块
* 支持处理:
* 1. 正常的换行符 \n
* 2. 转义的换行符 \\n后端 JSON 序列化产生)
* 3. 不完整的代码块LLM 输出被截断)
*
* @param {string} markdown - Markdown 文本
* @returns {Array} - 包含文本和图表的数组
*/
const parseMarkdownWithCharts = (markdown) => {
if (!markdown) return [];
let content = markdown;
// 处理转义的换行符(后端返回的 JSON 字符串可能包含 \\n
// 只处理代码块标记周围的换行符,不破坏 JSON 内部结构
// 将 ```echarts\\n 转换为 ```echarts\n
content = content.replace(/```echarts\\n/g, '```echarts\n');
// 将 \\n``` 转换为 \n```
content = content.replace(/\\n```/g, '\n```');
// 如果整个内容都是转义的换行符格式,进行全局替换
// 检测:如果内容中没有真正的换行符但有 \\n则进行全局替换
if (!content.includes('\n') && content.includes('\\n')) {
content = content.replace(/\\n/g, '\n');
}
const parts = [];
const echartsRegex = /```echarts\s*\n([\s\S]*?)```/g;
// 匹配 echarts 代码块的正则表达式
// 支持多种格式:
// 1. ```echarts\n{...}\n```
// 2. ```echarts\n{...}```(末尾无换行)
// 3. ```echarts {...}```(同一行开始,虽不推荐但兼容)
const echartsBlockRegex = /```echarts\s*\n?([\s\S]*?)```/g;
let lastIndex = 0;
let match;
while ((match = echartsRegex.exec(markdown)) !== null) {
// 匹配所有 echarts 代码块
while ((match = echartsBlockRegex.exec(content)) !== null) {
// 添加代码块前的文本
if (match.index > lastIndex) {
const textBefore = markdown.substring(lastIndex, match.index).trim();
const textBefore = content.substring(lastIndex, match.index).trim();
if (textBefore) {
parts.push({ type: 'text', content: textBefore });
}
}
// 添加 ECharts 配置
const chartConfig = match[1].trim();
parts.push({ type: 'chart', content: chartConfig });
// 提取 ECharts 配置内容
let chartConfig = match[1].trim();
// 处理 JSON 内部的转义换行符(恢复为真正的换行,便于后续解析)
// 注意:这里的 \\n 在 JSON 内部应该保持为 \n换行符不是字面量
if (chartConfig.includes('\\n')) {
chartConfig = chartConfig.replace(/\\n/g, '\n');
}
if (chartConfig.includes('\\t')) {
chartConfig = chartConfig.replace(/\\t/g, '\t');
}
if (chartConfig) {
parts.push({ type: 'chart', content: chartConfig });
}
lastIndex = match.index + match[0].length;
}
// 添加剩余文本
if (lastIndex < markdown.length) {
const textAfter = markdown.substring(lastIndex).trim();
if (textAfter) {
parts.push({ type: 'text', content: textAfter });
// 检查剩余内容
if (lastIndex < content.length) {
const remainingText = content.substring(lastIndex);
// 检查是否有不完整的 echarts 代码块(没有结束的 ```
const incompleteMatch = remainingText.match(/```echarts\s*\n?([\s\S]*?)$/);
if (incompleteMatch) {
// 提取不完整代码块之前的文本
const textBeforeIncomplete = remainingText.substring(0, incompleteMatch.index).trim();
if (textBeforeIncomplete) {
parts.push({ type: 'text', content: textBeforeIncomplete });
}
// 提取不完整的 echarts 内容
let incompleteChartConfig = incompleteMatch[1].trim();
// 同样处理转义换行符
if (incompleteChartConfig.includes('\\n')) {
incompleteChartConfig = incompleteChartConfig.replace(/\\n/g, '\n');
}
if (incompleteChartConfig) {
logger.warn('[MarkdownWithCharts] 检测到不完整的 echarts 代码块', {
contentPreview: incompleteChartConfig.substring(0, 100),
});
parts.push({ type: 'chart', content: incompleteChartConfig });
}
} else {
// 普通剩余文本
const textAfter = remainingText.trim();
if (textAfter) {
parts.push({ type: 'text', content: textAfter });
}
}
}
// 如果没有找到图表,返回整个 markdown 作为文本
// 如果没有找到任何部分,返回整个 markdown 作为文本
if (parts.length === 0) {
parts.push({ type: 'text', content: markdown });
parts.push({ type: 'text', content: content });
}
// 开发环境调试
if (process.env.NODE_ENV === 'development') {
const chartParts = parts.filter(p => p.type === 'chart');
if (chartParts.length > 0 || content.includes('echarts')) {
logger.info('[MarkdownWithCharts] 解析结果', {
inputLength: markdown?.length,
hasEchartsKeyword: content.includes('echarts'),
hasCodeBlock: content.includes('```'),
partsCount: parts.length,
partTypes: parts.map(p => p.type),
});
}
}
return parts;
@@ -55,10 +164,26 @@ const parseMarkdownWithCharts = (markdown) => {
/**
* 支持 ECharts 图表的 Markdown 渲染组件
* @param {string} content - Markdown 文本
* @param {string} variant - 主题变体: 'light' | 'dark' | 'auto' (默认 auto跟随系统)
*/
export const MarkdownWithCharts = ({ content }) => {
export const MarkdownWithCharts = ({ content, variant = 'auto' }) => {
const parts = parseMarkdownWithCharts(content);
// 系统颜色模式
const systemTextColor = useColorModeValue('gray.700', 'gray.100');
const systemHeadingColor = useColorModeValue('gray.800', 'gray.50');
const systemBlockquoteColor = useColorModeValue('gray.600', 'gray.300');
const systemCodeBg = useColorModeValue('gray.100', 'rgba(255, 255, 255, 0.1)');
// 根据 variant 选择颜色
const isDark = variant === 'dark';
const isLight = variant === 'light';
const textColor = isDark ? 'gray.100' : isLight ? 'gray.700' : systemTextColor;
const headingColor = isDark ? 'gray.50' : isLight ? 'gray.800' : systemHeadingColor;
const blockquoteColor = isDark ? 'gray.300' : isLight ? 'gray.600' : systemBlockquoteColor;
const codeBg = isDark ? 'rgba(255, 255, 255, 0.1)' : isLight ? 'gray.100' : systemCodeBg;
return (
<VStack align="stretch" spacing={4}>
{parts.map((part, index) => {
@@ -67,25 +192,26 @@ export const MarkdownWithCharts = ({ content }) => {
return (
<Box key={index}>
<ReactMarkdown
remarkPlugins={[remarkGfm]}
components={{
// 自定义渲染样式
p: ({ children }) => (
<Text mb={2} fontSize="sm">
<Text mb={2} fontSize="sm" color={textColor}>
{children}
</Text>
),
h1: ({ children }) => (
<Text fontSize="xl" fontWeight="bold" mb={3}>
<Text fontSize="xl" fontWeight="bold" mb={3} color={headingColor}>
{children}
</Text>
),
h2: ({ children }) => (
<Text fontSize="lg" fontWeight="bold" mb={2}>
<Text fontSize="lg" fontWeight="bold" mb={2} color={headingColor}>
{children}
</Text>
),
h3: ({ children }) => (
<Text fontSize="md" fontWeight="bold" mb={2}>
<Text fontSize="md" fontWeight="bold" mb={2} color={headingColor}>
{children}
</Text>
),
@@ -100,20 +226,46 @@ export const MarkdownWithCharts = ({ content }) => {
</Box>
),
li: ({ children }) => (
<Box as="li" fontSize="sm" mb={1}>
<Box as="li" fontSize="sm" mb={1} color={textColor}>
{children}
</Box>
),
code: ({ inline, children }) =>
inline ? (
<Code fontSize="sm" px={1}>
// 处理代码块和行内代码
code: ({ node, inline, className, children, ...props }) => {
// 检查是否是代码块(通过父元素是否为 pre 或通过 className 判断)
const isCodeBlock = !inline && (className || (node?.position?.start?.line !== node?.position?.end?.line));
if (isCodeBlock) {
// 代码块样式
return (
<Code
display="block"
p={3}
borderRadius="md"
fontSize="sm"
whiteSpace="pre-wrap"
bg={codeBg}
overflowX="auto"
maxW="100%"
{...props}
>
{children}
</Code>
);
}
// 行内代码样式
return (
<Code fontSize="sm" px={1} bg={codeBg} {...props}>
{children}
</Code>
) : (
<Code display="block" p={3} borderRadius="md" fontSize="sm" whiteSpace="pre-wrap">
{children}
</Code>
),
);
},
// 处理 pre 元素,防止嵌套问题
pre: ({ children }) => (
<Box as="pre" my={2} overflow="hidden" borderRadius="md">
{children}
</Box>
),
blockquote: ({ children }) => (
<Box
borderLeftWidth="4px"
@@ -121,11 +273,60 @@ export const MarkdownWithCharts = ({ content }) => {
pl={4}
py={2}
fontStyle="italic"
color="gray.600"
color={blockquoteColor}
>
{children}
</Box>
),
// 表格渲染
table: ({ children }) => (
<TableContainer
mb={4}
borderRadius="md"
border="1px solid"
borderColor={isDark ? 'rgba(255, 255, 255, 0.1)' : 'gray.200'}
overflowX="auto"
>
<Table size="sm" variant="simple">
{children}
</Table>
</TableContainer>
),
thead: ({ children }) => (
<Thead bg={isDark ? 'rgba(255, 255, 255, 0.05)' : 'gray.50'}>
{children}
</Thead>
),
tbody: ({ children }) => <Tbody>{children}</Tbody>,
tr: ({ children }) => (
<Tr
_hover={{
bg: isDark ? 'rgba(255, 255, 255, 0.03)' : 'gray.50'
}}
>
{children}
</Tr>
),
th: ({ children }) => (
<Th
fontSize="xs"
color={headingColor}
borderColor={isDark ? 'rgba(255, 255, 255, 0.1)' : 'gray.200'}
py={2}
>
{children}
</Th>
),
td: ({ children }) => (
<Td
fontSize="sm"
color={textColor}
borderColor={isDark ? 'rgba(255, 255, 255, 0.1)' : 'gray.200'}
py={2}
>
{children}
</Td>
),
}}
>
{part.content}
@@ -134,34 +335,21 @@ export const MarkdownWithCharts = ({ content }) => {
);
} else if (part.type === 'chart') {
// 渲染 ECharts 图表
// 清理可能的残留字符
let cleanContent = part.content.trim();
cleanContent = cleanContent.replace(/```\s*$/g, '').trim();
// 调试日志
console.log('[MarkdownWithCharts] Rendering chart, content length:', cleanContent.length);
console.log('[MarkdownWithCharts] Content preview:', cleanContent.substring(0, 100));
// 验证 JSON 是否可以解析
try {
// 清理可能的 Markdown 残留符号
let cleanContent = part.content.trim();
// 移除可能的前后空白和不可见字符
cleanContent = cleanContent.replace(/^\s+|\s+$/g, '');
// 尝试解析 JSON
const chartOption = JSON.parse(cleanContent);
// 验证是否是有效的 ECharts 配置
if (!chartOption || typeof chartOption !== 'object') {
throw new Error('Invalid chart configuration: not an object');
}
return (
<Box key={index}>
<EChartsRenderer option={chartOption} height={350} />
</Box>
);
} catch (error) {
// 记录详细的错误信息
logger.error('解析 ECharts 配置失败', {
error: error.message,
contentLength: part.content.length,
contentPreview: part.content.substring(0, 200),
errorStack: error.stack
});
const testParse = JSON.parse(cleanContent);
console.log('[MarkdownWithCharts] JSON valid, has series:', !!testParse.series);
} catch (e) {
console.error('[MarkdownWithCharts] JSON parse error:', e.message);
console.log('[MarkdownWithCharts] Problematic content:', cleanContent.substring(0, 300));
return (
<Alert status="warning" key={index} borderRadius="md">
@@ -171,16 +359,29 @@ export const MarkdownWithCharts = ({ content }) => {
图表配置解析失败
</Text>
<Text fontSize="xs" color="gray.600">
错误: {error.message}
错误: {e.message}
</Text>
<Code fontSize="xs" maxW="100%" overflow="auto" whiteSpace="pre-wrap">
{part.content.substring(0, 300)}
{part.content.length > 300 ? '...' : ''}
{cleanContent.substring(0, 300)}
{cleanContent.length > 300 ? '...' : ''}
</Code>
</VStack>
</Alert>
);
}
return (
<Box
key={index}
w="100%"
minW="300px"
my={3}
borderRadius="md"
overflow="hidden"
>
<StableChart jsonString={cleanContent} height={350} variant={variant} />
</Box>
);
}
return null;
})}

View File

@@ -23,8 +23,8 @@ import { FiTarget, FiCheckCircle, FiXCircle, FiClock, FiTool } from 'react-icons
* 执行计划卡片组件
*/
export const PlanCard = ({ plan, stepResults }) => {
const cardBg = useColorModeValue('blue.50', 'blue.900');
const borderColor = useColorModeValue('blue.200', 'blue.700');
const cardBg = useColorModeValue('blue.50', 'rgba(40, 45, 50, 0.8)');
const borderColor = useColorModeValue('blue.200', 'rgba(255, 215, 0, 0.3)');
const successColor = useColorModeValue('green.500', 'green.300');
const errorColor = useColorModeValue('red.500', 'red.300');
const pendingColor = useColorModeValue('gray.400', 'gray.500');
@@ -73,7 +73,7 @@ export const PlanCard = ({ plan, stepResults }) => {
<Icon as={FiTarget} color="blue.500" boxSize={5} />
<Text fontWeight="bold" fontSize="md">执行目标</Text>
</HStack>
<Text fontSize="sm" color="gray.600" pl={7}>
<Text fontSize="sm" color={useColorModeValue('gray.600', '#9BA1A6')} pl={7}>
{plan.goal}
</Text>
@@ -83,7 +83,7 @@ export const PlanCard = ({ plan, stepResults }) => {
{plan.reasoning && (
<>
<Text fontSize="sm" fontWeight="bold">规划思路</Text>
<Text fontSize="sm" color="gray.600">
<Text fontSize="sm" color={useColorModeValue('gray.600', '#9BA1A6')}>
{plan.reasoning}
</Text>
<Divider />
@@ -106,7 +106,7 @@ export const PlanCard = ({ plan, stepResults }) => {
<HStack
key={index}
p={2}
bg={useColorModeValue('white', 'gray.700')}
bg={useColorModeValue('white', 'rgba(50, 55, 60, 0.6)')}
borderRadius="md"
borderWidth="1px"
borderColor={stepColor}
@@ -129,7 +129,7 @@ export const PlanCard = ({ plan, stepResults }) => {
status === 'failed' ? '✗ 失败' : '⏳ 等待'}
</Badge>
</HStack>
<Text fontSize="xs" color="gray.600">
<Text fontSize="xs" color={useColorModeValue('gray.600', '#9BA1A6')}>
{step.reason}
</Text>
</VStack>

View File

@@ -23,8 +23,8 @@ import { FiChevronDown, FiChevronUp, FiCheckCircle, FiXCircle, FiClock, FiDataba
export const StepResultCard = ({ stepResult }) => {
const [isExpanded, setIsExpanded] = useState(false);
const cardBg = useColorModeValue('white', 'gray.700');
const borderColor = useColorModeValue('gray.200', 'gray.600');
const cardBg = useColorModeValue('white', 'rgba(40, 45, 50, 0.8)');
const borderColor = useColorModeValue('gray.200', 'rgba(255, 215, 0, 0.2)');
const successColor = useColorModeValue('green.500', 'green.300');
const errorColor = useColorModeValue('red.500', 'red.300');
@@ -80,7 +80,7 @@ export const StepResultCard = ({ stepResult }) => {
justify="space-between"
cursor="pointer"
onClick={() => setIsExpanded(!isExpanded)}
_hover={{ bg: useColorModeValue('gray.50', 'gray.600') }}
_hover={{ bg: useColorModeValue('gray.50', 'rgba(50, 55, 60, 0.7)') }}
>
<HStack flex={1}>
<Icon as={StatusIcon} color={`${statusColorScheme}.500`} boxSize={5} />
@@ -94,7 +94,7 @@ export const StepResultCard = ({ stepResult }) => {
stepResult.status === 'failed' ? '失败' : '执行中'}
</Badge>
</HStack>
<Text fontSize="xs" color="gray.500">
<Text fontSize="xs" color={useColorModeValue('gray.500', '#9BA1A6')}>
耗时: {stepResult.execution_time?.toFixed(2)}s
</Text>
</VStack>
@@ -140,7 +140,7 @@ export const StepResultCard = ({ stepResult }) => {
maxH="300px"
overflowY="auto"
p={2}
bg={useColorModeValue('gray.50', 'gray.800')}
bg={useColorModeValue('gray.50', 'rgba(25, 28, 32, 0.6)')}
borderRadius="md"
fontSize="xs"
>
@@ -155,7 +155,7 @@ export const StepResultCard = ({ stepResult }) => {
</Code>
))}
{stepResult.result.length > 3 && (
<Text fontSize="xs" color="gray.500">
<Text fontSize="xs" color={useColorModeValue('gray.500', '#9BA1A6')}>
...还有 {stepResult.result.length - 3} 条记录
</Text>
)}
@@ -172,7 +172,7 @@ export const StepResultCard = ({ stepResult }) => {
{stepResult.status === 'failed' && stepResult.error && (
<VStack align="stretch" spacing={2}>
<Text fontSize="xs" fontWeight="bold" color="red.500">错误信息:</Text>
<Text fontSize="xs" color="red.600" p={2} bg="red.50" borderRadius="md">
<Text fontSize="xs" color={useColorModeValue('red.600', 'red.300')} p={2} bg={useColorModeValue('red.50', 'rgba(220, 38, 38, 0.15)')} borderRadius="md">
{stepResult.error}
</Text>
</VStack>

View File

@@ -82,29 +82,9 @@ const CitedContent = ({
...containerStyle
}}
>
{/* AI 标识 - 固定在右上角 */}
{showAIBadge && (
<Tag
icon={<RobotOutlined />}
color="purple"
style={{
position: 'absolute',
top: 12,
right: 12,
margin: 0,
zIndex: 10,
fontSize: 12,
padding: '2px 8px'
}}
className="ai-badge-responsive"
>
AI合成
</Tag>
)}
{/* 标题栏 */}
{title && (
<div style={{ marginBottom: 12, paddingRight: 80 }}>
<div style={{ marginBottom: 12 }}>
<Text strong style={{ fontSize: 14, color: finalTitleColor }}>
{title}
</Text>
@@ -112,10 +92,24 @@ const CitedContent = ({
)}
{/* 带引用的文本内容 */}
<div style={{
lineHeight: 1.8,
paddingRight: title ? 0 : (showAIBadge ? 80 : 0)
}}>
<div style={{ lineHeight: 1.8 }}>
{/* AI 标识 - 行内显示在文字前面 */}
{showAIBadge && (
<Tag
icon={<RobotOutlined />}
color="purple"
style={{
fontSize: 12,
padding: '2px 8px',
marginRight: 8,
verticalAlign: 'middle',
display: 'inline-flex',
}}
className="ai-badge-responsive"
>
AI合成
</Tag>
)}
{/* 前缀标签(如果有) */}
{prefix && (
<Text style={{

View File

@@ -13,10 +13,10 @@ import {
Text,
useColorModeValue,
} from '@chakra-ui/react';
import moment from 'moment';
import 'moment/locale/zh-cn';
import dayjs from 'dayjs';
import 'dayjs/locale/zh-cn';
moment.locale('zh-cn');
dayjs.locale('zh-cn');
const CommentItem = ({ comment }) => {
const itemBg = useColorModeValue('gray.50', 'gray.700');
@@ -26,8 +26,8 @@ const CommentItem = ({ comment }) => {
// 格式化时间
const formatTime = (timestamp) => {
const now = moment();
const time = moment(timestamp);
const now = dayjs();
const time = dayjs(timestamp);
const diffMinutes = now.diff(time, 'minutes');
const diffHours = now.diff(time, 'hours');
const diffDays = now.diff(time, 'days');

View File

@@ -1,20 +1,25 @@
import Image from "../Image";
import React from 'react';
import Image from '../Image';
const Generating = ({ className }) => (
<div
className={`flex items-center h-[3.375rem] px-6 bg-n-8/80 rounded-[1.6875rem] ${
className || ""
} text-base`}
>
<Image
className="w-5 h-5 mr-4"
src="/images/loading.png"
width={20}
height={20}
alt="Loading"
/>
AI is generating|
</div>
interface GeneratingProps {
className?: string;
}
const Generating: React.FC<GeneratingProps> = ({ className }) => (
<div
className={`flex items-center h-[3.375rem] px-6 bg-n-8/80 rounded-[1.6875rem] ${
className || ''
} text-base`}
>
<Image
className="w-5 h-5 mr-4"
src="/images/loading.png"
width={20}
height={20}
alt="Loading"
/>
AI is generating|
</div>
);
export default Generating;

View File

@@ -1,102 +1,55 @@
// src/components/GlobalComponents.js
// 集中管理应用的全局组件
import React from 'react';
import { useLocation } from 'react-router-dom';
import { useNotification } from '../contexts/NotificationContext';
import { logger } from '../utils/logger';
import React, { useMemo } from 'react';
import { useSelector } from 'react-redux';
import { selectIsMobile } from '@/store/slices/deviceSlice';
// Global Components
import AuthModalManager from './Auth/AuthModalManager';
import NotificationContainer from './NotificationContainer';
import ConnectionStatusBar from './ConnectionStatusBar';
import ScrollToTop from './ScrollToTop';
// Bytedesk客服组件
import BytedeskWidget from '../bytedesk-integration/components/BytedeskWidget';
import { getBytedeskConfig, shouldShowCustomerService } from '../bytedesk-integration/config/bytedesk.config';
/**
* ConnectionStatusBar 包装组件
* 需要在 NotificationProvider 内部使用,所以在这里包装
*/
function ConnectionStatusBarWrapper() {
const { connectionStatus, reconnectAttempt, maxReconnectAttempts, retryConnection } = useNotification();
const [isDismissed, setIsDismissed] = React.useState(false);
// 监听连接状态变化
React.useEffect(() => {
// 重连成功后,清除 dismissed 状态
if (connectionStatus === 'connected' && isDismissed) {
setIsDismissed(false);
// 从 localStorage 清除 dismissed 标记
localStorage.removeItem('connection_status_dismissed');
}
// 从 localStorage 恢复 dismissed 状态
if (connectionStatus !== 'connected' && !isDismissed) {
const dismissed = localStorage.getItem('connection_status_dismissed');
if (dismissed === 'true') {
setIsDismissed(true);
}
}
}, [connectionStatus, isDismissed]);
const handleClose = () => {
// 用户手动关闭,保存到 localStorage
setIsDismissed(true);
localStorage.setItem('connection_status_dismissed', 'true');
logger.info('App', 'Connection status bar dismissed by user');
};
return (
<ConnectionStatusBar
status={connectionStatus}
reconnectAttempt={reconnectAttempt}
maxReconnectAttempts={maxReconnectAttempts}
onRetry={retryConnection}
onClose={handleClose}
isDismissed={isDismissed}
/>
);
}
import { getBytedeskConfig } from '../bytedesk-integration/config/bytedesk.config';
/**
* GlobalComponents - 全局组件容器
* 集中管理所有全局级别的组件,如弹窗、通知、状态栏等
*
* 包含的组件:
* - ConnectionStatusBarWrapper: Socket 连接状态条
* - ScrollToTop: 路由切换时自动滚动到顶部
* - AuthModalManager: 认证弹窗管理器
* - NotificationContainer: 通知容器
* - BytedeskWidget: Bytedesk在线客服 (条件性显示,在/和/home页隐藏)
* - NotificationContainer: 通知容器(仅桌面端渲染)
* - BytedeskWidget: Bytedesk在线客服
*
* 注意:
* - ConnectionStatusBar 已移除(所有端)
* - NotificationContainer 在移动端不渲染(通知功能已在 NotificationContext 层禁用)
*/
export function GlobalComponents() {
const location = useLocation();
const showBytedesk = shouldShowCustomerService(location.pathname);
const isMobile = useSelector(selectIsMobile);
// ✅ 缓存 Bytedesk 配置对象,避免每次渲染都创建新引用导致重新加载
const bytedeskConfigMemo = useMemo(() => getBytedeskConfig(), []);
return (
<>
{/* Socket 连接状态条 */}
<ConnectionStatusBarWrapper />
{/* 路由切换时自动滚动到顶部 */}
<ScrollToTop />
{/* 认证弹窗管理器 */}
<AuthModalManager />
{/* 通知容器 */}
<NotificationContainer />
{/* 通知容器(仅桌面端渲染) */}
{!isMobile && <NotificationContainer />}
{/* Bytedesk在线客服 - 根据路径条件性显示 */}
{showBytedesk && (
<BytedeskWidget
config={getBytedeskConfig()}
autoLoad={true}
/>
)}
{/* Bytedesk在线客服 - 使用缓存的配置对象 */}
<BytedeskWidget
config={bytedeskConfigMemo}
autoLoad={true}
/>
</>
);
}

View File

@@ -1,17 +1,21 @@
import { useState } from "react";
import React, { useState } from 'react';
const Image = ({ className, ...props }) => {
const [loaded, setLoaded] = useState(false);
interface ImageProps extends React.ImgHTMLAttributes<HTMLImageElement> {
className?: string;
}
return (
<img
className={`inline-block align-top opacity-0 transition-opacity ${
loaded && "opacity-100"
} ${className}`}
onLoad={() => setLoaded(true)}
{...props}
/>
);
const Image: React.FC<ImageProps> = ({ className, ...props }) => {
const [loaded, setLoaded] = useState(false);
return (
<img
className={`inline-block align-top opacity-0 transition-opacity ${
loaded && 'opacity-100'
} ${className || ''}`}
onLoad={() => setLoaded(true)}
{...props}
/>
);
};
export default Image;

View File

@@ -0,0 +1,309 @@
/**
* 图片灯箱组件
* 点击图片放大查看
*/
import React, { useState } from 'react';
import {
Modal,
ModalOverlay,
ModalContent,
ModalBody,
ModalCloseButton,
Image,
Box,
IconButton,
HStack,
useDisclosure,
} from '@chakra-ui/react';
import { ChevronLeft, ChevronRight, X, ZoomIn } from 'lucide-react';
import { motion, AnimatePresence } from 'framer-motion';
const MotionBox = motion(Box);
/**
* 单图片灯箱
*/
export const ImageLightbox = ({ src, alt, ...props }) => {
const { isOpen, onOpen, onClose } = useDisclosure();
return (
<>
{/* 缩略图 */}
<Box
position="relative"
cursor="pointer"
onClick={onOpen}
_hover={{
'& .zoom-icon': {
opacity: 1,
},
}}
{...props}
>
<Image
src={src}
alt={alt}
w="100%"
h="100%"
objectFit="cover"
borderRadius="md"
transition="all 0.3s"
_hover={{
transform: 'scale(1.05)',
filter: 'brightness(0.8)',
}}
/>
{/* 放大图标 */}
<Box
className="zoom-icon"
position="absolute"
top="50%"
left="50%"
transform="translate(-50%, -50%)"
opacity={0}
transition="opacity 0.3s"
pointerEvents="none"
>
<Box
bg="blackAlpha.700"
borderRadius="full"
p="3"
>
<ZoomIn size={32} color="white" />
</Box>
</Box>
</Box>
{/* 灯箱模态框 */}
<Modal isOpen={isOpen} onClose={onClose} size="full" isCentered>
<ModalOverlay bg="blackAlpha.900" backdropFilter="blur(10px)" />
<ModalContent bg="transparent" boxShadow="none">
<ModalCloseButton
position="fixed"
top="4"
right="4"
size="lg"
color="white"
bg="blackAlpha.600"
_hover={{ bg: 'blackAlpha.800' }}
borderRadius="full"
zIndex={2}
/>
<ModalBody display="flex" alignItems="center" justifyContent="center" p="0">
<MotionBox
initial={{ opacity: 0, scale: 0.9 }}
animate={{ opacity: 1, scale: 1 }}
exit={{ opacity: 0, scale: 0.9 }}
transition={{ duration: 0.3 }}
maxW="90vw"
maxH="90vh"
>
<Image
src={src}
alt={alt}
maxW="100%"
maxH="90vh"
objectFit="contain"
borderRadius="lg"
/>
</MotionBox>
</ModalBody>
</ModalContent>
</Modal>
</>
);
};
/**
* 多图片轮播灯箱
*/
export const ImageGalleryLightbox = ({ images, initialIndex = 0, ...props }) => {
const { isOpen, onOpen, onClose } = useDisclosure();
const [currentIndex, setCurrentIndex] = useState(initialIndex);
const handleOpen = (index) => {
setCurrentIndex(index);
onOpen();
};
const handlePrev = () => {
setCurrentIndex((prev) => (prev === 0 ? images.length - 1 : prev - 1));
};
const handleNext = () => {
setCurrentIndex((prev) => (prev === images.length - 1 ? 0 : prev + 1));
};
const handleKeyDown = (e) => {
if (e.key === 'ArrowLeft') handlePrev();
if (e.key === 'ArrowRight') handleNext();
if (e.key === 'Escape') onClose();
};
return (
<>
{/* 缩略图网格 */}
<HStack spacing="2" flexWrap="wrap" {...props}>
{images.map((image, index) => (
<Box
key={index}
position="relative"
cursor="pointer"
onClick={() => handleOpen(index)}
_hover={{
'& .zoom-icon': {
opacity: 1,
},
}}
>
<Image
src={image.src || image}
alt={image.alt || `图片 ${index + 1}`}
w="150px"
h="150px"
objectFit="cover"
borderRadius="md"
transition="all 0.3s"
_hover={{
transform: 'scale(1.05)',
filter: 'brightness(0.8)',
}}
/>
{/* 放大图标 */}
<Box
className="zoom-icon"
position="absolute"
top="50%"
left="50%"
transform="translate(-50%, -50%)"
opacity={0}
transition="opacity 0.3s"
pointerEvents="none"
>
<Box bg="blackAlpha.700" borderRadius="full" p="2">
<ZoomIn size={24} color="white" />
</Box>
</Box>
</Box>
))}
</HStack>
{/* 灯箱模态框(带轮播) */}
<Modal
isOpen={isOpen}
onClose={onClose}
size="full"
isCentered
onKeyDown={handleKeyDown}
>
<ModalOverlay bg="blackAlpha.900" backdropFilter="blur(10px)" />
<ModalContent bg="transparent" boxShadow="none">
{/* 关闭按钮 */}
<IconButton
icon={<X />}
position="fixed"
top="4"
right="4"
size="lg"
color="white"
bg="blackAlpha.600"
_hover={{ bg: 'blackAlpha.800' }}
borderRadius="full"
zIndex={2}
onClick={onClose}
/>
<ModalBody
display="flex"
alignItems="center"
justifyContent="center"
p="0"
position="relative"
>
{/* 左箭头 */}
{images.length > 1 && (
<IconButton
icon={<ChevronLeft />}
position="absolute"
left="4"
top="50%"
transform="translateY(-50%)"
size="lg"
color="white"
bg="blackAlpha.600"
_hover={{ bg: 'blackAlpha.800' }}
borderRadius="full"
zIndex={2}
onClick={handlePrev}
/>
)}
{/* 图片 */}
<AnimatePresence mode="wait">
<MotionBox
key={currentIndex}
initial={{ opacity: 0, scale: 0.9 }}
animate={{ opacity: 1, scale: 1 }}
exit={{ opacity: 0, scale: 0.9 }}
transition={{ duration: 0.3 }}
maxW="90vw"
maxH="90vh"
>
<Image
src={images[currentIndex].src || images[currentIndex]}
alt={images[currentIndex].alt || `图片 ${currentIndex + 1}`}
maxW="100%"
maxH="90vh"
objectFit="contain"
borderRadius="lg"
/>
</MotionBox>
</AnimatePresence>
{/* 右箭头 */}
{images.length > 1 && (
<IconButton
icon={<ChevronRight />}
position="absolute"
right="4"
top="50%"
transform="translateY(-50%)"
size="lg"
color="white"
bg="blackAlpha.600"
_hover={{ bg: 'blackAlpha.800' }}
borderRadius="full"
zIndex={2}
onClick={handleNext}
/>
)}
{/* 图片计数 */}
{images.length > 1 && (
<Box
position="absolute"
bottom="4"
left="50%"
transform="translateX(-50%)"
bg="blackAlpha.700"
color="white"
px="4"
py="2"
borderRadius="full"
fontSize="sm"
fontWeight="600"
>
{currentIndex + 1} / {images.length}
</Box>
)}
</ModalBody>
</ModalContent>
</Modal>
</>
);
};
export default ImageLightbox;

View File

@@ -0,0 +1,270 @@
/**
* 图片预览弹窗组件
* 支持多张图片左右切换、缩放、下载
*/
import React, { useState } from 'react';
import {
Modal,
ModalOverlay,
ModalContent,
ModalBody,
ModalCloseButton,
Image,
IconButton,
HStack,
Text,
Box,
} from '@chakra-ui/react';
import { ChevronLeft, ChevronRight, Download, ZoomIn, ZoomOut } from 'lucide-react';
import { motion, AnimatePresence } from 'framer-motion';
const MotionBox = motion(Box);
const ImagePreviewModal = ({ isOpen, onClose, images = [], initialIndex = 0 }) => {
const [currentIndex, setCurrentIndex] = useState(initialIndex);
const [scale, setScale] = useState(1);
// 切换到上一张
const handlePrevious = () => {
setCurrentIndex((prev) => (prev - 1 + images.length) % images.length);
setScale(1); // 重置缩放
};
// 切换到下一张
const handleNext = () => {
setCurrentIndex((prev) => (prev + 1) % images.length);
setScale(1); // 重置缩放
};
// 放大
const handleZoomIn = () => {
setScale((prev) => Math.min(prev + 0.25, 3));
};
// 缩小
const handleZoomOut = () => {
setScale((prev) => Math.max(prev - 0.25, 0.5));
};
// 下载图片
const handleDownload = () => {
const link = document.createElement('a');
link.href = images[currentIndex];
link.download = `image-${currentIndex + 1}.jpg`;
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
};
// 键盘快捷键
React.useEffect(() => {
const handleKeyDown = (e) => {
if (!isOpen) return;
switch (e.key) {
case 'ArrowLeft':
handlePrevious();
break;
case 'ArrowRight':
handleNext();
break;
case 'Escape':
onClose();
break;
case '+':
case '=':
handleZoomIn();
break;
case '-':
handleZoomOut();
break;
default:
break;
}
};
window.addEventListener('keydown', handleKeyDown);
return () => window.removeEventListener('keydown', handleKeyDown);
}, [isOpen, currentIndex]);
// 关闭时重置状态
const handleClose = () => {
setScale(1);
setCurrentIndex(initialIndex);
onClose();
};
if (!images || images.length === 0) return null;
return (
<Modal isOpen={isOpen} onClose={handleClose} size="full" isCentered>
<ModalOverlay bg="blackAlpha.900" backdropFilter="blur(10px)" />
<ModalContent bg="transparent" boxShadow="none" m="0">
<ModalCloseButton
size="lg"
color="white"
bg="blackAlpha.600"
_hover={{ bg: 'blackAlpha.800' }}
zIndex="2"
top="20px"
right="20px"
/>
<ModalBody
display="flex"
alignItems="center"
justifyContent="center"
position="relative"
p="0"
>
{/* 图片显示区域 */}
<AnimatePresence mode="wait">
<MotionBox
key={currentIndex}
initial={{ opacity: 0, scale: 0.9 }}
animate={{ opacity: 1, scale: 1 }}
exit={{ opacity: 0, scale: 0.9 }}
transition={{ duration: 0.3 }}
display="flex"
alignItems="center"
justifyContent="center"
maxH="90vh"
maxW="90vw"
>
<Image
src={images[currentIndex]}
alt={`图片 ${currentIndex + 1}`}
maxH="90vh"
maxW="90vw"
objectFit="contain"
transform={`scale(${scale})`}
transition="transform 0.3s"
cursor={scale > 1 ? 'grab' : 'default'}
userSelect="none"
/>
</MotionBox>
</AnimatePresence>
{/* 左右切换按钮(仅多张图片时显示) */}
{images.length > 1 && (
<>
<IconButton
icon={<ChevronLeft size={32} />}
position="absolute"
left="20px"
top="50%"
transform="translateY(-50%)"
onClick={handlePrevious}
size="lg"
borderRadius="full"
bg="blackAlpha.600"
color="white"
_hover={{ bg: 'blackAlpha.800', transform: 'translateY(-50%) scale(1.1)' }}
_active={{ transform: 'translateY(-50%) scale(0.95)' }}
aria-label="上一张"
zIndex="2"
/>
<IconButton
icon={<ChevronRight size={32} />}
position="absolute"
right="20px"
top="50%"
transform="translateY(-50%)"
onClick={handleNext}
size="lg"
borderRadius="full"
bg="blackAlpha.600"
color="white"
_hover={{ bg: 'blackAlpha.800', transform: 'translateY(-50%) scale(1.1)' }}
_active={{ transform: 'translateY(-50%) scale(0.95)' }}
aria-label="下一张"
zIndex="2"
/>
</>
)}
{/* 底部工具栏 */}
<Box
position="absolute"
bottom="30px"
left="50%"
transform="translateX(-50%)"
bg="blackAlpha.700"
borderRadius="full"
px="6"
py="3"
backdropFilter="blur(10px)"
zIndex="2"
>
<HStack spacing="4">
{/* 缩放控制 */}
<HStack spacing="2">
<IconButton
icon={<ZoomOut size={18} />}
size="sm"
variant="ghost"
color="white"
onClick={handleZoomOut}
isDisabled={scale <= 0.5}
_hover={{ bg: 'whiteAlpha.200' }}
aria-label="缩小"
/>
<Text color="white" fontSize="sm" fontWeight="500" minW="60px" textAlign="center">
{Math.round(scale * 100)}%
</Text>
<IconButton
icon={<ZoomIn size={18} />}
size="sm"
variant="ghost"
color="white"
onClick={handleZoomIn}
isDisabled={scale >= 3}
_hover={{ bg: 'whiteAlpha.200' }}
aria-label="放大"
/>
</HStack>
{/* 下载按钮 */}
<IconButton
icon={<Download size={18} />}
size="sm"
variant="ghost"
color="white"
onClick={handleDownload}
_hover={{ bg: 'whiteAlpha.200' }}
aria-label="下载图片"
/>
{/* 图片计数(仅多张图片时显示) */}
{images.length > 1 && (
<Text color="white" fontSize="sm" fontWeight="500">
{currentIndex + 1} / {images.length}
</Text>
)}
</HStack>
</Box>
{/* 快捷键提示 */}
<Box
position="absolute"
top="80px"
left="20px"
bg="blackAlpha.600"
borderRadius="md"
px="4"
py="2"
backdropFilter="blur(10px)"
>
<Text color="whiteAlpha.800" fontSize="xs">
快捷键: 切换 | + - 缩放 | ESC 关闭
</Text>
</Box>
</ModalBody>
</ModalContent>
</Modal>
);
};
export default ImagePreviewModal;

View File

@@ -1,73 +0,0 @@
import Section from "@/components/Section";
import Image from "@/components/Image";
import Button from "@/components/Button";
type JoinProps = {};
const Join = ({}: JoinProps) => (
<Section crosses>
<div className="container">
<div className="relative max-w-[43.125rem] mx-auto py-8 md:py-14 xl:py-0">
<div className="relative z-1 text-center">
<h1 className="h1 mb-6">
Be part of the future of{" "}
<span className="inline-block relative">
Brainwave
<Image
className="absolute top-full left-0 w-full"
src="/images/curve.png"
width={624}
height={28}
alt="Curve"
/>
</span>
</h1>
<p className="body-1 mb-8 text-n-4">
Unleash the power of AI within Brainwave. Upgrade your
productivity with Brainwave, the open AI chat app.
</p>
<Button href="/pricing" white>
Get started
</Button>
</div>
<div className="absolute top-1/2 left-1/2 w-[46.5rem] h-[46.5rem] border border-n-2/5 rounded-full -translate-x-1/2 -translate-y-1/2 pointer-events-none">
<div className="absolute top-1/2 left-1/2 w-[39.25rem] h-[39.25rem] border border-n-2/10 rounded-full -translate-x-1/2 -translate-y-1/2"></div>
<div className="absolute top-1/2 left-1/2 w-[30.625rem] h-[30.625rem] border border-n-2/10 rounded-full -translate-x-1/2 -translate-y-1/2"></div>
<div className="absolute top-1/2 left-1/2 w-[21.5rem] h-[21.5rem] border border-n-2/10 rounded-full -translate-x-1/2 -translate-y-1/2"></div>
<div className="absolute top-1/2 left-1/2 w-[13.75rem] h-[13.75rem] border border-n-2/10 rounded-full -translate-x-1/2 -translate-y-1/2"></div>
</div>
<div className="absolute top-1/2 left-1/2 w-[46.5rem] h-[46.5rem] border border-n-2/5 rounded-full -translate-x-1/2 -translate-y-1/2 opacity-60 mix-blend-color-dodge pointer-events-none">
<div className="absolute top-1/2 left-1/2 w-[58.85rem] h-[58.85rem] -translate-x-3/4 -translate-y-1/2">
<Image
className="w-full"
src="/images/gradient.png"
width={942}
height={942}
alt="Gradient"
/>
</div>
</div>
</div>
</div>
<div className="absolute -top-[5.75rem] left-[18.5rem] -z-1 w-[19.8125rem] pointer-events-none lg:-top-15 lg:left-[5.5rem]">
<Image
className="w-full"
src="/images/join/shapes-1.svg"
width={317}
height={293}
alt="Shapes 1"
/>
</div>
<div className="absolute right-[15rem] -bottom-[7rem] -z-1 w-[28.1875rem] pointer-events-none lg:right-7 lg:-bottom-[5rem]">
<Image
className="w-full"
src="/images/join/shapes-2.svg"
width={451}
height={266}
alt="Shapes 2"
/>
</div>
</Section>
);
export default Join;

View File

@@ -1,73 +0,0 @@
import Section from "@/components/Section";
import Image from "@/components/Image";
import Button from "@/components/Button";
type JoinProps = {};
const Join = ({}: JoinProps) => (
<Section crosses>
<div className="container">
<div className="relative max-w-[43.125rem] mx-auto py-8 md:py-14 xl:py-0">
<div className="relative z-1 text-center">
<h1 className="h1 mb-6">
Be part of the future of{" "}
<span className="inline-block relative">
Brainwave
<Image
className="absolute top-full left-0 w-full"
src="/images/curve.png"
width={624}
height={28}
alt="Curve"
/>
</span>
</h1>
<p className="body-1 mb-8 text-n-4">
Unleash the power of AI within Brainwave. Upgrade your
productivity with Brainwave, the open AI chat app.
</p>
<Button href="/pricing" white>
Get started
</Button>
</div>
<div className="absolute top-1/2 left-1/2 w-[46.5rem] h-[46.5rem] border border-n-2/5 rounded-full -translate-x-1/2 -translate-y-1/2 pointer-events-none">
<div className="absolute top-1/2 left-1/2 w-[39.25rem] h-[39.25rem] border border-n-2/10 rounded-full -translate-x-1/2 -translate-y-1/2"></div>
<div className="absolute top-1/2 left-1/2 w-[30.625rem] h-[30.625rem] border border-n-2/10 rounded-full -translate-x-1/2 -translate-y-1/2"></div>
<div className="absolute top-1/2 left-1/2 w-[21.5rem] h-[21.5rem] border border-n-2/10 rounded-full -translate-x-1/2 -translate-y-1/2"></div>
<div className="absolute top-1/2 left-1/2 w-[13.75rem] h-[13.75rem] border border-n-2/10 rounded-full -translate-x-1/2 -translate-y-1/2"></div>
</div>
<div className="absolute top-1/2 left-1/2 w-[46.5rem] h-[46.5rem] border border-n-2/5 rounded-full -translate-x-1/2 -translate-y-1/2 opacity-60 mix-blend-color-dodge pointer-events-none">
<div className="absolute top-1/2 left-1/2 w-[58.85rem] h-[58.85rem] -translate-x-3/4 -translate-y-1/2">
<Image
className="w-full"
src="/images/gradient.png"
width={942}
height={942}
alt="Gradient"
/>
</div>
</div>
</div>
</div>
<div className="absolute -top-[5.75rem] left-[18.5rem] -z-1 w-[19.8125rem] pointer-events-none lg:-top-15 lg:left-[5.5rem]">
<Image
className="w-full"
src="/images/join/shapes-1.svg"
width={317}
height={293}
alt="Shapes 1"
/>
</div>
<div className="absolute right-[15rem] -bottom-[7rem] -z-1 w-[28.1875rem] pointer-events-none lg:right-7 lg:-bottom-[5rem]">
<Image
className="w-full"
src="/images/join/shapes-2.svg"
width={451}
height={266}
alt="Shapes 2"
/>
</div>
</Section>
);
export default Join;

View File

@@ -1,53 +0,0 @@
import Image from "../Image";
const Logos = ({ className }) => (
<div className={className}>
<h5 className="tagline mb-6 text-center text-n-1/50">
Helping people create beautiful content at
</h5>
<ul className="flex">
<li className="flex items-center justify-center flex-1 h-[8.5rem]">
<Image
src="/images/yourlogo.svg"
width={134}
height={28}
alt="Logo 3"
/>
</li>
<li className="flex items-center justify-center flex-1 h-[8.5rem]">
<Image
src="/images/yourlogo.svg"
width={134}
height={28}
alt="Logo 3"
/>
</li>
<li className="flex items-center justify-center flex-1 h-[8.5rem]">
<Image
src="/images/yourlogo.svg"
width={134}
height={28}
alt="Logo 3"
/>
</li>
<li className="flex items-center justify-center flex-1 h-[8.5rem]">
<Image
src="/images/yourlogo.svg"
width={134}
height={28}
alt="Logo 3"
/>
</li>
<li className="flex items-center justify-center flex-1 h-[8.5rem]">
<Image
src="/images/yourlogo.svg"
width={134}
height={28}
alt="Logo 3"
/>
</li>
</ul>
</div>
);
export default Logos;

View File

@@ -1,53 +0,0 @@
import Image from "../Image";
const Logos = ({ className }) => (
<div className={className}>
<h5 className="tagline mb-6 text-center text-n-1/50">
Helping people create beautiful content at
</h5>
<ul className="flex">
<li className="flex items-center justify-center flex-1 h-[8.5rem]">
<Image
src="/images/yourlogo.svg"
width={134}
height={28}
alt="Logo 3"
/>
</li>
<li className="flex items-center justify-center flex-1 h-[8.5rem]">
<Image
src="/images/yourlogo.svg"
width={134}
height={28}
alt="Logo 3"
/>
</li>
<li className="flex items-center justify-center flex-1 h-[8.5rem]">
<Image
src="/images/yourlogo.svg"
width={134}
height={28}
alt="Logo 3"
/>
</li>
<li className="flex items-center justify-center flex-1 h-[8.5rem]">
<Image
src="/images/yourlogo.svg"
width={134}
height={28}
alt="Logo 3"
/>
</li>
<li className="flex items-center justify-center flex-1 h-[8.5rem]">
<Image
src="/images/yourlogo.svg"
width={134}
height={28}
alt="Logo 3"
/>
</li>
</ul>
</div>
);
export default Logos;

Some files were not shown because too many files have changed in this diff Show More