Files
DoubaoTeam/api/student.py
T

147 lines
4.8 KiB
Python

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, Gender
from dao import student as student_dao
student_router = APIRouter()
@student_router.post("",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.put("/{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(
# 三个查询条件都可以不传
gender:Gender = Query(default=None),
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,
gender = gender
)
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": "删除学生成功",
}