代码清理:删除重复文件和无用内容,优化项目结构

This commit is contained in:
Mars 2025-06-27 14:12:38 +08:00
parent 19ad7d6e00
commit 379f295ab0
11 changed files with 22 additions and 890 deletions

23
.gitignore vendored
View File

@ -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

View File

@ -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": "系统运行正常"}

View File

@ -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()

View File

@ -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')

View File

@ -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')

View File

@ -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"

View File

@ -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;
}

View File

@ -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

View File

@ -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()

View File

@ -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 (最新版本)
- ✅ 新增数据更新功能
- ✅ 新增高级分析功能
- ✅ 新增智能预测功能
- ✅ 优化用户界面和用户体验
- ✅ 提升系统性能和稳定性

View File

@ -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到项目仓库
---
**注意**: 定时任务功能需要系统持续运行,建议在服务器环境下使用。