|
|
|
|
|
# 金融数据中台 v2.1 - Bug 修复任务单
|
|
|
|
|
|
|
|
|
|
|
|
**优先级**: 🔴 P0 - 紧急
|
|
|
|
|
|
**创建时间**: 2026-04-06 02:05
|
|
|
|
|
|
**要求完成**: 2026-04-06 18:00 (16 小时内)
|
|
|
|
|
|
**执行人**: Agent Developer
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 🐛 Bug 列表(来自架构审查)
|
|
|
|
|
|
|
|
|
|
|
|
### Bug #001: API 限流保护缺失 🔴
|
|
|
|
|
|
|
|
|
|
|
|
**严重级别**: Major
|
|
|
|
|
|
**位置**: `backend/app/api/v2/*.py`
|
|
|
|
|
|
**问题**: 所有 API 接口未实现限流保护
|
|
|
|
|
|
**影响**: 安全风险,可能被 DDoS 攻击
|
|
|
|
|
|
|
|
|
|
|
|
**修复方案**:
|
|
|
|
|
|
```python
|
|
|
|
|
|
# 1. 安装 slowapi
|
|
|
|
|
|
pip install slowapi
|
|
|
|
|
|
|
|
|
|
|
|
# 2. 在 main.py 中添加
|
|
|
|
|
|
from slowapi import Limiter
|
|
|
|
|
|
from slowapi.util import get_remote_address
|
|
|
|
|
|
|
|
|
|
|
|
limiter = Limiter(key_func=get_remote_address)
|
|
|
|
|
|
app.state.limiter = limiter
|
|
|
|
|
|
app.add_exception_handler(RateLimitExceeded, _rate_limit_exceeded_handler)
|
|
|
|
|
|
|
|
|
|
|
|
# 3. 在 API 路由中添加装饰器
|
|
|
|
|
|
@router.get("/alert/rules")
|
|
|
|
|
|
@limiter.limit("100/minute")
|
|
|
|
|
|
async def get_alert_rules(request: Request):
|
|
|
|
|
|
...
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
**涉及文件**:
|
|
|
|
|
|
- `backend/app/main.py`
|
|
|
|
|
|
- `backend/app/api/v2/alert.py`
|
|
|
|
|
|
- `backend/app/api/v2/quality.py`
|
|
|
|
|
|
- `backend/app/api/v2/websocket.py`
|
|
|
|
|
|
|
|
|
|
|
|
**预计时间**: 2 小时
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
### Bug #002: WebSocket 连接数未限制 🔴
|
|
|
|
|
|
|
|
|
|
|
|
**严重级别**: Major
|
|
|
|
|
|
**位置**: `backend/app/websocket/connection_manager.py`
|
|
|
|
|
|
**问题**: 未设置最大连接数限制
|
|
|
|
|
|
**影响**: 性能风险,大量连接时服务器可能崩溃
|
|
|
|
|
|
|
|
|
|
|
|
**修复方案**:
|
|
|
|
|
|
```python
|
|
|
|
|
|
class ConnectionManager:
|
|
|
|
|
|
MAX_CONNECTIONS = 1000 # 类常量
|
|
|
|
|
|
|
|
|
|
|
|
async def connect(self, websocket: WebSocket, token: str, user_id: str):
|
|
|
|
|
|
# 添加连接数检查
|
|
|
|
|
|
if len(self.active_connections) >= self.MAX_CONNECTIONS:
|
|
|
|
|
|
await websocket.close(code=1013, reason="Too many connections")
|
|
|
|
|
|
logger.warning(f"Connection rejected: max connections ({self.MAX_CONNECTIONS}) reached")
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
|
|
await websocket.accept()
|
|
|
|
|
|
self.active_connections[user_id] = websocket
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
**涉及文件**:
|
|
|
|
|
|
- `backend/app/websocket/connection_manager.py`
|
|
|
|
|
|
|
|
|
|
|
|
**预计时间**: 1 小时
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
### Bug #003: 数据库连接池配置缺失 🟡
|
|
|
|
|
|
|
|
|
|
|
|
**严重级别**: Minor
|
|
|
|
|
|
**位置**: `backend/app/db/database.py`
|
|
|
|
|
|
**问题**: 未显式配置数据库连接池大小
|
|
|
|
|
|
**影响**: 高并发时可能连接不足
|
|
|
|
|
|
|
|
|
|
|
|
**修复方案**:
|
|
|
|
|
|
```python
|
|
|
|
|
|
# 在 create_engine 中添加参数
|
|
|
|
|
|
engine = create_engine(
|
|
|
|
|
|
DATABASE_URL,
|
|
|
|
|
|
pool_size=20, # 连接池大小
|
|
|
|
|
|
max_overflow=10, # 最大溢出连接数
|
|
|
|
|
|
pool_pre_ping=True, # 连接前检查
|
|
|
|
|
|
pool_recycle=3600 # 连接回收时间
|
|
|
|
|
|
)
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
**涉及文件**:
|
|
|
|
|
|
- `backend/app/db/database.py`
|
|
|
|
|
|
|
|
|
|
|
|
**预计时间**: 1 小时
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
### Bug #004: 日志记录不完整 🟡
|
|
|
|
|
|
|
|
|
|
|
|
**严重级别**: Minor
|
|
|
|
|
|
**位置**: 多个文件
|
|
|
|
|
|
**问题**: 关键操作缺少日志记录
|
|
|
|
|
|
|
|
|
|
|
|
**修复方案**:
|
|
|
|
|
|
```python
|
|
|
|
|
|
# 在关键操作中添加日志
|
|
|
|
|
|
logger.info(f"Alert rule created: {rule_id}, user: {user_id}")
|
|
|
|
|
|
logger.info(f"Alert triggered: {rule_id}, symbol: {symbol}, price: {price}")
|
|
|
|
|
|
logger.info(f"Notification sent: {notification_id}, channel: {channel}")
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
**涉及文件**:
|
|
|
|
|
|
- `backend/app/api/v2/alert.py`
|
|
|
|
|
|
- `backend/app/services/alert_engine.py`
|
|
|
|
|
|
- `backend/app/services/alert_notification.py`
|
|
|
|
|
|
|
|
|
|
|
|
**预计时间**: 3 小时
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
### Bug #005: 前端错误提示不友好 🟡
|
|
|
|
|
|
|
|
|
|
|
|
**严重级别**: Minor
|
|
|
|
|
|
**位置**: `frontend/src/views/alert/*.vue`
|
|
|
|
|
|
**问题**: API 调用失败时错误提示不够详细
|
|
|
|
|
|
|
|
|
|
|
|
**修复方案**:
|
|
|
|
|
|
```javascript
|
|
|
|
|
|
// 优化错误处理
|
|
|
|
|
|
try {
|
|
|
|
|
|
await api.createAlert(ruleData)
|
|
|
|
|
|
ElMessage.success('创建成功')
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
|
// 显示详细错误信息
|
|
|
|
|
|
const errorMsg = error.response?.data?.detail || error.message || '操作失败'
|
|
|
|
|
|
ElMessage.error(`创建失败:${errorMsg}`)
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
**涉及文件**:
|
|
|
|
|
|
- `frontend/src/views/alert/AlertCreate.vue`
|
|
|
|
|
|
- `frontend/src/views/alert/AlertEdit.vue`
|
|
|
|
|
|
|
|
|
|
|
|
**预计时间**: 2 小时
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 📋 修复步骤
|
|
|
|
|
|
|
|
|
|
|
|
### 步骤 1: API 限流(2 小时)
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# 1. 安装依赖
|
|
|
|
|
|
pip install slowapi
|
|
|
|
|
|
|
|
|
|
|
|
# 2. 修改 main.py
|
|
|
|
|
|
# 3. 修改各 API 文件
|
|
|
|
|
|
# 4. 测试限流功能
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 步骤 2: WebSocket 连接数限制(1 小时)
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# 1. 修改 connection_manager.py
|
|
|
|
|
|
# 2. 添加 MAX_CONNECTIONS 常量
|
|
|
|
|
|
# 3. 添加连接数检查逻辑
|
|
|
|
|
|
# 4. 测试连接限制
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 步骤 3: 数据库连接池(1 小时)
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# 1. 修改 database.py
|
|
|
|
|
|
# 2. 添加连接池参数
|
|
|
|
|
|
# 3. 测试连接池配置
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 步骤 4: 日志完善(3 小时)
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# 1. 在各模块添加日志
|
|
|
|
|
|
# 2. 统一日志格式
|
|
|
|
|
|
# 3. 测试日志输出
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 步骤 5: 前端错误提示(2 小时)
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# 1. 修改前端错误处理
|
|
|
|
|
|
# 2. 优化错误提示
|
|
|
|
|
|
# 3. 测试错误场景
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## ✅ 完成标准
|
|
|
|
|
|
|
|
|
|
|
|
1. 所有 Major 问题修复 ✅
|
|
|
|
|
|
2. 所有 Minor 问题修复 ✅
|
|
|
|
|
|
3. 代码审查通过 ✅
|
|
|
|
|
|
4. 回归测试通过 ✅
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 📢 完成后通知
|
|
|
|
|
|
|
|
|
|
|
|
修复完成后,请通知:
|
|
|
|
|
|
1. Agent Coordinator - 更新项目状态
|
|
|
|
|
|
2. Agent Architect - 复审
|
|
|
|
|
|
3. Agent Tester - 回归测试
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
**任务创建人**: Agent Coordinator
|
|
|
|
|
|
**创建时间**: 2026-04-06 02:05
|
|
|
|
|
|
**任务状态**: ⏳ 待执行
|
|
|
|
|
|
**优先级**: 🔴 P0 - 紧急
|
|
|
|
|
|
**截止时间**: 2026-04-06 18:00
|