代码清理:删除重复文件和无用内容,优化项目结构
This commit is contained in:
parent
19ad7d6e00
commit
379f295ab0
23
.gitignore
vendored
23
.gitignore
vendored
@ -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
|
||||
!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
|
||||
@ -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": "系统运行正常"}
|
||||
@ -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()
|
||||
37
clean_dlt.py
37
clean_dlt.py
@ -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')
|
||||
37
clean_ssq.py
37
clean_ssq.py
@ -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')
|
||||
58
fix_nginx.sh
58
fix_nginx.sh
@ -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"
|
||||
58
nginx.conf
58
nginx.conf
@ -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;
|
||||
}
|
||||
@ -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
|
||||
153
test_backend.py
153
test_backend.py
@ -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()
|
||||
172
使用指南.md
172
使用指南.md
@ -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 (最新版本)
|
||||
- ✅ 新增数据更新功能
|
||||
- ✅ 新增高级分析功能
|
||||
- ✅ 新增智能预测功能
|
||||
- ✅ 优化用户界面和用户体验
|
||||
- ✅ 提升系统性能和稳定性
|
||||
170
定时任务使用指南.md
170
定时任务使用指南.md
@ -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到项目仓库
|
||||
|
||||
---
|
||||
|
||||
**注意**: 定时任务功能需要系统持续运行,建议在服务器环境下使用。
|
||||
Loading…
x
Reference in New Issue
Block a user