From 379f295ab053aa2a614d64328114320320fc24cc Mon Sep 17 00:00:00 2001 From: Mars Date: Fri, 27 Jun 2025 14:12:38 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=B8=85=E7=90=86=EF=BC=9A?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E9=87=8D=E5=A4=8D=E6=96=87=E4=BB=B6=E5=92=8C?= =?UTF-8?q?=E6=97=A0=E7=94=A8=E5=86=85=E5=AE=B9=EF=BC=8C=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 23 ++++- backend/main.py | 34 -------- backend/schedule_update.py | 39 --------- clean_dlt.py | 37 -------- clean_ssq.py | 37 -------- fix_nginx.sh | 58 ------------- nginx.conf | 58 ------------- service_manager.sh | 131 ---------------------------- test_backend.py | 153 --------------------------------- 使用指南.md | 172 ------------------------------------- 定时任务使用指南.md | 170 ------------------------------------ 11 files changed, 22 insertions(+), 890 deletions(-) delete mode 100644 backend/main.py delete mode 100644 backend/schedule_update.py delete mode 100644 clean_dlt.py delete mode 100644 clean_ssq.py delete mode 100644 fix_nginx.sh delete mode 100644 nginx.conf delete mode 100644 service_manager.sh delete mode 100644 test_backend.py delete mode 100644 使用指南.md delete mode 100644 定时任务使用指南.md diff --git a/.gitignore b/.gitignore index 8b07892..e892925 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ __pycache__/ .Python venv/ ENV/ +*.pyc # Node node_modules/ @@ -28,4 +29,24 @@ Thumbs.db *.log *.json !package.json -!package-lock.json \ No newline at end of file +!package-lock.json + +# Data files +*_all_data.json +*_clean.json +backend/*_clean.json + +# Temporary files +*.tmp +*.temp +*.bak +*.backup + +# Logs +logs/ +*.log + +# Environment files +.env.local +.env.production +.env.development \ No newline at end of file diff --git a/backend/main.py b/backend/main.py deleted file mode 100644 index 9197a31..0000000 --- a/backend/main.py +++ /dev/null @@ -1,34 +0,0 @@ -from fastapi import FastAPI -from fastapi.middleware.cors import CORSMiddleware -from app.api.endpoints import analysis, lottery, prediction - -app = FastAPI( - title="彩票数据分析系统", - description="支持双色球和大乐透的数据管理、统计分析和智能选号功能", - version="1.0.0" -) - -# 配置CORS -app.add_middleware( - CORSMiddleware, - allow_origins=["*"], - allow_credentials=True, - allow_methods=["*"], - allow_headers=["*"], -) - -# 注册路由 -app.include_router(analysis.router, prefix="/api/analysis", tags=["analysis"]) -app.include_router(lottery.router, prefix="/api/v1/lottery", tags=["lottery"]) -app.include_router(prediction.router, - prefix="/api/v1/prediction", tags=["prediction"]) - - -@app.get("/") -def read_root(): - return {"message": "欢迎使用彩票数据分析系统"} - - -@app.get("/health") -def health_check(): - return {"status": "healthy", "message": "系统运行正常"} diff --git a/backend/schedule_update.py b/backend/schedule_update.py deleted file mode 100644 index 0b76f12..0000000 --- a/backend/schedule_update.py +++ /dev/null @@ -1,39 +0,0 @@ -import schedule -import time -from update_lottery import LotteryUpdater -import logging - -# 配置日志 -logging.basicConfig( - level=logging.INFO, - format='%(asctime)s - %(levelname)s - %(message)s', - filename='lottery_update.log' -) -logger = logging.getLogger(__name__) - - -def update_job(): - """定时更新任务""" - try: - logger.info("开始执行定时更新任务...") - updater = LotteryUpdater() - updater.update_all_lottery_data() - logger.info("定时更新任务完成") - except Exception as e: - logger.error(f"定时更新任务失败: {str(e)}") - - -def main(): - # 设置定时任务 - # 每天凌晨2点执行更新 - schedule.every().day.at("02:00").do(update_job) - - logger.info("定时更新服务已启动") - - while True: - schedule.run_pending() - time.sleep(60) - - -if __name__ == "__main__": - main() diff --git a/clean_dlt.py b/clean_dlt.py deleted file mode 100644 index 7c253f2..0000000 --- a/clean_dlt.py +++ /dev/null @@ -1,37 +0,0 @@ -import pandas as pd - -# 读取原始 JSON -df = pd.read_json('dlt_all_data.json') - - -def parse_front_balls(s): - return [int(x) for x in str(s).split()[:5]] - - -def parse_back_balls(s): - return [int(x) for x in str(s).split()[:2]] - - -records = [] -for _, row in df.iterrows(): - try: - fronts = parse_front_balls(row['frontWinningNum']) - backs = parse_back_balls(row['backWinningNum']) - records.append({ - 'issue': str(row['issue']), - 'open_time': str(row['openTime']), - 'front_ball_1': fronts[0], - 'front_ball_2': fronts[1], - 'front_ball_3': fronts[2], - 'front_ball_4': fronts[3], - 'front_ball_5': fronts[4], - 'back_ball_1': backs[0], - 'back_ball_2': backs[1] - }) - except Exception as e: - print(f"Error parsing row: {row['issue']}, error: {e}") - -# 保存为新 JSON -pd.DataFrame(records).to_json('dlt_clean.json', - orient='records', force_ascii=False) -print('精简后的数据已保存为 dlt_clean.json') diff --git a/clean_ssq.py b/clean_ssq.py deleted file mode 100644 index a637064..0000000 --- a/clean_ssq.py +++ /dev/null @@ -1,37 +0,0 @@ -import pandas as pd - -# 读取原始 JSON -df = pd.read_json('ssq_all_data.json') - - -def parse_red_balls(s): - return [int(x) for x in str(s).split()[:6]] - - -def parse_blue_ball(s): - return int(str(s).split()[0]) - - -records = [] -for _, row in df.iterrows(): - try: - reds = parse_red_balls(row['frontWinningNum']) - blue = parse_blue_ball(row['backWinningNum']) - records.append({ - 'issue': str(row['issue']), - 'open_time': str(row['openTime']), - 'red_ball_1': reds[0], - 'red_ball_2': reds[1], - 'red_ball_3': reds[2], - 'red_ball_4': reds[3], - 'red_ball_5': reds[4], - 'red_ball_6': reds[5], - 'blue_ball': blue - }) - except Exception as e: - print(f"Error parsing row: {row['issue']}, error: {e}") - -# 保存为新 JSON -pd.DataFrame(records).to_json('ssq_clean.json', - orient='records', force_ascii=False) -print('精简后的数据已保存为 ssq_clean.json') diff --git a/fix_nginx.sh b/fix_nginx.sh deleted file mode 100644 index b8ee211..0000000 --- a/fix_nginx.sh +++ /dev/null @@ -1,58 +0,0 @@ -#!/bin/bash - -echo "🔧 快速修复nginx配置..." - -# 1. 停止当前服务 -echo "🛑 停止当前服务..." -sudo pkill -f uvicorn -sudo systemctl stop nginx - -# 2. 构建前端 -echo "📦 构建前端..." -cd frontend -npm run build -cd .. - -# 3. 部署前端文件 -echo "📁 部署前端文件..." -sudo mkdir -p /var/www/html -sudo cp -r frontend/dist/* /var/www/html/ -sudo chown -R www-data:www-data /var/www/html -sudo chmod -R 755 /var/www/html - -# 4. 应用nginx配置 -echo "⚙️ 应用nginx配置..." -sudo cp nginx.conf /etc/nginx/sites-available/cp.mzh.one -sudo ln -sf /etc/nginx/sites-available/cp.mzh.one /etc/nginx/sites-enabled/ - -# 5. 启动nginx -echo "🚀 启动nginx..." -sudo nginx -t && sudo systemctl start nginx - -# 6. 启动后端 -echo "🚀 启动后端..." -cd backend -source venv/bin/activate -nohup uvicorn app.main:app --host 0.0.0.0 --port 8000 > backend.log 2>&1 & -cd .. - -# 7. 检查服务状态 -echo "⏳ 等待服务启动..." -sleep 3 - -echo "🔍 检查服务状态..." -if curl -f http://localhost:8000/health > /dev/null 2>&1; then - echo "✅ 后端服务正常" -else - echo "❌ 后端服务异常" -fi - -if curl -f http://localhost/ > /dev/null 2>&1; then - echo "✅ nginx服务正常" -else - echo "❌ nginx服务异常" -fi - -echo "" -echo "🎉 修复完成!" -echo "📋 访问地址: https://cp.mzh.one" \ No newline at end of file diff --git a/nginx.conf b/nginx.conf deleted file mode 100644 index dcc0d69..0000000 --- a/nginx.conf +++ /dev/null @@ -1,58 +0,0 @@ -server { - listen 80; - server_name cp.mzh.one; - - # 前端静态文件 - location / { - root /var/www/html; # 前端构建文件路径 - index index.html; - try_files $uri $uri/ /index.html; - } - - # API代理到后端 - location /api/ { - proxy_pass http://localhost:8000; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - - # 解决跨域问题 - add_header Access-Control-Allow-Origin *; - add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS"; - add_header Access-Control-Allow-Headers "DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization"; - - # 处理OPTIONS请求 - if ($request_method = 'OPTIONS') { - add_header Access-Control-Allow-Origin *; - add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS"; - add_header Access-Control-Allow-Headers "DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization"; - add_header Access-Control-Max-Age 1728000; - add_header Content-Type 'text/plain; charset=utf-8'; - add_header Content-Length 0; - return 204; - } - } - - # 健康检查 - location /health { - proxy_pass http://localhost:8000; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - } - - # 静态资源缓存 - location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ { - expires 1y; - add_header Cache-Control "public, immutable"; - } - - # 安全头 - add_header X-Frame-Options "SAMEORIGIN" always; - add_header X-XSS-Protection "1; mode=block" always; - add_header X-Content-Type-Options "nosniff" always; - add_header Referrer-Policy "no-referrer-when-downgrade" always; - add_header Content-Security-Policy "default-src 'self' http: https: data: blob: 'unsafe-inline'" always; -} \ No newline at end of file diff --git a/service_manager.sh b/service_manager.sh deleted file mode 100644 index b9ba5ef..0000000 --- a/service_manager.sh +++ /dev/null @@ -1,131 +0,0 @@ -#!/bin/bash - -# 服务管理脚本 -SERVICE_NAME="lottery-system" - -case "$1" in - start) - echo "🚀 启动彩票数据分析系统..." - - # 启动后端 - cd backend - source venv/bin/activate - nohup uvicorn app.main:app --host 0.0.0.0 --port 8000 > backend.log 2>&1 & - echo $! > backend.pid - cd .. - - # 启动定时任务 - nohup python3 scheduler.py > scheduler.log 2>&1 & - echo $! > scheduler.pid - - echo "✅ 服务启动完成" - ;; - - stop) - echo "🛑 停止彩票数据分析系统..." - - # 停止后端 - if [ -f "backend/backend.pid" ]; then - kill $(cat backend/backend.pid) 2>/dev/null - rm backend/backend.pid - fi - - # 停止定时任务 - if [ -f "scheduler.pid" ]; then - kill $(cat scheduler.pid) 2>/dev/null - rm scheduler.pid - fi - - # 强制停止所有相关进程 - pkill -f uvicorn - pkill -f scheduler.py - - echo "✅ 服务停止完成" - ;; - - restart) - echo "🔄 重启彩票数据分析系统..." - $0 stop - sleep 2 - $0 start - ;; - - status) - echo "📊 服务状态检查..." - - # 检查后端 - if curl -f http://localhost:8000/health > /dev/null 2>&1; then - echo "✅ 后端服务: 运行中" - else - echo "❌ 后端服务: 未运行" - fi - - # 检查nginx - if curl -f http://localhost/ > /dev/null 2>&1; then - echo "✅ nginx服务: 运行中" - else - echo "❌ nginx服务: 未运行" - fi - - # 检查定时任务 - if pgrep -f scheduler.py > /dev/null; then - echo "✅ 定时任务: 运行中" - else - echo "❌ 定时任务: 未运行" - fi - - # 显示进程信息 - echo "" - echo "📋 进程信息:" - ps aux | grep -E "(uvicorn|scheduler)" | grep -v grep - ;; - - logs) - echo "📋 查看日志..." - case "$2" in - backend) - tail -f backend/backend.log - ;; - scheduler) - tail -f scheduler.log - ;; - nginx) - sudo tail -f /var/log/nginx/error.log - ;; - *) - echo "用法: $0 logs {backend|scheduler|nginx}" - ;; - esac - ;; - - deploy) - echo "🚀 部署系统..." - - # 构建前端 - cd frontend - npm run build - cd .. - - # 部署前端文件 - sudo cp -r frontend/dist/* /var/www/html/ - sudo chown -R www-data:www-data /var/www/html - - # 重启服务 - $0 restart - - echo "✅ 部署完成" - ;; - - *) - echo "用法: $0 {start|stop|restart|status|logs|deploy}" - echo "" - echo "命令说明:" - echo " start - 启动所有服务" - echo " stop - 停止所有服务" - echo " restart - 重启所有服务" - echo " status - 查看服务状态" - echo " logs - 查看日志 (用法: $0 logs {backend|scheduler|nginx})" - echo " deploy - 部署系统" - exit 1 - ;; -esac \ No newline at end of file diff --git a/test_backend.py b/test_backend.py deleted file mode 100644 index 3106d83..0000000 --- a/test_backend.py +++ /dev/null @@ -1,153 +0,0 @@ -#!/usr/bin/env python3 -""" -测试后端启动的脚本 -""" - -import os -import sys -import subprocess -import time -import requests - - -def test_backend_startup(): - """测试后端启动""" - print("🧪 测试后端启动...") - - # 切换到backend目录 - backend_dir = "backend" - if not os.path.exists(backend_dir): - print("❌ 找不到backend目录") - return False - - os.chdir(backend_dir) - - try: - # 启动后端服务 - print("📝 启动命令: uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload") - process = subprocess.Popen([ - sys.executable, "-m", "uvicorn", "app.main:app", - "--host", "0.0.0.0", "--port", "8000", "--reload" - ], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) - - # 等待服务启动 - print("⏳ 等待服务启动...") - time.sleep(10) - - # 检查进程状态 - if process.poll() is not None: - # 进程已退出 - stdout, stderr = process.communicate() - print(f"❌ 进程已退出,退出码: {process.returncode}") - if stderr: - print(f"错误输出:\n{stderr}") - if stdout: - print(f"标准输出:\n{stdout}") - return False - - # 尝试连接服务 - try: - response = requests.get("http://localhost:8000/", timeout=5) - print(f"✅ 服务响应成功,状态码: {response.status_code}") - print(f"响应内容: {response.text}") - - # 测试API文档 - try: - docs_response = requests.get( - "http://localhost:8000/docs", timeout=5) - print(f"✅ API文档可访问,状态码: {docs_response.status_code}") - except Exception as e: - print(f"⚠️ API文档访问失败: {e}") - - return True - - except requests.exceptions.RequestException as e: - print(f"❌ 无法连接到服务: {e}") - - # 检查进程输出 - try: - stdout, stderr = process.communicate(timeout=2) - if stderr: - print(f"错误输出:\n{stderr}") - if stdout: - print(f"标准输出:\n{stdout}") - except subprocess.TimeoutExpired: - process.kill() - print("⚠️ 进程被强制终止") - - return False - - except Exception as e: - print(f"❌ 启动过程中出错: {e}") - return False - finally: - # 清理进程 - if 'process' in locals() and process.poll() is None: - process.terminate() - try: - process.wait(timeout=5) - except subprocess.TimeoutExpired: - process.kill() - - -def test_database_connection(): - """测试数据库连接""" - print("\n🔍 测试数据库连接...") - - try: - # 导入数据库配置 - sys.path.append('backend') - from app.core.database import SQLALCHEMY_DATABASE_URL - - print(f"数据库URL: {SQLALCHEMY_DATABASE_URL}") - - # 尝试创建引擎 - from sqlalchemy import create_engine, text - engine = create_engine(SQLALCHEMY_DATABASE_URL) - - # 测试连接 - with engine.connect() as connection: - result = connection.execute(text("SELECT 1")) - print("✅ 数据库连接成功") - return True - - except Exception as e: - print(f"❌ 数据库连接失败: {e}") - return False - - -def main(): - """主函数""" - print("🧪 后端启动测试") - print("=" * 50) - - # 测试数据库连接 - db_ok = test_database_connection() - - if not db_ok: - print("\n💡 数据库连接失败,可能的原因:") - print("1. 数据库服务器未运行") - print("2. 网络连接问题") - print("3. 数据库凭据错误") - print("4. 防火墙阻止连接") - - response = input("\n是否继续测试后端启动?(y/N): ") - if response.lower() != 'y': - return - - # 测试后端启动 - backend_ok = test_backend_startup() - - if backend_ok: - print("\n🎉 后端启动测试成功!") - else: - print("\n❌ 后端启动测试失败!") - print("\n💡 建议:") - print("1. 检查数据库连接") - print("2. 检查依赖包是否安装完整") - print("3. 检查端口8000是否被占用") - print("4. 查看详细的错误输出") - - -if __name__ == "__main__": - main() diff --git a/使用指南.md b/使用指南.md deleted file mode 100644 index b5e45af..0000000 --- a/使用指南.md +++ /dev/null @@ -1,172 +0,0 @@ -# 彩票数据分析系统使用指南 - -## 🚀 快速开始 - -### 1. 启动系统 -```bash -# 一键启动(推荐) -python start_system.py - -# 或者手动启动 -# 后端:cd backend && uvicorn app.main:app --reload --host 0.0.0.0 --port 8000 -# 前端:cd frontend && npm run dev -``` - -### 2. 访问系统 -- 前端界面:http://localhost:5173 -- 后端API文档:http://localhost:8000/docs - -## 📊 主要功能 - -### 1. 数据更新功能 ⭐ 新功能 - -#### 位置 -- 在首页顶部可以看到"数据更新"卡片 -- 包含三个按钮:更新双色球、更新大乐透、更新全部 - -#### 使用方法 -1. **更新双色球数据** - - 点击"更新双色球"按钮 - - 系统会自动从API获取最新开奖数据 - - 只添加数据库中不存在的新记录 - - 更新完成后会显示新增记录数量 - -2. **更新大乐透数据** - - 点击"更新大乐透"按钮 - - 功能与双色球更新类似 - -3. **更新全部数据** - - 点击"更新全部"按钮 - - 同时更新双色球和大乐透数据 - - 适合批量更新场景 - -#### 更新逻辑 -- 自动去重:只添加数据库中未存在的开奖日期 -- 数据验证:验证开奖号码的格式和范围 -- 实时反馈:显示更新进度和结果 -- 自动刷新:更新完成后自动刷新首页最新开奖信息 - -### 2. 数据查看功能 - -#### 最新开奖信息 -- 首页显示双色球和大乐透的最新开奖记录 -- 包含期号、开奖时间、开奖号码 -- 支持手动刷新功能 - -#### 历史数据查询 -- 进入"双色球数据"或"大乐透数据"页面 -- 支持按期号、日期范围查询 -- 分页显示,每页20条记录 - -### 3. 统计分析功能 - -#### 基础统计 -- 号码出现频率统计 -- 热门号码和冷门号码分析 -- 数据可视化展示 - -#### 高级分析 ⭐ 新功能 -- **遗漏值分析**:分析各号码的遗漏期数 -- **和值分析**:统计红球和值的分布规律 -- **AC值分析**:邻号差值分析 -- **质合比分析**:质数与合数的比例分析 -- **012路分析**:除3余数分析 -- **跨度分析**:最大最小号码差值分析 -- **综合分析**:多维度数据整合分析 - -### 4. 智能预测功能 ⭐ 新功能 - -#### 预测方法 -- **机器学习预测**:基于AI算法的预测 -- **模式预测**:基于统计模式的预测 -- **集成预测**:多方法综合预测 - -#### 使用步骤 -1. 进入"智能预测"页面 -2. 选择彩票类型(双色球/大乐透) -3. 设置训练期数(建议100-500期) -4. 点击"训练模型"按钮 -5. 选择预测方法并查看结果 - -### 5. 智能选号功能 - -#### 选号策略 -- 随机选号 -- 频率选号 -- 热门号码选号 -- 冷门号码选号 -- 自定义选号策略 - -## 🔧 技术特性 - -### 数据管理 -- **自动去重**:避免重复数据导入 -- **数据验证**:确保数据格式正确 -- **批量处理**:支持大量数据的高效处理 -- **事务安全**:数据库操作支持回滚 - -### 性能优化 -- **API缓存**:减少重复请求 -- **分页查询**:提高大数据量查询性能 -- **异步处理**:支持并发请求处理 -- **错误重试**:网络请求自动重试机制 - -### 用户体验 -- **响应式设计**:支持各种屏幕尺寸 -- **实时反馈**:操作状态实时显示 -- **错误提示**:友好的错误信息展示 -- **加载状态**:长时间操作的进度提示 - -## 🛠️ 故障排除 - -### 常见问题 - -#### 1. 系统启动失败 -**问题**:运行 `python start_system.py` 后系统无法启动 -**解决**: -- 检查Python版本是否为3.8+ -- 检查Node.js版本是否为16+ -- 确保已安装所有依赖包 - -#### 2. 数据更新失败 -**问题**:点击更新按钮后显示错误 -**解决**: -- 检查网络连接 -- 确认API密钥是否有效 -- 查看后端日志获取详细错误信息 - -#### 3. 前端页面无法访问 -**问题**:浏览器无法打开 http://localhost:5173 -**解决**: -- 确认前端服务是否正常启动 -- 检查端口5173是否被占用 -- 查看前端控制台错误信息 - -#### 4. 数据库连接失败 -**问题**:后端启动时显示数据库连接错误 -**解决**: -- 检查数据库服务是否启动 -- 确认数据库连接配置是否正确 -- 验证数据库用户权限 - -### 日志查看 -- 后端日志:查看终端输出或日志文件 -- 前端日志:打开浏览器开发者工具查看控制台 -- 数据库日志:查看数据库服务器日志 - -## 📞 技术支持 - -如果遇到问题,请: -1. 查看本文档的故障排除部分 -2. 检查系统日志获取详细错误信息 -3. 确认系统环境配置是否正确 -4. 联系技术支持团队 - -## 🔄 更新日志 - -### v1.0.0 (最新版本) -- ✅ 新增数据更新功能 -- ✅ 新增高级分析功能 -- ✅ 新增智能预测功能 -- ✅ 优化用户界面和用户体验 -- ✅ 提升系统性能和稳定性 \ No newline at end of file diff --git a/定时任务使用指南.md b/定时任务使用指南.md deleted file mode 100644 index 86bc524..0000000 --- a/定时任务使用指南.md +++ /dev/null @@ -1,170 +0,0 @@ -# 定时任务使用指南 - -## 概述 -彩票数据分析系统新增了定时任务功能,可以自动执行数据更新和拼盘推荐生成任务。 - -## 定时任务说明 - -### 1. 数据更新任务 -- **执行时间**: 每天早上6点 -- **功能**: 自动从API获取最新开奖数据 -- **更新内容**: - - 双色球最新开奖数据 - - 大乐透最新开奖数据 - - 检查历史投注的中奖情况 -- **日志文件**: `backend/lottery_scheduler.log` - -### 2. 拼盘推荐任务 -- **执行时间**: 每天下午5点 -- **功能**: 自动生成今日拼盘推荐 -- **生成内容**: - - 使用集成预测算法 - - 生成4注推荐号码 - - 保存到数据库供前端显示 -- **日志文件**: `backend/lottery_scheduler.log` - -## 启动方式 - -### 方式一:一键启动(推荐) -```bash -python start_system.py -``` -启动时会询问是否启动定时任务,选择"1"即可。 - -### 方式二:手动启动 -```bash -cd backend -python scheduler.py -``` - -### 方式三:后台运行 -```bash -cd backend -nohup python scheduler.py > scheduler.log 2>&1 & -``` - -## 查看任务状态 - -### 1. 前端查看 -- 打开一键下单页面 -- 查看"定时任务状态"区域 -- 显示下次执行时间和今日推荐状态 - -### 2. 日志查看 -```bash -# 实时查看日志 -tail -f backend/lottery_scheduler.log - -# 查看最近100行日志 -tail -n 100 backend/lottery_scheduler.log - -# 搜索特定任务的日志 -grep "早上6点" backend/lottery_scheduler.log -grep "下午5点" backend/lottery_scheduler.log -``` - -### 3. 进程查看 -```bash -# 查看定时任务进程 -ps aux | grep scheduler.py - -# 查看进程ID -pgrep -f scheduler.py -``` - -## 常见问题 - -### Q1: 定时任务没有执行? -**A**: 检查以下几点: -1. 确保定时任务进程正在运行 -2. 检查日志文件是否有错误信息 -3. 确认系统时间正确 -4. 检查数据库连接是否正常 - -### Q2: 如何修改定时任务时间? -**A**: 编辑 `backend/scheduler.py` 文件中的时间设置: -```python -# 修改为其他时间 -schedule.every().day.at("07:00").do(self.update_lottery_data_job) # 改为早上7点 -schedule.every().day.at("18:00").do(self.generate_daily_recommendations_job) # 改为下午6点 -``` - -### Q3: 如何停止定时任务? -**A**: -1. 找到进程ID:`pgrep -f scheduler.py` -2. 停止进程:`kill <进程ID>` -3. 或者使用Ctrl+C停止(如果在前台运行) - -### Q4: 今日推荐没有生成? -**A**: 检查以下几点: -1. 定时任务是否正常运行 -2. 是否有足够的历史数据(建议至少100期) -3. 预测模型是否训练完成 -4. 查看日志文件获取错误信息 - -### Q5: 如何手动执行任务? -**A**: -1. **手动更新数据**: - ```bash - cd backend - python update_lottery.py - ``` - -2. **手动生成推荐**: - - 在前端一键下单页面点击"来一份拼盘"按钮 - - 或者调用API接口 - -## 配置说明 - -### 日志配置 -日志文件位置:`backend/lottery_scheduler.log` -日志级别:INFO -日志格式:时间 - 级别 - 消息 - -### 数据库配置 -确保数据库连接正常,定时任务需要访问数据库进行数据更新和推荐生成。 - -### API配置 -定时任务使用聚合数据API获取开奖数据,确保API密钥有效。 - -## 监控建议 - -### 1. 定期检查日志 -建议每天检查一次日志文件,确保任务正常执行。 - -### 2. 监控磁盘空间 -日志文件会持续增长,建议定期清理或设置日志轮转。 - -### 3. 监控数据库 -确保数据库有足够空间存储新数据。 - -### 4. 监控网络 -确保服务器网络连接正常,能够访问外部API。 - -## 故障排除 - -### 1. 任务执行失败 -- 查看日志文件获取详细错误信息 -- 检查数据库连接 -- 检查网络连接 -- 检查API密钥是否有效 - -### 2. 推荐生成失败 -- 检查历史数据是否充足 -- 检查预测模型是否正常 -- 查看预测服务日志 - -### 3. 数据更新失败 -- 检查API连接 -- 检查API密钥 -- 检查数据库权限 - -## 联系支持 -如果遇到问题,请: -1. 查看日志文件获取错误信息 -2. 检查常见问题部分 -3. 提交Issue到项目仓库 - ---- - -**注意**: 定时任务功能需要系统持续运行,建议在服务器环境下使用。 \ No newline at end of file