fix: 修复代码审查反馈全部问题
审查意见修复清单:
P1 列映射语义修复 (lottery.py):
- _normalize_history_format() 不再将红球2-6映射到开机号/和值特征/奇偶比等
格式A不含这些特征字段,缺失列留空,前端做降级显示
- 删除已用于构建号码列的原始分列,避免数据重复
P2 架构优化:
- 提取 Excel 兼容逻辑到公共模块 history_loader.py
lottery.py 和 app.py 共同引用,消除三处重复代码
- web_executor.py 标记为已废弃,功能已整合到 app.py
部署修复:
- 删除 deploy/lotto-web.service (旧服务),仅保留 lotto-app.service
- 更新 deploy/DEPLOY.md: 端口5000→8085, 接口清单更新, 添加迁移说明
安全加固:
- API Token 改为环境变量读取: os.environ.get('LOTTO_API_TOKEN')
- 错误信息不再暴露内部异常,改为通用错误消息+日志记录
- 目录遍历防护改用 os.path.realpath 检查最终路径
其他:
- .gitignore 补充排除 双色球历史数据.xlsx
- app.py 引用公共模块,简化 get_statistics_data 和 load_history_dataframe
测试验证: 全部 API 测试通过,120条历史数据正确解析
Issue: BIZ-75
This commit is contained in:
+110
-62
@@ -5,9 +5,11 @@
|
||||
| 项目 | 值 |
|
||||
|------|-----|
|
||||
| 项目名称 | 双色球自动化系统 |
|
||||
| 部署时间 | 2026-06-29 |
|
||||
| 部署时间 | 2026-07-04 |
|
||||
| 开发人员 | 徐聪 (costcodev) |
|
||||
| 部署人员 | 严维序 (opengineer) |
|
||||
| 服务地址 | http://192.168.1.99:5000 |
|
||||
| 服务地址 | http://192.168.1.99:8085 |
|
||||
| 代码仓库 | http://192.168.1.99:12299/vincent/Lottery.git |
|
||||
| 宿主服务器 | Ubuntu-OpenClaw (192.168.1.99) |
|
||||
|
||||
---
|
||||
@@ -17,38 +19,48 @@
|
||||
```
|
||||
/home/vincent/Studio/lottoData/
|
||||
├── venv/ # Python 虚拟环境
|
||||
├── web_executor.py # Flask Web 服务 (监听 0.0.0.0:5000)
|
||||
├── fetch_data.py # 数据抓取脚本
|
||||
├── lottery.py # 双色球号码生成器
|
||||
├── web_console.html # Web 控制台页面
|
||||
├── LottoSpider/ # 爬虫模块
|
||||
├── lottery/ # 彩票模块
|
||||
├── docs/ # 文档
|
||||
├── 双色球历史数据.xlsx # 历史数据文件
|
||||
├── app.py # Flask 统一 Web 服务 (监听 0.0.0.0:8085)
|
||||
├── index.html # 前端 UI (响应式,4 Tab 页面)
|
||||
├── lottery.py # 双色球号码生成器核心逻辑
|
||||
├── fetch_data.py # 历史数据抓取脚本
|
||||
├── web_console.html # 数据抓取控制台前端页面
|
||||
├── web_executor.py # [已废弃] 旧版独立抓取服务,功能已整合到 app.py
|
||||
├── requirements.txt # Python 依赖清单
|
||||
├── 双色球历史数据.xlsx # 历史数据文件 (不纳入 git)
|
||||
├── lottery/ # 号码生成结果输出目录 (不纳入 git)
|
||||
├── .generation_records.json # 生成记录索引 (不纳入 git)
|
||||
├── .fetch_status.json # 抓取状态文件 (不纳入 git)
|
||||
├── docs/ # 文档目录
|
||||
│ ├── PRD-双色球 WebUI-v1.0.md
|
||||
│ └── 开发文档-双色球WebUI-v1.0.md
|
||||
└── deploy/ # 部署文件
|
||||
├── DEPLOY.md # 本文档
|
||||
├── lotto-web.service # systemd 服务文件
|
||||
├── fetch_daily.sh # 每日抓取脚本
|
||||
├── lotto-app.service # systemd 服务文件 (统一入口)
|
||||
├── fetch_daily.sh # 每日定时抓取脚本
|
||||
├── backup.sh # 备份脚本 (30天保留)
|
||||
├── cron.log # Cron 执行日志
|
||||
└── fetch_YYYYMMDD.log # 每日抓取详细日志
|
||||
```
|
||||
|
||||
**说明**: `app.py` 是统一入口,整合了号码生成、历史数据、生成记录、统计数据抓取等全部功能。`web_executor.py` 已废弃,不需独立部署。
|
||||
|
||||
---
|
||||
|
||||
## 二、依赖清单
|
||||
|
||||
| 包 | 版本 | 用途 |
|
||||
|----|------|------|
|
||||
| Flask | 3.1.3 | Web 服务框架 |
|
||||
| pandas | 3.0.4 | 数据处理 |
|
||||
| openpyxl | 3.1.5 | Excel 读写 |
|
||||
| requests | 2.34.2 | HTTP 请求 |
|
||||
| beautifulsoup4 | 4.15.0 | HTML 解析 |
|
||||
| 包 | 用途 |
|
||||
|----|------|
|
||||
| Flask | Web 服务框架 |
|
||||
| pandas | 数据处理 |
|
||||
| openpyxl | Excel 读写 |
|
||||
| numpy | 数值计算 |
|
||||
| requests | HTTP 请求 (数据抓取) |
|
||||
| beautifulsoup4 | HTML 解析 (数据抓取) |
|
||||
|
||||
安装命令:
|
||||
```bash
|
||||
python3 -m venv venv
|
||||
./venv/bin/pip install flask pandas openpyxl requests beautifulsoup4
|
||||
./venv/bin/pip install -r requirements.txt
|
||||
```
|
||||
|
||||
---
|
||||
@@ -57,22 +69,23 @@ python3 -m venv venv
|
||||
|
||||
### 服务文件
|
||||
|
||||
`/etc/systemd/system/lotto-web.service`
|
||||
`/etc/systemd/system/lotto-app.service`
|
||||
|
||||
```ini
|
||||
[Unit]
|
||||
Description=双色球数据抓取 Web 服务
|
||||
Description=双色球号码生成 Web 服务 (app.py :8085)
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=vincent
|
||||
WorkingDirectory=/home/vincent/Studio/lottoData
|
||||
ExecStart=/home/vincent/Studio/lottoData/venv/bin/python3 /home/vincent/Studio/lottoData/web_executor.py
|
||||
ExecStartPre=/home/vincent/Studio/lottoData/venv/bin/python3 -c "import flask; import pandas; import openpyxl; import requests; import bs4"
|
||||
ExecStart=/home/vincent/Studio/lottoData/venv/bin/python3 /home/vincent/Studio/lottoData/app.py
|
||||
ExecStartPre=/home/vincent/Studio/lottoData/venv/bin/python3 -c "import flask; import pandas; import openpyxl; import numpy"
|
||||
Restart=on-failure
|
||||
RestartSec=5
|
||||
KillMode=control-group
|
||||
Environment=PYTHONUNBUFFERED=1
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
@@ -82,16 +95,25 @@ WantedBy=multi-user.target
|
||||
|
||||
```bash
|
||||
# 安装/启用
|
||||
sudo cp deploy/lotto-web.service /etc/systemd/system/
|
||||
sudo cp deploy/lotto-app.service /etc/systemd/system/
|
||||
sudo systemctl daemon-reload
|
||||
sudo systemctl enable lotto-web
|
||||
sudo systemctl start lotto-web
|
||||
sudo systemctl enable lotto-app
|
||||
sudo systemctl start lotto-app
|
||||
|
||||
# 日常管理
|
||||
sudo systemctl status lotto-web # 查看状态
|
||||
sudo systemctl restart lotto-web # 重启
|
||||
sudo systemctl stop lotto-web # 停止
|
||||
sudo journalctl -u lotto-web -f # 查看实时日志
|
||||
sudo systemctl status lotto-app # 查看状态
|
||||
sudo systemctl restart lotto-app # 重启
|
||||
sudo systemctl stop lotto-app # 停止
|
||||
sudo journalctl -u lotto-app -f # 查看实时日志
|
||||
```
|
||||
|
||||
### 生产部署建议
|
||||
|
||||
建议使用 gunicorn 替代 Flask 内置服务器:
|
||||
```bash
|
||||
./venv/bin/pip install gunicorn
|
||||
# 修改 ExecStart 为:
|
||||
# /home/vincent/Studio/lottoData/venv/bin/gunicorn -w 4 -b 0.0.0.0:8085 app:app
|
||||
```
|
||||
|
||||
---
|
||||
@@ -102,77 +124,103 @@ sudo journalctl -u lotto-web -f # 查看实时日志
|
||||
|
||||
```
|
||||
30 2 * * * /home/vincent/Studio/lottoData/deploy/fetch_daily.sh >> /home/vincent/Studio/lottoData/deploy/cron.log 2>&1
|
||||
0 3 * * * /home/vincent/Studio/lottoData/deploy/backup.sh >> /home/vincent/Studio/lottoData/deploy/cron.log 2>&1
|
||||
```
|
||||
|
||||
每天凌晨 2:30 自动抓取双色球历史数据。
|
||||
- 每天 02:30 自动抓取双色球历史数据
|
||||
- 每天 03:00 自动备份数据(保留 30 天)
|
||||
|
||||
### 手动执行
|
||||
|
||||
```bash
|
||||
/home/vincent/Studio/lottoData/deploy/fetch_daily.sh
|
||||
# 或
|
||||
/home/vincent/Studio/lottoData/venv/bin/python3 /home/vincent/Studio/lottoData/fetch_data.py
|
||||
# 或通过 Web 控制台触发: http://192.168.1.99:8085/fetch
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 五、Web 接口
|
||||
## 五、Web 接口清单
|
||||
|
||||
| 路径 | 方法 | 说明 |
|
||||
|------|------|------|
|
||||
| `/` | GET | Web 控制台页面 |
|
||||
| `/api/status` | GET | 获取执行状态 |
|
||||
| `/api/execute` | POST | 触发数据抓取 |
|
||||
| `/` | GET | 双色球 Web UI 首页(号码生成) |
|
||||
| `/fetch` | GET | 数据抓取控制台 |
|
||||
| `/api/generate` | POST | 生成号码(参数: num_tickets, strategy) |
|
||||
| `/api/history` | GET | 获取历史开奖数据(参数: page, page_size, search) |
|
||||
| `/api/records` | GET | 获取生成记录列表(参数: page, page_size) |
|
||||
| `/api/records/:id` | DELETE | 删除生成记录 |
|
||||
| `/api/statistics` | GET | 获取统计分析数据 |
|
||||
| `/api/download/:filepath` | GET | 下载文件 |
|
||||
| `/api/status` | GET | 系统状态 |
|
||||
| `/api/config` | GET | 前端配置 |
|
||||
| `/api/fetch/status` | GET | 抓取执行状态 |
|
||||
| `/api/fetch/execute` | POST | 触发数据抓取 |
|
||||
|
||||
### 示例
|
||||
|
||||
```bash
|
||||
# 查看状态
|
||||
curl http://192.168.1.99:5000/api/status
|
||||
curl http://192.168.1.99:8085/api/status
|
||||
|
||||
# 生成号码
|
||||
curl -X POST http://192.168.1.99:8085/api/generate \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"num_tickets": 10, "strategy": "advanced"}'
|
||||
|
||||
# 触发抓取
|
||||
curl -X POST http://192.168.1.99:5000/api/execute
|
||||
curl -X POST http://192.168.1.99:8085/api/fetch/execute
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 六、验证清单
|
||||
## 六、迁移说明(从旧版升级)
|
||||
|
||||
- [x] 依赖安装完整 (Flask, pandas, openpyxl, requests, beautifulsoup4)
|
||||
- [x] systemd 服务运行正常 (active, enabled)
|
||||
- [x] Web 服务可访问 (http://192.168.1.99:5000, HTTP 200)
|
||||
- [x] API 接口正常 (/api/status, /api/execute)
|
||||
- [x] Cron 定时任务已配置 (每日 2:30 抓取)
|
||||
- [x] 手动抓取测试通过 (121 条记录保存成功)
|
||||
- [x] 开机自启已配置 (systemd enable)
|
||||
|
||||
---
|
||||
|
||||
## 七、回滚方案
|
||||
如果之前部署了旧版 `lotto-web.service`(端口 5000):
|
||||
|
||||
```bash
|
||||
# 停止服务
|
||||
# 1. 停止旧服务
|
||||
sudo systemctl stop lotto-web
|
||||
sudo systemctl disable lotto-web
|
||||
sudo rm /etc/systemd/system/lotto-web.service
|
||||
sudo systemctl daemon-reload
|
||||
|
||||
# 移除 cron
|
||||
crontab -l | grep -v 'lottoData' | crontab -
|
||||
# 2. 部署新服务
|
||||
sudo cp deploy/lotto-app.service /etc/systemd/system/
|
||||
sudo systemctl daemon-reload
|
||||
sudo systemctl enable --now lotto-app
|
||||
|
||||
# 不影响数据文件和代码
|
||||
# 3. 更新 cron(指向新的 fetch_daily.sh)
|
||||
crontab -l | sed 's|web_executor|app|g' | crontab -
|
||||
# 或手动编辑: crontab -e
|
||||
|
||||
# 4. 验证
|
||||
curl http://127.0.0.1:8085/api/status
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 七、验证清单
|
||||
|
||||
- [ ] 依赖安装完整 (Flask, pandas, openpyxl, numpy, requests, beautifulsoup4)
|
||||
- [ ] systemd 服务运行正常 (active, enabled)
|
||||
- [ ] Web 服务可访问 (http://192.168.1.99:8085, HTTP 200)
|
||||
- [ ] API 接口正常 (/api/status, /api/generate, /api/history 等)
|
||||
- [ ] 前端页面正常 (4 Tab: 号码生成、历史数据、生成记录、统计分析)
|
||||
- [ ] 移动端响应式布局正常
|
||||
- [ ] Cron 定时任务已配置 (每日 2:30 抓取, 3:00 备份)
|
||||
- [ ] 旧版 lotto-web.service 已停止并移除
|
||||
- [ ] 开机自启已配置 (systemd enable)
|
||||
|
||||
---
|
||||
|
||||
## 八、监控要点
|
||||
|
||||
1. **服务存活**:`systemctl status lotto-web` 确认 active
|
||||
2. **Web 可达**:`curl http://127.0.0.1:5000/api/status`
|
||||
3. **数据更新**:检查 `/home/vincent/Studio/lottoData/双色球历史数据.xlsx` 修改时间
|
||||
4. **Cron 日志**:检查 `/home/vincent/Studio/lottoData/deploy/cron.log`
|
||||
5. **磁盘空间**:Excel 文件约 250KB,可忽略
|
||||
1. **服务存活**:`systemctl status lotto-app` 确认 active
|
||||
2. **Web 可达**:`curl http://127.0.0.1:8085/api/status`
|
||||
3. **数据更新**:检查 `双色球历史数据.xlsx` 修改时间
|
||||
4. **Cron 日志**:检查 `deploy/cron.log`
|
||||
5. **磁盘空间**:Excel 文件约 13KB,定期检查 `lottery/` 目录增长
|
||||
|
||||
---
|
||||
|
||||
> 部署人:严维序 (opengineer) | 2026-06-29
|
||||
> 部署人:严维序 (opengineer) | 2026-07-04
|
||||
|
||||
Reference in New Issue
Block a user