From 77d81ffa4b55c30db9753bd3de0450ff8cf68b36 Mon Sep 17 00:00:00 2001 From: Mars Date: Mon, 16 Jun 2025 16:19:44 +0800 Subject: [PATCH] =?UTF-8?q?BUG=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/app/api/v1/lottery.py | 21 +++++++++++++++++- backend/app/services/lottery.py | 8 +++++-- backend/requirements.txt | 4 +++- backend/schedule_update.py | 39 +++++++++++++++++++++++++++++++++ frontend/src/views/DLT.vue | 1 + 5 files changed, 69 insertions(+), 4 deletions(-) create mode 100644 backend/schedule_update.py diff --git a/backend/app/api/v1/lottery.py b/backend/app/api/v1/lottery.py index c5753d9..ff16e46 100644 --- a/backend/app/api/v1/lottery.py +++ b/backend/app/api/v1/lottery.py @@ -1,4 +1,4 @@ -from fastapi import APIRouter, Depends, Query +from fastapi import APIRouter, Depends, Query, HTTPException, UploadFile, File from sqlalchemy.orm import Session from typing import List, Optional from datetime import date @@ -6,6 +6,7 @@ from app.core.database import get_db from app.services.lottery import LotteryService from app.schemas.lottery import SSQLottery, DLTLottery, LotteryQuery import random +import tempfile router = APIRouter() @@ -110,3 +111,21 @@ def generate_dlt_numbers(strategy: str = Query("random"), count: int = Query(1)) "back_balls": back_balls }) return {"results": results} + + +@router.post("/ssq/import") +def import_ssq_data(file: UploadFile = File(...), db: Session = Depends(get_db)): + with tempfile.NamedTemporaryFile(delete=False) as tmp: + tmp.write(file.file.read()) + tmp_path = tmp.name + count = LotteryService.import_ssq_data(db, tmp_path) + return {"imported": count} + + +@router.post("/dlt/import") +def import_dlt_data(file: UploadFile = File(...), db: Session = Depends(get_db)): + with tempfile.NamedTemporaryFile(delete=False) as tmp: + tmp.write(file.file.read()) + tmp_path = tmp.name + count = LotteryService.import_dlt_data(db, tmp_path) + return {"imported": count} diff --git a/backend/app/services/lottery.py b/backend/app/services/lottery.py index c8e1a5b..0cfafc4 100644 --- a/backend/app/services/lottery.py +++ b/backend/app/services/lottery.py @@ -173,6 +173,8 @@ class LotteryService: # pandas 端彻底去重 new_rows = df[~df['issue'].astype(str).isin( existing_issues)].drop_duplicates(subset=['issue']) + # 按open_time升序排序 + new_rows = new_rows.sort_values(by='open_time', ascending=True) objs = [ SSQLottery( @@ -210,6 +212,8 @@ class LotteryService: # pandas 端彻底去重 new_rows = df[~df['issue'].astype(str).isin( existing_issues)].drop_duplicates(subset=['issue']) + # 按open_time升序排序 + new_rows = new_rows.sort_values(by='open_time', ascending=True) objs = [ DLTLottery( @@ -237,9 +241,9 @@ class LotteryService: @staticmethod def get_latest_ssq(db: Session) -> Optional[SSQLottery]: """获取最新一期双色球开奖记录""" - return db.query(SSQLottery).order_by(desc(SSQLottery.issue)).first() + return db.query(SSQLottery).order_by(desc(SSQLottery.open_time)).first() @staticmethod def get_latest_dlt(db: Session) -> Optional[DLTLottery]: """获取最新一期大乐透开奖记录""" - return db.query(DLTLottery).order_by(desc(DLTLottery.issue)).first() + return db.query(DLTLottery).order_by(desc(DLTLottery.open_time)).first() diff --git a/backend/requirements.txt b/backend/requirements.txt index 71c98cf..aab9f46 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -10,4 +10,6 @@ pymysql==1.1.0 cryptography==41.0.5 python-dotenv==1.0.0 pandas==2.1.3 -aiofiles==23.2.1 \ No newline at end of file +aiofiles==23.2.1 +requests==2.31.0 +schedule==1.2.1 \ No newline at end of file diff --git a/backend/schedule_update.py b/backend/schedule_update.py new file mode 100644 index 0000000..0b76f12 --- /dev/null +++ b/backend/schedule_update.py @@ -0,0 +1,39 @@ +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/frontend/src/views/DLT.vue b/frontend/src/views/DLT.vue index af27f9c..9efb561 100644 --- a/frontend/src/views/DLT.vue +++ b/frontend/src/views/DLT.vue @@ -336,6 +336,7 @@ const handleCurrentChange = (val) => { // 初始化 onMounted(() => { + // 然后获取完整列表 fetchData() })