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

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 期货智析系统 - 架构分析与重构方案
> 文档版本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