From de2ae811042796e77aa1bf2c09f6903e55d18656 Mon Sep 17 00:00:00 2001 From: wangshu <248653095@qq.com> Date: Sat, 27 Dec 2025 08:16:51 +0000 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=96=87=E4=BB=B6=E8=87=B3?= =?UTF-8?q?=20web/ws/backend/app/api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/ws/backend/app/api/db.py | 24 ++++++++++++++ web/ws/backend/app/api/login.py | 31 ++++++++++++++++++ web/ws/backend/app/api/submit_record.py | 43 +++++++++++++++++++++++++ 3 files changed, 98 insertions(+) create mode 100644 web/ws/backend/app/api/db.py create mode 100644 web/ws/backend/app/api/login.py create mode 100644 web/ws/backend/app/api/submit_record.py diff --git a/web/ws/backend/app/api/db.py b/web/ws/backend/app/api/db.py new file mode 100644 index 0000000..b867e61 --- /dev/null +++ b/web/ws/backend/app/api/db.py @@ -0,0 +1,24 @@ +from sqlalchemy import create_engine, MetaData +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.orm import sessionmaker +from app.settings import DATABASE_URL + +# 创建SQLAlchemy引擎 +engine = create_engine(DATABASE_URL) + +# 创建元数据对象 +metadata = MetaData() + +# 创建会话工厂 +SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) + +# 创建基类 +Base = declarative_base() + +# 依赖项:获取数据库会话 +def get_db(): + db = SessionLocal() + try: + yield db + finally: + db.close() \ No newline at end of file diff --git a/web/ws/backend/app/api/login.py b/web/ws/backend/app/api/login.py new file mode 100644 index 0000000..3b682c4 --- /dev/null +++ b/web/ws/backend/app/api/login.py @@ -0,0 +1,31 @@ +from fastapi import APIRouter, Depends, HTTPException +from sqlalchemy.orm import Session +from sqlalchemy import text +from app.api.db import get_db +from pydantic import BaseModel +from app.settings import WHITELIST_TABLE, WHITELIST_COLUMN + +router = APIRouter() + +# 请求模型 +class EmailRequest(BaseModel): + email: str + +# 检查邮箱是否在白名单中 +@router.post("/check-email") +async def check_email_in_whitelist(request: EmailRequest, db: Session = Depends(get_db)): + try: + # 构建查询语句 + query = text(f"SELECT COUNT(*) FROM {WHITELIST_TABLE} WHERE {WHITELIST_COLUMN} = :email") + + # 执行查询 + result = db.execute(query, {"email": request.email}) + count = result.scalar() + + if count > 0: + return {"status": "success", "message": "继续操作"} + else: + raise HTTPException(status_code=403, detail="邮箱不在白名单中,请联系管理员") + + except Exception as e: + raise HTTPException(status_code=500, detail=f"服务器错误:{str(e)}") \ No newline at end of file diff --git a/web/ws/backend/app/api/submit_record.py b/web/ws/backend/app/api/submit_record.py new file mode 100644 index 0000000..cc20149 --- /dev/null +++ b/web/ws/backend/app/api/submit_record.py @@ -0,0 +1,43 @@ +from fastapi import APIRouter, Depends, HTTPException +from sqlalchemy.orm import Session +from sqlalchemy import text +from app.api.db import get_db +from pydantic import BaseModel +from app.settings import SUBMIT_RECORD_TABLE +from datetime import datetime +import pytz + +router = APIRouter() + +class SubmitRecordRequest(BaseModel): + user_email: str + operation_type: str + storage_path: str + +@router.post("/submit-record") +async def submit_record(request: SubmitRecordRequest, db: Session = Depends(get_db)): + try: + if request.operation_type not in ['upload', 'delete']: + raise HTTPException(status_code=400, detail="操作类型必须是 'upload' 或 'delete'") + + china_tz = pytz.timezone('Asia/Shanghai') + operation_time = datetime.now(china_tz) + + query = text(f""" + INSERT INTO {SUBMIT_RECORD_TABLE} (user_email, operation_time, operation_type, storage_path) + VALUES (:user_email, :operation_time, :operation_type, :storage_path) + """) + + db.execute(query, { + "user_email": request.user_email, + "operation_time": operation_time, + "operation_type": request.operation_type, + "storage_path": request.storage_path + }) + db.commit() + + return {"status": "success", "message": "操作记录已保存"} + + except Exception as e: + db.rollback() + raise HTTPException(status_code=500, detail=f"服务器错误:{str(e)}") \ No newline at end of file -- 2.49.1