彩票数据分析系统
项目概述
本项目是一个彩票数据分析系统,支持双色球和大乐透的数据管理、统计分析和智能选号功能。系统采用前后端分离架构,提供直观的用户界面和强大的数据分析能力。
技术栈
后端
- 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
安装和运行
快速启动 ⭐ 推荐
使用一键启动脚本(推荐方式):
# 确保已安装Python 3.8+和Node.js 16+
python start_system.py
脚本会自动:
- 检查Python版本和依赖
- 检查数据库连接
- 询问是否启动定时任务
- 启动后端服务(端口8000)
- 启动前端服务(端口5173)
- 启动定时任务调度器(可选)
- 显示访问地址和使用说明
手动启动
后端
- 创建虚拟环境
python -m venv venv
source venv/bin/activate # Linux/Mac
venv\Scripts\activate # Windows
- 安装依赖
cd backend
pip install -r requirements.txt
- 配置数据库
- 创建 MySQL/PostgreSQL 数据库
- 修改
backend/app/core/database.py中的数据库连接配置
- 启动服务
uvicorn main:app --reload --host 0.0.0.0 --port 8000
前端
- 安装依赖
cd frontend
npm install
- 启动开发服务器
npm run dev
- 构建生产版本
npm run build
定时任务 ⭐ 新功能
cd backend
python scheduler.py
生产环境部署 ⭐ 新功能
自动部署
使用部署脚本进行一键部署:
# 给脚本执行权限
chmod +x deploy.sh
# 运行部署脚本
./deploy.sh
快速修复
如果遇到nginx配置问题,使用快速修复脚本:
# 给脚本执行权限
chmod +x fix_nginx.sh
# 运行修复脚本
./fix_nginx.sh
服务管理
使用服务管理脚本进行日常维护:
# 给脚本执行权限
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"
解决方案:
# 使用快速修复脚本
./fix_nginx.sh
2. 后端API连接被拒绝
错误信息: connect() failed (111: Connection refused) while connecting to upstream
解决方案:
# 检查后端服务状态
./service_manager.sh status
# 重启后端服务
./service_manager.sh restart
# 查看后端日志
./service_manager.sh logs backend
3. 前端页面无法访问
解决方案:
# 重新构建前端
cd frontend
npm run build
cd ..
# 重新部署
./service_manager.sh deploy
4. 数据库连接问题
解决方案:
# 检查数据库配置
cat backend/app/core/database.py
# 测试数据库连接
cd backend
python -c "from app.core.database import engine; print('数据库连接正常')"
日志查看
# nginx错误日志
sudo tail -f /var/log/nginx/error.log
# 后端应用日志
tail -f backend/backend.log
# 定时任务日志
tail -f scheduler.log
# 系统日志
sudo journalctl -u nginx -f
性能优化
-
启用gzip压缩: 在nginx.conf中添加:
gzip on; gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; -
静态资源缓存: 已在nginx.conf中配置静态资源缓存
-
数据库优化:
- 为常用查询字段添加索引
- 定期清理历史数据
- 使用连接池
使用说明
定时任务系统 ⭐ 新功能
自动任务
系统提供两个定时任务:
-
每天早上6点 - 数据更新任务
- 自动从API获取最新开奖数据
- 更新双色球和大乐透数据
- 检查历史投注的中奖情况
- 记录详细执行日志
-
每天下午5点 - 拼盘推荐任务
- 自动生成今日拼盘推荐
- 使用集成预测算法
- 生成4注推荐号码
- 保存到数据库供前端显示
手动启动定时任务
cd backend
python scheduler.py
查看定时任务状态
# 查看任务日志
tail -f scheduler.log
# 查看任务进程
ps aux | grep scheduler
数据管理
导入历史数据
- 准备CSV格式的历史数据文件
- 在管理界面选择"数据导入"
- 选择彩票类型(双色球/大乐透)
- 上传数据文件
- 系统自动验证和导入数据
手动录入数据
- 在管理界面选择"手动录入"
- 选择彩票类型和期号
- 输入开奖号码
- 保存数据
数据导出
- 在管理界面选择"数据导出"
- 选择彩票类型和时间范围
- 选择导出格式(CSV/Excel)
- 下载数据文件
统计分析
基础统计
- 频率统计: 查看各号码的出现次数和频率
- 热门号码: 显示出现频率最高的号码
- 冷门号码: 显示出现频率最低的号码
- 遗漏分析: 分析各号码的遗漏期数
高级分析 ⭐ 新功能
- 和值分析: 统计红球和值的分布规律
- AC值分析: 邻号差值分析
- 质合比分析: 质数与合数的比例分析
- 012路分析: 除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- 系统健康检查
开发指南
添加新的分析功能
- 在
backend/app/services/中添加新的分析服务 - 在
backend/app/api/endpoints/中添加对应的API端点 - 在前端
src/views/中添加新的页面组件 - 更新路由配置
添加新的预测算法
- 在
backend/app/services/prediction_service.py中添加新算法 - 更新API端点以支持新算法
- 在前端添加算法选择选项
数据库迁移
- 修改数据模型
- 生成迁移文件
- 执行迁移
贡献指南
- Fork 项目
- 创建功能分支
- 提交更改
- 推送到分支
- 创建 Pull Request
许可证
本项目采用 MIT 许可证。
联系方式
如有问题或建议,请通过以下方式联系:
- 提交 Issue
- 发送邮件
- 在线讨论
注意: 本系统仅供学习和研究使用,不构成投资建议。请理性购彩,注意风险。
问题分析与解决记录 ⚠️ 重要
投注记录开奖信息存储逻辑问题
问题描述
通过深入调试发现,双色球与大乐透的投注记录中开奖信息存储存在期号匹配错误:
- 问题表现:部分投注记录的期号没有对应的开奖数据,导致"未加料成功"
- 根本原因:投注期号获取逻辑错误,没有正确处理当天开奖的情况
技术分析
调试发现的实际问题:
双色球数据分析:
- 期号25076:7月3日投注,但25076期尚未开奖 ❌
- 期号25075:7月1日投注,7月3日开奖 ✅ 正确匹配
- 期号25074:6月29日投注,7月3日开奖 ✅ 正确匹配
问题:7月3日投注时获取到的是25075期号,但这期当天就开奖了
错误的期号获取逻辑:
# 问题代码:直接使用最新期号
last = db.query(LotteryModel).order_by(LotteryModel.open_time.desc()).first()
issue = last.issue if last else '' # 可能获取到当天已开奖的期号
问题分析:
- 投注时间在下午5点,但最新期号可能是当天早上开奖的期号
- 当天投注应该投注下一期(尚未开奖的期号)
- 没有正确处理期号与开奖时间的关系
解决方案
修正期号获取逻辑:
# 修正后的代码:始终投注下一期
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日为例:
- 7月3日下午5点:投注,期号设置为
25076(即将开奖的期号) - 7月3日晚上9点:第
25076期开奖 - 7月4日早上6点:获取第
25076期开奖数据,更新投注记录中奖状态
修复涉及的文件:
backend/scheduler.py- 定时任务中的投注记录创建backend/app/api/endpoints/prediction.py- 手动推荐中的投注记录创建backend/debug_lottery_issue.py- 调试分析脚本
修复步骤
- ✅ 通过调试脚本确认了真正的问题
- ✅ 修正代码中的期号获取逻辑
- 🔄 需要修正现有错误期号的投注记录
- 🔄 重新执行兑奖比对,更新中奖状态
影响范围
- 主要影响期号为25076的投注记录(需要等待下次开奖)
- 其他投注记录的期号匹配基本正确
数据一致性
修复后,新的投注记录将使用正确的期号,现有的错误记录需要等待对应期号开奖后才能正确更新中奖状态。
周六投注周日中奖检查问题 ⚠️ 新发现
问题描述
用户反馈周六投注的号码在周日没有完整的中奖比对信息,经调查发现定时任务逻辑存在错误。
根本原因
在scheduler.py的check_previous_day_wins_job函数中存在错误逻辑:
if current_weekday == 6: # 周六
logger.info("周六休息,不推送中奖检查")
return
问题分析:
- 周六投注大乐透,周六晚上开奖
- 周日早上9:30的定时任务应该检查周六的投注中奖情况
- 但错误的判断逻辑导致周日跳过了检查,因为昨天是周六
彩票开奖时间安排
- 双色球:周二、周四、周日开奖
- 大乐透:周一、周三、周六开奖
- 推荐安排:一三六推荐大乐透,二四日推荐双色球,周五休息
解决方案
修正check_previous_day_wins_job中的工作日判断逻辑:
- 移除错误的"周六休息"逻辑
- 根据昨天的日期来判断彩票类型,而不是今天
- 只有昨天是周五(休息日)才跳过检查
修复后的逻辑:
yesterday_weekday = yesterday.isoweekday()
if yesterday_weekday in [1, 3, 6]: # 昨天是周一、三、六,投注的是大乐透
lottery_type = 'dlt'
elif yesterday_weekday in [2, 4, 7]: # 昨天是周二、四、日,投注的是双色球
lottery_type = 'ssq'
else: # 昨天是周五,休息日,没有投注
logger.info("昨日是周五休息日,没有投注记录,跳过中奖检查")
return
验证结果
修复后测试显示:
- ✅ 7月12日(周六)4条大乐透投注记录
- ✅ 所有记录都正确更新了中奖信息
- ✅ 开奖号码和中奖状态完全匹配
- ✅ Telegram推送正常工作
影响范围
此修复解决了:
- 周六投注周日无中奖比对信息的问题
- 确保所有工作日的投注都能正确进行中奖检查
- 保持Telegram每日推送的完整性
2025-01-16 彩票投注内容调整
背景
用户需求将快乐8投注内容替换为排列3组选3投注。
排列3组选3规则
- 投注方式:从000-999中选择号码,其中有两个数字相同
- 中奖条件:所选号码与开奖号码相同且顺序不限
- 奖金设定:单注固定奖金346元
- 示例:开奖544,中奖号码可为544、454、445中任意一个
修改内容
在backend/scheduler.py的generate_daily_recommendations_job函数中:
原快乐8投注:
msg_lines.append("\n快乐8,单式,选十")
for _ in range(3):
nums = sorted(random.sample(range(1, 81), 10))
msg_lines.append(' '.join(f"{n:02d}" for n in nums))
新排列3组选3投注:
msg_lines.append("\n排列三,组选三")
for _ in range(3):
# 生成组选3号码:两个相同数字 + 一个不同数字
same_digit = random.randint(0, 9) # 相同的数字
different_digit = random.choice([d for d in range(0, 10) if d != same_digit]) # 不同的数字
# 将三个数字随机排列
digits = [same_digit, same_digit, different_digit]
random.shuffle(digits)
msg_lines.append(' '.join(str(d) for d in digits))
推送消息示例
你好,帮忙买下大乐透。
红球:04 06 09 18 19 蓝球:07 12
红球:01 03 05 06 31 蓝球:03 06
红球:06 09 18 23 32 蓝球:02 07
红球:02 07 13 14 22 蓝球:03 09
红球:02 09 22 31 32 蓝球:07 12
都追加,谢谢。
排列三,组选三
9 6 6
1 4 4
5 5 3
技术特点
- 随机生成:每次生成3注不同的组选3号码
- 规则保证:确保每注都包含两个相同数字和一个不同数字
- 顺序随机:相同数字的位置完全随机
- 无需存储:与快乐8一样,不保存投注记录,不进行中奖比对
最后更新:2025-01-16 问题状态:✅ 已完全修复并验证