feat: 添加数据库支持以保存问卷响应

- 新增数据库模型和连接配置,使用SQLite存储问卷响应
- 更新结果处理逻辑,将用户响应保存到数据库
- 更新.gitignore以排除数据库文件和缓存目录
This commit is contained in:
Miu Li 2025-06-16 05:17:49 +08:00
parent 8117d7e669
commit 7989c8ed4e
4 changed files with 48 additions and 4 deletions

4
.gitignore vendored
View File

@ -1 +1,3 @@
scales/ scales/
psychoscales.db
__pycache__/

15
app.py
View File

@ -1,4 +1,4 @@
from fastapi import FastAPI, Request, HTTPException from fastapi import FastAPI, Request, HTTPException, Depends
from fastapi.responses import HTMLResponse, FileResponse, Response from fastapi.responses import HTMLResponse, FileResponse, Response
import markdown import markdown
from fastapi.staticfiles import StaticFiles from fastapi.staticfiles import StaticFiles
@ -8,6 +8,8 @@ import os
import uvicorn import uvicorn
from datetime import datetime from datetime import datetime
from xml.etree import ElementTree as ET from xml.etree import ElementTree as ET
from sqlalchemy.orm import Session
from database import get_db, RawResponse
app = FastAPI() app = FastAPI()
templates = Jinja2Templates(directory="templates") templates = Jinja2Templates(directory="templates")
@ -76,12 +78,19 @@ async def scale(request: Request, scale_id: str):
raise HTTPException(status_code=404, detail="问卷未找到") raise HTTPException(status_code=404, detail="问卷未找到")
@app.post("/scales/{scale_id}", response_class=HTMLResponse) @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() form_data = await request.form()
tags, scales = load_all_scales() tags, scales = load_all_scales()
scale = scales.get(scale_id) scale = scales.get(scale_id)
if scale: 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 = {} responses = {}
average = {} average = {}
options = {} options = {}

33
database.py Normal file
View File

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

Binary file not shown.