You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
buffer_platform/data/系统架构分析与重构方案.md

757 lines
45 KiB

# 期货智析系统 - 架构分析与重构方案
> 文档版本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 (更新时间戳)
```
#### 调用链2AI分析链路
```
[前端] 请求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.db6个表
| 表名 | 用途 | 关键字段 |
| ------------------- | ------- | ---------------------------------------------------------------------------- |
| `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.db14个表
| 表名 | 用途 | 关键字段 |
| ---------------------- | -------- | ------------------------------------------------------------------- |
| `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