from fastapi import APIRouter, Depends, HTTPException,Query,Path from sqlalchemy.orm import Session from core.database import get_db from schemas.student import StudentCreate, StudentUpdate from dao import student as student_dao student_router = APIRouter() @student_router.put("",summary='添加学生') def create_student(request:StudentCreate,db:Session = Depends(get_db)): d = request.model_dump() r = student_dao.create_students(d,db) if not r: raise HTTPException(status_code=500,detail='服务器繁忙,请稍后添加!') return {'code':200,'detail':"添加学生成功"} @student_router.post("/{id}", summary="更新学生信息") def update_student( id: int, request: StudentUpdate, db: Session = Depends(get_db), ): # 只取前端真正传来的字段 # 例如只传 age,就只修改 age data = request.model_dump(exclude_unset=True) student = student_dao.update_student(id, data, db) # None 表示学生不存在 if student is None: raise HTTPException(status_code=404, detail="学生不存在") # False 表示操作数据库失败 if student is False: raise HTTPException(status_code=500, detail="修改学生失败") #传入空字典报400 if not data: raise HTTPException( status_code=400, detail="没有传入需要修改的字段", ) return { "code": 200, "detail": "修改学生成功", "data": student, } @student_router.get("", summary="分页查询学生列表") def get_students( # 三个查询条件都可以不传 student_no: str | None = Query(default=None,description="按学号精确查询"), student_name: str | None = Query(default=None,description="按名字模糊查询"), class_id: int | None = Query(default=None,gt=0,description="按班级号精确查询"), # 获取本次请求使用的数据库连接 db: Session = Depends(get_db), page:int = Query(default=1,ge=1,description="页码,从1开始"), page_size:int = Query(default=10,ge=1,le=100,description="每页条数,最多100条"), ): # 调用 DAO 查询数据库 total, students = student_dao.get_students( db=db, student_no=student_no, student_name=student_name, class_id=class_id, page=page, page_size=page_size, ) data = [ { "id": student.id, "student_no": student.student_no, "student_name": student.student_name, "class_id": student.class_id, "consultant_id": student.consultant_id, "native_place": student.native_place, "graduation_school": student.graduation_school, "major": student.major, "enrollment_date": student.enrollment_date, "graduation_date": student.graduation_date, "education": student.education, "age": student.age, "gender": student.gender, } for student in students ] return { "code": 200, "detail": "查询成功", "total": total, "page": page, "page_size": page_size, "data": data, } @student_router.get("/{id}", summary="查询学生详情") def get_student(id: int = Path(gt=0), db: Session = Depends(get_db)): # 根据路径中的 ID 查询学生 student = student_dao.get_student_by_id(id, db) if not student: # 404 表示请求的数据不存在 raise HTTPException(status_code=404, detail="学生不存在") result = { "id": student.id, "student_no": student.student_no, "student_name": student.student_name, "class_id": student.class_id, "consultant_id": student.consultant_id, "native_place": student.native_place, "graduation_school": student.graduation_school, "major": student.major, "enrollment_date": student.enrollment_date, "graduation_date": student.graduation_date, "education": student.education, "age": student.age, "gender": student.gender, } return { "code": 200, "detail": "查询成功", "data": result, } @student_router.delete("/{id}", summary="逻辑删除学生") def delete_student(id: int, db: Session = Depends(get_db)): student = student_dao.delete_student(id, db) # None 表示不存在,或者以前已经删除 if student is None: raise HTTPException(status_code=404, detail="学生不存在或已经删除") if student is False: raise HTTPException(status_code=500, detail="删除学生失败") return { "code": 200, "detail": "删除学生成功", }