# 彩票数据分析系统 ## 项目概述 本项目是一个彩票数据分析系统,支持双色球和大乐透的数据管理、统计分析和智能选号功能。系统采用前后端分离架构,提供直观的用户界面和强大的数据分析能力。 ## 技术栈 ### 后端 - 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的投注记录(需要等待下次开奖) - 其他投注记录的期号匹配基本正确 #### 数据一致性 修复后,新的投注记录将使用正确的期号,现有的错误记录需要等待对应期号开奖后才能正确更新中奖状态。 ### 周六投注周日中奖检查问题 ⚠️ 新发现 #### 问题描述 用户反馈周六投注的号码在周日没有完整的中奖比对信息,经调查发现定时任务逻辑存在错误。 #### 根本原因 在`scheduler.py`的`check_previous_day_wins_job`函数中存在错误逻辑: ```python if current_weekday == 6: # 周六 logger.info("周六休息,不推送中奖检查") return ``` **问题分析**: - 周六投注大乐透,周六晚上开奖 - 周日早上9:30的定时任务应该检查周六的投注中奖情况 - 但错误的判断逻辑导致周日跳过了检查,因为昨天是周六 #### 彩票开奖时间安排 - **双色球**:周二、周四、周日开奖 - **大乐透**:周一、周三、周六开奖 - **推荐安排**:一三六推荐大乐透,二四日推荐双色球,周五休息 #### 解决方案 修正`check_previous_day_wins_job`中的工作日判断逻辑: 1. 移除错误的"周六休息"逻辑 2. 根据**昨天的日期**来判断彩票类型,而不是今天 3. 只有昨天是周五(休息日)才跳过检查 **修复后的逻辑**: ```python 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推送正常工作 #### 影响范围 此修复解决了: 1. 周六投注周日无中奖比对信息的问题 2. 确保所有工作日的投注都能正确进行中奖检查 3. 保持Telegram每日推送的完整性 --- ## 2025-01-16 彩票投注内容调整 ### 背景 用户需求将快乐8投注内容替换为排列3组选3投注。 ### 排列3组选3规则 - **投注方式**:从000-999中选择号码,其中有两个数字相同 - **中奖条件**:所选号码与开奖号码相同且顺序不限 - **奖金设定**:单注固定奖金346元 - **示例**:开奖544,中奖号码可为544、454、445中任意一个 ### 修改内容 在`backend/scheduler.py`的`generate_daily_recommendations_job`函数中: #### 原快乐8投注: ```python 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投注: ```python 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 ``` ### 技术特点 1. **随机生成**:每次生成3注不同的组选3号码 2. **规则保证**:确保每注都包含两个相同数字和一个不同数字 3. **顺序随机**:相同数字的位置完全随机 4. **无需存储**:与快乐8一样,不保存投注记录,不进行中奖比对 --- *最后更新:2025-01-16* *问题状态:✅ 已完全修复并验证*