Compare commits
426 Commits
origin_pro
...
06beeeaee4
| Author | SHA1 | Date | |
|---|---|---|---|
| 06beeeaee4 | |||
| d1a222d9e9 | |||
| bd86ccce85 | |||
| ed14031d65 | |||
| 9b16d9d162 | |||
| 7708cb1a69 | |||
| 2395d92b17 | |||
| 02d5311005 | |||
| 7fa3d26470 | |||
| 21eb1783e9 | |||
| ec31801ccd | |||
| ff9c68295b | |||
| a72978c200 | |||
| 2c4f5152e4 | |||
| 846e66fecb | |||
| ef6c58b247 | |||
| b753d29dbf | |||
| 455e1c1d32 | |||
| 7b65cac358 | |||
| 8843c81d8b | |||
| 6763151c57 | |||
| 9d9d3430b7 | |||
| 25c3d9d828 | |||
| 41368f82a7 | |||
| 608ac4a962 | |||
| 5a24cb9eec | |||
| 33a3c16421 | |||
| 2f8388ba41 | |||
| 4127e4c816 | |||
| 05aa0c89f0 | |||
| 14ab2f62f3 | |||
| fc738dc639 | |||
| 059275d1a2 | |||
| d14be2081d | |||
| 1676d69917 | |||
| 20b3d624f0 | |||
| 34323cc63d | |||
| 42fdb7d754 | |||
| 5526705254 | |||
| f6e8d673a8 | |||
| 547424fff6 | |||
| ec2978026a | |||
| 250d585b87 | |||
| 8cf2850660 | |||
| 9b7a221315 | |||
| 18f8f75116 | |||
| 56a7ca7eb3 | |||
| c1937b9e31 | |||
| 9c5900c7f5 | |||
| 007de2d76d | |||
| 49656e6e88 | |||
| bc6e993dec | |||
| 72a490c789 | |||
|
|
b88bfebcef | ||
|
|
cf4fdf6a68 | ||
|
|
34338373cd | ||
|
|
589e1c20f9 | ||
|
|
60e9a40a1f | ||
|
|
b8b24643fe | ||
|
|
e9e9ec9051 | ||
|
|
5b0e420770 | ||
|
|
93f43054fd | ||
|
|
101d042b0e | ||
|
|
a1aa6718e6 | ||
|
|
753727c1c0 | ||
|
|
afc92ee583 | ||
| 900aff17df | |||
|
|
d825e4fe59 | ||
|
|
62cf0a6c7d | ||
|
|
805d446775 | ||
|
|
24ddfcd4b5 | ||
|
|
a90158239b | ||
|
|
a8d4245595 | ||
|
|
5aedde7528 | ||
|
|
f5f89a1c72 | ||
|
|
e0b7f8c59d | ||
|
|
d22d75e761 | ||
|
|
30fc156474 | ||
|
|
572665199a | ||
|
|
a2831c82a8 | ||
|
|
217551b6ab | ||
|
|
022271947a | ||
|
|
cd6ffdbe68 | ||
|
|
9df725b748 | ||
|
|
64f8914951 | ||
|
|
506e5a448c | ||
|
|
e277352133 | ||
|
|
87437ed229 | ||
|
|
037471d880 | ||
|
|
0c482bc72c | ||
|
|
4aebb3bf4b | ||
|
|
ed241bd9c5 | ||
|
|
e6ede81c78 | ||
|
|
a0b688da80 | ||
|
|
6bd09b797d | ||
|
|
9c532b5f18 | ||
|
|
1d1d6c8169 | ||
|
|
3507cfe9f7 | ||
|
|
cc520893f8 | ||
|
|
dabedc1c0b | ||
|
|
7b4c4be7bf | ||
|
|
7a2c73f3ca | ||
|
|
105a0b02ea | ||
|
|
d8a4c20565 | ||
|
|
5f959fb44f | ||
|
|
ee78e00d3b | ||
|
|
2fcc341213 | ||
|
|
1090a2fc67 | ||
|
|
77f3949fe2 | ||
|
|
742ab337dc | ||
|
|
d2b6904a4a | ||
|
|
789a6229a7 | ||
|
|
6886a649f5 | ||
|
|
581e874b0d | ||
|
|
b23ed93020 | ||
|
|
84f70f3329 | ||
|
|
601b06d79e | ||
|
|
0818a7bff7 | ||
| ce19881181 | |||
| bef3e86f60 | |||
| 65deea43e2 | |||
| c7a881c965 | |||
| 6932796b00 | |||
|
|
03f1331202 | ||
|
|
c771f7cae6 | ||
|
|
0be357a1c5 | ||
|
|
9f907b3cba | ||
|
|
bb878c5346 | ||
|
|
1bc3241596 | ||
|
|
cb46971e0e | ||
| 6679d99cf9 | |||
| 2c55a53c3a | |||
| 6ad56b9882 | |||
| b9eddbe752 | |||
|
|
cb9f927e3e | ||
|
|
b9a587bac4 | ||
|
|
86259793cb | ||
| f76bd17160 | |||
| ce0e91a5fb | |||
| f873fdb9a6 | |||
| cc446fc0da | |||
| de30755271 | |||
| a2f33c2a8a | |||
| 761fe5d2f0 | |||
| 3677217fce | |||
| 177c1d6401 | |||
| fb066aa6b8 | |||
| 96bedb8439 | |||
| 83d7c19fed | |||
| e80d2cfcec | |||
| 412f2a3d79 | |||
| 4a0e156bec | |||
| 7743a8a26a | |||
| 72e3e56a63 | |||
| 388e9eb235 | |||
| bd23100192 | |||
|
|
887525197a | ||
|
|
f8bb46ae64 | ||
| 810c878a1e | |||
| 2607028f4f | |||
| ea166d59c4 | |||
|
|
982d8135e7 | ||
|
|
e61090810b | ||
|
|
2d49af3bea | ||
|
|
3a0898634f | ||
|
|
44ecf7e5c7 | ||
|
|
5183473557 | ||
|
|
41f1bbab1b | ||
|
|
f536d68753 | ||
|
|
9475027c0d | ||
|
|
851c148f7d | ||
|
|
ef7f91ba77 | ||
|
|
80084d607b | ||
|
|
dc789f57f7 | ||
|
|
528e61b961 | ||
|
|
e201f35b18 | ||
|
|
13040b5df8 | ||
|
|
9b068fd69f | ||
|
|
2f125a9207 | ||
| b4dcbd1db9 | |||
| c594650aa4 | |||
| 8c372bbc89 | |||
| 4054e2e106 | |||
| 0a149eaa0f | |||
| 3c7b55226c | |||
| 69d05b664e | |||
| ce2226793f | |||
| 07a4cdb357 | |||
| d9a169d2e0 | |||
| 76bf560b36 | |||
| 4a411c6d44 | |||
| dca70074c0 | |||
| 1f1aa896d1 | |||
| 134897c3aa | |||
| 19db421f9f | |||
| 1c290e0da2 | |||
| 15def1c931 | |||
| 7538f2d935 | |||
| 3fa3e52d65 | |||
| 2fb12e0cc7 | |||
| 13f8e2a4f1 | |||
| 7b3907a3bd | |||
| b582de9bc2 | |||
| acb7862789 | |||
| a778f94b68 | |||
| 23a94d5ab2 | |||
| d5250f7d3c | |||
| ae92f333c4 | |||
| 82146f7365 | |||
| 96346977ae | |||
|
|
0f410c55a5 | ||
|
|
a4b8a13e6d | ||
| f578969ee6 | |||
| 4da1d580fc | |||
| af362f3ceb | |||
| e01092365e | |||
| ad7c180e11 | |||
| 2111b1d25b | |||
| ddcbbc9da4 | |||
| 6515a47a42 | |||
| 0bcf6a93f7 | |||
| 5857144180 | |||
| 1ea001fa3d | |||
| 09420963d5 | |||
| d8a1dd7a03 | |||
|
|
098107f38e | ||
|
|
c2b80a727d | ||
|
|
745b9caeee | ||
| b1d042d0e3 | |||
| 04c13f3a6c | |||
| 173ddb985d | |||
| c487c33617 | |||
| 9251531eb7 | |||
| 738cc9cb87 | |||
| 7b9bb153cc | |||
| 33ae9e63a1 | |||
| c4efebdbda | |||
| 602888bbeb | |||
| 6a1e861977 | |||
| 31a3e429d7 | |||
| bbc2493ecd | |||
| eef1dbfe8d | |||
| aaef2272f1 | |||
| 9f2fd60228 | |||
| 2fc0cca482 | |||
| 2668affe88 | |||
| 32b4b772c5 | |||
| 115300a4e3 | |||
|
|
2964b4331a | ||
| cbc231a2b6 | |||
| a158319717 | |||
|
|
f361cb55f4 | ||
|
|
bcd67ed410 | ||
|
|
c391c4c980 | ||
|
|
7b2f5a18bc | ||
|
|
06916cdde5 | ||
|
|
5bb8a17588 | ||
|
|
ad2a374069 | ||
| f28bba6326 | |||
| 69a2c83bd0 | |||
| c5f21a517d | |||
| 6b9be7dad0 | |||
| 3526c8c51c | |||
| 13609163a7 | |||
| e4961a21ee | |||
| 4fcc3e1054 | |||
| b2c116cef4 | |||
| 1ad68bca6c | |||
| 4879121d2b | |||
| cde849b3a4 | |||
| 6c99cb83bf | |||
| 97fd1645d4 | |||
| a66d55237f | |||
| 1f7308a512 | |||
| cab5cc5d7b | |||
| 47e2380bd3 | |||
| 357c03aee2 | |||
| 75e7e7e19c | |||
| f56df0e956 | |||
| 75696b9e52 | |||
| 5e333ad7e7 | |||
| 70376b3544 | |||
| a15830c97e | |||
| a8d38e85d2 | |||
| dce6b5701f | |||
| 0fcb7322ed | |||
| 8e16d3cd3a | |||
| 9b436523ff | |||
| 59a5a03637 | |||
| 70af97e9ad | |||
| ebf7ddda6a | |||
| 68fa1d0717 | |||
| 8fb6992cf6 | |||
| 8f3e2bed70 | |||
| 8a87cd1b74 | |||
| 244968a1cb | |||
| 47be4584f9 | |||
| 42b7d2ee63 | |||
| d8e4c737c5 | |||
| a4b634abff | |||
| 15d521dd59 | |||
| 40b57c1a81 | |||
| 71f3834b79 | |||
| 20c6356842 | |||
| cd926bb42d | |||
| feb08dc746 | |||
| cddf82ce51 | |||
| eceb2e7da0 | |||
| 092c86f3d2 | |||
| 7498e87d31 | |||
| e778742590 | |||
| 990ca3663e | |||
| b9ed0f5449 | |||
| 077f8d9120 | |||
| 97371ae16a | |||
| aa3fe0d806 | |||
| e68acfe7d1 | |||
| c336be5cd7 | |||
| 1a845f54e9 | |||
| 781710ae53 | |||
| b5a0b7094a | |||
| 22bb57b52f | |||
| cd315a718f | |||
| ff2ad14246 | |||
|
|
baf4ca1ed4 | ||
|
|
3cd34d93c8 | ||
|
|
c9084ebb33 | ||
|
|
ed584b72d4 | ||
|
|
2dec587d37 | ||
|
|
7f021dcfa0 | ||
|
|
e34f5593b4 | ||
|
|
5f76530e80 | ||
|
|
d6c7d64e59 | ||
|
|
ceed71eca4 | ||
|
|
9669d5709e | ||
|
|
34bae35858 | ||
|
|
bc50d9fe3e | ||
|
|
39978c57d5 | ||
| b197d62c31 | |||
|
|
834067f679 | ||
| 564caa08c2 | |||
| 0aa050b95f | |||
| e22e8339a6 | |||
|
|
e8b3d13c0a | ||
| 8c787a8915 | |||
|
|
796c623197 | ||
| 690754e416 | |||
| 12d104cc22 | |||
|
|
a1c1a36f6a | ||
| 2b30d10451 | |||
| 8dfd344806 | |||
| 7c8310eeb6 | |||
| 30108b297c | |||
| 161bcec55e | |||
| 34f2d7dabd | |||
|
|
3e4b47dbfe | ||
|
|
e2861b994b | ||
| 6b9291a4f9 | |||
| 0818eeedf1 | |||
| 2a8d7438c8 | |||
| fdd58634e6 | |||
|
|
53fbda44e6 | ||
|
|
540b938525 | ||
|
|
8fe11efcd7 | ||
|
|
e753437b86 | ||
|
|
a6f69418f6 | ||
|
|
dfdd2f4134 | ||
|
|
4c79871ab4 | ||
| f8eb268341 | |||
| 665f5e8416 | |||
| be2da54d82 | |||
| 8bf4a0b6c6 | |||
| 412b2c03ed | |||
| 899500007d | |||
| d3879b3840 | |||
| 80fe74c041 | |||
| 78f7dca1f6 | |||
| 03aee75235 | |||
| 8eff6b1a95 | |||
| 80676dd622 | |||
| 082e644534 | |||
| b0b227a5ef | |||
| 691c4f6eb1 | |||
| d5a55c4e02 | |||
| 27cdf0aecd | |||
| 4a1157c0b6 | |||
| f515dc94f4 | |||
| 683e261756 | |||
| 8bdfd0389c | |||
| eae495ac34 | |||
| 958cedefb8 | |||
|
|
1fc9f4790f | ||
| b48ff99658 | |||
| ae558996b6 | |||
| 71742c0116 | |||
| 2ead50c37c | |||
| 9e8519bb94 | |||
| a4d16e7686 | |||
|
|
3eb31c99dc | ||
|
|
5f6b4b083b | ||
|
|
905023c056 | ||
|
|
25cc28e03b | ||
|
|
5f9901a098 | ||
|
|
28643d7c4a | ||
|
|
bb28e141e6 | ||
|
|
8fa273c8d4 | ||
|
|
17c04211bb | ||
|
|
c9419d3c14 | ||
|
|
dfc13c5737 | ||
|
|
de8d0ef1c3 | ||
|
|
65c16d65ac | ||
|
|
13a291b979 | ||
|
|
4d6da77aeb | ||
|
|
fc1f667700 | ||
|
|
46639030bb | ||
|
|
f747a0bdb2 | ||
|
|
9b55610167 | ||
|
|
a93fcfa9b9 | ||
|
|
8914a46c40 | ||
|
|
678eb6838e | ||
|
|
c06d3a88ae | ||
|
|
307c308739 | ||
|
|
cbb6517bb1 | ||
|
|
f33489f5d7 | ||
|
|
9ff77b570d | ||
|
|
de37546ddb |
@@ -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
|
||||
|
||||
15
.env.mock
@@ -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
|
||||
|
||||
@@ -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
@@ -48,6 +48,8 @@ Thumbs.db
|
||||
*.md
|
||||
!README.md
|
||||
!CLAUDE.md
|
||||
!docs/**/*.md
|
||||
|
||||
# 忽略 docs 目录(开发文档不提交到 Git)
|
||||
docs/
|
||||
|
||||
src/assets/img/original-backup/
|
||||
|
||||
@@ -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(事务型数据库)
|
||||
|
||||
@@ -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
@@ -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): 使用组件化架构替换内联渲染函数`
|
||||
|
||||
---
|
||||
BIN
__pycache__/app.cpython-310.pyc
Normal file
BIN
__pycache__/app_vx.cpython-310.pyc
Normal file
BIN
__pycache__/mcp_database.cpython-310.pyc
Normal file
BIN
__pycache__/mcp_elasticsearch.cpython-310.pyc
Normal file
BIN
__pycache__/mcp_quant.cpython-310.pyc
Normal file
BIN
__pycache__/mcp_server.cpython-310.pyc
Normal file
6352
app_vx_copy1.py
Normal file
1028
category_tree_openapi.json
Normal 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
1176
concept_hierarchy.json
Normal 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 处理
|
||||
},
|
||||
},
|
||||
}),
|
||||
}),
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
918
docs/BYTEDESK_INTEGRATION_GUIDE.md
Normal 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总大小约50KB(gzip后),首次加载后会被浏览器缓存。
|
||||
|
||||
### 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 # 本手册(参考)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**祝您集成顺利!**
|
||||
|
||||
如有任何问题,请随时联系技术支持。
|
||||
@@ -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
|
||||
@@ -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 onNewEvent(Toast + 列表更新)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ✅ 整合完成
|
||||
|
||||
所有代码和功能已经就绪!你现在可以:
|
||||
|
||||
1. ✅ 在 Mock 模式下测试实时推送
|
||||
2. ✅ 在 Real 模式下连接后端
|
||||
3. ✅ 查看右下角通知卡片
|
||||
4. ✅ 体验事件列表实时更新
|
||||
5. ✅ 随时切换 Mock/Real 模式
|
||||
|
||||
**祝测试顺利!🎉**
|
||||
576
docs/NEW_PAYMENT_SYSTEM_DESIGN.md
Normal 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
|
||||
@@ -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 错误
|
||||
@@ -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
|
||||
**维护者**: 数据分析团队
|
||||
@@ -1,841 +0,0 @@
|
||||
# PostHog 事件追踪实施总结
|
||||
|
||||
## ✅ 已完成的追踪
|
||||
|
||||
### 1. Home 页面(首页/落地页)
|
||||
|
||||
**已实施的追踪事件**:
|
||||
|
||||
#### 📄 页面浏览
|
||||
- **事件**: `LANDING_PAGE_VIEWED`
|
||||
- **触发时机**: 页面加载
|
||||
- **属性**:
|
||||
- `timestamp` - 访问时间
|
||||
- `is_authenticated` - 是否已登录
|
||||
- `user_id` - 用户ID(如果已登录)
|
||||
|
||||
#### 🎯 功能卡片点击
|
||||
- **事件**: `FEATURE_CARD_CLICKED`
|
||||
- **触发时机**: 用户点击任何功能卡片
|
||||
- **属性**:
|
||||
- `feature_id` - 功能ID(news-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个核心页面**。
|
||||
@@ -1,338 +0,0 @@
|
||||
# 崩溃修复测试指南
|
||||
|
||||
> 测试时间:2025-10-14
|
||||
> 测试范围:SignInIllustration.js + SignUpIllustration.js
|
||||
> 服务器地址:http://localhost:3000
|
||||
|
||||
---
|
||||
|
||||
## 🎯 测试目标
|
||||
|
||||
验证以下修复是否有效:
|
||||
- ✅ 响应对象崩溃(6处)
|
||||
- ✅ 组件卸载后 setState(6处)
|
||||
- ✅ 定时器内存泄漏(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
|
||||
|
||||
祝测试顺利!如发现问题请及时反馈。
|
||||
166
gunicorn_config.py
Normal 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
|
||||
"""
|
||||
249
mcp_database.py
@@ -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)}
|
||||
|
||||
@@ -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
1725
mcp_server.py
59
package.json
@@ -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",
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
module.exports = {
|
||||
plugins: [
|
||||
require('tailwindcss'),
|
||||
require('autoprefixer'),
|
||||
],
|
||||
}
|
||||
BIN
public/LOGO_badge.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
553
public/htmls/TPU芯片.html
Normal 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>
|
||||
736
public/htmls/券商合并预期.html
Normal 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. **投资价值**:
|
||||
- 明确的投资方向建议
|
||||
- 核心跟踪指标
|
||||
- 风险提示与应对策略
|
||||
|
||||
页面完全响应式设计,适配各种设备屏幕,同时保持了金融专业性和视觉美感的平衡。
|
||||
971
public/htmls/华为AI容器.html
Normal 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">UCM(9月开源)</span>
|
||||
<span class="inline-block px-2 py-1 bg-blue-100 text-blue-700 rounded text-sm">+ Flex:ai(11月发布)</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
@@ -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>
|
||||
746
public/htmls/对日反制.html
Normal 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">
|
||||
关键指标:良率稳定性 < 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">
|
||||
关键指标:国产替代成本差异 > 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 > 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增速 > 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
@@ -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>代工厂缺失:创业公司被迫自建产线,良率可能<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,商业需>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>成本倒挂:自建产线成本>$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>市场错配:脑机接口市场规模<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>
|
||||
736
public/htmls/林地资源.html
Normal 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
@@ -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
@@ -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
@@ -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
@@ -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产业链的投资机会。
|
||||
648
public/htmls/谷歌概念.html
Normal 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>
|
||||
824
public/htmls/远程火力.html
Normal 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>
|
||||
643
public/htmls/阿里AI千问、灵光.html
Normal 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编程能力达全球SOTA,API调用量突破千亿级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>
|
||||
BIN
public/images/agent/simons.png
Normal file
|
After Width: | Height: | Size: 380 KiB |
BIN
public/images/agent/基金经理.png
Normal file
|
After Width: | Height: | Size: 134 KiB |
BIN
public/images/agent/大空头.png
Normal file
|
After Width: | Height: | Size: 90 KiB |
BIN
public/images/agent/巴菲特.png
Normal file
|
After Width: | Height: | Size: 562 KiB |
BIN
public/images/agent/牢大.png
Normal file
|
After Width: | Height: | Size: 279 KiB |
|
Before Width: | Height: | Size: 918 KiB |
|
Before Width: | Height: | Size: 795 KiB |
|
Before Width: | Height: | Size: 1017 KiB |
|
Before Width: | Height: | Size: 251 KiB |
|
Before Width: | Height: | Size: 640 KiB |
|
Before Width: | Height: | Size: 315 KiB |
|
Before Width: | Height: | Size: 479 KiB |
|
Before Width: | Height: | Size: 553 KiB |
|
Before Width: | Height: | Size: 556 KiB |
|
Before Width: | Height: | Size: 443 KiB |
|
Before Width: | Height: | Size: 607 KiB |
@@ -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
|
After Width: | Height: | Size: 28 KiB |
@@ -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
|
After Width: | Height: | Size: 55 KiB |
2089
report_zt_api.py
Normal 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
|
||||
@@ -1,3 +0,0 @@
|
||||
INFO Accepting connections at http://localhost:58321
|
||||
|
||||
INFO Gracefully shutting down. Please wait...
|
||||
205
src/App.js
@@ -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>
|
||||
);
|
||||
}
|
||||
@@ -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已在后端配置(允许您的前端域名)
|
||||
* - 在管理后台配置正确的工作组ID(sid)
|
||||
*/
|
||||
@@ -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]);
|
||||
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
|
||||
@@ -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 (
|
||||
<>
|
||||
|
||||
@@ -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>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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]);
|
||||
|
||||
/**
|
||||
* 组件卸载时清理定时器和标记组件状态
|
||||
*/
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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"
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
@@ -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;
|
||||
})}
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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={{
|
||||
|
||||
@@ -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');
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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}
|
||||
/>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
309
src/components/ImageLightbox/index.js
Normal 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;
|
||||
270
src/components/ImagePreviewModal/index.js
Normal 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;
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
@@ -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;
|
||||