feat: 初始化代码;当前为前端演示demo,且详情页存在显示空白bug

master
Lxy 3 months ago
commit 0331915728

24
.gitignore vendored

@ -0,0 +1,24 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
node_modules
dist
dist-ssr
*.local
# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?

@ -0,0 +1,135 @@
---
name: "ux交互设计师"
description: "根据用户需求生成交互设计方案,支持预览调整,产出可用于开发的详细设计文档。当需要设计用户界面交互流程、优化现有界面体验或为新功能设计交互方案时调用。"
---
# UX交互设计师
## 功能说明
此技能专门用于根据用户需求生成专业的UX交互设计方案主要功能包括
1. **需求分析**:分析用户需求,提取关键交互点和用户场景
2. **交互设计生成**:根据需求生成完整的交互设计方案,包括:
- 用户流程图
- 页面布局设计
- 交互流程设计
- 状态转换设计
- 响应式设计考虑
3. **预览调整**:提供设计预览和调整功能,包括:
- 交互流程演示
- 视觉效果预览
- 可调整的设计参数
- 实时反馈机制
4. **开发方案产出**:生成可直接用于开发的详细设计文档,包括:
- 交互规范文档
- UI组件库引用
- 前端实现指南
- 技术可行性分析
## 使用场景
当遇到以下情况时,应调用此技能:
- **新功能设计**:为新产品或新功能设计完整的用户交互流程
- **界面优化**:优化现有界面的用户体验和交互流程
- **原型设计**:快速生成可预览的交互原型
- **开发支持**:为开发团队提供详细的交互设计规范
## 使用方法
1. 提供详细的需求描述,包括:
- 产品目标和用户群体
- 核心功能需求
- 技术约束条件
- 设计风格偏好
2. 调用此技能生成初始交互设计方案
3. 查看设计预览并提供反馈
4. 基于反馈进行调整优化
5. 获取最终的开发方案文档
## 输出内容
### 设计方案包含:
1. **交互流程图**:用户操作流程的可视化图表
2. **页面设计**:关键页面的布局和元素设计
3. **交互细节**:按钮、表单、导航等交互元素的具体行为
4. **响应式设计**:不同设备尺寸的适配方案
5. **动画效果**:过渡动画和微交互设计
### 开发文档包含:
1. **交互规范**:详细的交互行为描述和实现要求
2. **UI组件清单**:使用的组件及其配置
3. **前端实现指南**:技术实现建议和最佳实践
4. **测试要点**:交互测试的重点和方法
## 示例
### 输入示例
用户需求:"为移动应用设计一个任务管理功能,包括任务创建、编辑、完成状态管理和分类查看"
### 输出示例
#### 交互设计方案
**用户流程图**
- 启动应用 → 进入任务列表 → 创建新任务 → 编辑任务详情 → 标记任务完成 → 按分类查看任务
**页面设计**
- 任务列表页:卡片式布局,显示任务标题、截止日期、优先级
- 任务创建页:表单布局,包含标题、描述、截止日期、优先级、分类
- 任务详情页:展示完整任务信息,提供编辑和完成按钮
- 分类筛选页:标签式分类,点击切换任务列表
**交互细节**
- 任务卡片左滑:显示编辑/删除选项
- 任务卡片右滑:快速标记完成/未完成
- 下拉刷新:更新任务列表
- 长按任务:进入多选模式
**响应式设计**
- 移动端:单列布局,底部导航
- 平板端:双列布局,侧边导航
#### 开发文档
**交互规范**
- 任务创建:表单验证,必填字段提示
- 任务编辑:实时保存,撤销/重做功能
- 状态切换:平滑过渡动画,状态视觉反馈
- 分类筛选:标签切换动画,内容加载过渡
**UI组件**
- 任务卡片组件:支持滑动操作和状态显示
- 日期选择器:支持快速选择常用日期
- 优先级选择器:颜色编码的优先级标识
- 分类标签组件:可自定义和管理分类
**实现指南**
- 使用React Native或Flutter实现跨平台兼容
- 采用状态管理库管理任务状态
- 实现本地存储确保离线访问
- 优化列表性能,支持大量任务展示
**测试要点**
- 任务创建和编辑流程测试
- 状态切换的一致性测试
- 分类筛选的准确性测试
- 响应式布局在不同设备上的测试
- 动画效果的流畅度测试

@ -0,0 +1,186 @@
---
name: "架构师"
description: "根据用户需求进行整体架构设计,输出详细的架构方案文档,为后续编码提供明确指导。当需要为新项目或功能进行技术架构设计、评估技术可行性或优化现有系统架构时调用。"
---
# 架构师
## 功能说明
此技能专门用于根据用户需求进行全面的技术架构设计,主要功能包括:
1. **需求分析与拆解**:分析用户需求,拆解为技术实现要素
2. **整体架构设计**:生成完整的系统架构方案,包括:
- 技术栈选择与论证
- 系统分层与模块划分
- 核心流程设计
- 数据模型设计
- 接口设计规范
3. **技术方案详细设计**:提供详细的技术实现方案,包括:
- 关键类与函数设计
- 数据库结构设计
- API接口设计
- 性能优化策略
- 安全考虑因素
4. **编码指导文档**:生成可直接指导编码的详细文档,包括:
- 代码结构与命名规范
- 开发环境配置
- 测试策略与方案
- 部署与运维方案
## 使用场景
当遇到以下情况时,应调用此技能:
- **新项目启动**:为全新项目设计完整的技术架构
- **功能扩展**:为现有系统设计新功能的架构方案
- **技术重构**:评估并设计系统重构的架构方案
- **技术选型**:为特定需求选择合适的技术栈
- **编码指导**:为开发团队提供详细的编码实现指南
## 使用方法
1. 提供详细的需求描述,包括:
- 业务目标与范围
- 功能需求列表
- 非功能需求(性能、安全、可扩展性等)
- 技术约束与偏好
2. 调用此技能生成初始架构设计方案
3. 评审架构方案并提供反馈
4. 基于反馈进行调整优化
5. 获取最终的架构设计文档和编码指导
## 输出内容
### 架构设计文档包含:
1. **技术栈选择**:推荐的技术栈及其选型理由
2. **系统架构图**:整体系统的分层与模块关系
3. **核心流程设计**:关键业务流程的技术实现路径
4. **数据架构**:数据库设计、数据流向与存储策略
5. **接口设计**API接口规范与调用关系
6. **部署架构**:系统部署方案与环境配置
### 编码指导文档包含:
1. **代码结构**:项目目录结构与文件组织
2. **编码规范**:命名约定、代码风格与最佳实践
3. **实现指南**:关键功能的具体实现步骤
4. **测试策略**:单元测试、集成测试与端到端测试方案
5. **性能优化**:性能瓶颈识别与优化建议
6. **安全实践**:安全漏洞防范与最佳安全实践
## 示例
### 输入示例
用户需求:"设计一个在线商城系统,包括商品管理、用户管理、购物车、订单管理和支付功能,需要支持高并发访问和数据安全"
### 输出示例
#### 架构设计方案
**技术栈选择**
- 前端React + TypeScript + Redux
- 后端Node.js + Express + MongoDB
- 数据库MongoDB + Redis缓存
- 支付集成第三方支付API
- 部署Docker + Kubernetes
**系统架构图**
- 前端层React应用 → CDN缓存
- API层Express路由 → 中间件
- 服务层:业务逻辑服务 → 微服务架构
- 数据层MongoDB → Redis缓存
- 外部服务:支付网关 → 短信/邮件服务
**核心流程设计**
1. 用户注册/登录流程
2. 商品浏览与搜索流程
3. 购物车管理流程
4. 订单创建与支付流程
5. 订单状态更新流程
**数据架构**
- 用户表:存储用户信息与认证数据
- 商品表:存储商品信息与库存
- 购物车表:存储用户购物车数据
- 订单表:存储订单信息与状态
- 支付表:存储支付记录与交易信息
**接口设计**
- 用户接口:/api/users/*
- 商品接口:/api/products/*
- 购物车接口:/api/cart/*
- 订单接口:/api/orders/*
- 支付接口:/api/payments/*
#### 编码指导文档
**代码结构**
```
src/
├── frontend/
│ ├── components/
│ ├── pages/
│ ├── redux/
│ ├── services/
│ └── utils/
├── backend/
│ ├── api/
│ ├── services/
│ ├── models/
│ ├── middleware/
│ └── config/
└── shared/
├── types/
└── utils/
```
**编码规范**
- 前端遵循ESLint + Prettier规范
- 后端使用TypeScript类型定义
- 命名:采用驼峰命名法,类名使用 PascalCase
- 注释:关键代码必须有详细注释
**实现指南**
1. 初始化项目结构与依赖
2. 实现用户认证系统
3. 开发商品管理功能
4. 实现购物车功能
5. 开发订单与支付流程
6. 集成第三方支付API
**测试策略**
- 前端Jest + React Testing Library
- 后端Mocha + Chai
- 集成测试Supertest
- 端到端测试Cypress
**性能优化**
- 前端:代码分割、图片优化、缓存策略
- 后端数据库索引、Redis缓存、负载均衡
- API响应压缩、请求限流、批量操作
**安全实践**
- 认证JWT + 密码哈希
- 授权:基于角色的访问控制
- 输入验证参数校验与SQL注入防护
- 传输安全HTTPS + CORS配置
- 数据保护:敏感数据加密存储

@ -0,0 +1,85 @@
---
name: "需求规划师"
description: "将用户需求拆解为结构化要素转换为AI模型可识别的标准prompt格式并根据需求类型应用对应模板。在输出前与用户进行需求确认确保理解准确无误。当用户提出新需求、需要需求分析或优化现有prompt时调用。"
---
# 需求规划师
## 功能说明
此技能专门用于将用户的自然语言需求拆解转换为AI模型可识别的标准prompt格式。主要功能包括
1. **需求结构化**:将模糊、不完整的需求拆解为明确的结构化要素,包括:
- 目标Goal需求的最终目标是什么
- 输入Input需要提供哪些信息或数据
- 输出Output期望得到什么形式的结果
- 约束Constraints有哪些限制条件或要求
- 上下文Context相关的背景信息
2. **Prompt格式化**将结构化后的需求转换为标准的AI提示词格式包括
- 清晰的指令结构
- 适当的任务描述
- 明确的输出要求
- 必要的约束条件
3. **模板生成**根据需求类型自动应用对应的prompt模板包括
- 代码生成类模板
- 内容创作类模板
- 数据分析类模板
- 问题解决类模板
4. **需求确认**在生成最终prompt前与用户进行需求确认确保
- 需求理解准确无误
- 关键要素无遗漏
- 输出格式符合预期
- 可根据用户反馈进行调整
## 使用场景
当遇到以下情况时,应调用此技能:
- **用户提出新需求**用户描述了一个新的功能需求或任务需要将其转换为AI可处理的prompt
- **需求分析**需要深入分析和拆解复杂的需求确保AI能够准确理解
- **Prompt优化**现有prompt效果不佳需要重新组织和优化结构
## 使用方法
1. 接收用户的原始需求描述
2. 调用此技能进行需求拆解和结构化分析
3. 生成初始的prompt方案
4. 与用户进行需求确认,包括:
- 验证需求理解是否准确
- 确认关键要素是否完整
- 检查输出格式是否符合预期
- 收集用户的反馈和调整建议
5. 根据用户确认的结果优化和完善prompt
6. 提供最终确认后的prompt给AI模型使用
## 示例
### 输入示例
用户需求:"帮我写一个Python脚本爬取网站数据并保存到Excel文件"
### 输出示例
```
请帮我创建一个Python脚本实现以下功能
目标爬取指定网站的数据并将结果保存到Excel文件
输入:
- 网站URL[待提供]
- 需要爬取的数据字段:[待指定]
- 爬取深度:[待指定]
输出:
- 生成一个Python脚本文件
- 脚本应包含完整的代码和注释
- 生成的Excel文件应包含所有爬取的数据
约束:
- 使用合法的爬取方式遵守网站robots.txt规则
- 脚本应具有错误处理能力
- 爬取过程应考虑速率限制,避免对目标网站造成压力
请提供完整的实现代码,并确保代码可直接运行。
```

@ -0,0 +1,16 @@
# React + Vite
This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.
Currently, two official plugins are available:
- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) (or [oxc](https://oxc.rs) when used in [rolldown-vite](https://vite.dev/guide/rolldown)) for Fast Refresh
- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh
## React Compiler
The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation).
## Expanding the ESLint configuration
If you are developing a production application, we recommend using TypeScript with type-aware lint rules enabled. Check out the [TS template](https://github.com/vitejs/vite/tree/main/packages/create-vite/template-react-ts) for information on how to integrate TypeScript and [`typescript-eslint`](https://typescript-eslint.io) in your project.

@ -0,0 +1,376 @@
# AI期货分析系统前端设计方案
## 1. 设计概述
### 1.1 设计目标
- 打造专业、直观的期货分析系统界面
- 提供流畅的用户交互体验
- 实现多维度数据可视化
- 确保全设备响应式适配
### 1.2 技术栈
- **前端框架**React + Ant Design
- **状态管理**Redux Toolkit
- **数据可视化**ECharts + D3.js
- **K线图表**TradingView Lightweight Charts
- **样式方案**Ant Design 默认主题 + 自定义样式
- **构建工具**Vite
### 1.3 设计风格
- **主色调**#1890ffAnt Design 蓝色)
- **辅助色**#52c41a上涨绿、#ff4d4f下跌红、#faad14中性黄
- **背景色**#f0f2f5浅色背景
- **文字色**#262626主文字、#8c8c8c次要文字
- **卡片样式**轻微阴影圆角4px
- **图标风格**Ant Design 图标库
## 2. 页面结构与布局
### 2.1 整体布局
- **顶部导航栏**:系统标题、用户信息、全局搜索、主题切换
- **左侧菜单**:功能模块导航,支持折叠
- **主内容区**:根据选择的功能模块显示相应内容
- **右侧信息栏**:市场热点、风险预警(可折叠)
### 2.2 响应式适配
- **桌面端**≥1200px完整三栏布局
- **平板端**768px-1199px左侧菜单折叠右侧信息栏可收起
- **移动端**<768px):顶部导航栏简化,左侧菜单转为抽屉式,右侧信息栏隐藏
## 3. 页面设计详情
### 3.1 Dashboard主页
#### 布局结构
- **页面头部**:欢迎信息、市场概览、快速操作按钮
- **品种概览区**:网格布局的品种卡片,支持分页和筛选
- **市场热点区**:热力图展示各品种表现
- **风险预警区**:重要风险提示列表
- **AI研判区**AI对市场的整体判断和预测
#### 交互设计
- **品种卡片**:点击进入详情页,悬停显示更多信息
- **筛选功能**:按品种类型、涨跌幅、胜率等筛选
- **排序功能**:支持多种排序方式
- **刷新机制**自动定时刷新默认30秒支持手动刷新
- **布局切换**:支持卡片网格和列表视图切换
#### 数据展示
- **品种卡片**显示品种名称、代码、当前价格、涨跌幅、胜率、ATR、ADX、多周期趋势判断
- **热力图**:颜色深浅表示涨跌幅大小
- **风险预警**:按严重程度排序,红色表示高风险
### 3.2 详情分析页
#### 布局结构
- **页面头部**:品种信息、代码、当前价格、涨跌幅
- **K线图表区**专业K线图支持多周期切换
- **技术指标区**:可切换显示不同技术指标
- **AI研判区**AI对该品种的详细分析和预测
- **交易建议区**:入场价、止损价、目标价建议
- **风险评估区**:风险等级、波动率分析
#### 交互设计
- **K线周期切换**5分钟、30分钟、1小时、1天、1周等
- **指标叠加**可在K线上叠加MA、MACD等指标
- **图表缩放**:鼠标滚轮缩放,拖拽平移
- **数据对比**:支持与其他品种或指数对比
- **历史回测**显示AI策略的历史表现
#### 数据展示
- **K线图**:专业蜡烛图,支持成交量柱状图
- **技术指标**MA、MACD、KDJ、RSI、布林带等
- **多周期趋势**5MIN、30MIN、1HOUR、1DAY的趋势判断
- **AI预测**:趋势预测图、胜率评估、预期收益
### 3.3 风控管理页
#### 布局结构
- **页面头部**:风控概览、风险等级
- **止损策略区**:止损设置表单,支持多种止损策略
- **仓位管理区**:资金分配、仓位计算器
- **换月预警区**:即将到期合约提醒
- **风险监控区**:实时风险指标监控
#### 交互设计
- **止损策略选择**:下拉选择不同止损策略,自动计算止损点位
- **仓位计算器**:输入资金、风险偏好,自动计算建议仓位
- **换月提醒**:点击查看详细换月策略
- **风险阈值设置**:可调整各项风险指标的预警阈值
#### 数据展示
- **止损点位**:动态计算的止损价格
- **仓位建议**:基于风险偏好的建议仓位比例
- **换月日历**:合约到期日倒计时
- **风险指标**:风险价值、最大回撤、夏普比率等
### 3.4 配置管理页
#### 布局结构
- **页面头部**:配置管理标题
- **数据源配置区**:数据源列表、优先级设置
- **AI模型配置区**:模型选择、参数调优
- **系统配置区**:分析周期、预警阈值等设置
- **用户偏好区**:界面偏好、通知设置
#### 交互设计
- **数据源切换**:开关控制数据源启用/禁用
- **模型参数调整**:滑块或输入框调整参数
- **配置保存**:实时保存或手动保存
- **配置重置**:恢复默认配置
#### 数据展示
- **数据源状态**:在线/离线状态,响应时间
- **模型性能**:不同模型的准确率、响应时间对比
- **系统参数**:当前配置值,默认值参考
## 4. 核心组件设计
### 4.1 导航组件
- **顶部导航栏**:系统标题、全局搜索、用户头像、消息通知、主题切换
- **左侧菜单**:折叠/展开功能,当前选中状态高亮,支持多级菜单
### 4.2 数据可视化组件
- **K线图表组件**:支持多周期切换,技术指标叠加,图表缩放
- **热力图组件**:多品种涨跌幅对比,颜色渐变表示强度
- **趋势分析组件**AI预测趋势线置信区间显示
- **技术指标组件**:可切换不同技术指标,支持参数调整
### 4.3 功能组件
- **品种卡片组件**:显示品种关键信息,支持点击进入详情
- **风险预警组件**:风险等级标识,详细信息展开
- **止损计算器组件**:根据策略计算止损点位
- **仓位计算器组件**:基于风险偏好计算建议仓位
- **数据源配置组件**:数据源管理,状态监控
- **AI模型配置组件**:模型选择,参数调优界面
### 4.4 通用组件
- **搜索组件**:支持模糊搜索,历史记录
- **筛选组件**:多条件组合筛选
- **分页组件**:数据分页显示,支持每页条数调整
- **加载组件**:数据加载动画,骨架屏
- **通知组件**:系统消息,预警通知
## 5. 交互流程设计
### 5.1 主要用户流程
#### 流程1查看市场概览
1. 用户登录系统 → 进入Dashboard主页
2. 浏览品种概览卡片 → 查看市场热点热力图
3. 查看风险预警 → 了解AI整体研判
4. 可通过筛选/排序找到感兴趣的品种
#### 流程2深入分析单个品种
1. 在Dashboard点击品种卡片 → 进入详情分析页
2. 查看K线图表 → 切换不同周期
3. 叠加技术指标 → 分析多周期趋势
4. 查看AI研判结果 → 参考交易建议
5. 评估风险等级 → 制定交易策略
#### 流程3设置风控参数
1. 从左侧菜单进入风控管理页
2. 设置止损策略 → 调整止损参数
3. 使用仓位计算器 → 确定资金分配
4. 查看换月预警 → 提前规划换月
5. 监控风险指标 → 确保风险可控
#### 流程4配置系统参数
1. 从左侧菜单进入配置管理页
2. 管理数据源 → 设置优先级
3. 选择AI模型 → 调整模型参数
4. 设置系统参数 → 调整预警阈值
5. 保存配置 → 应用新设置
### 5.2 微交互设计
- **按钮反馈**:点击时有轻微的缩放效果,悬停时有背景色变化
- **卡片悬停**:轻微上浮效果,阴影加深
- **数据更新**:数字变化时有平滑过渡动画
- **图表加载**:渐进式动画,提升视觉体验
- **通知提醒**:弹出动画,吸引用户注意
- **表单验证**:实时验证,错误提示动画
## 6. 响应式设计
### 6.1 桌面端≥1200px
- 完整三栏布局,左侧菜单展开
- 丰富的数据展示,多列布局
- 支持复杂的交互操作
### 6.2 平板端768px-1199px
- 左侧菜单默认折叠hover展开
- 右侧信息栏可收起,通过按钮展开
- 卡片布局改为2列
- 部分复杂图表简化显示
### 6.3 移动端(<768px
- 左侧菜单转为抽屉式,通过顶部按钮打开
- 右侧信息栏隐藏,重要信息整合到主内容区
- 卡片布局改为单列
- K线图表简化仅显示核心信息
- 表单元素适配触摸操作,增大点击区域
## 7. 性能优化
### 7.1 前端性能优化
- **代码分割**使用React.lazy和Suspense实现组件懒加载
- **状态管理**合理使用Redux避免不必要的重渲染
- **数据缓存**:缓存频繁访问的数据,减少重复请求
- **图表优化**:大数据量图表使用虚拟滚动,按需渲染
- **图片优化**使用适当尺寸的图片支持WebP格式
### 7.2 交互体验优化
- **骨架屏**:数据加载时显示骨架屏,提升感知性能
- **防抖节流**:对搜索、滚动等操作进行防抖节流处理
- **预加载**:预测用户可能访问的内容,提前加载
- **离线支持**:关键功能支持离线访问
- **错误处理**:友好的错误提示,避免白屏
## 8. 开发实现指南
### 8.1 项目结构
```
/src
/components # 通用组件
/layout # 布局组件
/charts # 图表组件
/forms # 表单组件
/common # 通用UI组件
/pages # 页面组件
/dashboard # 主页
/detail # 详情分析页
/risk-control # 风控管理页
/config # 配置管理页
/services # API服务
/store # Redux状态管理
/utils # 工具函数
/constants # 常量定义
/hooks # 自定义Hooks
App.jsx # 应用根组件
main.jsx # 应用入口
```
### 8.2 关键技术实现
- **K线图表**使用TradingView Lightweight Charts实现专业K线图
- **数据可视化**使用ECharts实现热力图、趋势分析等图表
- **响应式布局**使用Ant Design的Layout组件结合媒体查询
- **状态管理**使用Redux Toolkit管理全局状态
- **API调用**使用Axios实现API请求支持拦截器
- **模拟数据**在src/utils/mockData.js中定义模拟数据
### 8.3 开发规范
- **代码风格**使用ESLint和Prettier保持代码风格一致
- **命名规范**:组件名使用大驼峰,变量名使用小驼峰
- **注释规范**关键组件和函数添加JSDoc注释
- **提交规范**使用Git Commitizen保持提交信息规范
## 9. 测试计划
### 9.1 功能测试
- **页面导航**:测试所有页面之间的导航是否正常
- **数据展示**:测试各种数据的展示是否正确
- **交互功能**:测试所有交互元素是否正常响应
- **表单提交**:测试表单验证和提交功能
### 9.2 性能测试
- **页面加载速度**:测试各页面的加载时间
- **交互响应速度**:测试用户操作的响应时间
- **大数据量处理**:测试处理大量数据时的性能
### 9.3 兼容性测试
- **浏览器兼容性**测试主流浏览器Chrome、Firefox、Safari、Edge
- **设备兼容性**:测试不同尺寸的设备
### 9.4 可用性测试
- **用户体验**:评估界面的易用性和直观性
- **错误处理**:测试系统对错误操作的处理
- **帮助信息**:测试系统的帮助和提示信息
## 10. 模拟数据
### 10.1 期货品种列表
```javascript
const futuresList = [
// 金属类
{ code: 'AU', name: '金', type: '金属' },
{ code: 'AG', name: '银', type: '金属' },
{ code: 'CU', name: '铜', type: '金属' },
{ code: 'NI', name: '镍', type: '金属' },
{ code: 'SN', name: '锡', type: '金属' },
{ code: 'AL', name: '铝', type: '金属' },
{ code: 'ZN', name: '锌', type: '金属' },
// 建材类
{ code: 'FG', name: '玻璃', type: '建材' },
{ code: 'SJS', name: '烧碱', type: '建材' },
{ code: 'SCA', name: '纯碱', type: '建材' },
{ code: 'JM', name: '焦煤', type: '建材' },
{ code: 'RB', name: '螺纹钢', type: '建材' },
{ code: 'ALO', name: '氧化铝', type: '建材' },
// 能源化工类
{ code: 'MA', name: '甲醇', type: '能源化工' },
{ code: 'PVC', name: 'PVC', type: '能源化工' },
{ code: 'FU', name: '燃油', type: '能源化工' },
{ code: 'SC', name: '原油', type: '能源化工' },
{ code: 'L', name: '橡胶', type: '能源化工' },
{ code: 'NR', name: '20号胶', type: '能源化工' },
{ code: 'BU', name: '沥青', type: '能源化工' },
{ code: 'LU', name: '低硫燃油', type: '能源化工' },
// 农产品类
{ code: 'P', name: '棕榈油', type: '农产品' },
// 新能源类
{ code: 'LC', name: '碳酸锂', type: '新能源' },
{ code: 'SI', name: '工业硅', type: '新能源' },
{ code: 'PGS', name: '多晶硅', type: '新能源' },
// 金融类
{ code: 'IC', name: '中证500', type: '金融' },
{ code: 'IM', name: '中证1000', type: '金融' },
{ code: 'IH', name: '上证50', type: '金融' }
];
```
### 10.2 品种数据结构
```javascript
const futureData = {
code: 'MA',
name: '甲醇',
fullName: '甲醇-MA605',
currentPrice: 2188.00,
changePercent: -2.35,
atr: 2.35,
adx: 19,
adxStatus: '无趋势/震荡',
winRate: 56,
trends: {
'5MIN': { direction: '看空', status: '空头趋势', rsi: 24 },
'30MIN': { direction: '看空', status: '空头趋势', rsi: 19 },
'1HOUR': { direction: '看空', status: '空头趋势', rsi: 17 },
'1DAY': { direction: '看空', status: '空头趋势', rsi: 30 }
},
indicators: {
macd: '死叉向下',
rsi: '34(中性)',
bollinger: '触及下轨',
kdj: '死叉向下'
},
tradingAdvice: {
entry: 2188,
stopLoss: 2166,
target: 2210
},
riskLevel: '中等',
volatility: '高'
};
```
## 11. 结论
本设计方案提供了AI期货分析系统的完整前端设计包括页面布局、交互流程、响应式设计和技术实现指南。方案基于React + Ant Design技术栈采用浅色简洁的设计风格确保专业、直观的用户体验。
设计方案充分考虑了期货分析系统的专业性要求提供了K线图表、技术指标、热力图等专业数据可视化功能同时确保了系统的易用性和可扩展性。
通过本设计方案开发团队可以快速实现一个功能完整、体验良好的AI期货分析系统前端为期货投资者提供专业的决策辅助工具。

@ -0,0 +1,104 @@
# AI期货分析系统前端设计需求
## 1. 项目概述
AI期货分析系统是基于DeepSeek等大模型和量化分析算法的智能期货决策辅助系统为期货投资者提供多维度市场分析、AI智能研判、全自动数据更新和专业风控管理功能。
## 2. 技术栈
- **前端框架**React + Ant Design
- **响应式设计**:全设备适配(桌面端、平板、移动端)
- **视觉风格**:浅色简洁风格
- **导航方式**:混合导航(左侧菜单 + 顶部导航)
## 3. 核心功能模块
### 3.1 多维度市场分析
- 技术面分析K线形态、技术指标、趋势线等
- 资金面分析(持仓量、成交量、资金流向等)
- 政策面分析(宏观数据、政策变动、新闻情感等)
### 3.2 AI智能研判
- 趋势判断(基于大模型的趋势预测)
- 胜率评估(历史回测、策略表现分析)
- 风险预警(异常波动监测、情绪识别等)
### 3.3 全自动数据更新
- 实时行情数据获取
- 自动复盘每日3次
- 数据处理与管理
### 3.4 专业风控管理
- 止损建议
- 仓位管理
- 换月预警
### 3.5 配置管理
- 数据源配置(多数据源选择与切换)
- AI模型配置大模型选择与参数调优
- 系统配置(分析周期、预警阈值等)
## 4. 页面结构
### 4.1 Dashboard主页
- 多品种概览卡片显示胜率、ATR、ADX等关键指标
- 市场热点分析
- 风险预警提示
- 快速访问常用品种
### 4.2 详情分析页
- K线图表支持多周期切换
- 技术指标分析
- AI智能研判结果
- 风险评估
- 交易建议
### 4.3 风控管理页
- 止损策略设置
- 仓位计算工具
- 换月提醒
- 风险监控面板
### 4.4 配置管理页
- 数据源管理
- AI模型选择与配置
- 系统参数设置
- 用户偏好设置
## 5. 数据可视化需求
- **K线图表**专业的K线图表支持多周期切换
- **技术指标**MA、MACD、KDJ等技术指标的可视化
- **热力图**:多品种对比的热力图展示
- **趋势分析**AI预测趋势的可视化展示
## 6. 模拟数据
### 6.1 期货品种列表
- 金、银、铜、镍、锡、玻璃、烧碱、纯碱、焦煤
- 螺纹钢、氧化铝、甲醇、PVC、燃油、原油、铝、棕榈油
- 碳酸锂、工业硅、橡胶、合成橡胶、锌、20号胶、多晶硅
- 中证1000、中证500、低硫燃油、上证50
### 6.2 数据字段
- 品种名称、代码
- 当前价格、涨跌幅
- ATR平均真实波幅
- ADX平均趋向指数
- 胜率评估
- 多周期趋势判断5MIN、30MIN、1HOUR、1DAY
- 技术指标MACD、RSI、布林带、KDJ等
- 入场价、止损价、目标价
## 7. 交互设计要求
- 响应式布局,适配不同设备尺寸
- 流畅的页面切换和数据加载动画
- 直观的操作流程,减少学习成本
- 专业的金融分析界面风格
- 支持深色/浅色主题切换
## 8. 性能要求
- 实时响应,分析结果秒级返回
- 数据更新延迟<1
- 系统稳定性99.9%以上
- 支持万级用户同时在线
## 9. 设计参考
参考提供的深色主题界面风格,但实现为浅色简洁风格,保持专业的金融分析工具感。

@ -0,0 +1,157 @@
# AI期货分析系统需求分析文档
## 1. 系统概述
AI期货分析系统是基于DeepSeek等大模型和量化分析算法的智能期货决策辅助系统旨在为期货投资者提供多维度市场分析、AI智能研判、全自动数据更新和专业风控管理功能。
## 2. 核心功能模块
### 2.1 多维度市场分析
**技术面分析**
- K线形态识别与分析
- 技术指标计算与解读MA、MACD、KDJ、RSI等
- 趋势线与支撑阻力位自动绘制
- 量价关系分析
**资金面分析**
- 持仓量变化监测
- 成交量分析与资金流向追踪
- 主力资金动向识别
- 多空力量对比分析
**政策面分析**
- 宏观经济数据自动采集与分析
- 政策法规变动监测
- 行业新闻情感分析
- 突发事件影响评估
### 2.2 AI智能研判
**趋势判断**
- 基于大模型的市场趋势预测
- 多周期趋势一致性分析
- 趋势反转信号识别
- 波动率预测
**胜率评估**
- 历史数据回测与胜率计算
- 不同市场环境下的策略表现分析
- 风险收益比评估
- 预期收益预测
**风险预警**
- 异常价格波动监测
- 市场情绪极端状态识别
- 流动性风险评估
- 黑天鹅事件预警
### 2.3 全自动数据更新
**数据采集**
- 实时行情数据自动获取
- 历史数据定期更新
- 基本面数据自动采集
- 外部数据源集成
**数据处理**
- 数据清洗与标准化
- 数据质量监控
- 数据一致性检查
- 数据存储与管理
**自动复盘**
- 每日3次自动复盘早、中、晚
- 盘前预测与盘后总结
- 关键事件自动标记
- 历史表现分析与优化
### 2.4 专业风控管理
**止损建议**
- 动态止损点位计算
- 不同策略的止损策略推荐
- 止损执行监控与提醒
- 止损效果评估
**仓位管理**
- 基于风险偏好的仓位计算
- 资金分配优化建议
- 杠杆使用控制
- 多品种仓位平衡
**换月预警**
- 合约到期日提醒
- 主力合约切换监测
- 换月成本分析
- 换月策略建议
### 2.5 配置管理
**数据源配置**
- 多数据源选择与切换
- 数据源优先级设置
- 数据源参数配置API密钥、访问频率等
- 数据源健康状态监控
**AI模型配置**
- 大模型选择与切换DeepSeek等
- 模型参数调优
- 模型权重管理
- 模型性能评估与对比
**系统配置**
- 分析周期设置
- 预警阈值配置
- 个性化偏好设置
- 系统参数优化
## 3. 系统架构
### 3.1 技术架构
- **前端**Web应用 + 移动App
- **后端**:云端部署的微服务架构
- **数据层**:实时行情数据库 + 历史数据库 + 分析结果库
- **AI层**DeepSeek等大模型 + 量化分析算法库
- **接口层**API网关 + 第三方数据接口
### 3.2 部署方式
- 云端SaaS模式无需本地安装
- 多区域部署,确保实时响应
- 弹性扩容,应对高并发需求
- 数据加密存储,保障安全
## 4. 目标用户
- **个人投资者**:提供直观的决策辅助工具,降低交易门槛
- **专业交易员**:提供深度分析功能,支持复杂策略开发
- **混合型**:同时满足不同层次用户的需求,提供个性化功能
## 5. 性能要求
- **响应时间**:实时响应,分析结果秒级返回
- **数据更新**:实时行情数据延迟<1
- **系统稳定性**99.9%以上的可用性
- **并发处理**:支持万级用户同时在线
## 6. 数据安全
- 数据传输加密
- 用户身份认证与授权
- 敏感信息保护
- 数据备份与恢复机制
## 7. 实施路径
1. **需求细化与原型设计**详细功能规格制定UI/UX设计
2. **核心功能开发**数据采集、分析算法、AI模型集成
3. **系统集成与测试**:各模块集成,性能测试,安全测试
4. **试运行与优化**:内部测试,用户反馈收集,系统优化
5. **正式上线与迭代**:持续功能更新,性能优化,用户体验改进
## 8. 预期成果
- 为期货投资者提供全方位的市场分析工具
- 提高交易决策的科学性与准确性
- 降低投资风险,优化收益表现
- 推动期货市场的智能化发展

@ -0,0 +1,29 @@
import js from '@eslint/js'
import globals from 'globals'
import reactHooks from 'eslint-plugin-react-hooks'
import reactRefresh from 'eslint-plugin-react-refresh'
import { defineConfig, globalIgnores } from 'eslint/config'
export default defineConfig([
globalIgnores(['dist']),
{
files: ['**/*.{js,jsx}'],
extends: [
js.configs.recommended,
reactHooks.configs.flat.recommended,
reactRefresh.configs.vite,
],
languageOptions: {
ecmaVersion: 2020,
globals: globals.browser,
parserOptions: {
ecmaVersion: 'latest',
ecmaFeatures: { jsx: true },
sourceType: 'module',
},
},
rules: {
'no-unused-vars': ['error', { varsIgnorePattern: '^[A-Z_]' }],
},
},
])

@ -0,0 +1,13 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>alphafuturespro2</title>
</head>
<body>
<div id="root"></div>
<script type="module" src="/src/main.jsx"></script>
</body>
</html>

4312
package-lock.json generated

File diff suppressed because it is too large Load Diff

@ -0,0 +1,34 @@
{
"name": "alphafuturespro2",
"private": true,
"version": "0.0.0",
"type": "module",
"scripts": {
"dev": "vite",
"build": "vite build",
"lint": "eslint .",
"preview": "vite preview"
},
"dependencies": {
"@reduxjs/toolkit": "^2.11.2",
"antd": "^6.3.0",
"axios": "^1.13.5",
"echarts": "^6.0.0",
"lightweight-charts": "^5.1.0",
"react": "^19.2.0",
"react-dom": "^19.2.0",
"react-redux": "^9.2.0",
"redux": "^5.0.1"
},
"devDependencies": {
"@eslint/js": "^9.39.1",
"@types/react": "^19.2.7",
"@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^5.1.1",
"eslint": "^9.39.1",
"eslint-plugin-react-hooks": "^7.0.1",
"eslint-plugin-react-refresh": "^0.4.24",
"globals": "^16.5.0",
"vite": "^7.3.1"
}
}

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

@ -0,0 +1,86 @@
#root {
width: 100%;
height: 100vh;
margin: 0;
padding: 0;
}
/* 全局样式重置 */
* {
box-sizing: border-box;
}
body {
margin: 0;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
code {
font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
monospace;
}
/* 自定义滚动条 */
::-webkit-scrollbar {
width: 8px;
height: 8px;
}
::-webkit-scrollbar-track {
background: #f1f1f1;
border-radius: 4px;
}
::-webkit-scrollbar-thumb {
background: #c1c1c1;
border-radius: 4px;
}
::-webkit-scrollbar-thumb:hover {
background: #a8a8a8;
}
/* 深色模式滚动条 */
[data-theme="dark"] ::-webkit-scrollbar-track {
background: #333;
}
[data-theme="dark"] ::-webkit-scrollbar-thumb {
background: #666;
}
[data-theme="dark"] ::-webkit-scrollbar-thumb:hover {
background: #888;
}
/* 卡片悬停效果 */
.ant-card-hoverable:hover {
transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
transition: all 0.3s ease;
}
/* 按钮动画效果 */
.ant-btn {
transition: all 0.3s ease;
}
.ant-btn:hover {
transform: translateY(-1px);
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
}
/* 表格行悬停效果 */
.ant-table-tbody > tr:hover > td {
background-color: rgba(24, 144, 255, 0.05);
}
/* 深色模式表格行悬停效果 */
[data-theme="dark"] .ant-table-tbody > tr:hover > td {
background-color: rgba(64, 169, 255, 0.1);
}

@ -0,0 +1,35 @@
import React, { useState } from 'react';
import MainLayout from './components/layout/MainLayout';
import Dashboard from './pages/dashboard/Dashboard';
import Detail from './pages/detail/Detail';
import RiskControl from './pages/risk-control/RiskControl';
import Config from './pages/config/Config';
import './App.css';
function App() {
const [currentMenu, setCurrentMenu] = useState('dashboard');
//
const renderCurrentPage = () => {
switch (currentMenu) {
case 'dashboard':
return <Dashboard />;
case 'detail':
return <Detail />;
case 'risk-control':
return <RiskControl />;
case 'config':
return <Config />;
default:
return <Dashboard />;
}
};
return (
<MainLayout currentMenu={currentMenu} onMenuSelect={setCurrentMenu}>
{renderCurrentPage()}
</MainLayout>
);
}
export default App;

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="35.93" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 228"><path fill="#00D8FF" d="M210.483 73.824a171.49 171.49 0 0 0-8.24-2.597c.465-1.9.893-3.777 1.273-5.621c6.238-30.281 2.16-54.676-11.769-62.708c-13.355-7.7-35.196.329-57.254 19.526a171.23 171.23 0 0 0-6.375 5.848a155.866 155.866 0 0 0-4.241-3.917C100.759 3.829 77.587-4.822 63.673 3.233C50.33 10.957 46.379 33.89 51.995 62.588a170.974 170.974 0 0 0 1.892 8.48c-3.28.932-6.445 1.924-9.474 2.98C17.309 83.498 0 98.307 0 113.668c0 15.865 18.582 31.778 46.812 41.427a145.52 145.52 0 0 0 6.921 2.165a167.467 167.467 0 0 0-2.01 9.138c-5.354 28.2-1.173 50.591 12.134 58.266c13.744 7.926 36.812-.22 59.273-19.855a145.567 145.567 0 0 0 5.342-4.923a168.064 168.064 0 0 0 6.92 6.314c21.758 18.722 43.246 26.282 56.54 18.586c13.731-7.949 18.194-32.003 12.4-61.268a145.016 145.016 0 0 0-1.535-6.842c1.62-.48 3.21-.974 4.76-1.488c29.348-9.723 48.443-25.443 48.443-41.52c0-15.417-17.868-30.326-45.517-39.844Zm-6.365 70.984c-1.4.463-2.836.91-4.3 1.345c-3.24-10.257-7.612-21.163-12.963-32.432c5.106-11 9.31-21.767 12.459-31.957c2.619.758 5.16 1.557 7.61 2.4c23.69 8.156 38.14 20.213 38.14 29.504c0 9.896-15.606 22.743-40.946 31.14Zm-10.514 20.834c2.562 12.94 2.927 24.64 1.23 33.787c-1.524 8.219-4.59 13.698-8.382 15.893c-8.067 4.67-25.32-1.4-43.927-17.412a156.726 156.726 0 0 1-6.437-5.87c7.214-7.889 14.423-17.06 21.459-27.246c12.376-1.098 24.068-2.894 34.671-5.345a134.17 134.17 0 0 1 1.386 6.193ZM87.276 214.515c-7.882 2.783-14.16 2.863-17.955.675c-8.075-4.657-11.432-22.636-6.853-46.752a156.923 156.923 0 0 1 1.869-8.499c10.486 2.32 22.093 3.988 34.498 4.994c7.084 9.967 14.501 19.128 21.976 27.15a134.668 134.668 0 0 1-4.877 4.492c-9.933 8.682-19.886 14.842-28.658 17.94ZM50.35 144.747c-12.483-4.267-22.792-9.812-29.858-15.863c-6.35-5.437-9.555-10.836-9.555-15.216c0-9.322 13.897-21.212 37.076-29.293c2.813-.98 5.757-1.905 8.812-2.773c3.204 10.42 7.406 21.315 12.477 32.332c-5.137 11.18-9.399 22.249-12.634 32.792a134.718 134.718 0 0 1-6.318-1.979Zm12.378-84.26c-4.811-24.587-1.616-43.134 6.425-47.789c8.564-4.958 27.502 2.111 47.463 19.835a144.318 144.318 0 0 1 3.841 3.545c-7.438 7.987-14.787 17.08-21.808 26.988c-12.04 1.116-23.565 2.908-34.161 5.309a160.342 160.342 0 0 1-1.76-7.887Zm110.427 27.268a347.8 347.8 0 0 0-7.785-12.803c8.168 1.033 15.994 2.404 23.343 4.08c-2.206 7.072-4.956 14.465-8.193 22.045a381.151 381.151 0 0 0-7.365-13.322Zm-45.032-43.861c5.044 5.465 10.096 11.566 15.065 18.186a322.04 322.04 0 0 0-30.257-.006c4.974-6.559 10.069-12.652 15.192-18.18ZM82.802 87.83a323.167 323.167 0 0 0-7.227 13.238c-3.184-7.553-5.909-14.98-8.134-22.152c7.304-1.634 15.093-2.97 23.209-3.984a321.524 321.524 0 0 0-7.848 12.897Zm8.081 65.352c-8.385-.936-16.291-2.203-23.593-3.793c2.26-7.3 5.045-14.885 8.298-22.6a321.187 321.187 0 0 0 7.257 13.246c2.594 4.48 5.28 8.868 8.038 13.147Zm37.542 31.03c-5.184-5.592-10.354-11.779-15.403-18.433c4.902.192 9.899.29 14.978.29c5.218 0 10.376-.117 15.453-.343c-4.985 6.774-10.018 12.97-15.028 18.486Zm52.198-57.817c3.422 7.8 6.306 15.345 8.596 22.52c-7.422 1.694-15.436 3.058-23.88 4.071a382.417 382.417 0 0 0 7.859-13.026a347.403 347.403 0 0 0 7.425-13.565Zm-16.898 8.101a358.557 358.557 0 0 1-12.281 19.815a329.4 329.4 0 0 1-23.444.823c-7.967 0-15.716-.248-23.178-.732a310.202 310.202 0 0 1-12.513-19.846h.001a307.41 307.41 0 0 1-10.923-20.627a310.278 310.278 0 0 1 10.89-20.637l-.001.001a307.318 307.318 0 0 1 12.413-19.761c7.613-.576 15.42-.876 23.31-.876H128c7.926 0 15.743.303 23.354.883a329.357 329.357 0 0 1 12.335 19.695a358.489 358.489 0 0 1 11.036 20.54a329.472 329.472 0 0 1-11 20.722Zm22.56-122.124c8.572 4.944 11.906 24.881 6.52 51.026c-.344 1.668-.73 3.367-1.15 5.09c-10.622-2.452-22.155-4.275-34.23-5.408c-7.034-10.017-14.323-19.124-21.64-27.008a160.789 160.789 0 0 1 5.888-5.4c18.9-16.447 36.564-22.941 44.612-18.3ZM128 90.808c12.625 0 22.86 10.235 22.86 22.86s-10.235 22.86-22.86 22.86s-22.86-10.235-22.86-22.86s10.235-22.86 22.86-22.86Z"></path></svg>

After

Width:  |  Height:  |  Size: 4.0 KiB

@ -0,0 +1,68 @@
import React from 'react';
import { Layout, Menu, Input, Badge, Switch, Avatar } from 'antd';
import { SearchOutlined, BellOutlined, UserOutlined, MenuFoldOutlined, MenuUnfoldOutlined } from '@ant-design/icons';
const { Header: AntHeader } = Layout;
const { Search } = Input;
const Header = ({ collapsed, onToggle, theme, onThemeChange }) => {
return (
<AntHeader style={{
display: 'flex',
alignItems: 'center',
justifyContent: 'space-between',
background: theme === 'light' ? '#fff' : '#1f1f1f',
boxShadow: '0 2px 8px rgba(0, 0, 0, 0.1)',
padding: '0 24px'
}}>
<div style={{ display: 'flex', alignItems: 'center' }}>
<button
type="button"
className="trigger"
style={{
fontSize: '16px',
width: 64,
height: 64,
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
cursor: 'pointer',
border: 'none',
background: 'transparent',
color: theme === 'light' ? '#262626' : '#fff'
}}
onClick={onToggle}
>
{collapsed ? <MenuUnfoldOutlined /> : <MenuFoldOutlined />}
</button>
<div style={{
fontSize: '20px',
fontWeight: 'bold',
marginLeft: '20px',
color: theme === 'light' ? '#1890ff' : '#40a9ff'
}}>
AI期货分析系统
</div>
</div>
<div style={{ display: 'flex', alignItems: 'center' }}>
<Search
placeholder="搜索品种"
style={{ width: 200, marginRight: 20 }}
prefix={<SearchOutlined />}
/>
<Badge count={3} style={{ marginRight: 20 }}>
<BellOutlined style={{ fontSize: 20, cursor: 'pointer', color: theme === 'light' ? '#262626' : '#fff' }} />
</Badge>
<div style={{ display: 'flex', alignItems: 'center', marginRight: 20 }}>
<span style={{ marginRight: 8, color: theme === 'light' ? '#262626' : '#fff' }}>深色模式</span>
<Switch checked={theme === 'dark'} onChange={onThemeChange} />
</div>
<Avatar size="small" icon={<UserOutlined />} style={{ marginRight: 8 }} />
<span style={{ color: theme === 'light' ? '#262626' : '#fff' }}>管理员</span>
</div>
</AntHeader>
);
};
export default Header;

@ -0,0 +1,64 @@
import React, { useState } from 'react';
import { Layout } from 'antd';
import Header from './Header';
import Sider from './Sider';
import RightPanel from './RightPanel';
const { Content } = Layout;
const MainLayout = ({ children, currentMenu, onMenuSelect }) => {
const [collapsed, setCollapsed] = useState(false);
const [rightCollapsed, setRightCollapsed] = useState(false);
const [theme, setTheme] = useState('light');
const handleToggle = () => {
setCollapsed(!collapsed);
};
const handleRightToggle = (collapsed) => {
setRightCollapsed(collapsed);
};
const handleThemeChange = (checked) => {
setTheme(checked ? 'dark' : 'light');
};
return (
<Layout style={{ minHeight: '100vh', background: theme === 'light' ? '#f0f2f5' : '#141414' }}>
<Header
collapsed={collapsed}
onToggle={handleToggle}
theme={theme}
onThemeChange={handleThemeChange}
/>
<Layout>
<Sider
collapsed={collapsed}
theme={theme}
currentMenu={currentMenu}
onMenuSelect={onMenuSelect}
/>
<Content
style={{
margin: '24px',
padding: '24px',
background: theme === 'light' ? '#fff' : '#1f1f1f',
borderRadius: '4px',
boxShadow: '0 2px 8px rgba(0, 0, 0, 0.1)',
minHeight: 280,
overflow: 'auto'
}}
>
{children}
</Content>
<RightPanel
collapsed={rightCollapsed}
onToggle={handleRightToggle}
theme={theme}
/>
</Layout>
</Layout>
);
};
export default MainLayout;

@ -0,0 +1,105 @@
import React, { useState } from 'react';
import { Layout, Card, List, Badge, Collapse } from 'antd';
import { ArrowUpOutlined, ArrowDownOutlined, AlertOutlined, FireOutlined } from '@ant-design/icons';
import { marketHotspots, riskAlerts } from '../../utils/mockData';
const { Sider: AntSider } = Layout;
const { Panel } = Collapse;
const RightPanel = ({ collapsed, onToggle, theme }) => {
const [activeTab, setActiveTab] = useState('hotspots');
//
const sortedHotspots = [...marketHotspots].sort((a, b) => Math.abs(b.changePercent) - Math.abs(a.changePercent)).slice(0, 10);
return (
<AntSider
width={300}
collapsible
collapsed={collapsed}
onCollapse={onToggle}
style={{
background: theme === 'light' ? '#fff' : '#1f1f1f',
boxShadow: '-2px 0 8px rgba(0, 0, 0, 0.1)',
overflow: 'auto'
}}
>
<div style={{
height: 64,
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
fontSize: '16px',
fontWeight: 'bold',
color: theme === 'light' ? '#1890ff' : '#40a9ff',
borderBottom: `1px solid ${theme === 'light' ? '#f0f0f0' : '#333'}`
}}>
{!collapsed && '市场信息'}
</div>
{!collapsed && (
<div style={{ padding: '16px' }}>
<Collapse defaultActiveKey={['hotspots', 'alerts']} style={{ marginBottom: 16 }}>
<Panel
header={<div style={{ display: 'flex', alignItems: 'center' }}><FireOutlined style={{ marginRight: 8 }} />市场热点</div>}
key="hotspots"
>
<List
itemLayout="horizontal"
dataSource={sortedHotspots}
renderItem={item => (
<List.Item>
<List.Item.Meta
title={
<div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>
<span>{item.name} ({item.code})</span>
<span style={{
color: item.changePercent > 0 ? '#52c41a' : '#ff4d4f',
display: 'flex',
alignItems: 'center'
}}>
{item.changePercent > 0 ? <ArrowUpOutlined style={{ fontSize: 12 }} /> : <ArrowDownOutlined style={{ fontSize: 12 }} />}
{Math.abs(item.changePercent).toFixed(2)}%
</span>
</div>
}
description={
<div style={{ fontSize: '12px', color: theme === 'light' ? '#8c8c8c' : '#999' }}>
{item.type}
</div>
}
/>
</List.Item>
)}
/>
</Panel>
<Panel
header={<div style={{ display: 'flex', alignItems: 'center' }}><AlertOutlined style={{ marginRight: 8 }} />风险预警</div>}
key="alerts"
>
<List
dataSource={riskAlerts}
renderItem={alert => (
<List.Item>
<Badge
status={alert.level === '高' ? 'error' : alert.level === '中等' ? 'warning' : 'success'}
text={alert.level}
style={{ marginBottom: 8 }}
/>
<div style={{ fontWeight: 'bold', marginBottom: 4 }}>{alert.title}</div>
<div style={{ fontSize: '12px', color: theme === 'light' ? '#8c8c8c' : '#999' }}>
{alert.message}
</div>
</List.Item>
)}
/>
</Panel>
</Collapse>
</div>
)}
</AntSider>
);
};
export default RightPanel;

@ -0,0 +1,57 @@
import React from 'react';
import { Layout, Menu } from 'antd';
import { HomeOutlined, BarChartOutlined, AlertOutlined, SettingOutlined } from '@ant-design/icons';
const { Sider: AntSider } = Layout;
const Sider = ({ collapsed, theme, currentMenu, onMenuSelect }) => {
return (
<AntSider
collapsible
collapsed={collapsed}
style={{
background: theme === 'light' ? '#fff' : '#1f1f1f',
boxShadow: '2px 0 8px rgba(0, 0, 0, 0.1)'
}}
>
<div style={{
height: 64,
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
fontSize: '16px',
fontWeight: 'bold',
color: theme === 'light' ? '#1890ff' : '#40a9ff',
borderBottom: `1px solid ${theme === 'light' ? '#f0f0f0' : '#333'}`
}}>
{!collapsed && '功能导航'}
</div>
<Menu
mode="inline"
selectedKeys={[currentMenu]}
onSelect={({ key }) => onMenuSelect(key)}
style={{
height: '100%',
borderRight: 0,
background: theme === 'light' ? '#fff' : '#1f1f1f'
}}
theme={theme}
>
<Menu.Item key="dashboard" icon={<HomeOutlined />}>
市场概览
</Menu.Item>
<Menu.Item key="detail" icon={<BarChartOutlined />}>
详情分析
</Menu.Item>
<Menu.Item key="risk-control" icon={<AlertOutlined />}>
风控管理
</Menu.Item>
<Menu.Item key="config" icon={<SettingOutlined />}>
配置管理
</Menu.Item>
</Menu>
</AntSider>
);
};
export default Sider;

@ -0,0 +1,25 @@
import { useState, useEffect } from 'react';
const useTheme = () => {
const [theme, setTheme] = useState('light');
useEffect(() => {
// 从localStorage读取主题设置
const savedTheme = localStorage.getItem('theme');
if (savedTheme) {
setTheme(savedTheme);
document.documentElement.setAttribute('data-theme', savedTheme);
}
}, []);
const toggleTheme = () => {
const newTheme = theme === 'light' ? 'dark' : 'light';
setTheme(newTheme);
localStorage.setItem('theme', newTheme);
document.documentElement.setAttribute('data-theme', newTheme);
};
return { theme, toggleTheme };
};
export default useTheme;

@ -0,0 +1,79 @@
:root {
font-family: system-ui, Avenir, Helvetica, Arial, sans-serif;
line-height: 1.5;
font-weight: 400;
font-synthesis: none;
text-rendering: optimizeLegibility;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
margin: 0;
min-width: 320px;
min-height: 100vh;
background-color: #f0f2f5;
color: #262626;
}
/* 深色模式基础样式 */
[data-theme="dark"] {
body {
background-color: #141414;
color: #ffffff;
}
}
/* 确保所有元素继承box-sizing */
*,
*::before,
*::after {
box-sizing: inherit;
}
/* 移除默认列表样式 */
ul, ol {
list-style: none;
}
/* 移除默认链接样式 */
a {
text-decoration: none;
color: inherit;
}
/* 确保图片响应式 */
img {
max-width: 100%;
height: auto;
}
/* 确保表单元素继承字体 */
input, button, select, textarea {
font-family: inherit;
font-size: inherit;
line-height: inherit;
}
/* 确保按钮和输入框的默认样式一致 */
button, input[type="submit"], input[type="reset"] {
background: none;
border: none;
cursor: pointer;
padding: 0;
}
/* 清除浮动 */
.clearfix::after {
content: '';
display: table;
clear: both;
}

@ -0,0 +1,11 @@
import { StrictMode } from 'react'
import { createRoot } from 'react-dom/client'
import './index.css'
import App from './App.jsx'
import 'antd/dist/reset.css'
createRoot(document.getElementById('root')).render(
<StrictMode>
<App />
</StrictMode>,
)

@ -0,0 +1,357 @@
import React, { useState } from 'react';
import { Card, Row, Col, Form, Input, Select, Switch, Slider, Button, Table, Badge, Typography, Tabs } from 'antd';
import { SaveOutlined, ReloadOutlined, DatabaseOutlined, ToolOutlined, SettingOutlined, UserOutlined } from '@ant-design/icons';
import useTheme from '../../hooks/useTheme';
const { Title, Text } = Typography;
const { Option } = Select;
const { TabPane } = Tabs;
const { Column } = Table;
const Config = () => {
const [form] = Form.useForm();
const [activeTab, setActiveTab] = useState('data-source');
//
const dataSources = [
{ id: 1, name: 'CTP行情', type: '期货', status: '在线', responseTime: '23ms', priority: 1, enabled: true },
{ id: 2, name: 'Wind资讯', type: '综合', status: '在线', responseTime: '45ms', priority: 2, enabled: true },
{ id: 3, name: '东方财富', type: '股票', status: '在线', responseTime: '67ms', priority: 3, enabled: false },
{ id: 4, name: '同花顺', type: '股票', status: '离线', responseTime: '-', priority: 4, enabled: false }
];
// AI
const aiModels = [
{ id: 1, name: 'LSTM预测模型', type: '时间序列', accuracy: '85%', responseTime: '120ms', enabled: true },
{ id: 2, name: 'XGBoost分类模型', type: '分类', accuracy: '82%', responseTime: '80ms', enabled: true },
{ id: 3, name: 'Transformer模型', type: '时间序列', accuracy: '88%', responseTime: '200ms', enabled: false },
{ id: 4, name: '随机森林模型', type: '分类', accuracy: '78%', responseTime: '60ms', enabled: false }
];
//
const onFinish = (values) => {
console.log('配置设置:', values);
//
};
//
const toggleDataSource = (id) => {
console.log('切换数据源状态:', id);
//
};
// AI
const toggleAiModel = (id) => {
console.log('切换AI模型状态:', id);
//
};
return (
<div>
{/* 页面头部 */}
<Row gutter={[16, 16]} style={{ marginBottom: 24 }}>
<Col flex="auto">
<Title level={3}>配置管理</Title>
<Text>管理数据源AI模型系统参数和用户偏好</Text>
</Col>
</Row>
<Tabs activeKey={activeTab} onChange={setActiveTab} style={{ marginBottom: 24 }}>
{/* 数据源配置 */}
<TabPane tab={<div style={{ display: 'flex', alignItems: 'center' }}><DatabaseOutlined style={{ marginRight: 8 }} />数据源配置</div>} key="data-source">
<Card style={{ marginBottom: 24 }}>
<Table dataSource={dataSources} rowKey="id" size="small">
<Column title="数据源名称" dataIndex="name" />
<Column title="类型" dataIndex="type" />
<Column
title="状态"
dataIndex="status"
render={(text) => (
<Badge status={text === '在线' ? 'success' : 'error'} text={text} />
)}
/>
<Column title="响应时间" dataIndex="responseTime" />
<Column title="优先级" dataIndex="priority" />
<Column
title="启用"
dataIndex="enabled"
render={(text, record) => (
<Switch checked={text} onChange={() => toggleDataSource(record.id)} />
)}
/>
<Column
title="操作"
render={() => (
<Button size="small" icon={<ReloadOutlined />}>刷新</Button>
)}
/>
</Table>
</Card>
<Card title="添加数据源">
<Form
layout="vertical"
onFinish={onFinish}
>
<Row gutter={[16, 16]}>
<Col xs={24} md={12}>
<Form.Item
label="数据源名称"
name="dataSourceName"
rules={[{ required: true, message: '请输入数据源名称' }]}
>
<Input />
</Form.Item>
</Col>
<Col xs={24} md={12}>
<Form.Item
label="类型"
name="dataSourceType"
rules={[{ required: true, message: '请选择数据源类型' }]}
>
<Select placeholder="选择数据源类型">
<Option value="期货">期货</Option>
<Option value="股票">股票</Option>
<Option value="综合">综合</Option>
</Select>
</Form.Item>
</Col>
<Col xs={24} md={12}>
<Form.Item
label="优先级"
name="dataSourcePriority"
rules={[{ required: true, message: '请输入优先级' }]}
>
<Input type="number" min={1} max={10} />
</Form.Item>
</Col>
<Col xs={24} md={12}>
<Form.Item
label="启用"
name="dataSourceEnabled"
>
<Switch defaultChecked />
</Form.Item>
</Col>
<Col xs={24}>
<Form.Item>
<Button type="primary" htmlType="submit" icon={<SaveOutlined />} style={{ marginRight: 8 }}>
添加数据源
</Button>
<Button>取消</Button>
</Form.Item>
</Col>
</Row>
</Form>
</Card>
</TabPane>
{/* AI模型配置 */}
<TabPane tab={<div style={{ display: 'flex', alignItems: 'center' }}><ToolOutlined style={{ marginRight: 8 }} />AI模型配置</div>} key="ai-model">
<Card style={{ marginBottom: 24 }}>
<Table dataSource={aiModels} rowKey="id" size="small">
<Column title="模型名称" dataIndex="name" />
<Column title="类型" dataIndex="type" />
<Column title="准确率" dataIndex="accuracy" />
<Column title="响应时间" dataIndex="responseTime" />
<Column
title="启用"
dataIndex="enabled"
render={(text, record) => (
<Switch checked={text} onChange={() => toggleAiModel(record.id)} />
)}
/>
<Column
title="操作"
render={() => (
<Button size="small">配置</Button>
)}
/>
</Table>
</Card>
<Card title="模型参数调优">
<Row gutter={[16, 16]}>
<Col xs={24} md={12}>
<Text strong>学习率</Text>
<Slider defaultValue={0.01} min={0.001} max={0.1} step={0.001} />
<Text style={{ display: 'block', marginTop: 8 }}>当前值: 0.01</Text>
</Col>
<Col xs={24} md={12}>
<Text strong>批次大小</Text>
<Slider defaultValue={32} min={8} max={128} step={8} />
<Text style={{ display: 'block', marginTop: 8 }}>当前值: 32</Text>
</Col>
<Col xs={24} md={12}>
<Text strong>训练轮数</Text>
<Slider defaultValue={100} min={10} max={500} step={10} />
<Text style={{ display: 'block', marginTop: 8 }}>当前值: 100</Text>
</Col>
<Col xs={24} md={12}>
<Text strong>特征维度</Text>
<Slider defaultValue={64} min={16} max={256} step={16} />
<Text style={{ display: 'block', marginTop: 8 }}>当前值: 64</Text>
</Col>
<Col xs={24}>
<Button type="primary" icon={<SaveOutlined />} style={{ marginRight: 8 }}>
保存参数
</Button>
<Button>重置默认</Button>
</Col>
</Row>
</Card>
</TabPane>
{/* 系统配置 */}
<TabPane tab={<div style={{ display: 'flex', alignItems: 'center' }}><SettingOutlined style={{ marginRight: 8 }} />系统配置</div>} key="system">
<Card style={{ marginBottom: 24 }}>
<Form
layout="vertical"
onFinish={onFinish}
>
<Row gutter={[16, 16]}>
<Col xs={24} md={12}>
<Form.Item
label="分析周期"
name="analysisPeriod"
rules={[{ required: true, message: '请选择分析周期' }]}
>
<Select placeholder="选择分析周期">
<Option value="1MIN">1分钟</Option>
<Option value="5MIN">5分钟</Option>
<Option value="15MIN">15分钟</Option>
<Option value="30MIN">30分钟</Option>
<Option value="1HOUR">1小时</Option>
<Option value="1DAY">1</Option>
</Select>
</Form.Item>
</Col>
<Col xs={24} md={12}>
<Form.Item
label="数据刷新间隔"
name="refreshInterval"
rules={[{ required: true, message: '请输入数据刷新间隔' }]}
>
<Input addonAfter="秒" type="number" min={1} max={300} />
</Form.Item>
</Col>
<Col xs={24} md={12}>
<Form.Item
label="风险预警阈值"
name="riskAlertThreshold"
rules={[{ required: true, message: '请输入风险预警阈值' }]}
>
<Input addonAfter="%" type="number" min={0.1} max={10} step={0.1} />
</Form.Item>
</Col>
<Col xs={24} md={12}>
<Form.Item
label="最大并发请求数"
name="maxConcurrentRequests"
rules={[{ required: true, message: '请输入最大并发请求数' }]}
>
<Input type="number" min={1} max={100} />
</Form.Item>
</Col>
<Col xs={24}>
<Form.Item>
<Button type="primary" htmlType="submit" icon={<SaveOutlined />} style={{ marginRight: 8 }}>
保存配置
</Button>
<Button>重置默认</Button>
</Form.Item>
</Col>
</Row>
</Form>
</Card>
</TabPane>
{/* 用户偏好 */}
<TabPane tab={<div style={{ display: 'flex', alignItems: 'center' }}><UserOutlined style={{ marginRight: 8 }} />用户偏好</div>} key="user-preference">
<Card style={{ marginBottom: 24 }}>
<Form
layout="vertical"
onFinish={onFinish}
>
<Row gutter={[16, 16]}>
<Col xs={24} md={12}>
<Form.Item
label="默认页面"
name="defaultPage"
rules={[{ required: true, message: '请选择默认页面' }]}
>
<Select placeholder="选择默认页面">
<Option value="dashboard">市场概览</Option>
<Option value="detail">详情分析</Option>
<Option value="risk-control">风控管理</Option>
<Option value="config">配置管理</Option>
</Select>
</Form.Item>
</Col>
<Col xs={24} md={12}>
<Form.Item
label="默认品种"
name="defaultFuture"
rules={[{ required: true, message: '请选择默认品种' }]}
>
<Select placeholder="选择默认品种">
<Option value="MA">甲醇</Option>
<Option value="CU"></Option>
<Option value="SC">原油</Option>
<Option value="RB">螺纹钢</Option>
</Select>
</Form.Item>
</Col>
<Col xs={24}>
<Text strong>通知设置</Text>
</Col>
<Col xs={24} md={12}>
<Form.Item
label="风险预警通知"
name="riskAlertNotification"
>
<Switch defaultChecked />
</Form.Item>
</Col>
<Col xs={24} md={12}>
<Form.Item
label="行情异动通知"
name="marketMovementNotification"
>
<Switch defaultChecked />
</Form.Item>
</Col>
<Col xs={24} md={12}>
<Form.Item
label="AI模型更新通知"
name="aiModelUpdateNotification"
>
<Switch />
</Form.Item>
</Col>
<Col xs={24} md={12}>
<Form.Item
label="系统消息通知"
name="systemMessageNotification"
>
<Switch defaultChecked />
</Form.Item>
</Col>
<Col xs={24}>
<Form.Item>
<Button type="primary" htmlType="submit" icon={<SaveOutlined />} style={{ marginRight: 8 }}>
保存偏好
</Button>
<Button>重置默认</Button>
</Form.Item>
</Col>
</Row>
</Form>
</Card>
</TabPane>
</Tabs>
</div>
);
};
export default Config;

@ -0,0 +1,237 @@
import React, { useState, useEffect } from 'react';
import { Card, Row, Col, Button, Input, Select, Table, Badge, Statistic, Typography, Spin } from 'antd';
import { ReloadOutlined, FilterOutlined, EyeOutlined, EyeInvisibleOutlined, ArrowUpOutlined, ArrowDownOutlined } from '@ant-design/icons';
import { allFuturesData, aiAnalysis, marketHotspots, riskAlerts } from '../../utils/mockData';
import useTheme from '../../hooks/useTheme';
const { Title, Text } = Typography;
const { Search } = Input;
const { Option } = Select;
const { Column } = Table;
const Dashboard = () => {
const [futuresData, setFuturesData] = useState(allFuturesData);
const [filteredData, setFilteredData] = useState(allFuturesData);
const [loading, setLoading] = useState(false);
const [viewMode, setViewMode] = useState('card'); // card or list
const [filterType, setFilterType] = useState('');
const [filterKeyword, setFilterKeyword] = useState('');
//
const handleRefresh = () => {
setLoading(true);
setTimeout(() => {
const refreshedData = allFuturesData.map(item => ({
...item,
currentPrice: (parseFloat(item.currentPrice) * (1 + (Math.random() * 0.02 - 0.01))).toFixed(2),
changePercent: (parseFloat(item.changePercent) + (Math.random() * 2 - 1)).toFixed(2)
}));
setFuturesData(refreshedData);
setFilteredData(refreshedData);
setLoading(false);
}, 1000);
};
//
useEffect(() => {
let result = futuresData;
if (filterKeyword) {
const keyword = filterKeyword.toLowerCase();
result = result.filter(item =>
item.code.toLowerCase().includes(keyword) ||
item.name.toLowerCase().includes(keyword)
);
}
if (filterType) {
result = result.filter(item => item.type === filterType);
}
setFilteredData(result);
}, [futuresData, filterKeyword, filterType]);
//
const typeOptions = Array.from(new Set(allFuturesData.map(item => item.type))).map(type => (
<Option key={type} value={type}>{type}</Option>
));
//
const renderCard = (item) => (
<Card
key={item.code}
style={{ marginBottom: 16, transition: 'all 0.3s', cursor: 'pointer' }}
hoverable
onClick={() => console.log('查看详情:', item.code)}
>
<Row gutter={[16, 16]}>
<Col span={24}>
<div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 8 }}>
<div style={{ fontWeight: 'bold', fontSize: '16px' }}>{item.name} ({item.code})</div>
<Badge
status={item.changePercent > 0 ? 'success' : 'error'}
text={`${item.changePercent > 0 ? '+' : ''}${item.changePercent}%`}
/>
</div>
</Col>
<Col span={24}>
<Statistic
title="当前价格"
value={item.currentPrice}
valueStyle={{ color: item.changePercent > 0 ? '#52c41a' : '#ff4d4f' }}
suffix="元"
size="small"
/>
</Col>
<Col span={12}>
<div style={{ fontSize: '12px', color: '#8c8c8c' }}>胜率: {item.winRate}%</div>
</Col>
<Col span={12}>
<div style={{ fontSize: '12px', color: '#8c8c8c' }}>ATR: {item.atr}</div>
</Col>
<Col span={12}>
<div style={{ fontSize: '12px', color: '#8c8c8c' }}>ADX: {item.adx}</div>
</Col>
<Col span={12}>
<div style={{ fontSize: '12px', color: '#8c8c8c' }}>趋势: {item.adxStatus}</div>
</Col>
</Row>
</Card>
);
return (
<div>
{/* 页面头部 */}
<Row gutter={[16, 16]} style={{ marginBottom: 24 }}>
<Col flex="auto">
<Title level={3}>欢迎使用AI期货分析系统</Title>
<Text>当前市场整体处于{aiAnalysis.overallView.split('')[0]}</Text>
</Col>
<Col flex="none">
<div style={{ display: 'flex', gap: 12 }}>
<Button onClick={handleRefresh} icon={<ReloadOutlined />} loading={loading}>
刷新数据
</Button>
<Button
onClick={() => setViewMode(viewMode === 'card' ? 'list' : 'card')}
icon={viewMode === 'card' ? <EyeInvisibleOutlined /> : <EyeOutlined />}
>
{viewMode === 'card' ? '列表视图' : '卡片视图'}
</Button>
</div>
</Col>
</Row>
{/* 筛选栏 */}
<Row gutter={[16, 16]} style={{ marginBottom: 24 }}>
<Col span={8}>
<Search
placeholder="搜索品种代码或名称"
value={filterKeyword}
onChange={(e) => setFilterKeyword(e.target.value)}
style={{ width: '100%' }}
/>
</Col>
<Col span={8}>
<Select
placeholder="按品种类型筛选"
style={{ width: '100%' }}
value={filterType}
onChange={setFilterType}
allowClear
>
{typeOptions}
</Select>
</Col>
</Row>
{/* 品种概览区 */}
<Card title="品种概览" style={{ marginBottom: 24 }}>
<Spin spinning={loading}>
{viewMode === 'card' ? (
<Row gutter={[16, 16]}>
{filteredData.map(item => (
<Col key={item.code} xs={24} sm={12} md={8} lg={6}>
{renderCard(item)}
</Col>
))}
</Row>
) : (
<Table dataSource={filteredData} rowKey="code" pagination={{ pageSize: 10 }}>
<Column title="品种" dataIndex="name" key="name" render={(text, record) => `${text} (${record.code})`} />
<Column title="当前价格" dataIndex="currentPrice" key="currentPrice" />
<Column
title="涨跌幅"
dataIndex="changePercent"
key="changePercent"
render={(text) => (
<span style={{ color: text > 0 ? '#52c41a' : '#ff4d4f' }}>
{text > 0 ? '+' : ''}{text}%
</span>
)}
/>
<Column title="胜率" dataIndex="winRate" key="winRate" render={(text) => `${text}%`} />
<Column title="ATR" dataIndex="atr" key="atr" />
<Column title="ADX" dataIndex="adx" key="adx" />
<Column title="趋势状态" dataIndex="adxStatus" key="adxStatus" />
</Table>
)}
</Spin>
</Card>
{/* 市场热点和AI研判区 */}
<Row gutter={[16, 16]} style={{ marginBottom: 24 }}>
<Col xs={24} lg={12}>
<Card title="AI研判">
<div style={{ marginBottom: 16 }}>
<Text strong>市场整体观点</Text>
<Text>{aiAnalysis.overallView}</Text>
</div>
<div style={{ marginBottom: 16 }}>
<Text strong>投资建议</Text>
<ul style={{ marginLeft: 20, marginTop: 8 }}>
{aiAnalysis.recommendations.map((item, index) => (
<li key={index} style={{ marginBottom: 4 }}>{item}</li>
))}
</ul>
</div>
<div>
<Text strong>置信度</Text>
<Badge status="success" text={`${aiAnalysis.confidence}%`} />
</div>
</Card>
</Col>
<Col xs={24} lg={12}>
<Card title="风险预警">
<Row gutter={[16, 16]}>
{riskAlerts.map(alert => (
<Col key={alert.id} span={24}>
<Card
size="small"
style={{
borderLeft: `4px solid ${alert.level === '高' ? '#ff4d4f' : alert.level === '中等' ? '#faad14' : '#52c41a'}`
}}
>
<div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 8 }}>
<Text strong>{alert.title}</Text>
<Badge
status={alert.level === '高' ? 'error' : alert.level === '中等' ? 'warning' : 'success'}
text={alert.level}
/>
</div>
<Text type="secondary">{alert.message}</Text>
</Card>
</Col>
))}
</Row>
</Card>
</Col>
</Row>
</div>
);
};
export default Dashboard;

@ -0,0 +1,306 @@
import React, { useState, useEffect, useRef } from 'react';
import { Card, Row, Col, Button, Select, Tabs, Statistic, Typography, Badge, Table } from 'antd';
import { ArrowUpOutlined, ArrowDownOutlined, LineChartOutlined, BarChartOutlined, PieChartOutlined } from '@ant-design/icons';
import { generateFutureData, generateKlineData } from '../../utils/mockData';
import useTheme from '../../hooks/useTheme';
// Lightweight Charts
import { createChart } from 'lightweight-charts';
const { Title, Text } = Typography;
const { Option } = Select;
const { TabPane } = Tabs;
const { Column } = Table;
const Detail = () => {
const [selectedFuture, setSelectedFuture] = useState('MA');
const [futureData, setFutureData] = useState(generateFutureData('MA', '甲醇'));
const [timePeriod, setTimePeriod] = useState('1DAY');
const [chart, setChart] = useState(null);
const chartRef = useRef(null);
//
const futuresList = [
{ code: 'MA', name: '甲醇' },
{ code: 'CU', name: '铜' },
{ code: 'SC', name: '原油' },
{ code: 'RB', name: '螺纹钢' },
{ code: 'P', name: '棕榈油' }
];
// K线
const klineData = generateKlineData(30);
//
const handleFutureChange = (code) => {
const future = futuresList.find(f => f.code === code);
setSelectedFuture(code);
setFutureData(generateFutureData(code, future.name));
};
//
const handleTimePeriodChange = (period) => {
setTimePeriod(period);
};
// K线
useEffect(() => {
if (chartRef.current) {
//
if (chart) {
chart.destroy();
}
//
const newChart = createChart(chartRef.current, {
width: chartRef.current.clientWidth,
height: 400,
layout: {
backgroundColor: '#ffffff',
textColor: '#333333'
},
grid: {
vertLines: {
color: '#f0f0f0'
},
horzLines: {
color: '#f0f0f0'
}
},
priceScale: {
borderColor: '#f0f0f0'
},
timeScale: {
borderColor: '#f0f0f0'
}
});
//
const candleSeries = newChart.addCandlestickSeries({
upColor: '#52c41a',
downColor: '#ff4d4f',
borderUpColor: '#52c41a',
borderDownColor: '#ff4d4f',
wickUpColor: '#52c41a',
wickDownColor: '#ff4d4f'
});
//
const volumeSeries = newChart.addHistogramSeries({
color: '#82ca9d',
priceFormat: {
type: 'volume'
},
priceScaleId: '',
scaleMargins: {
top: 0.8, //
bottom: 0
}
});
//
const candleData = klineData.map(item => ({
time: item.time,
open: parseFloat(item.open),
high: parseFloat(item.high),
low: parseFloat(item.low),
close: parseFloat(item.close)
}));
const volumeData = klineData.map(item => ({
time: item.time,
value: parseFloat(item.volume),
color: parseFloat(item.close) >= parseFloat(item.open) ? '#52c41a' : '#ff4d4f'
}));
//
candleSeries.setData(candleData);
volumeSeries.setData(volumeData);
//
const handleResize = () => {
if (newChart) {
newChart.resize(chartRef.current.clientWidth, 400);
}
};
window.addEventListener('resize', handleResize);
setChart(newChart);
//
return () => {
window.removeEventListener('resize', handleResize);
if (newChart) {
newChart.destroy();
}
};
}
}, []);
return (
<div>
{/* 页面头部 */}
<Row gutter={[16, 16]} style={{ marginBottom: 24 }}>
<Col flex="auto">
<Title level={3}>{futureData.name} ({futureData.code}) 详情分析</Title>
<Text>{futureData.fullName}</Text>
</Col>
<Col flex="none">
<Select
defaultValue="MA"
style={{ width: 120, marginRight: 16 }}
onChange={handleFutureChange}
>
{futuresList.map(future => (
<Option key={future.code} value={future.code}>{future.name}</Option>
))}
</Select>
</Col>
</Row>
{/* 品种基本信息 */}
<Card style={{ marginBottom: 24 }}>
<Row gutter={[16, 16]}>
<Col xs={24} sm={12} md={8} lg={6}>
<Statistic
title="当前价格"
value={futureData.currentPrice}
valueStyle={{ color: parseFloat(futureData.changePercent) > 0 ? '#52c41a' : '#ff4d4f' }}
suffix="元"
/>
</Col>
<Col xs={24} sm={12} md={8} lg={6}>
<Statistic
title="涨跌幅"
value={futureData.changePercent}
valueStyle={{ color: parseFloat(futureData.changePercent) > 0 ? '#52c41a' : '#ff4d4f' }}
suffix="%"
/>
</Col>
<Col xs={24} sm={12} md={8} lg={6}>
<Statistic title="胜率" value={futureData.winRate} suffix="%" />
</Col>
<Col xs={24} sm={12} md={8} lg={6}>
<Statistic title="ATR" value={futureData.atr} />
</Col>
<Col xs={24} sm={12} md={8} lg={6}>
<Statistic title="ADX" value={futureData.adx} />
</Col>
<Col xs={24} sm={12} md={8} lg={6}>
<Statistic title="趋势状态" value={futureData.adxStatus} />
</Col>
<Col xs={24} sm={12} md={8} lg={6}>
<Statistic title="风险等级" value={futureData.riskLevel} />
</Col>
<Col xs={24} sm={12} md={8} lg={6}>
<Statistic title="波动率" value={futureData.volatility} />
</Col>
</Row>
</Card>
{/* K线图表区 */}
<Card title="K线图表" style={{ marginBottom: 24 }}>
<div style={{ marginBottom: 16, display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>
<div>
<Select
defaultValue="1DAY"
style={{ width: 120 }}
onChange={handleTimePeriodChange}
>
<Option value="5MIN">5分钟</Option>
<Option value="30MIN">30分钟</Option>
<Option value="1HOUR">1小时</Option>
<Option value="1DAY">1</Option>
<Option value="1WEEK">1</Option>
</Select>
</div>
<div style={{ display: 'flex', gap: 8 }}>
<Button icon={<LineChartOutlined />}>MA</Button>
<Button icon={<BarChartOutlined />}>MACD</Button>
<Button icon={<PieChartOutlined />}>KDJ</Button>
</div>
</div>
<div ref={chartRef} style={{ width: '100%', height: 400 }} />
</Card>
{/* 技术指标和AI研判区 */}
<Row gutter={[16, 16]} style={{ marginBottom: 24 }}>
<Col xs={24} lg={12}>
<Card title="技术指标">
<Table dataSource={Object.entries(futureData.indicators).map(([key, value]) => ({ key, value }))} rowKey="key" size="small">
<Column title="指标" dataIndex="key" render={(text) => {
const indicatorNames = {
macd: 'MACD',
rsi: 'RSI',
bollinger: '布林带',
kdj: 'KDJ'
};
return indicatorNames[text] || text;
}} />
<Column title="状态" dataIndex="value" />
</Table>
</Card>
</Col>
<Col xs={24} lg={12}>
<Card title="多周期趋势">
<Table dataSource={Object.entries(futureData.trends).map(([period, data]) => ({ period, ...data }))} rowKey="period" size="small">
<Column title="周期" dataIndex="period" />
<Column title="方向" dataIndex="direction" render={(text) => (
<Badge status={text === '看多' ? 'success' : 'error'} text={text} />
)} />
<Column title="状态" dataIndex="status" />
<Column title="RSI" dataIndex="rsi" />
</Table>
</Card>
</Col>
</Row>
{/* 交易建议和AI研判区 */}
<Row gutter={[16, 16]} style={{ marginBottom: 24 }}>
<Col xs={24} lg={12}>
<Card title="交易建议">
<Row gutter={[16, 16]}>
<Col span={8}>
<Statistic title="入场价" value={futureData.tradingAdvice.entry} suffix="元" />
</Col>
<Col span={8}>
<Statistic title="止损价" value={futureData.tradingAdvice.stopLoss} suffix="元" />
</Col>
<Col span={8}>
<Statistic title="目标价" value={futureData.tradingAdvice.target} suffix="元" />
</Col>
</Row>
<div style={{ marginTop: 16, padding: 16, backgroundColor: '#f6ffed', border: '1px solid #b7eb8f', borderRadius: 4 }}>
<Text strong>AI建议</Text>
<Text>根据多周期分析当前{futureData.name}处于{futureData.trends[timePeriod].status}建议{futureData.trends[timePeriod].direction === '看多' ? '逢低做多' : '逢高做空'}</Text>
</div>
</Card>
</Col>
<Col xs={24} lg={12}>
<Card title="AI研判">
<div style={{ marginBottom: 16 }}>
<Text strong>整体判断</Text>
<Text>{futureData.name}当前处于{futureData.adxStatus}{futureData.trends[timePeriod].direction === '看多' ? '多头力量较强' : '空头力量较强'}</Text>
</div>
<div style={{ marginBottom: 16 }}>
<Text strong>技术面分析</Text>
<ul style={{ marginLeft: 20, marginTop: 8 }}>
<li>MACD{futureData.indicators.macd}</li>
<li>RSI{futureData.indicators.rsi}</li>
<li>布林带{futureData.indicators.bollinger}</li>
<li>KDJ{futureData.indicators.kdj}</li>
</ul>
</div>
<div>
<Text strong>风险提示</Text>
<Text>当前风险等级为{futureData.riskLevel}波动率{futureData.volatility}建议控制仓位严格设置止损</Text>
</div>
</Card>
</Col>
</Row>
</div>
);
};
export default Detail;

@ -0,0 +1,268 @@
import React, { useState } from 'react';
import { Card, Row, Col, Form, Input, Select, Slider, Button, Table, Badge, Statistic, Typography, Alert } from 'antd';
import { SaveOutlined, CalculatorOutlined, CalendarOutlined, AlertOutlined } from '@ant-design/icons';
import useTheme from '../../hooks/useTheme';
const { Title, Text } = Typography;
const { Option } = Select;
const { Column } = Table;
const RiskControl = () => {
const [form] = Form.useForm();
const [positionSize, setPositionSize] = useState(0);
const [riskLevel, setRiskLevel] = useState('中等');
//
const stopLossStrategies = [
{ value: 'fixed', label: '固定止损' },
{ value: 'trailing', label: '移动止损' },
{ value: 'volatility', label: '波动率止损' },
{ value: 'support', label: '支撑位止损' }
];
//
const rolloverAlerts = [
{ id: 1, code: 'MA', name: '甲醇', currentContract: 'MA605', nextContract: 'MA606', expiryDate: '2024-05-15', daysLeft: 15 },
{ id: 2, code: 'CU', name: '铜', currentContract: 'CU605', nextContract: 'CU606', expiryDate: '2024-05-20', daysLeft: 20 },
{ id: 3, code: 'SC', name: '原油', currentContract: 'SC605', nextContract: 'SC606', expiryDate: '2024-05-18', daysLeft: 18 },
{ id: 4, code: 'RB', name: '螺纹钢', currentContract: 'RB605', nextContract: 'RB606', expiryDate: '2024-05-10', daysLeft: 10 }
];
//
const riskMetrics = [
{ id: 1, name: '风险价值 (VaR)', value: '12,500', unit: '元', threshold: '20,000', status: 'normal' },
{ id: 2, name: '最大回撤', value: '8.5', unit: '%', threshold: '15', status: 'normal' },
{ id: 3, name: '夏普比率', value: '1.2', unit: '', threshold: '0.8', status: 'normal' },
{ id: 4, name: '仓位使用率', value: '65', unit: '%', threshold: '80', status: 'normal' },
{ id: 5, name: '杠杆率', value: '2.5', unit: '倍', threshold: '3', status: 'normal' },
{ id: 6, name: '日均波动', value: '2.3', unit: '%', threshold: '3', status: 'normal' }
];
//
const calculatePosition = (values) => {
const { totalCapital, riskPercentage, entryPrice, stopLossPrice } = values;
const riskPerTrade = totalCapital * (riskPercentage / 100);
const priceDiff = Math.abs(entryPrice - stopLossPrice);
const position = priceDiff > 0 ? riskPerTrade / priceDiff : 0;
setPositionSize(position);
};
//
const onFinish = (values) => {
console.log('风控设置:', values);
//
};
return (
<div>
{/* 页面头部 */}
<Row gutter={[16, 16]} style={{ marginBottom: 24 }}>
<Col flex="auto">
<Title level={3}>风控管理</Title>
<Text>设置止损策略管理仓位监控风险</Text>
</Col>
</Row>
{/* 风险概览 */}
<Card style={{ marginBottom: 24 }}>
<Row gutter={[16, 16]}>
<Col xs={24} sm={12} md={8} lg={6}>
<Statistic
title="风险等级"
value={riskLevel}
valueStyle={{ color: riskLevel === '高' ? '#ff4d4f' : riskLevel === '中等' ? '#faad14' : '#52c41a' }}
/>
</Col>
<Col xs={24} sm={12} md={8} lg={6}>
<Statistic title="总资金" value={1000000} suffix="元" />
</Col>
<Col xs={24} sm={12} md={8} lg={6}>
<Statistic title="已用资金" value={650000} suffix="元" />
</Col>
<Col xs={24} sm={12} md={8} lg={6}>
<Statistic title="可用资金" value={350000} suffix="元" />
</Col>
</Row>
</Card>
{/* 止损策略区 */}
<Card title="止损策略设置" style={{ marginBottom: 24 }}>
<Form
form={form}
layout="vertical"
onFinish={onFinish}
>
<Row gutter={[16, 16]}>
<Col xs={24} md={12}>
<Form.Item
label="止损策略"
name="stopLossStrategy"
rules={[{ required: true, message: '请选择止损策略' }]}
>
<Select placeholder="选择止损策略">
{stopLossStrategies.map(strategy => (
<Option key={strategy.value} value={strategy.value}>{strategy.label}</Option>
))}
</Select>
</Form.Item>
</Col>
<Col xs={24} md={12}>
<Form.Item
label="止损比例"
name="stopLossPercentage"
rules={[{ required: true, message: '请输入止损比例' }]}
>
<Input addonAfter="%" type="number" min={0.1} max={10} step={0.1} />
</Form.Item>
</Col>
<Col xs={24} md={12}>
<Form.Item
label="止损价格"
name="stopLossPrice"
rules={[{ required: true, message: '请输入止损价格' }]}
>
<Input addonAfter="元" type="number" step={0.01} />
</Form.Item>
</Col>
<Col xs={24} md={12}>
<Form.Item
label="移动止损距离"
name="trailingDistance"
>
<Input addonAfter="元" type="number" step={0.01} />
</Form.Item>
</Col>
<Col xs={24}>
<Form.Item>
<Button type="primary" htmlType="submit" icon={<SaveOutlined />} style={{ marginRight: 8 }}>
保存设置
</Button>
<Button>重置</Button>
</Form.Item>
</Col>
</Row>
</Form>
</Card>
{/* 仓位管理区 */}
<Card title="仓位计算器" style={{ marginBottom: 24 }}>
<Form
layout="vertical"
onValuesChange={calculatePosition}
>
<Row gutter={[16, 16]}>
<Col xs={24} md={12}>
<Form.Item
label="总资金"
name="totalCapital"
initialValue={1000000}
>
<Input addonAfter="元" type="number" min={1000} step={1000} />
</Form.Item>
</Col>
<Col xs={24} md={12}>
<Form.Item
label="每笔风险比例"
name="riskPercentage"
initialValue={2}
>
<Input addonAfter="%" type="number" min={0.1} max={10} step={0.1} />
</Form.Item>
</Col>
<Col xs={24} md={12}>
<Form.Item
label="入场价格"
name="entryPrice"
initialValue={2000}
>
<Input addonAfter="元" type="number" step={0.01} />
</Form.Item>
</Col>
<Col xs={24} md={12}>
<Form.Item
label="止损价格"
name="stopLossPrice"
initialValue={1960}
>
<Input addonAfter="元" type="number" step={0.01} />
</Form.Item>
</Col>
<Col xs={24}>
<Card style={{ marginBottom: 16 }}>
<Row gutter={[16, 16]}>
<Col span={8}>
<Statistic title="建议仓位" value={positionSize.toFixed(2)} suffix="手" />
</Col>
<Col span={8}>
<Statistic title="风险金额" value={(1000000 * 0.02).toFixed(2)} suffix="元" />
</Col>
<Col span={8}>
<Statistic title="仓位比例" value={(positionSize * 2000 / 1000000 * 100).toFixed(2)} suffix="%" />
</Col>
</Row>
</Card>
</Col>
</Row>
</Form>
</Card>
{/* 换月预警区 */}
<Card title="换月预警" icon={<CalendarOutlined />} style={{ marginBottom: 24 }}>
<Table dataSource={rolloverAlerts} rowKey="id" size="small">
<Column title="品种" dataIndex="name" render={(text, record) => `${text} (${record.code})`} />
<Column title="当前合约" dataIndex="currentContract" />
<Column title="下一合约" dataIndex="nextContract" />
<Column title="到期日" dataIndex="expiryDate" />
<Column
title="剩余天数"
dataIndex="daysLeft"
render={(text) => (
<Badge status={text <= 5 ? 'error' : text <= 10 ? 'warning' : 'success'} text={text} />
)}
/>
<Column
title="操作"
render={() => (
<Button size="small">查看详情</Button>
)}
/>
</Table>
</Card>
{/* 风险监控区 */}
<Card title="风险监控" icon={<AlertOutlined />} style={{ marginBottom: 24 }}>
<Row gutter={[16, 16]}>
{riskMetrics.map(metric => (
<Col key={metric.id} xs={24} sm={12} md={8} lg={4}>
<Card size="small" style={{ height: '100%' }}>
<div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 8 }}>
<Text>{metric.name}</Text>
<Badge status={metric.status === 'normal' ? 'success' : 'error'} text={metric.status === 'normal' ? '正常' : '超标'} />
</div>
<Statistic
value={metric.value}
suffix={metric.unit}
size="small"
valueStyle={{ color: metric.status === 'normal' ? '#52c41a' : '#ff4d4f' }}
/>
<div style={{ fontSize: '12px', color: '#8c8c8c', marginTop: 4 }}>
阈值: {metric.threshold}{metric.unit}
</div>
</Card>
</Col>
))}
</Row>
</Card>
{/* 风险提示 */}
<Alert
message="风险提示"
description="请根据自身风险承受能力设置合理的风控参数,避免过度交易和重仓操作。"
type="warning"
showIcon
/>
</div>
);
};
export default RiskControl;

@ -0,0 +1,147 @@
// 期货品种列表
export const futuresList = [
// 金属类
{ code: 'AU', name: '金', type: '金属' },
{ code: 'AG', name: '银', type: '金属' },
{ code: 'CU', name: '铜', type: '金属' },
{ code: 'NI', name: '镍', type: '金属' },
{ code: 'SN', name: '锡', type: '金属' },
{ code: 'AL', name: '铝', type: '金属' },
{ code: 'ZN', name: '锌', type: '金属' },
// 建材类
{ code: 'FG', name: '玻璃', type: '建材' },
{ code: 'SJS', name: '烧碱', type: '建材' },
{ code: 'SCA', name: '纯碱', type: '建材' },
{ code: 'JM', name: '焦煤', type: '建材' },
{ code: 'RB', name: '螺纹钢', type: '建材' },
{ code: 'ALO', name: '氧化铝', type: '建材' },
// 能源化工类
{ code: 'MA', name: '甲醇', type: '能源化工' },
{ code: 'PVC', name: 'PVC', type: '能源化工' },
{ code: 'FU', name: '燃油', type: '能源化工' },
{ code: 'SC', name: '原油', type: '能源化工' },
{ code: 'L', name: '橡胶', type: '能源化工' },
{ code: 'NR', name: '20号胶', type: '能源化工' },
{ code: 'BU', name: '沥青', type: '能源化工' },
{ code: 'LU', name: '低硫燃油', type: '能源化工' },
// 农产品类
{ code: 'P', name: '棕榈油', type: '农产品' },
// 新能源类
{ code: 'LC', name: '碳酸锂', type: '新能源' },
{ code: 'SI', name: '工业硅', type: '新能源' },
{ code: 'PGS', name: '多晶硅', type: '新能源' },
// 金融类
{ code: 'IC', name: '中证500', type: '金融' },
{ code: 'IM', name: '中证1000', type: '金融' },
{ code: 'IH', name: '上证50', type: '金融' }
];
// 生成模拟品种数据
export const generateFutureData = (code, name) => {
const currentPrice = Math.random() * 10000 + 1000;
const changePercent = (Math.random() * 10 - 5).toFixed(2);
const atr = (Math.random() * 10).toFixed(2);
const adx = Math.floor(Math.random() * 100);
const winRate = Math.floor(Math.random() * 100);
let adxStatus = '无趋势/震荡';
if (adx > 40) {
adxStatus = '强趋势';
} else if (adx > 25) {
adxStatus = '弱趋势';
}
return {
code,
name,
fullName: `${name}-${code}605`,
currentPrice: currentPrice.toFixed(2),
changePercent: parseFloat(changePercent),
atr: parseFloat(atr),
adx,
adxStatus,
winRate,
trends: {
'5MIN': { direction: Math.random() > 0.5 ? '看多' : '看空', status: Math.random() > 0.5 ? '多头趋势' : '空头趋势', rsi: Math.floor(Math.random() * 100) },
'30MIN': { direction: Math.random() > 0.5 ? '看多' : '看空', status: Math.random() > 0.5 ? '多头趋势' : '空头趋势', rsi: Math.floor(Math.random() * 100) },
'1HOUR': { direction: Math.random() > 0.5 ? '看多' : '看空', status: Math.random() > 0.5 ? '多头趋势' : '空头趋势', rsi: Math.floor(Math.random() * 100) },
'1DAY': { direction: Math.random() > 0.5 ? '看多' : '看空', status: Math.random() > 0.5 ? '多头趋势' : '空头趋势', rsi: Math.floor(Math.random() * 100) }
},
indicators: {
macd: Math.random() > 0.5 ? '金叉向上' : '死叉向下',
rsi: `${Math.floor(Math.random() * 100)}(中性)`,
bollinger: ['触及上轨', '触及下轨', '在轨道内'][Math.floor(Math.random() * 3)],
kdj: Math.random() > 0.5 ? '金叉向上' : '死叉向下'
},
tradingAdvice: {
entry: currentPrice.toFixed(2),
stopLoss: (currentPrice * (1 - 0.02)).toFixed(2),
target: (currentPrice * (1 + 0.03)).toFixed(2)
},
riskLevel: ['低', '中等', '高'][Math.floor(Math.random() * 3)],
volatility: ['低', '中等', '高'][Math.floor(Math.random() * 3)]
};
};
// 生成所有品种的模拟数据
export const allFuturesData = futuresList.map(item => generateFutureData(item.code, item.name));
// 市场热点数据
export const marketHotspots = allFuturesData.map(item => ({
code: item.code,
name: item.name,
changePercent: item.changePercent,
type: futuresList.find(f => f.code === item.code).type
}));
// 风险预警数据
export const riskAlerts = [
{ id: 1, title: '原油价格波动加剧', level: '高', message: '近期原油价格波动较大,建议控制仓位' },
{ id: 2, title: '甲醇库存增加', level: '中等', message: '甲醇库存持续增加,可能影响价格走势' },
{ id: 3, title: '螺纹钢需求下降', level: '中等', message: '螺纹钢需求季节性下降,注意风险' },
{ id: 4, title: '铜价突破关键阻力位', level: '低', message: '铜价突破关键阻力位,可能开启上涨趋势' }
];
// AI研判数据
export const aiAnalysis = {
overallView: '当前市场整体处于震荡格局,能源化工板块表现较弱,金属板块相对强势。',
recommendations: [
'关注铜、铝等有色金属品种的反弹机会',
'谨慎对待能源化工类品种,尤其是甲醇、燃油',
'建材类品种建议观望为主,等待明确信号',
'金融类品种有望受益于市场情绪改善'
],
confidence: 75
};
// K线图表模拟数据
export const generateKlineData = (days = 30) => {
const data = [];
let price = 2000;
for (let i = 0; i < days; i++) {
const open = price;
const high = open + Math.random() * 100;
const low = open - Math.random() * 100;
const close = low + Math.random() * (high - low);
const volume = Math.random() * 1000000;
data.push({
time: new Date(Date.now() - (days - i) * 24 * 60 * 60 * 1000).toISOString().split('T')[0],
open: open.toFixed(2),
high: high.toFixed(2),
low: low.toFixed(2),
close: close.toFixed(2),
volume: volume.toFixed(0)
});
price = close;
}
return data;
};

@ -0,0 +1,135 @@
---
name: "ux交互设计师"
description: "根据用户需求生成交互设计方案,支持预览调整,产出可用于开发的详细设计文档。当需要设计用户界面交互流程、优化现有界面体验或为新功能设计交互方案时调用。"
---
# UX交互设计师
## 功能说明
此技能专门用于根据用户需求生成专业的UX交互设计方案主要功能包括
1. **需求分析**:分析用户需求,提取关键交互点和用户场景
2. **交互设计生成**:根据需求生成完整的交互设计方案,包括:
- 用户流程图
- 页面布局设计
- 交互流程设计
- 状态转换设计
- 响应式设计考虑
3. **预览调整**:提供设计预览和调整功能,包括:
- 交互流程演示
- 视觉效果预览
- 可调整的设计参数
- 实时反馈机制
4. **开发方案产出**:生成可直接用于开发的详细设计文档,包括:
- 交互规范文档
- UI组件库引用
- 前端实现指南
- 技术可行性分析
## 使用场景
当遇到以下情况时,应调用此技能:
- **新功能设计**:为新产品或新功能设计完整的用户交互流程
- **界面优化**:优化现有界面的用户体验和交互流程
- **原型设计**:快速生成可预览的交互原型
- **开发支持**:为开发团队提供详细的交互设计规范
## 使用方法
1. 提供详细的需求描述,包括:
- 产品目标和用户群体
- 核心功能需求
- 技术约束条件
- 设计风格偏好
2. 调用此技能生成初始交互设计方案
3. 查看设计预览并提供反馈
4. 基于反馈进行调整优化
5. 获取最终的开发方案文档
## 输出内容
### 设计方案包含:
1. **交互流程图**:用户操作流程的可视化图表
2. **页面设计**:关键页面的布局和元素设计
3. **交互细节**:按钮、表单、导航等交互元素的具体行为
4. **响应式设计**:不同设备尺寸的适配方案
5. **动画效果**:过渡动画和微交互设计
### 开发文档包含:
1. **交互规范**:详细的交互行为描述和实现要求
2. **UI组件清单**:使用的组件及其配置
3. **前端实现指南**:技术实现建议和最佳实践
4. **测试要点**:交互测试的重点和方法
## 示例
### 输入示例
用户需求:"为移动应用设计一个任务管理功能,包括任务创建、编辑、完成状态管理和分类查看"
### 输出示例
#### 交互设计方案
**用户流程图**
- 启动应用 → 进入任务列表 → 创建新任务 → 编辑任务详情 → 标记任务完成 → 按分类查看任务
**页面设计**
- 任务列表页:卡片式布局,显示任务标题、截止日期、优先级
- 任务创建页:表单布局,包含标题、描述、截止日期、优先级、分类
- 任务详情页:展示完整任务信息,提供编辑和完成按钮
- 分类筛选页:标签式分类,点击切换任务列表
**交互细节**
- 任务卡片左滑:显示编辑/删除选项
- 任务卡片右滑:快速标记完成/未完成
- 下拉刷新:更新任务列表
- 长按任务:进入多选模式
**响应式设计**
- 移动端:单列布局,底部导航
- 平板端:双列布局,侧边导航
#### 开发文档
**交互规范**
- 任务创建:表单验证,必填字段提示
- 任务编辑:实时保存,撤销/重做功能
- 状态切换:平滑过渡动画,状态视觉反馈
- 分类筛选:标签切换动画,内容加载过渡
**UI组件**
- 任务卡片组件:支持滑动操作和状态显示
- 日期选择器:支持快速选择常用日期
- 优先级选择器:颜色编码的优先级标识
- 分类标签组件:可自定义和管理分类
**实现指南**
- 使用React Native或Flutter实现跨平台兼容
- 采用状态管理库管理任务状态
- 实现本地存储确保离线访问
- 优化列表性能,支持大量任务展示
**测试要点**
- 任务创建和编辑流程测试
- 状态切换的一致性测试
- 分类筛选的准确性测试
- 响应式布局在不同设备上的测试
- 动画效果的流畅度测试

@ -0,0 +1,186 @@
---
name: "架构师"
description: "根据用户需求进行整体架构设计,输出详细的架构方案文档,为后续编码提供明确指导。当需要为新项目或功能进行技术架构设计、评估技术可行性或优化现有系统架构时调用。"
---
# 架构师
## 功能说明
此技能专门用于根据用户需求进行全面的技术架构设计,主要功能包括:
1. **需求分析与拆解**:分析用户需求,拆解为技术实现要素
2. **整体架构设计**:生成完整的系统架构方案,包括:
- 技术栈选择与论证
- 系统分层与模块划分
- 核心流程设计
- 数据模型设计
- 接口设计规范
3. **技术方案详细设计**:提供详细的技术实现方案,包括:
- 关键类与函数设计
- 数据库结构设计
- API接口设计
- 性能优化策略
- 安全考虑因素
4. **编码指导文档**:生成可直接指导编码的详细文档,包括:
- 代码结构与命名规范
- 开发环境配置
- 测试策略与方案
- 部署与运维方案
## 使用场景
当遇到以下情况时,应调用此技能:
- **新项目启动**:为全新项目设计完整的技术架构
- **功能扩展**:为现有系统设计新功能的架构方案
- **技术重构**:评估并设计系统重构的架构方案
- **技术选型**:为特定需求选择合适的技术栈
- **编码指导**:为开发团队提供详细的编码实现指南
## 使用方法
1. 提供详细的需求描述,包括:
- 业务目标与范围
- 功能需求列表
- 非功能需求(性能、安全、可扩展性等)
- 技术约束与偏好
2. 调用此技能生成初始架构设计方案
3. 评审架构方案并提供反馈
4. 基于反馈进行调整优化
5. 获取最终的架构设计文档和编码指导
## 输出内容
### 架构设计文档包含:
1. **技术栈选择**:推荐的技术栈及其选型理由
2. **系统架构图**:整体系统的分层与模块关系
3. **核心流程设计**:关键业务流程的技术实现路径
4. **数据架构**:数据库设计、数据流向与存储策略
5. **接口设计**API接口规范与调用关系
6. **部署架构**:系统部署方案与环境配置
### 编码指导文档包含:
1. **代码结构**:项目目录结构与文件组织
2. **编码规范**:命名约定、代码风格与最佳实践
3. **实现指南**:关键功能的具体实现步骤
4. **测试策略**:单元测试、集成测试与端到端测试方案
5. **性能优化**:性能瓶颈识别与优化建议
6. **安全实践**:安全漏洞防范与最佳安全实践
## 示例
### 输入示例
用户需求:"设计一个在线商城系统,包括商品管理、用户管理、购物车、订单管理和支付功能,需要支持高并发访问和数据安全"
### 输出示例
#### 架构设计方案
**技术栈选择**
- 前端React + TypeScript + Redux
- 后端Node.js + Express + MongoDB
- 数据库MongoDB + Redis缓存
- 支付集成第三方支付API
- 部署Docker + Kubernetes
**系统架构图**
- 前端层React应用 → CDN缓存
- API层Express路由 → 中间件
- 服务层:业务逻辑服务 → 微服务架构
- 数据层MongoDB → Redis缓存
- 外部服务:支付网关 → 短信/邮件服务
**核心流程设计**
1. 用户注册/登录流程
2. 商品浏览与搜索流程
3. 购物车管理流程
4. 订单创建与支付流程
5. 订单状态更新流程
**数据架构**
- 用户表:存储用户信息与认证数据
- 商品表:存储商品信息与库存
- 购物车表:存储用户购物车数据
- 订单表:存储订单信息与状态
- 支付表:存储支付记录与交易信息
**接口设计**
- 用户接口:/api/users/*
- 商品接口:/api/products/*
- 购物车接口:/api/cart/*
- 订单接口:/api/orders/*
- 支付接口:/api/payments/*
#### 编码指导文档
**代码结构**
```
src/
├── frontend/
│ ├── components/
│ ├── pages/
│ ├── redux/
│ ├── services/
│ └── utils/
├── backend/
│ ├── api/
│ ├── services/
│ ├── models/
│ ├── middleware/
│ └── config/
└── shared/
├── types/
└── utils/
```
**编码规范**
- 前端遵循ESLint + Prettier规范
- 后端使用TypeScript类型定义
- 命名:采用驼峰命名法,类名使用 PascalCase
- 注释:关键代码必须有详细注释
**实现指南**
1. 初始化项目结构与依赖
2. 实现用户认证系统
3. 开发商品管理功能
4. 实现购物车功能
5. 开发订单与支付流程
6. 集成第三方支付API
**测试策略**
- 前端Jest + React Testing Library
- 后端Mocha + Chai
- 集成测试Supertest
- 端到端测试Cypress
**性能优化**
- 前端:代码分割、图片优化、缓存策略
- 后端数据库索引、Redis缓存、负载均衡
- API响应压缩、请求限流、批量操作
**安全实践**
- 认证JWT + 密码哈希
- 授权:基于角色的访问控制
- 输入验证参数校验与SQL注入防护
- 传输安全HTTPS + CORS配置
- 数据保护:敏感数据加密存储

@ -0,0 +1,85 @@
---
name: "需求规划师"
description: "将用户需求拆解为结构化要素转换为AI模型可识别的标准prompt格式并根据需求类型应用对应模板。在输出前与用户进行需求确认确保理解准确无误。当用户提出新需求、需要需求分析或优化现有prompt时调用。"
---
# 需求规划师
## 功能说明
此技能专门用于将用户的自然语言需求拆解转换为AI模型可识别的标准prompt格式。主要功能包括
1. **需求结构化**:将模糊、不完整的需求拆解为明确的结构化要素,包括:
- 目标Goal需求的最终目标是什么
- 输入Input需要提供哪些信息或数据
- 输出Output期望得到什么形式的结果
- 约束Constraints有哪些限制条件或要求
- 上下文Context相关的背景信息
2. **Prompt格式化**将结构化后的需求转换为标准的AI提示词格式包括
- 清晰的指令结构
- 适当的任务描述
- 明确的输出要求
- 必要的约束条件
3. **模板生成**根据需求类型自动应用对应的prompt模板包括
- 代码生成类模板
- 内容创作类模板
- 数据分析类模板
- 问题解决类模板
4. **需求确认**在生成最终prompt前与用户进行需求确认确保
- 需求理解准确无误
- 关键要素无遗漏
- 输出格式符合预期
- 可根据用户反馈进行调整
## 使用场景
当遇到以下情况时,应调用此技能:
- **用户提出新需求**用户描述了一个新的功能需求或任务需要将其转换为AI可处理的prompt
- **需求分析**需要深入分析和拆解复杂的需求确保AI能够准确理解
- **Prompt优化**现有prompt效果不佳需要重新组织和优化结构
## 使用方法
1. 接收用户的原始需求描述
2. 调用此技能进行需求拆解和结构化分析
3. 生成初始的prompt方案
4. 与用户进行需求确认,包括:
- 验证需求理解是否准确
- 确认关键要素是否完整
- 检查输出格式是否符合预期
- 收集用户的反馈和调整建议
5. 根据用户确认的结果优化和完善prompt
6. 提供最终确认后的prompt给AI模型使用
## 示例
### 输入示例
用户需求:"帮我写一个Python脚本爬取网站数据并保存到Excel文件"
### 输出示例
```
请帮我创建一个Python脚本实现以下功能
目标爬取指定网站的数据并将结果保存到Excel文件
输入:
- 网站URL[待提供]
- 需要爬取的数据字段:[待指定]
- 爬取深度:[待指定]
输出:
- 生成一个Python脚本文件
- 脚本应包含完整的代码和注释
- 生成的Excel文件应包含所有爬取的数据
约束:
- 使用合法的爬取方式遵守网站robots.txt规则
- 脚本应具有错误处理能力
- 爬取过程应考虑速率限制,避免对目标网站造成压力
请提供完整的实现代码,并确保代码可直接运行。
```

@ -0,0 +1,7 @@
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
// https://vite.dev/config/
export default defineConfig({
plugins: [react()],
})
Loading…
Cancel
Save