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 187eb52..84fd9a0 100644 Binary files a/requirements.txt and b/requirements.txt differ