kangda/doc/design.md
2025-05-16 17:22:50 +08:00

332 lines
7.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 温度数据采集系统设计文档
## 1. 系统概述
### 1.1 系统目标
设计并实现一个自动化温度数据采集系统通过websocket与别的系统通信.当收到websocket消息后,调用第三方API获取事件并保存时事件到数据库.然后使用OCR技术识别图片中的温度数据保存到数据库中并提供数据查询接口。
### 1.2 系统范围
- 自动化数据采集
- 图片处理和OCR识别
- 数据存储和管理
- API接口服务
## 2. 系统架构
### 2.1 整体架构
系统采用分层架构设计,主要包含以下层次:
1. 数据采集层
2. 业务处理层
3. 数据持久层
4. API接口层
### 2.2 技术架构
```
├── app/
│ ├── config/ # 配置
│ ├── core/ # 数据库核心配置
│ ├── crud/ # 通用数据库操作
│ ├── kandaApi/ # 第三方平台的一些测试接口
│ ├── models/ # 数据库模型
│ ├── service/ # 同步数据库数据
│ └── utils/ # 工具函数
├── doc/ # 项目文档
├── alembic/ # 数据库迁移
├── ocrModel/ # ocr模型
├── logs/ # 日志文件
├── imagesDownload/ # 下载的图片
└── imagesOcr/ # ocr结果图片
```
## 3. 详细设计
### 3.1 数据同步模块
```python
class EventSyncService:
def __init__(self):
self.kangda = Kangda()
self.ocr = BadiduOcr()
async def sync_events(self):
"""同步事件数据"""
print("开始同步事件数据...")
# 获取事件列表
event_list = self.kangda.get_event_list()
if not event_list:
print("获取事件列表失败")
return
# 获取新事件列表
new_events = await self._get_new_events(event_list)
if not new_events:
print("没有新事件需要同步")
return
print(f"发现 {len(new_events)} 个新事件")
# 获取事件详情并更新
await self._update_event_details(new_events)
print("事件同步完成
```
### 3.2 API接口模块
```python
@router.get("/temperatures")
async def get_temperatures(
start_time: datetime,
end_time: datetime,
db: Session = Depends(get_db)
):
return await temperature_service.get_temperatures(
db, start_time, end_time
)
```
## 4. 数据库设计
### 4.1 表结构
详细表结构见需求文档中的数据库设计部分。
### 4.2 索引设计
```sql
-- 温度数据表索引
ALTER TABLE temperature ADD INDEX idx_temp_event_id (event_id);
ALTER TABLE temperature ADD INDEX idx_temp_create_time (create_time);
-- 图片表索引
ALTER TABLE image ADD INDEX idx_image_event_id (event_id);
-- 处理日志表索引
ALTER TABLE process_log ADD INDEX idx_log_event_id (event_id);
ALTER TABLE process_log ADD INDEX idx_log_create_time (create_time);
```
### 4.3 数据库配置
```ini
[mysql]
host = localhost
port = 3306
database = temp_db
user = temp_user
password = your_password
charset = utf8mb4
pool_size = 5
max_overflow = 10
pool_timeout = 30
pool_recycle = 1800
```
## 5. 接口设计
### 5.1 内部接口
1. 数据采集接口
- 获取事件列表
- 获取事件详情
- 下载图片
2. 数据处理接口
- OCR识别接口
- 数据验证接口
- 数据存储接口
### 5.2 外部接口
1. WebSocket接口
```python
@router.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
await websocket.accept()
try:
while True:
data = await websocket.receive_json()
# 处理接收到的消息
await process_websocket_message(data)
except WebSocketDisconnect:
pass
```
2. 温度数据查询接口
```python
@router.get("/api/v1/temperatures")
async def query_temperatures(
start_time: datetime,
end_time: datetime,
event_type: Optional[str] = None
) -> List[TemperatureResponse]:
pass
```
3. 处理状态查询接口
```python
@router.get("/api/v1/events/{event_id}/status")
async def get_event_status(
event_id: str
) -> EventStatusResponse:
pass
```
4. 获取事件列表接口
```python
@router.get("/api/v1/events")
async def get_events(
skip: int = 0,
limit: int = 100,
start_time: Optional[datetime] = None,
end_time: Optional[datetime] = None
) -> List[EventResponse]:
pass
```
5. 搜索事件接口
```python
@router.get("/api/v1/events/search")
async def search_events(
keyword: str,
skip: int = 0,
limit: int = 100
) -> List[EventResponse]:
pass
```
6. 删除事件接口
```python
@router.delete("/api/v1/events/{event_id}")
async def delete_event(
event_id: str
) -> Dict[str, str]:
pass
```
7. 查看事件详情接口
```python
@router.get("/api/v1/events/{event_id}")
async def get_event_detail(
event_id: str
) -> EventDetailResponse:
pass
```
## 6. 安全设计
### 6.1 认证授权
- 使用JWT进行API认证
- 实现基于角色的访问控制
### 6.2 数据安全
- 敏感数据加密存储
- 数据传输加密
- 操作日志记录
## 7. 性能设计
### 7.1 并发处理
- 使用异步IO处理HTTP请求
- 实现请求限流
- 使用连接池管理数据库连接
### 7.2 缓存策略
- 使用Redis缓存token
- 缓存热点数据
- 实现数据预加载
## 8. 监控设计
### 8.1 系统监控
- 接口响应时间监控
- 系统资源使用监控
- 异常监控告警
### 8.2 业务监控
- 数据采集成功率
- OCR识别准确率
- 处理延迟监控
## 9. 部署方案
### 9.1 环境要求
- Python 3.8+
- MySQL 8.0+
- Redis 6+
- Docker 20+
### 9.2 部署架构
```
[负载均衡器]
|
+---------------+---------------+
| | |
[应用服务器1] [应用服务器2] [应用服务器3]
| | |
+---+---------------+---+-----------+
| |
[MySQL主] [MySQL从]
| |
[Redis集群] [文件存储]
```
### 9.3 MySQL配置建议
```ini
[mysqld]
# 基本配置
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
default-time-zone = '+8:00'
# 连接配置
max_connections = 1000
max_connect_errors = 1000
# 缓冲池配置
innodb_buffer_pool_size = 4G
innodb_buffer_pool_instances = 4
# 日志配置
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
# 主从复制配置
server-id = 1
log-bin = mysql-bin
binlog_format = ROW
```
## 10. 测试方案
### 10.1 单元测试
- 使用pytest进行单元测试
- 测试覆盖率要求>80%
### 10.2 集成测试
- API接口测试
- 数据库操作测试
- OCR识别测试
### 10.3 性能测试
- 并发请求测试
- 数据处理能力测试
- 系统稳定性测试