From 7989c8ed4e5be574c36ef59ae136da20a79ad3f6 Mon Sep 17 00:00:00 2001 From: mxr612 Date: Mon, 16 Jun 2025 05:17:49 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=E6=94=AF=E6=8C=81=E4=BB=A5=E4=BF=9D=E5=AD=98=E9=97=AE?= =?UTF-8?q?=E5=8D=B7=E5=93=8D=E5=BA=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增数据库模型和连接配置,使用SQLite存储问卷响应 - 更新结果处理逻辑,将用户响应保存到数据库 - 更新.gitignore以排除数据库文件和缓存目录 --- .gitignore | 4 +++- app.py | 15 ++++++++++++--- database.py | 33 +++++++++++++++++++++++++++++++++ requirements.txt | Bin 166 -> 212 bytes 4 files changed, 48 insertions(+), 4 deletions(-) create mode 100644 database.py diff --git a/.gitignore b/.gitignore index ea53347..cac1531 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ -scales/ \ No newline at end of file +scales/ +psychoscales.db +__pycache__/ \ No newline at end of file diff --git a/app.py b/app.py index 1b67ec2..73034a0 100644 --- a/app.py +++ b/app.py @@ -1,4 +1,4 @@ -from fastapi import FastAPI, Request, HTTPException +from fastapi import FastAPI, Request, HTTPException, Depends from fastapi.responses import HTMLResponse, FileResponse, Response import markdown from fastapi.staticfiles import StaticFiles @@ -8,6 +8,8 @@ import os import uvicorn from datetime import datetime from xml.etree import ElementTree as ET +from sqlalchemy.orm import Session +from database import get_db, RawResponse app = FastAPI() templates = Jinja2Templates(directory="templates") @@ -76,12 +78,19 @@ async def scale(request: Request, scale_id: str): raise HTTPException(status_code=404, detail="问卷未找到") @app.post("/scales/{scale_id}", response_class=HTMLResponse) -async def result(request: Request, scale_id: str): +async def result(request: Request, scale_id: str, db: Session = Depends(get_db)): form_data = await request.form() tags, scales = load_all_scales() scale = scales.get(scale_id) if scale: - # 这里可以添加保存数据到数据库等逻辑 + # Save response to database + db_response = RawResponse( + scale_id=scale_id, + user_agent=request.headers.get("user-agent", "Unknown"), + response=dict(form_data) + ) + db.add(db_response) + db.commit() responses = {} average = {} options = {} diff --git a/database.py b/database.py new file mode 100644 index 0000000..984934a --- /dev/null +++ b/database.py @@ -0,0 +1,33 @@ +from sqlalchemy import create_engine, Column, Integer, String, Float, DateTime, ForeignKey, JSON +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.orm import sessionmaker, relationship +from datetime import datetime, UTC + +SQLALCHEMY_DATABASE_URL = "sqlite:///./psychoscales.db" + +engine = create_engine( + SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False} +) +SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) + +Base = declarative_base() + +class RawResponse(Base): + __tablename__ = "responses_raw" + + id = Column(Integer, primary_key=True, index=True) + scale_id = Column(String, index=True) + user_agent = Column(String) + response = Column(JSON) + created_at = Column(DateTime, default=datetime.now(UTC)) + +# Create tables +Base.metadata.create_all(bind=engine) + +# Dependency +def get_db(): + db = SessionLocal() + try: + yield db + finally: + db.close() \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 187eb52100f8fe39308e21d7572b47e455cfaa49..84fd9a0ee438a8e5ec2be88ee022c87024d138c6 100644 GIT binary patch delta 53 ycmZ3+c!hDoGCf`fE{0-;LWUfML?BLP$Y4li$YrQx0Es6uWHRJKWiuH{fHD9^oC^&A delta 6 Ncmcb@xQubaG5`r=0