|
|
|
|
|
# 期货智析系统 - 架构分析与重构方案
|
|
|
|
|
|
|
|
|
|
|
|
> 文档版本:v1.0 | 日期:2026-06-21
|
|
|
|
|
|
|
|
|
|
|
|
***
|
|
|
|
|
|
|
|
|
|
|
|
## 第一部分:当前系统功能清单与交互流程
|
|
|
|
|
|
|
|
|
|
|
|
### 1.1 功能模块总览
|
|
|
|
|
|
|
|
|
|
|
|
| 序号 | 功能模块 | 核心能力 | 入口页面 |
|
|
|
|
|
|
| --- | ------ | ------------------------ | --------------------------------------- |
|
|
|
|
|
|
| F1 | 用户认证 | 登录/登出/角色选择/Token验证 | `/login` → `/role-select` |
|
|
|
|
|
|
| F2 | 品种配置管理 | 品种CRUD、配置文件上传、批量采集 | `/ui` |
|
|
|
|
|
|
| F3 | 期货品种分析 | 品种列表/详情/K线图/技术指标/数据刷新 | `/futures-analysis` (list-view) |
|
|
|
|
|
|
| F4 | AI智能分析 | 四维联合分析(4D-XV)、多周期共振、交易建议 | `/futures-analysis` (detail-view) |
|
|
|
|
|
|
| F5 | 自选品种 | 关注/取消关注品种 | `/futures-analysis` (watched-view) |
|
|
|
|
|
|
| F6 | 复盘计划 | V2多维度评分、交易计划生成、板块热度 | `/futures-analysis` (review-view) |
|
|
|
|
|
|
| F7 | 交易复盘 | 结算单导入、交易统计、配对分析、K线标注 | `/futures-analysis` (trade-review-view) |
|
|
|
|
|
|
| F8 | AI模型配置 | 模型CRUD、连接测试、提供商管理 | `/ai-config` |
|
|
|
|
|
|
| F9 | 定时采集 | 定时任务CRUD、启停控制、间隔调整 | 后台自动/手动触发 |
|
|
|
|
|
|
| F10 | 数据缓冲 | K线数据缓存、智能缓存判断、多周期数据聚合 | 内部服务层 |
|
|
|
|
|
|
|
|
|
|
|
|
### 1.2 用户交互流程
|
|
|
|
|
|
|
|
|
|
|
|
#### 流程1:登录 → 角色选择 → 主功能
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
用户访问 / → 重定向到 /login
|
|
|
|
|
|
├── 输入用户名/密码 → POST /api/v1/auth/login
|
|
|
|
|
|
│ ├── 成功 → Token存入localStorage → 跳转 /role-select
|
|
|
|
|
|
│ └── 失败 → 提示错误
|
|
|
|
|
|
└── Token验证 → GET /api/v1/auth/verify
|
|
|
|
|
|
└── 有效 → 跳转 /role-select
|
|
|
|
|
|
|
|
|
|
|
|
/role-select (角色选择)
|
|
|
|
|
|
├── 管理员 → 可访问所有功能
|
|
|
|
|
|
└── 普通用户 → 跳转 /futures-analysis
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
#### 流程2:品种分析 → AI分析
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
/futures-analysis (品种列表)
|
|
|
|
|
|
├── 加载品种列表 → GET /api/v1/futures/list
|
|
|
|
|
|
├── 搜索/筛选品种
|
|
|
|
|
|
├── 刷新数据 → POST /api/v1/futures/refresh/{symbol}
|
|
|
|
|
|
│ └── 调用akshare采集新浪数据 → 缓存到buffer.db
|
|
|
|
|
|
├── 点击品种 → 进入详情页
|
|
|
|
|
|
│ ├── 加载详情 → GET /api/v1/futures/detail/{symbol}
|
|
|
|
|
|
│ ├── 加载K线图 → GET /api/v1/futures/kline/{symbol}
|
|
|
|
|
|
│ │ └── ECharts渲染K线+MA+MACD+成交量
|
|
|
|
|
|
│ ├── 点击"AI分析" → POST /api/v1/futures/ai-analysis/{symbol}
|
|
|
|
|
|
│ │ ├── 检查缓存 → AIAnalysisCache表
|
|
|
|
|
|
│ │ ├── 缓存有效(15min内+K线未变) → 直接返回缓存
|
|
|
|
|
|
│ │ └── 缓存失效 → 准备多周期数据 → 构建Prompt
|
|
|
|
|
|
│ │ → 调用AI模型API → 解析JSON响应 → 保存缓存
|
|
|
|
|
|
│ └── 展示AI分析结果(四维分析/交易建议/关键点位/风控)
|
|
|
|
|
|
└── 查看历史 → GET /api/v1/futures/ai-analysis/{symbol}/history
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
#### 流程3:复盘计划生成
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
/futures-analysis (review-view)
|
|
|
|
|
|
├── 点击"生成复盘计划" → POST /api/v1/review/generate
|
|
|
|
|
|
│ ├── 采集所有品种多周期数据(60m/15m/5m)
|
|
|
|
|
|
│ ├── 5维度评分(振幅20%+量能15%+涨跌幅15%+趋势35%+活跃度15%)
|
|
|
|
|
|
│ ├── 归一化 → 分类(green/yellow/red)
|
|
|
|
|
|
│ ├── 生成交易计划(入场/止损/目标)
|
|
|
|
|
|
│ ├── 计算板块热度
|
|
|
|
|
|
│ └── 生成汇总报告
|
|
|
|
|
|
├── 查看计划列表 → GET /api/v1/review/v2/plans
|
|
|
|
|
|
├── 查看计划详情 → GET /api/v1/review/v2/plan/{plan_id}
|
|
|
|
|
|
└── 查看品种详情弹窗
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
#### 流程4:交易复盘
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
/futures-analysis (trade-review-view)
|
|
|
|
|
|
├── 上传结算单(.xls) → POST /api/v1/trade-review/import
|
|
|
|
|
|
│ └── 解析xls → 标准化 → 保存trade_records表
|
|
|
|
|
|
├── 查看交易记录 → GET /api/v1/trade-review/records
|
|
|
|
|
|
├── 查看统计
|
|
|
|
|
|
│ ├── 每日汇总 → GET /api/v1/trade-review/daily-summary
|
|
|
|
|
|
│ ├── 品种汇总 → GET /api/v1/trade-review/variety-summary
|
|
|
|
|
|
│ └── 总体统计 → GET /api/v1/trade-review/statistics
|
|
|
|
|
|
├── 配对分析 → GET /api/v1/trade-review/trade-pairs
|
|
|
|
|
|
├── K线+买卖点 → GET /api/v1/trade-review/kline-with-trades/{symbol}
|
|
|
|
|
|
└── AI逐笔分析 → POST /api/v1/trade-review/analyze-trade
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 1.3 数据流转调用链
|
|
|
|
|
|
|
|
|
|
|
|
#### 调用链1:数据采集链路
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
[前端] 触发刷新
|
|
|
|
|
|
→ [API] POST /api/v1/futures/refresh/{symbol}
|
|
|
|
|
|
→ [Service] collector.fetch_symbol_data()
|
|
|
|
|
|
→ [External] akshare → 新浪财经API
|
|
|
|
|
|
→ 返回多周期K线数据(5m/15m/30m/60m/daily)
|
|
|
|
|
|
→ [Service] cache.save_market_data()
|
|
|
|
|
|
→ [DB] buffer.db.market_data (按period存储JSON)
|
|
|
|
|
|
→ [DB] buffer.db.symbol_timestamps (更新时间戳)
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
#### 调用链2:AI分析链路
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
[前端] 请求AI分析
|
|
|
|
|
|
→ [API] POST /api/v1/futures/ai-analysis/{symbol}
|
|
|
|
|
|
→ [Service] AIFuturesAnalyzer.analyze()
|
|
|
|
|
|
→ [Service] get_cached_data() → [DB] buffer.db.market_data
|
|
|
|
|
|
→ [Service] prepare_multi_period_data() → 计算技术指标(MACD/KDJ/EMA)
|
|
|
|
|
|
→ [Service] AIAnalysisPrompt.build_prompt() → 构建Prompt
|
|
|
|
|
|
→ [External] AI模型API (阿里百炼qwen3.6-plus)
|
|
|
|
|
|
→ [Service] parse_ai_response() → 解析JSON
|
|
|
|
|
|
→ [Service] save_analysis_cache() → [DB] futures_analysis.db.ai_analysis_cache
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
#### 调用链3:复盘计划生成链路
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
[前端] 生成复盘计划
|
|
|
|
|
|
→ [API] POST /api/v1/review/generate
|
|
|
|
|
|
→ [Service] plan_generator.generate()
|
|
|
|
|
|
→ [Service] 批量采集所有品种数据 → [External] akshare
|
|
|
|
|
|
→ [Service] 5维度评分计算
|
|
|
|
|
|
→ [Service] 归一化 + 分类(green/yellow/red)
|
|
|
|
|
|
→ [Service] 生成交易计划(入场/止损/目标价)
|
|
|
|
|
|
→ [Service] 计算板块热度
|
|
|
|
|
|
→ [DB] futures_analysis.db:
|
|
|
|
|
|
├── symbol_scores_v2 (品种评分)
|
|
|
|
|
|
├── trading_plans_v2 (交易计划)
|
|
|
|
|
|
├── sector_heat (板块热度)
|
|
|
|
|
|
└── review_plans_v2 (汇总报告)
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
#### 调用链4:交易复盘链路
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
[前端] 上传结算单
|
|
|
|
|
|
→ [API] POST /api/v1/trade-review/import
|
|
|
|
|
|
→ [Service] trade_parser.parse()
|
|
|
|
|
|
→ 解析.xls文件 → 动态识别表头
|
|
|
|
|
|
→ 标准化日期/时间/品种代码
|
|
|
|
|
|
→ [DB] futures_analysis.db.trade_records
|
|
|
|
|
|
→ [DB] futures_analysis.db.trade_import_batches
|
|
|
|
|
|
|
|
|
|
|
|
[前端] 查看统计
|
|
|
|
|
|
→ [API] GET /api/v1/trade-review/{summary-type}
|
|
|
|
|
|
→ [Service] trade_parser 统计函数
|
|
|
|
|
|
→ [DB] 查询trade_records → 聚合计算
|
|
|
|
|
|
→ 返回统计结果
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
#### 调用链5:定时任务链路
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
[启动时] lifespan() → start_scheduler()
|
|
|
|
|
|
→ [Service] scheduler.start_scheduler() → 创建APScheduler实例
|
|
|
|
|
|
→ 恢复已启用任务 → list_tasks() → add_job()
|
|
|
|
|
|
|
|
|
|
|
|
[运行时] APScheduler触发
|
|
|
|
|
|
→ [Service] scheduler.execute_task()
|
|
|
|
|
|
→ [Service] collector.fetch_symbol_data()
|
|
|
|
|
|
→ [External] akshare → 新浪财经
|
|
|
|
|
|
→ [Service] cache.save_market_data() → [DB] buffer.db
|
|
|
|
|
|
→ [Service] cache.update_task_status() → [DB] buffer.db.scheduled_tasks
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
***
|
|
|
|
|
|
|
|
|
|
|
|
## 第二部分:当前系统架构
|
|
|
|
|
|
|
|
|
|
|
|
### 2.1 技术栈
|
|
|
|
|
|
|
|
|
|
|
|
| 层级 | 技术选型 | 说明 |
|
|
|
|
|
|
| ----------- | ------------------ | ---------------- |
|
|
|
|
|
|
| **Web框架** | FastAPI 0.110+ | 异步Python Web框架 |
|
|
|
|
|
|
| **ASGI服务器** | Uvicorn 0.29+ | 生产级ASGI服务器 |
|
|
|
|
|
|
| **ORM** | SQLAlchemy 2.0+ | 同步Session模式 |
|
|
|
|
|
|
| **数据库** | SQLite (aiosqlite) | 双数据库文件 |
|
|
|
|
|
|
| **定时调度** | APScheduler 3.10+ | 后台线程池调度 |
|
|
|
|
|
|
| **数据采集** | akshare 1.14+ | 新浪财经数据源 |
|
|
|
|
|
|
| **前端框架** | 无 (Vanilla JS) | 原生HTML/CSS/JS |
|
|
|
|
|
|
| **图表** | ECharts 5.4.3 | CDN引入 |
|
|
|
|
|
|
| **部署** | Docker + Compose | Python 3.11-slim |
|
|
|
|
|
|
|
|
|
|
|
|
### 2.2 系统架构图
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
|
|
|
|
│ 前端层 (Vanilla JS) │
|
|
|
|
|
|
│ ┌──────────┐ ┌──────────────┐ ┌──────────┐ ┌───────────────┐ │
|
|
|
|
|
|
│ │login.html│ │futures_ │ │ai_config │ │review_plan │ │
|
|
|
|
|
|
│ │role_select│ │ analysis.html│ │ .html │ │ .html │ │
|
|
|
|
|
|
│ └──────────┘ └──────────────┘ └──────────┘ └───────────────┘ │
|
|
|
|
|
|
│ │ │ │ │ │
|
|
|
|
|
|
│ └───────────┴───────────────┴──────────────┘ │
|
|
|
|
|
|
│ │ HTTP REST API │
|
|
|
|
|
|
│ │ (fetch + localStorage) │
|
|
|
|
|
|
└─────────────────────────────┼───────────────────────────────────┘
|
|
|
|
|
|
│
|
|
|
|
|
|
┌─────────────────────────────┼───────────────────────────────────┐
|
|
|
|
|
|
│ API路由层 (FastAPI) │
|
|
|
|
|
|
│ ┌──────┐ ┌──────┐ ┌──────┐ ┌────────┐ ┌───────┐ ┌──────────┐ │
|
|
|
|
|
|
│ │auth │ │data │ │tasks │ │futures │ │ai_ │ │review │ │
|
|
|
|
|
|
│ │.py │ │.py │ │.py │ │_analysis│ │config │ │_plan.py │ │
|
|
|
|
|
|
│ └──┬───┘ └──┬───┘ └──┬───┘ └───┬────┘ └──┬────┘ └────┬─────┘ │
|
|
|
|
|
|
│ │ │ │ │ │ │ │
|
|
|
|
|
|
│ ┌──┴────────┴────────┴─────────┴───────────┴──────────┴──────┐ │
|
|
|
|
|
|
│ │ trade_review.py │ │
|
|
|
|
|
|
│ └────────────────────────┬────────────────────────────────────┘ │
|
|
|
|
|
|
└───────────────────────────┼─────────────────────────────────────┘
|
|
|
|
|
|
│
|
|
|
|
|
|
┌───────────────────────────┼─────────────────────────────────────┐
|
|
|
|
|
|
│ 服务层 (Services) │
|
|
|
|
|
|
│ ┌───────────┐ ┌─────────┐ ┌──────────┐ ┌───────────────────┐ │
|
|
|
|
|
|
│ │collector │ │ cache │ │scheduler │ │ ai_analysis │ │
|
|
|
|
|
|
│ │.py │ │ .py │ │ .py │ │ .py │ │
|
|
|
|
|
|
│ │(akshare) │ │(TTL缓存)│ │(APSchd) │ │(Prompt+AI调用) │ │
|
|
|
|
|
|
│ └─────┬─────┘ └────┬────┘ └────┬─────┘ └────────┬──────────┘ │
|
|
|
|
|
|
│ │ │ │ │ │
|
|
|
|
|
|
│ ┌─────┴─────┐ ┌─────┴─────────┴──────────────────┴──────────┐ │
|
|
|
|
|
|
│ │plan_ │ │ trade_parser.py │ │
|
|
|
|
|
|
│ │generator │ │ (结算单解析) │ │
|
|
|
|
|
|
│ │.py │ │ │ │
|
|
|
|
|
|
│ └───────────┘ └──────────────────────────────────────────────┘ │
|
|
|
|
|
|
└───────────────────────────┬─────────────────────────────────────┘
|
|
|
|
|
|
│
|
|
|
|
|
|
┌───────────────────────────┼─────────────────────────────────────┐
|
|
|
|
|
|
│ 数据层 (SQLite) │
|
|
|
|
|
|
│ ┌────────────────────────┴───┐ ┌────────────────────────────┐ │
|
|
|
|
|
|
│ │ buffer.db │ │ futures_analysis.db │ │
|
|
|
|
|
|
│ │ ┌──────────────┐ │ │ ┌────────────────────┐ │ │
|
|
|
|
|
|
│ │ │ market_data │ │ │ │ futures_analysis │ │ │
|
|
|
|
|
|
│ │ │ (K线缓存) │ │ │ │ watched_symbols │ │ │
|
|
|
|
|
|
│ │ ├──────────────┤ │ │ │ ai_model_configs │ │ │
|
|
|
|
|
|
│ │ │symbol_ │ │ │ │ analysis_settings │ │ │
|
|
|
|
|
|
│ │ │ timestamps │ │ │ │ ai_analysis_cache │ │ │
|
|
|
|
|
|
│ │ ├──────────────┤ │ │ │ review_dates │ │ │
|
|
|
|
|
|
│ │ │scheduled_ │ │ │ │ symbol_rankings │ │ │
|
|
|
|
|
|
│ │ │ tasks │ │ │ │ trading_plans(v1) │ │ │
|
|
|
|
|
|
│ │ ├──────────────┤ │ │ │ symbol_scores_v2 │ │ │
|
|
|
|
|
|
│ │ │ users │ │ │ │ trading_plans_v2 │ │ │
|
|
|
|
|
|
│ │ ├──────────────┤ │ │ │ sector_heat │ │ │
|
|
|
|
|
|
│ │ │ sessions │ │ │ │ review_plans_v2 │ │ │
|
|
|
|
|
|
│ │ └──────────────┘ │ │ │ trade_records │ │ │
|
|
|
|
|
|
│ │ │ │ │ trade_import_batches│ │ │
|
|
|
|
|
|
│ │ 6个表 │ │ └────────────────────┘ │ │
|
|
|
|
|
|
│ │ │ │ 14个表 │ │
|
|
|
|
|
|
│ └────────────────────────────┘ └────────────────────────────┘ │
|
|
|
|
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
|
|
|
|
│
|
|
|
|
|
|
┌───────────────────────────┼─────────────────────────────────────┐
|
|
|
|
|
|
│ 外部服务 │
|
|
|
|
|
|
│ ┌──────────────┐ ┌──────┴───────┐ ┌───────────────────────┐ │
|
|
|
|
|
|
│ │ 新浪财经API │ │ AI模型API │ │ Docker容器 │ │
|
|
|
|
|
|
│ │ (via akshare)│ │ (阿里百炼) │ │ (python:3.11-slim) │ │
|
|
|
|
|
|
│ └──────────────┘ └──────────────┘ └───────────────────────┘ │
|
|
|
|
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 2.3 数据库Schema(共20个表)
|
|
|
|
|
|
|
|
|
|
|
|
#### buffer.db(6个表)
|
|
|
|
|
|
|
|
|
|
|
|
| 表名 | 用途 | 关键字段 |
|
|
|
|
|
|
| ------------------- | ------- | ---------------------------------------------------------------------------- |
|
|
|
|
|
|
| `market_data` | K线数据缓存 | symbol, data\_type, period, candles\_json(JSON), current\_price, fetched\_at |
|
|
|
|
|
|
| `symbol_timestamps` | 合约刷新时间戳 | symbol, data\_type, last\_refresh\_at, refresh\_count |
|
|
|
|
|
|
| `scheduled_tasks` | 定时任务配置 | symbol, data\_type, periods, interval\_seconds, task\_type, enabled |
|
|
|
|
|
|
| `users` | 用户表 | username, password\_hash, role(admin/user), is\_active |
|
|
|
|
|
|
| `sessions` | 会话管理 | user\_id, token, expires\_at, is\_valid |
|
|
|
|
|
|
|
|
|
|
|
|
#### futures\_analysis.db(14个表)
|
|
|
|
|
|
|
|
|
|
|
|
| 表名 | 用途 | 关键字段 |
|
|
|
|
|
|
| ---------------------- | -------- | ------------------------------------------------------------------- |
|
|
|
|
|
|
| `futures_analysis` | 分析报告 | symbol, period, suggestion, entry\_price, target\_price, stop\_loss |
|
|
|
|
|
|
| `watched_symbols` | 关注品种 | symbol, name, note |
|
|
|
|
|
|
| `ai_model_configs` | AI模型配置 | provider, model\_name, api\_key, api\_base, enabled |
|
|
|
|
|
|
| `analysis_settings` | 分析设置(KV) | key, value(JSON) |
|
|
|
|
|
|
| `ai_analysis_cache` | AI分析缓存 | symbol, analysis\_data(JSON), kline\_timestamp |
|
|
|
|
|
|
| `review_dates` | 复盘日期 | review\_date, week\_day |
|
|
|
|
|
|
| `symbol_rankings` | 品种排名(V1) | symbol, rank\_type, rank, value |
|
|
|
|
|
|
| `trading_plans` | 交易计划(V1) | symbol, plan\_type, score, logic, entry\_price |
|
|
|
|
|
|
| `symbol_scores_v2` | V2多维度评分 | symbol, 5维度分数, composite\_score, category, pivot/R/S |
|
|
|
|
|
|
| `trading_plans_v2` | V2交易计划 | symbol, direction, entry\_low/high, stop\_loss, target1/2 |
|
|
|
|
|
|
| `sector_heat` | 板块热度 | sector\_name, avg\_score, heat\_level, leader\_symbol |
|
|
|
|
|
|
| `review_plans_v2` | V2复盘总表 | review\_date, core\_conclusion, bull/bear\_count |
|
|
|
|
|
|
| `trade_records` | 交易记录 | symbol, direction, offset, price, volume, close\_pnl |
|
|
|
|
|
|
| `trade_import_batches` | 导入批次 | batch\_id, source\_file, futures\_count |
|
|
|
|
|
|
|
|
|
|
|
|
### 2.4 API端点清单(共55+个)
|
|
|
|
|
|
|
|
|
|
|
|
| 模块 | 前缀 | 端点数 | 主要功能 |
|
|
|
|
|
|
| ---- | ---------------------- | --- | ------------------ |
|
|
|
|
|
|
| 认证 | `/api/v1/auth` | 4 | 登录/登出/验证/用户信息 |
|
|
|
|
|
|
| 数据 | `/api/v1/data` | 5 | 批量获取/最新数据/缓存状态 |
|
|
|
|
|
|
| 任务 | `/api/v1/tasks` | 8 | 定时任务CRUD+启停 |
|
|
|
|
|
|
| 配置 | `/api/v1/config` | 4 | 品种配置/批量操作 |
|
|
|
|
|
|
| 期货分析 | `/api/v1/futures` | 18 | 品种列表/详情/K线/AI分析/关注 |
|
|
|
|
|
|
| AI配置 | `/api/v1/ai-config` | 4 | 模型配置/测试连接 |
|
|
|
|
|
|
| 复盘计划 | `/api/v1/review` | 12 | V1+V2复盘数据管理 |
|
|
|
|
|
|
| 交易复盘 | `/api/v1/trade-review` | 12 | 结算单导入/统计/配对/AI分析 |
|
|
|
|
|
|
|
|
|
|
|
|
### 2.5 前端页面结构
|
|
|
|
|
|
|
|
|
|
|
|
| 页面 | 文件 | 大小 | 视图/组件 |
|
|
|
|
|
|
| ----------- | ------------------------------------------------------ | ------- | ----------------------------------------------------- |
|
|
|
|
|
|
| 登录 | `login.html` | 内联 | 单表单 |
|
|
|
|
|
|
| 角色选择 | `role_select.html` | 内联 | 入口卡片 |
|
|
|
|
|
|
| 品种配置 | `index.html` | 内联 | 管理后台 |
|
|
|
|
|
|
| **期货智析(主)** | `futures_analysis.html` + `.css`(3100行) + `.js`(3200行) | \~6300行 | 5个视图(list/detail/watched/review/trade-review) + 7个模态框 |
|
|
|
|
|
|
| AI配置 | `ai_config.html` + `.css` + `.js` | 中等 | 模型配置表单 |
|
|
|
|
|
|
| 复盘计划 | `review_plan.html` + `.css`(1760行) + `.js` | 中等 | 独立复盘页(暗色主题) |
|
|
|
|
|
|
|
|
|
|
|
|
### 2.6 当前架构存在的问题
|
|
|
|
|
|
|
|
|
|
|
|
| 编号 | 问题类别 | 具体问题 | 影响 |
|
|
|
|
|
|
| --- | --------- | ------------------------------------------------- | ---------- |
|
|
|
|
|
|
| P1 | **缓存效率** | 使用SQLite存储K线JSON,每次读取需反序列化整个JSON字符串 | 高延迟,尤其品种多时 |
|
|
|
|
|
|
| P2 | **并发能力** | SQLite写锁限制,多线程采集时存在竞争 | 数据更新阻塞 |
|
|
|
|
|
|
| P3 | **前端架构** | 6300行单文件JS,无模块化,全局变量管理状态 | 维护困难,易出错 |
|
|
|
|
|
|
| P4 | **代码重复** | 两套数据库连接、两套Session管理、手动迁移脚本 | 维护成本高 |
|
|
|
|
|
|
| P5 | **缓存策略** | 简单TTL机制,无分层缓存,无内存缓存 | 重复查询数据库 |
|
|
|
|
|
|
| P6 | **AI调用** | 同步requests调用AI API,阻塞事件循环 | 并发分析时性能差 |
|
|
|
|
|
|
| P7 | **数据模型** | 大量JSON字段存储(candles\_json, analysis\_data等),无法索引查询 | 查询效率低 |
|
|
|
|
|
|
| P8 | **无数据管道** | 采集→缓存→分析→展示紧耦合 | 难以扩展和测试 |
|
|
|
|
|
|
| P9 | **认证安全** | 自研Token系统,SHA256+Salt,无JWT标准 | 安全性不足 |
|
|
|
|
|
|
| P10 | **部署** | 单容器,无Redis/消息队列 | 无法水平扩展 |
|
|
|
|
|
|
|
|
|
|
|
|
***
|
|
|
|
|
|
|
|
|
|
|
|
## 第三部分:重构方案
|
|
|
|
|
|
|
|
|
|
|
|
### 3.1 数据库重构方案
|
|
|
|
|
|
|
|
|
|
|
|
#### 现状问题
|
|
|
|
|
|
|
|
|
|
|
|
* 双SQLite数据库文件,写锁限制并发
|
|
|
|
|
|
|
|
|
|
|
|
* 大量JSON字段无法索引
|
|
|
|
|
|
|
|
|
|
|
|
* 无迁移管理工具
|
|
|
|
|
|
|
|
|
|
|
|
* K线数据以JSON字符串存储,查询效率低
|
|
|
|
|
|
|
|
|
|
|
|
#### 方案:迁移到 PostgreSQL + Redis 双层架构
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
┌─────────────────────────────────────────────┐
|
|
|
|
|
|
│ Redis (缓存层) │
|
|
|
|
|
|
│ ┌────────────────┐ ┌────────────────────┐ │
|
|
|
|
|
|
│ │ K线数据缓存 │ │ AI分析结果缓存 │ │
|
|
|
|
|
|
│ │ (Hash+TTL) │ │ (String+TTL) │ │
|
|
|
|
|
|
│ │ 品种:周期→数据 │ │ 品种→分析JSON │ │
|
|
|
|
|
|
│ └────────────────┘ └────────────────────┘ │
|
|
|
|
|
|
│ ┌────────────────┐ ┌────────────────────┐ │
|
|
|
|
|
|
│ │ 刷新状态/锁 │ │ 会话Token │ │
|
|
|
|
|
|
│ │ (String+TTL) │ │ (String+TTL) │ │
|
|
|
|
|
|
│ └────────────────┘ └────────────────────┘ │
|
|
|
|
|
|
└─────────────────────────────────────────────┘
|
|
|
|
|
|
│
|
|
|
|
|
|
┌─────────────────────────────────────────────┐
|
|
|
|
|
|
│ PostgreSQL (持久层) │
|
|
|
|
|
|
│ │
|
|
|
|
|
|
│ 核心业务表: │
|
|
|
|
|
|
│ ├── kline_data (K线数据,按品种+周期分区) │
|
|
|
|
|
|
│ ├── symbol_info (品种基础信息) │
|
|
|
|
|
|
│ ├── scheduled_task (定时任务配置) │
|
|
|
|
|
|
│ ├── ai_analysis (AI分析历史记录) │
|
|
|
|
|
|
│ ├── review_plan (复盘计划) │
|
|
|
|
|
|
│ ├── trade_record (交易记录) │
|
|
|
|
|
|
│ └── user/session (用户认证) │
|
|
|
|
|
|
│ │
|
|
|
|
|
|
│ 使用 Alembic 管理数据库迁移 │
|
|
|
|
|
|
└─────────────────────────────────────────────┘
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
**关键改进:**
|
|
|
|
|
|
|
|
|
|
|
|
| 改进点 | 当前 | 重构后 |
|
|
|
|
|
|
| ----- | ------------ | ---------------- |
|
|
|
|
|
|
| 数据库引擎 | SQLite × 2 | PostgreSQL (统一) |
|
|
|
|
|
|
| K线存储 | JSON字符串字段 | 独立表 + 分区(按品种) |
|
|
|
|
|
|
| 缓存 | SQLite TTL查询 | Redis Hash + TTL |
|
|
|
|
|
|
| 迁移管理 | 手动脚本 | Alembic自动迁移 |
|
|
|
|
|
|
| 并发写入 | 写锁阻塞 | MVCC无锁读、行级锁写 |
|
|
|
|
|
|
| 索引能力 | JSON无法索引 | 结构化字段可建索引 |
|
|
|
|
|
|
|
|
|
|
|
|
**K线数据表设计(核心优化):**
|
|
|
|
|
|
|
|
|
|
|
|
```sql
|
|
|
|
|
|
-- K线数据表(按品种分区)
|
|
|
|
|
|
CREATE TABLE kline_data (
|
|
|
|
|
|
id BIGSERIAL PRIMARY KEY,
|
|
|
|
|
|
symbol VARCHAR(20) NOT NULL,
|
|
|
|
|
|
period VARCHAR(10) NOT NULL, -- 5min/15min/30min/60min/daily
|
|
|
|
|
|
open_time TIMESTAMP NOT NULL,
|
|
|
|
|
|
open DECIMAL(12,4),
|
|
|
|
|
|
high DECIMAL(12,4),
|
|
|
|
|
|
low DECIMAL(12,4),
|
|
|
|
|
|
close DECIMAL(12,4),
|
|
|
|
|
|
volume DECIMAL(18,4),
|
|
|
|
|
|
amount DECIMAL(18,4),
|
|
|
|
|
|
created_at TIMESTAMP DEFAULT NOW(),
|
|
|
|
|
|
UNIQUE(symbol, period, open_time)
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
-- 分区:按品种创建分区表
|
|
|
|
|
|
CREATE TABLE kline_data_ag PARTITION OF kline_data FOR VALUES IN ('AG');
|
|
|
|
|
|
CREATE TABLE kline_data_au PARTITION OF kline_data FOR VALUES IN ('AU');
|
|
|
|
|
|
-- ... 每个品种一个分区
|
|
|
|
|
|
|
|
|
|
|
|
-- 索引
|
|
|
|
|
|
CREATE INDEX idx_kline_symbol_period ON kline_data(symbol, period, open_time DESC);
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
**Redis缓存策略:**
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
# K线数据缓存 (TTL=300s)
|
|
|
|
|
|
kline:{symbol}:{period} → Hash { candles: [...], current_price, fetched_at }
|
|
|
|
|
|
|
|
|
|
|
|
# AI分析缓存 (TTL=900s)
|
|
|
|
|
|
ai_analysis:{symbol} → JSON { result, kline_timestamp, created_at }
|
|
|
|
|
|
|
|
|
|
|
|
# 刷新状态 (TTL=60s)
|
|
|
|
|
|
refresh:status:{symbol} → "running" | "done" | "error"
|
|
|
|
|
|
|
|
|
|
|
|
# 分布式锁
|
|
|
|
|
|
lock:refresh:{symbol} → 防止并发刷新同一品种
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 3.2 后端重构方案
|
|
|
|
|
|
|
|
|
|
|
|
#### 现状问题
|
|
|
|
|
|
|
|
|
|
|
|
* 服务层紧耦合,采集→缓存→分析链式调用
|
|
|
|
|
|
|
|
|
|
|
|
* AI调用使用同步requests阻塞事件循环
|
|
|
|
|
|
|
|
|
|
|
|
* 双数据库连接管理混乱
|
|
|
|
|
|
|
|
|
|
|
|
* 无统一错误处理、无中间件链
|
|
|
|
|
|
|
|
|
|
|
|
#### 方案:分层架构 + 异步优化 + 数据管道
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
┌─────────────────────────────────────────────────────────────┐
|
|
|
|
|
|
│ API Gateway层 │
|
|
|
|
|
|
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌───────────────┐ │
|
|
|
|
|
|
│ │ 认证中间件│ │ 限流中间件│ │ 日志中间件│ │ CORS中间件 │ │
|
|
|
|
|
|
│ └──────────┘ └──────────┘ └──────────┘ └───────────────┘ │
|
|
|
|
|
|
└─────────────────────────────────────────────────────────────┘
|
|
|
|
|
|
│
|
|
|
|
|
|
┌─────────────────────────────────────────────────────────────┐
|
|
|
|
|
|
│ API路由层 (模块化) │
|
|
|
|
|
|
│ ┌─────────┐ ┌─────────┐ ┌──────────┐ ┌─────────────────┐ │
|
|
|
|
|
|
│ │v1/auth │ │v1/market│ │v1/analysis│ │v1/review │ │
|
|
|
|
|
|
│ │(认证) │ │(行情) │ │(分析) │ │(复盘+交易) │ │
|
|
|
|
|
|
│ └────┬────┘ └────┬────┘ └────┬─────┘ └────────┬────────┘ │
|
|
|
|
|
|
└───────┼───────────┼───────────┼────────────────┼────────────┘
|
|
|
|
|
|
│ │ │ │
|
|
|
|
|
|
┌───────┼───────────┼───────────┼────────────────┼────────────┐
|
|
|
|
|
|
│ │ 服务层 (业务逻辑) │ │ │
|
|
|
|
|
|
│ ┌────┴────┐ ┌────┴─────┐ ┌───┴──────┐ ┌──────┴─────────┐ │
|
|
|
|
|
|
│ │AuthSvc │ │MarketSvc │ │AnalysisSvc│ │ReviewSvc │ │
|
|
|
|
|
|
│ │ │ │ │ │ │ │ │ │
|
|
|
|
|
|
│ │- login │ │- get_list│ │- ai_ │ │- generate_plan │ │
|
|
|
|
|
|
│ │- verify │ │- refresh │ │ analyze │ │- import_trade │ │
|
|
|
|
|
|
│ │- RBAC │ │- kline │ │- prepare │ │- statistics │ │
|
|
|
|
|
|
│ └─────────┘ │ _data │ │ _data │ │- trade_pairs │ │
|
|
|
|
|
|
│ └────┬─────┘ │- cache_ │ └────────────────┘ │
|
|
|
|
|
|
│ │ │ manage │ │
|
|
|
|
|
|
│ ┌────┴─────┐ └───────────┘ │
|
|
|
|
|
|
│ │CollectSvc│ │
|
|
|
|
|
|
│ │- akshare │ │
|
|
|
|
|
|
│ │- batch │ │
|
|
|
|
|
|
│ └──────────┘ │
|
|
|
|
|
|
└──────────────────────────────────────────────────────────────┘
|
|
|
|
|
|
│ │ │
|
|
|
|
|
|
┌───────┼───────────┼───────────┼──────────────────────────────┐
|
|
|
|
|
|
│ │ 基础设施层 │ │
|
|
|
|
|
|
│ ┌────┴─────┐ ┌──┴───────┐ ┌─┴──────────┐ ┌──────────────┐ │
|
|
|
|
|
|
│ │PostgreSQL│ │ Redis │ │AI Client │ │Scheduler │ │
|
|
|
|
|
|
│ │(SQLAlchemy│ │(aioredis)│ │(httpx async│ │(APScheduler │ │
|
|
|
|
|
|
│ │ async) │ │ │ │ + 重试) │ │ or Celery) │ │
|
|
|
|
|
|
│ └──────────┘ └──────────┘ └────────────┘ └──────────────┘ │
|
|
|
|
|
|
└──────────────────────────────────────────────────────────────┘
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
**关键改进:**
|
|
|
|
|
|
|
|
|
|
|
|
| 改进点 | 当前 | 重构后 |
|
|
|
|
|
|
| ----- | ------------------------ | ---------------------------- |
|
|
|
|
|
|
| 数据库连接 | 同步SQLAlchemy + 双引擎 | 异步SQLAlchemy + 统一引擎 |
|
|
|
|
|
|
| AI调用 | `requests.post()` (同步阻塞) | `httpx.AsyncClient` (异步非阻塞) |
|
|
|
|
|
|
| 缓存 | SQLite TTL查询 | Redis + 本地LRU双层缓存 |
|
|
|
|
|
|
| 错误处理 | 各模块独立try/catch | 全局异常中间件 |
|
|
|
|
|
|
| 认证 | 自研Token | JWT (python-jose) |
|
|
|
|
|
|
| 数据库迁移 | 手动脚本 | Alembic |
|
|
|
|
|
|
| 配置管理 | .env + JSON文件 | Pydantic Settings + 统一配置 |
|
|
|
|
|
|
| 日志 | 基础logging | structlog结构化日志 |
|
|
|
|
|
|
| 任务调度 | APScheduler线程池 | APScheduler(轻量) 或 Celery(重量) |
|
|
|
|
|
|
|
|
|
|
|
|
**缓存优化策略(三层缓存):**
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
请求 → L1: 内存缓存 (TTLCache, 10s)
|
|
|
|
|
|
↓ miss
|
|
|
|
|
|
L2: Redis缓存 (TTL 300s)
|
|
|
|
|
|
↓ miss
|
|
|
|
|
|
L3: PostgreSQL数据库
|
|
|
|
|
|
↓ 回填L2
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
* **L1 内存缓存**:使用 `cachetools.TTLCache`,缓存热点数据(品种列表、配置),10秒过期
|
|
|
|
|
|
|
|
|
|
|
|
* **L2 Redis缓存**:K线数据、AI分析结果,按TTL策略过期
|
|
|
|
|
|
|
|
|
|
|
|
* **L3 数据库**:持久化存储,仅在缓存miss时访问
|
|
|
|
|
|
|
|
|
|
|
|
**AI分析异步化:**
|
|
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
|
# 当前(阻塞)
|
|
|
|
|
|
response = requests.post(url, json=payload, timeout=180)
|
|
|
|
|
|
|
|
|
|
|
|
# 重构后(异步)
|
|
|
|
|
|
async with httpx.AsyncClient() as client:
|
|
|
|
|
|
response = await client.post(url, json=payload, timeout=180)
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 3.3 前端重构方案
|
|
|
|
|
|
|
|
|
|
|
|
#### 现状问题
|
|
|
|
|
|
|
|
|
|
|
|
* 6300行单文件JS,无模块化
|
|
|
|
|
|
|
|
|
|
|
|
* 全局变量管理状态,易冲突
|
|
|
|
|
|
|
|
|
|
|
|
* 无构建工具,无法Tree-shaking/压缩
|
|
|
|
|
|
|
|
|
|
|
|
* 内联CSS + 外部CSS混用,样式不统一
|
|
|
|
|
|
|
|
|
|
|
|
* 两套主题(浅色/暗色)手动维护
|
|
|
|
|
|
|
|
|
|
|
|
#### 方案:保持原生JS + 引入模块化 + 统一设计系统
|
|
|
|
|
|
|
|
|
|
|
|
> **原则**:前端样式风格保持不变,系统功能不变。引入轻量级工程化改造,不引入重型框架。
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
┌──────────────────────────────────────────────────────┐
|
|
|
|
|
|
│ 前端架构 │
|
|
|
|
|
|
│ │
|
|
|
|
|
|
│ ┌────────────────────────────────────────────────┐ │
|
|
|
|
|
|
│ │ 页面层 (HTML) │ │
|
|
|
|
|
|
│ │ login.html | futures_analysis.html | ... │ │
|
|
|
|
|
|
│ └────────────────────┬───────────────────────────┘ │
|
|
|
|
|
|
│ │ │
|
|
|
|
|
|
│ ┌────────────────────┴───────────────────────────┐ │
|
|
|
|
|
|
│ │ 模块层 (ES Modules) │ │
|
|
|
|
|
|
│ │ │ │
|
|
|
|
|
|
│ │ ┌─────────┐ ┌─────────┐ ┌─────────────────┐ │ │
|
|
|
|
|
|
│ │ │api.js │ │store.js │ │router.js │ │ │
|
|
|
|
|
|
│ │ │(HTTP封装)│ │(状态管理)│ │(视图路由) │ │ │
|
|
|
|
|
|
│ │ └─────────┘ └─────────┘ └─────────────────┘ │ │
|
|
|
|
|
|
│ │ ┌─────────┐ ┌─────────┐ ┌─────────────────┐ │ │
|
|
|
|
|
|
│ │ │chart.js │ │theme.js │ │components.js │ │ │
|
|
|
|
|
|
│ │ │(图表封装)│ │(主题管理)│ │(通用组件) │ │ │
|
|
|
|
|
|
│ │ └─────────┘ └─────────┘ └─────────────────┘ │ │
|
|
|
|
|
|
│ │ ┌─────────────────────────────────────────┐ │ │
|
|
|
|
|
|
│ │ │ views/ │ │ │
|
|
|
|
|
|
│ │ │ ├── list-view.js (品种列表) │ │ │
|
|
|
|
|
|
│ │ │ ├── detail-view.js (品种详情) │ │ │
|
|
|
|
|
|
│ │ │ ├── watched-view.js (自选) │ │ │
|
|
|
|
|
|
│ │ │ ├── review-view.js (复盘计划) │ │ │
|
|
|
|
|
|
│ │ │ └── trade-review.js (交易复盘) │ │ │
|
|
|
|
|
|
│ │ └─────────────────────────────────────────┘ │ │
|
|
|
|
|
|
│ └────────────────────────────────────────────────┘ │
|
|
|
|
|
|
│ │ │
|
|
|
|
|
|
│ ┌────────────────────┴───────────────────────────┐ │
|
|
|
|
|
|
│ │ 样式层 (统一CSS变量) │ │
|
|
|
|
|
|
│ │ │ │
|
|
|
|
|
|
│ │ ┌──────────┐ ┌──────────┐ ┌───────────────┐ │ │
|
|
|
|
|
|
│ │ │variables │ │base.css │ │components.css │ │ │
|
|
|
|
|
|
│ │ │.css │ │(重置+基础)│ │(通用组件样式) │ │ │
|
|
|
|
|
|
│ │ │(设计Token)│ └──────────┘ └───────────────┘ │ │
|
|
|
|
|
|
│ │ └──────────┘ │ │
|
|
|
|
|
|
│ └────────────────────────────────────────────────┘ │
|
|
|
|
|
|
└──────────────────────────────────────────────────────┘
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
**关键改进:**
|
|
|
|
|
|
|
|
|
|
|
|
| 改进点 | 当前 | 重构后 |
|
|
|
|
|
|
| ----- | ----------- | -------------------------- |
|
|
|
|
|
|
| JS组织 | 单文件6300行 | ES Modules模块化(每模块200-500行) |
|
|
|
|
|
|
| 状态管理 | 全局变量 | 集中式Store(发布-订阅模式) |
|
|
|
|
|
|
| 视图路由 | CSS类切换 | 轻量Router模块 |
|
|
|
|
|
|
| API调用 | 分散的fetch | 统一API封装(拦截器/错误处理) |
|
|
|
|
|
|
| CSS | 内联+外部混用 | CSS变量统一设计Token |
|
|
|
|
|
|
| 主题 | 手动维护两套 | CSS变量切换(data-theme属性) |
|
|
|
|
|
|
| 图表 | 直接调用ECharts | Chart模块封装(统一配置) |
|
|
|
|
|
|
| 构建 | 无 | 可选Vite(开发热更新+生产压缩) |
|
|
|
|
|
|
|
|
|
|
|
|
**目录结构规划:**
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
app/static/
|
|
|
|
|
|
├── index.html # 入口HTML
|
|
|
|
|
|
├── login.html
|
|
|
|
|
|
├── futures_analysis.html # 主页面(精简HTML骨架)
|
|
|
|
|
|
├── css/
|
|
|
|
|
|
│ ├── variables.css # 设计Token(颜色/字体/间距)
|
|
|
|
|
|
│ ├── base.css # 重置+基础样式
|
|
|
|
|
|
│ ├── components.css # 通用组件(按钮/卡片/模态框/表格)
|
|
|
|
|
|
│ ├── layout.css # 布局(导航/侧边栏/网格)
|
|
|
|
|
|
│ └── views/
|
|
|
|
|
|
│ ├── list.css # 品种列表页样式
|
|
|
|
|
|
│ ├── detail.css # 详情页样式
|
|
|
|
|
|
│ ├── review.css # 复盘页样式
|
|
|
|
|
|
│ └── trade-review.css # 交易复盘页样式
|
|
|
|
|
|
├── js/
|
|
|
|
|
|
│ ├── app.js # 应用入口(初始化+路由)
|
|
|
|
|
|
│ ├── api.js # HTTP请求封装
|
|
|
|
|
|
│ ├── store.js # 状态管理
|
|
|
|
|
|
│ ├── router.js # 视图路由
|
|
|
|
|
|
│ ├── chart.js # ECharts封装
|
|
|
|
|
|
│ ├── theme.js # 主题管理
|
|
|
|
|
|
│ ├── components.js # 通用组件(模态框/通知/加载)
|
|
|
|
|
|
│ ├── auth.js # 认证逻辑
|
|
|
|
|
|
│ └── views/
|
|
|
|
|
|
│ ├── list-view.js # 品种列表视图
|
|
|
|
|
|
│ ├── detail-view.js # 品种详情视图
|
|
|
|
|
|
│ ├── watched-view.js # 自选视图
|
|
|
|
|
|
│ ├── review-view.js # 复盘计划视图
|
|
|
|
|
|
│ └── trade-review.js # 交易复盘视图
|
|
|
|
|
|
└── assets/
|
|
|
|
|
|
└── (图标SVG等)
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
**Store状态管理示例:**
|
|
|
|
|
|
|
|
|
|
|
|
```javascript
|
|
|
|
|
|
// js/store.js - 轻量级状态管理
|
|
|
|
|
|
class Store {
|
|
|
|
|
|
constructor() {
|
|
|
|
|
|
this.state = {
|
|
|
|
|
|
user: JSON.parse(localStorage.getItem('user_info') || 'null'),
|
|
|
|
|
|
token: localStorage.getItem('auth_token'),
|
|
|
|
|
|
theme: localStorage.getItem('futures-theme') || 'light',
|
|
|
|
|
|
futures: { list: [], current: null, loading: false },
|
|
|
|
|
|
watched: JSON.parse(localStorage.getItem('watched_symbols') || '[]'),
|
|
|
|
|
|
review: { plans: [], current: null },
|
|
|
|
|
|
trade: { records: [], batches: [], stats: null }
|
|
|
|
|
|
};
|
|
|
|
|
|
this.listeners = new Map();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
on(key, callback) { /* 订阅状态变化 */ }
|
|
|
|
|
|
set(key, value) { /* 更新状态 + 通知监听者 */ }
|
|
|
|
|
|
get(key) { /* 获取状态 */ }
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
export const store = new Store();
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
***
|
|
|
|
|
|
|
|
|
|
|
|
## 第四部分:功能清单验证结果
|
|
|
|
|
|
|
|
|
|
|
|
### 4.1 验证方法
|
|
|
|
|
|
|
|
|
|
|
|
通过逐一阅读所有8个API路由文件源码,与前端JS代码中的API调用进行交叉比对,确认每个端点的存在性和完整性。
|
|
|
|
|
|
|
|
|
|
|
|
### 4.2 验证后的完整端点清单(共77个端点)
|
|
|
|
|
|
|
|
|
|
|
|
| 模块 | 前缀 | 端点数 | GET | POST | DELETE | PUT |
|
|
|
|
|
|
|------|------|--------|-----|------|--------|-----|
|
|
|
|
|
|
| 认证 | `/api/v1/auth` | 4 | 2 | 2 | 0 | 0 |
|
|
|
|
|
|
| 数据 | `/api/v1/data` | 5 | 4 | 1 | 0 | 0 |
|
|
|
|
|
|
| 任务 | `/api/v1/tasks` | 8 | 2 | 4 | 1 | 0 |
|
|
|
|
|
|
| 配置 | `/api/v1/config` | 4 | 1 | 3 | 0 | 0 |
|
|
|
|
|
|
| 期货分析 | `/api/v1/futures` | 19 | 10 | 6 | 1 | 1 |
|
|
|
|
|
|
| AI配置 | `/api/v1/ai-config` | 4 | 2 | 2 | 0 | 0 |
|
|
|
|
|
|
| 复盘计划 | `/api/v1/review` | 14 | 7 | 5 | 2 | 0 |
|
|
|
|
|
|
| 交易复盘 | `/api/v1/trade-review` | 12 | 9 | 2 | 2 | 0 |
|
|
|
|
|
|
| 页面路由 | `/` | 7 | 7 | 0 | 0 | 0 |
|
|
|
|
|
|
| **合计** | | **77** | **44** | **25** | **6** | **1** |
|
|
|
|
|
|
|
|
|
|
|
|
### 4.3 验证中发现的问题
|
|
|
|
|
|
|
|
|
|
|
|
| 编号 | 严重度 | 问题描述 | 影响 |
|
|
|
|
|
|
|------|--------|---------|------|
|
|
|
|
|
|
| V1 | **高** | 大部分API端点无认证保护:路由注册时未全局应用认证依赖,所有70个API端点可无认证访问 | 安全风险 |
|
|
|
|
|
|
| V2 | **高** | AI模型配置存在两套重复系统:`/api/v1/ai-config`(JSON文件存储)与 `/api/v1/futures/ai-models`(数据库存储)互不同步 | 数据不一致 |
|
|
|
|
|
|
| V3 | **中** | 前端调用了不存在的端点 `/api/v1/config/symbols`(index.html 第2047行),后端返回404 | 功能异常 |
|
|
|
|
|
|
| V4 | **中** | `review_plan.html` 页面无入口路由:main.py中未注册 `/review-plan` 路由,只能通过 `/static/review_plan.html` 访问且绕过认证 | 安全+可访问性 |
|
|
|
|
|
|
| V5 | **中** | `trade_review.py` 第394行引用 `from app.services.ai_analysis import AIAnalysisService`,但该类不存在(只有 `AIFuturesAnalyzer`),运行时报 ImportError | 功能异常 |
|
|
|
|
|
|
| V6 | **低** | 无速率限制:数据刷新和AI分析接口可能被频繁调用导致资源耗尽 | 稳定性风险 |
|
|
|
|
|
|
| V7 | **低** | CORS配置完全开放(`allow_origins=["*"]`) | 安全风险 |
|
|
|
|
|
|
|
|
|
|
|
|
### 4.4 与初版文档的差异
|
|
|
|
|
|
|
|
|
|
|
|
| 项目 | 初版 | 验证后 | 差异说明 |
|
|
|
|
|
|
|------|------|--------|--------|
|
|
|
|
|
|
| API端点总数 | 55+ | **70个API + 7个页面路由 = 77** | 逐一核实后数量更精确 |
|
|
|
|
|
|
| 期货分析模块端点 | 18 | **19** | 遗漏了 `POST /api/v1/futures/analysis/save` |
|
|
|
|
|
|
| 复盘计划模块端点 | 12 | **14** | 遗漏了 `POST /api/v1/review/plans/batch` 和 `GET /api/v1/review/summary/{id}` |
|
|
|
|
|
|
| 已知Bug | 0 | **5个(V1-V5)** | 深度验证发现 |
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 第五部分:编码规范
|
|
|
|
|
|
|
|
|
|
|
|
### 5.1 Python 编码规范
|
|
|
|
|
|
|
|
|
|
|
|
#### 基础规范
|
|
|
|
|
|
- **Python版本**:3.11+
|
|
|
|
|
|
- **代码格式化工具**:Ruff(替代 black + isort + flake8)
|
|
|
|
|
|
- **行宽**:最大 120 字符
|
|
|
|
|
|
- **缩进**:4 空格
|
|
|
|
|
|
- **编码**:UTF-8
|
|
|
|
|
|
- **类型注解**:所有函数签名必须包含类型注解
|
|
|
|
|
|
|
|
|
|
|
|
#### 命名规范
|
|
|
|
|
|
| 类型 | 规范 | 示例 |
|
|
|
|
|
|
|------|------|------|
|
|
|
|
|
|
| 文件名 | snake_case | `ai_analysis.py` |
|
|
|
|
|
|
| 类名 | PascalCase | `AIFuturesAnalyzer` |
|
|
|
|
|
|
| 函数/方法 | snake_case | `fetch_symbol_data()` |
|
|
|
|
|
|
| 常量 | UPPER_SNAKE_CASE | `CACHE_TTL_SECONDS` |
|
|
|
|
|
|
| 变量 | snake_case | `current_price` |
|
|
|
|
|
|
| 私有成员 | _前缀 | `_calc_macd()` |
|
|
|
|
|
|
| 模块级私有 | _前缀 | `_internal_helper()` |
|
|
|
|
|
|
|
|
|
|
|
|
#### 导入顺序(Ruff自动排序)
|
|
|
|
|
|
```python
|
|
|
|
|
|
# 1. 标准库
|
|
|
|
|
|
import json
|
|
|
|
|
|
import logging
|
|
|
|
|
|
from datetime import datetime
|
|
|
|
|
|
from typing import Dict, List, Optional
|
|
|
|
|
|
|
|
|
|
|
|
# 2. 第三方库
|
|
|
|
|
|
from fastapi import APIRouter, Depends, HTTPException
|
|
|
|
|
|
from sqlalchemy.orm import Session
|
|
|
|
|
|
|
|
|
|
|
|
|