570 lines
15 KiB
Markdown
570 lines
15 KiB
Markdown
# 彩票数据分析系统
|
||
|
||
## 项目概述
|
||
本项目是一个彩票数据分析系统,支持双色球和大乐透的数据管理、统计分析和智能选号功能。系统采用前后端分离架构,提供直观的用户界面和强大的数据分析能力。
|
||
|
||
## 技术栈
|
||
### 后端
|
||
- Python 3.8+
|
||
- FastAPI
|
||
- SQLAlchemy
|
||
- MySQL/PostgreSQL
|
||
- Pydantic
|
||
- Scikit-learn (机器学习)
|
||
- NumPy (数值计算)
|
||
- Pandas (数据处理)
|
||
- Schedule (定时任务)
|
||
|
||
### 前端
|
||
- Vue 3
|
||
- Vite
|
||
- Element Plus
|
||
- ECharts
|
||
- Pinia
|
||
- Vue Router
|
||
|
||
## 系统功能
|
||
|
||
### 1. 数据管理
|
||
- 双色球和大乐透历史数据导入
|
||
- 数据查询和筛选
|
||
- 数据导出
|
||
- 手动数据录入
|
||
- **自动数据更新** ⭐ 新功能
|
||
- **定时任务系统** ⭐ 新功能
|
||
|
||
### 2. 基础统计分析
|
||
- 号码出现频率统计
|
||
- 热门号码分析
|
||
- 冷门号码分析
|
||
- 数据可视化展示
|
||
|
||
### 3. 高级数据分析 ⭐ 新功能
|
||
- **遗漏值分析**: 分析各号码的遗漏期数
|
||
- **和值分析**: 统计红球和值的分布规律
|
||
- **AC值分析**: 邻号差值分析
|
||
- **质合比分析**: 质数与合数的比例分析
|
||
- **012路分析**: 除3余数分析
|
||
- **跨度分析**: 最大最小号码差值分析
|
||
- **综合分析**: 多维度数据整合分析
|
||
|
||
### 4. 智能预测系统 ⭐ 新功能
|
||
- **机器学习预测**: 基于历史数据的AI预测
|
||
- **模式预测**: 基于统计模式的预测
|
||
- **集成预测**: 多方法综合预测
|
||
- **预测模型训练**: 可自定义训练参数
|
||
- **预测结果评估**: 预测准确率统计
|
||
- **每日拼盘推荐**: 定时生成推荐号码 ⭐ 新功能
|
||
|
||
### 5. 智能选号
|
||
- 随机选号
|
||
- 频率选号
|
||
- 热门号码选号
|
||
- 冷门号码选号
|
||
- 自定义选号策略
|
||
|
||
### 6. 定时任务系统 ⭐ 新功能
|
||
- **每天早上6点**: 自动更新开奖数据
|
||
- **每天下午5点**: 自动生成拼盘推荐
|
||
- **任务状态监控**: 实时查看任务执行状态
|
||
- **日志记录**: 详细的任务执行日志
|
||
|
||
## 项目结构
|
||
```
|
||
lottery/
|
||
├── backend/ # 后端代码
|
||
│ ├── app/
|
||
│ │ ├── api/ # API 路由
|
||
│ │ │ ├── endpoints/ # 基础API端点
|
||
│ │ │ └── v1/ # API版本1
|
||
│ │ ├── core/ # 核心配置
|
||
│ │ ├── models/ # 数据模型
|
||
│ │ ├── schemas/ # 数据验证
|
||
│ │ └── services/ # 业务逻辑
|
||
│ │ ├── analysis_service.py # 基础分析服务
|
||
│ │ ├── advanced_analysis.py # 高级分析服务 ⭐
|
||
│ │ └── prediction_service.py # 预测服务 ⭐
|
||
│ ├── requirements.txt # 依赖包
|
||
│ ├── main.py # 入口文件
|
||
│ ├── scheduler.py # 定时任务调度器 ⭐
|
||
│ └── update_lottery.py # 数据更新脚本
|
||
├── frontend/ # 前端代码
|
||
│ ├── src/
|
||
│ │ ├── api/ # API 接口
|
||
│ │ ├── assets/ # 静态资源
|
||
│ │ ├── components/ # 组件
|
||
│ │ ├── router/ # 路由配置
|
||
│ │ ├── views/ # 页面
|
||
│ │ │ ├── AdvancedAnalysis.vue # 高级分析页面 ⭐
|
||
│ │ │ ├── NumberGenerator.vue # 一键下单页面 ⭐
|
||
│ │ │ └── Prediction.vue # 预测页面 ⭐
|
||
│ │ ├── App.vue # 根组件
|
||
│ │ └── main.js # 入口文件
|
||
│ ├── package.json # 依赖配置
|
||
│ └── vite.config.js # Vite 配置
|
||
├── nginx.conf # nginx配置文件 ⭐
|
||
├── deploy.sh # 部署脚本 ⭐
|
||
├── fix_nginx.sh # 快速修复脚本 ⭐
|
||
├── service_manager.sh # 服务管理脚本 ⭐
|
||
└── README.md # 项目文档
|
||
```
|
||
|
||
## 开发环境要求
|
||
- Python 3.8+
|
||
- Node.js 16+
|
||
- MySQL 8.0+ 或 PostgreSQL 12+
|
||
- npm 或 yarn
|
||
|
||
## 安装和运行
|
||
|
||
### 快速启动 ⭐ 推荐
|
||
使用一键启动脚本(推荐方式):
|
||
```bash
|
||
# 确保已安装Python 3.8+和Node.js 16+
|
||
python start_system.py
|
||
```
|
||
|
||
脚本会自动:
|
||
- 检查Python版本和依赖
|
||
- 检查数据库连接
|
||
- 询问是否启动定时任务
|
||
- 启动后端服务(端口8000)
|
||
- 启动前端服务(端口5173)
|
||
- 启动定时任务调度器(可选)
|
||
- 显示访问地址和使用说明
|
||
|
||
### 手动启动
|
||
|
||
#### 后端
|
||
1. 创建虚拟环境
|
||
```bash
|
||
python -m venv venv
|
||
source venv/bin/activate # Linux/Mac
|
||
venv\Scripts\activate # Windows
|
||
```
|
||
|
||
2. 安装依赖
|
||
```bash
|
||
cd backend
|
||
pip install -r requirements.txt
|
||
```
|
||
|
||
3. 配置数据库
|
||
- 创建 MySQL/PostgreSQL 数据库
|
||
- 修改 `backend/app/core/database.py` 中的数据库连接配置
|
||
|
||
4. 启动服务
|
||
```bash
|
||
uvicorn main:app --reload --host 0.0.0.0 --port 8000
|
||
```
|
||
|
||
#### 前端
|
||
1. 安装依赖
|
||
```bash
|
||
cd frontend
|
||
npm install
|
||
```
|
||
|
||
2. 启动开发服务器
|
||
```bash
|
||
npm run dev
|
||
```
|
||
|
||
3. 构建生产版本
|
||
```bash
|
||
npm run build
|
||
```
|
||
|
||
#### 定时任务 ⭐ 新功能
|
||
```bash
|
||
cd backend
|
||
python scheduler.py
|
||
```
|
||
|
||
## 生产环境部署 ⭐ 新功能
|
||
|
||
### 自动部署
|
||
使用部署脚本进行一键部署:
|
||
```bash
|
||
# 给脚本执行权限
|
||
chmod +x deploy.sh
|
||
|
||
# 运行部署脚本
|
||
./deploy.sh
|
||
```
|
||
|
||
### 快速修复
|
||
如果遇到nginx配置问题,使用快速修复脚本:
|
||
```bash
|
||
# 给脚本执行权限
|
||
chmod +x fix_nginx.sh
|
||
|
||
# 运行修复脚本
|
||
./fix_nginx.sh
|
||
```
|
||
|
||
### 服务管理
|
||
使用服务管理脚本进行日常维护:
|
||
```bash
|
||
# 给脚本执行权限
|
||
chmod +x service_manager.sh
|
||
|
||
# 启动所有服务
|
||
./service_manager.sh start
|
||
|
||
# 停止所有服务
|
||
./service_manager.sh stop
|
||
|
||
# 重启所有服务
|
||
./service_manager.sh restart
|
||
|
||
# 查看服务状态
|
||
./service_manager.sh status
|
||
|
||
# 查看日志
|
||
./service_manager.sh logs backend # 后端日志
|
||
./service_manager.sh logs scheduler # 定时任务日志
|
||
./service_manager.sh logs nginx # nginx错误日志
|
||
|
||
# 部署更新
|
||
./service_manager.sh deploy
|
||
```
|
||
|
||
## 故障排除 ⭐ 新功能
|
||
|
||
### 常见问题
|
||
|
||
#### 1. nginx重定向循环错误
|
||
**错误信息**: `rewrite or internal redirection cycle while internally redirecting to "/index.html"`
|
||
|
||
**解决方案**:
|
||
```bash
|
||
# 使用快速修复脚本
|
||
./fix_nginx.sh
|
||
```
|
||
|
||
#### 2. 后端API连接被拒绝
|
||
**错误信息**: `connect() failed (111: Connection refused) while connecting to upstream`
|
||
|
||
**解决方案**:
|
||
```bash
|
||
# 检查后端服务状态
|
||
./service_manager.sh status
|
||
|
||
# 重启后端服务
|
||
./service_manager.sh restart
|
||
|
||
# 查看后端日志
|
||
./service_manager.sh logs backend
|
||
```
|
||
|
||
#### 3. 前端页面无法访问
|
||
**解决方案**:
|
||
```bash
|
||
# 重新构建前端
|
||
cd frontend
|
||
npm run build
|
||
cd ..
|
||
|
||
# 重新部署
|
||
./service_manager.sh deploy
|
||
```
|
||
|
||
#### 4. 数据库连接问题
|
||
**解决方案**:
|
||
```bash
|
||
# 检查数据库配置
|
||
cat backend/app/core/database.py
|
||
|
||
# 测试数据库连接
|
||
cd backend
|
||
python -c "from app.core.database import engine; print('数据库连接正常')"
|
||
```
|
||
|
||
### 日志查看
|
||
```bash
|
||
# nginx错误日志
|
||
sudo tail -f /var/log/nginx/error.log
|
||
|
||
# 后端应用日志
|
||
tail -f backend/backend.log
|
||
|
||
# 定时任务日志
|
||
tail -f scheduler.log
|
||
|
||
# 系统日志
|
||
sudo journalctl -u nginx -f
|
||
```
|
||
|
||
### 性能优化
|
||
1. **启用gzip压缩**:
|
||
在nginx.conf中添加:
|
||
```nginx
|
||
gzip on;
|
||
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
|
||
```
|
||
|
||
2. **静态资源缓存**:
|
||
已在nginx.conf中配置静态资源缓存
|
||
|
||
3. **数据库优化**:
|
||
- 为常用查询字段添加索引
|
||
- 定期清理历史数据
|
||
- 使用连接池
|
||
|
||
## 使用说明
|
||
|
||
### 定时任务系统 ⭐ 新功能
|
||
|
||
#### 自动任务
|
||
系统提供两个定时任务:
|
||
|
||
1. **每天早上6点 - 数据更新任务**
|
||
- 自动从API获取最新开奖数据
|
||
- 更新双色球和大乐透数据
|
||
- 检查历史投注的中奖情况
|
||
- 记录详细执行日志
|
||
|
||
2. **每天下午5点 - 拼盘推荐任务**
|
||
- 自动生成今日拼盘推荐
|
||
- 使用集成预测算法
|
||
- 生成4注推荐号码
|
||
- 保存到数据库供前端显示
|
||
|
||
#### 手动启动定时任务
|
||
```bash
|
||
cd backend
|
||
python scheduler.py
|
||
```
|
||
|
||
#### 查看定时任务状态
|
||
```bash
|
||
# 查看任务日志
|
||
tail -f scheduler.log
|
||
|
||
# 查看任务进程
|
||
ps aux | grep scheduler
|
||
```
|
||
|
||
### 数据管理
|
||
|
||
#### 导入历史数据
|
||
1. 准备CSV格式的历史数据文件
|
||
2. 在管理界面选择"数据导入"
|
||
3. 选择彩票类型(双色球/大乐透)
|
||
4. 上传数据文件
|
||
5. 系统自动验证和导入数据
|
||
|
||
#### 手动录入数据
|
||
1. 在管理界面选择"手动录入"
|
||
2. 选择彩票类型和期号
|
||
3. 输入开奖号码
|
||
4. 保存数据
|
||
|
||
#### 数据导出
|
||
1. 在管理界面选择"数据导出"
|
||
2. 选择彩票类型和时间范围
|
||
3. 选择导出格式(CSV/Excel)
|
||
4. 下载数据文件
|
||
|
||
### 统计分析
|
||
|
||
#### 基础统计
|
||
- **频率统计**: 查看各号码的出现次数和频率
|
||
- **热门号码**: 显示出现频率最高的号码
|
||
- **冷门号码**: 显示出现频率最低的号码
|
||
- **遗漏分析**: 分析各号码的遗漏期数
|
||
|
||
#### 高级分析 ⭐ 新功能
|
||
- **和值分析**: 统计红球和值的分布规律
|
||
- **AC值分析**: 邻号差值分析
|
||
- **质合比分析**: 质数与合数的比例分析
|
||
- **012路分析**: 除3余数分析
|
||
- **跨度分析**: 最大最小号码差值分析
|
||
|
||
### 智能预测 ⭐ 新功能
|
||
|
||
#### 机器学习预测
|
||
1. 选择彩票类型(双色球/大乐透)
|
||
2. 选择预测期数
|
||
3. 系统使用历史数据训练模型
|
||
4. 生成预测结果
|
||
|
||
#### 模式预测
|
||
1. 选择预测模式
|
||
2. 设置预测参数
|
||
3. 生成预测结果
|
||
|
||
#### 集成预测
|
||
1. 系统综合多种预测方法
|
||
2. 生成最优预测结果
|
||
3. 显示预测置信度
|
||
|
||
### 智能选号
|
||
|
||
#### 随机选号
|
||
- 完全随机生成号码组合
|
||
- 适合新手用户
|
||
|
||
#### 频率选号
|
||
- 基于历史频率选择号码
|
||
- 平衡热门和冷门号码
|
||
|
||
#### 热门号码选号
|
||
- 选择历史出现频率高的号码
|
||
- 适合追求稳定性的用户
|
||
|
||
#### 冷门号码选号
|
||
- 选择历史出现频率低的号码
|
||
- 适合追求高回报的用户
|
||
|
||
#### 自定义选号策略
|
||
- 用户可以自定义选号规则
|
||
- 支持多种选号策略组合
|
||
|
||
## API文档
|
||
|
||
### 基础API
|
||
- `GET /api/v1/lottery/ssq/latest` - 获取最新双色球数据
|
||
- `GET /api/v1/lottery/dlt/latest` - 获取最新大乐透数据
|
||
- `GET /api/v1/lottery/ssq/history` - 获取双色球历史数据
|
||
- `GET /api/v1/lottery/dlt/history` - 获取大乐透历史数据
|
||
|
||
### 分析API ⭐ 新功能
|
||
- `GET /api/analysis/ssq/frequency` - 双色球频率分析
|
||
- `GET /api/analysis/dlt/frequency` - 大乐透频率分析
|
||
- `GET /api/analysis/ssq/missing` - 双色球遗漏值分析
|
||
- `GET /api/analysis/dlt/missing` - 大乐透遗漏值分析
|
||
- `GET /api/analysis/ssq/sum` - 双色球和值分析
|
||
- `GET /api/analysis/dlt/sum` - 大乐透和值分析
|
||
|
||
### 预测API ⭐ 新功能
|
||
- `POST /api/v1/prediction/ssq` - 双色球预测
|
||
- `POST /api/v1/prediction/dlt` - 大乐透预测
|
||
- `GET /api/v1/prediction/ssq/recommendations` - 获取双色球推荐
|
||
- `GET /api/v1/prediction/dlt/recommendations` - 获取大乐透推荐
|
||
|
||
### 健康检查
|
||
- `GET /health` - 系统健康检查
|
||
|
||
## 开发指南
|
||
|
||
### 添加新的分析功能
|
||
1. 在 `backend/app/services/` 中添加新的分析服务
|
||
2. 在 `backend/app/api/endpoints/` 中添加对应的API端点
|
||
3. 在前端 `src/views/` 中添加新的页面组件
|
||
4. 更新路由配置
|
||
|
||
### 添加新的预测算法
|
||
1. 在 `backend/app/services/prediction_service.py` 中添加新算法
|
||
2. 更新API端点以支持新算法
|
||
3. 在前端添加算法选择选项
|
||
|
||
### 数据库迁移
|
||
1. 修改数据模型
|
||
2. 生成迁移文件
|
||
3. 执行迁移
|
||
|
||
## 贡献指南
|
||
|
||
1. Fork 项目
|
||
2. 创建功能分支
|
||
3. 提交更改
|
||
4. 推送到分支
|
||
5. 创建 Pull Request
|
||
|
||
## 许可证
|
||
|
||
本项目采用 MIT 许可证。
|
||
|
||
## 联系方式
|
||
|
||
如有问题或建议,请通过以下方式联系:
|
||
- 提交 Issue
|
||
- 发送邮件
|
||
- 在线讨论
|
||
|
||
---
|
||
|
||
**注意**: 本系统仅供学习和研究使用,不构成投资建议。请理性购彩,注意风险。
|
||
|
||
## 问题分析与解决记录 ⚠️ 重要
|
||
|
||
### 投注记录开奖信息存储逻辑问题
|
||
|
||
#### 问题描述
|
||
通过深入调试发现,双色球与大乐透的投注记录中开奖信息存储存在期号匹配错误:
|
||
- **问题表现**:部分投注记录的期号没有对应的开奖数据,导致"未加料成功"
|
||
- **根本原因**:投注期号获取逻辑错误,没有正确处理当天开奖的情况
|
||
|
||
#### 技术分析
|
||
|
||
**调试发现的实际问题**:
|
||
```
|
||
双色球数据分析:
|
||
- 期号25076:7月3日投注,但25076期尚未开奖 ❌
|
||
- 期号25075:7月1日投注,7月3日开奖 ✅ 正确匹配
|
||
- 期号25074:6月29日投注,7月3日开奖 ✅ 正确匹配
|
||
|
||
问题:7月3日投注时获取到的是25075期号,但这期当天就开奖了
|
||
```
|
||
|
||
**错误的期号获取逻辑**:
|
||
```python
|
||
# 问题代码:直接使用最新期号
|
||
last = db.query(LotteryModel).order_by(LotteryModel.open_time.desc()).first()
|
||
issue = last.issue if last else '' # 可能获取到当天已开奖的期号
|
||
```
|
||
|
||
**问题分析**:
|
||
1. 投注时间在下午5点,但最新期号可能是当天早上开奖的期号
|
||
2. 当天投注应该投注**下一期**(尚未开奖的期号)
|
||
3. 没有正确处理期号与开奖时间的关系
|
||
|
||
#### 解决方案
|
||
|
||
**修正期号获取逻辑**:
|
||
```python
|
||
# 修正后的代码:始终投注下一期
|
||
last = db.query(LotteryModel).order_by(LotteryModel.open_time.desc()).first()
|
||
if last and last.issue:
|
||
# 无论何时投注,都应该投注下一期(尚未开奖的期号)
|
||
current_issue = int(last.issue)
|
||
next_issue = str(current_issue + 1)
|
||
else:
|
||
next_issue = ''
|
||
```
|
||
|
||
**修复逻辑**:
|
||
- 投注记录始终使用**下一期期号**(尚未开奖的期号)
|
||
- 确保投注记录能够在开奖后正确匹配到开奖数据
|
||
- 第二天早上6点的定时任务会获取开奖数据并更新中奖状态
|
||
|
||
#### 正确的时间线
|
||
以7月3日为例:
|
||
1. **7月3日下午5点**:投注,期号设置为 `25076`(即将开奖的期号)
|
||
2. **7月3日晚上9点**:第 `25076` 期开奖
|
||
3. **7月4日早上6点**:获取第 `25076` 期开奖数据,更新投注记录中奖状态
|
||
|
||
**修复涉及的文件**:
|
||
1. `backend/scheduler.py` - 定时任务中的投注记录创建
|
||
2. `backend/app/api/endpoints/prediction.py` - 手动推荐中的投注记录创建
|
||
3. `backend/debug_lottery_issue.py` - 调试分析脚本
|
||
|
||
#### 修复步骤
|
||
1. ✅ 通过调试脚本确认了真正的问题
|
||
2. ✅ 修正代码中的期号获取逻辑
|
||
3. 🔄 需要修正现有错误期号的投注记录
|
||
4. 🔄 重新执行兑奖比对,更新中奖状态
|
||
|
||
#### 影响范围
|
||
- 主要影响期号为25076的投注记录(需要等待下次开奖)
|
||
- 其他投注记录的期号匹配基本正确
|
||
|
||
#### 数据一致性
|
||
修复后,新的投注记录将使用正确的期号,现有的错误记录需要等待对应期号开奖后才能正确更新中奖状态。
|
||
|
||
---
|
||
|
||
*最后更新:2025-07-04*
|
||
*问题状态:已修复期号逻辑,等待验证* |