Files
2026-09-21 17:39:16 +08:00

113 lines
4.2 KiB
Python

from fastapi import APIRouter, Depends, HTTPException
from pymysql import IntegrityError
from sqlalchemy.orm import Session
from typing import List
from model.classes_model import Classes
from dao.student_dao import update_student
from database import get_db
from model.student_info import Student
from schemas.student_info import StudentCreate, StudentUpdate, StudentResponse,student_date
router = APIRouter(prefix="/students", tags=["学生基本信息"])
# 1. 查询
@router.get("", response_model=List[StudentResponse], summary="查询学生")
def list_students(
id: str = None,
name: str = None,
class_name: str = None,
db: Session = Depends(get_db)
):
query = db.query(Student).filter(Student.is_deleted == False)
if id:
query = query.filter(Student.id == id)
if name:
query = query.filter(Student.name.like(f"%{name}%"))
if class_name:
query = query.filter(Student.class_name == class_name)
return query.all()
# 2. 创建
@router.post("", response_model=StudentResponse, summary="创建新学生")
def create_student(student: StudentCreate, db: Session = Depends(get_db)):
# 调用校验函数 如果入学日期存在,就把它变成字符串;如果不存在,就赋值为空
enroll_str = student.enrollment_date.strftime("%Y-%m-%d") if student.enrollment_date else None
grad_str = student.graduation_date.strftime("%Y-%m-%d") if student.graduation_date else None
date_check_result = student_date(enroll_str, grad_str)
#如果不存在,直接抛出异常中断请求
if date_check_result != "时间校验通过":
raise HTTPException(status_code=400, detail=date_check_result)
# 检查学号是否已存在
exist = db.query(Student).filter(Student.id == student.id).first()
if exist:
raise HTTPException(status_code=400, detail=f"学号 {student.id} 已存在")
# 不存在的班级导致外键约束报错
class_exists = db.query(Classes).filter(
Classes.class_name == student.class_name,
).first()
if not class_exists:
raise HTTPException(status_code=400,detail=f"班级 '{student.class_name}' 不存在,请检查输入是否正确!")
# 3. 构建数据库模型对象 一个个赋值
db_student = Student(
id=student.id,
name=student.name,
gender=student.gender,
class_name=student.class_name,
age=student.age,
hometown=student.hometown,
graduate_school=student.graduate_school,
major=student.major,
education=student.education,
enrollment_date=student.enrollment_date,
graduation_date=student.graduation_date,
status=student.status,
is_deleted=False
)
db.add(db_student)
db.commit()
db.refresh(db_student)
return db_student #返回响应
# 3. 详情
@router.get("/{id}", response_model=StudentResponse, summary="获取特定学生信息")
def get_student(id: str, db: Session = Depends(get_db)):
student = db.query(Student).filter(
Student.id == id,
Student.is_deleted == False
).first()
if student is None:
raise HTTPException(status_code=404, detail="学生不存在或已删除")
return student
# 4. 更新
@router.put("/{id}", response_model=StudentResponse, summary="更新学生信息")
def api_update_student(id: str, payload: StudentUpdate, db: Session = Depends(get_db)):
try:
student = update_student(db, id, payload)
if student is None:
raise HTTPException(status_code=404, detail="学生不存在或已删除")
return student
except IntegrityError:
db.rollback()
raise HTTPException(status_code=400, detail="更新失败:指定的班级不存在,请先创建对应班级!")
# 5. 逻辑删除
@router.delete("/{id}", summary="逻辑删除学生")
def delete_student(id: str, db: Session = Depends(get_db)):
student = db.query(Student).filter(
Student.id == id,
Student.is_deleted == False
).first()
if student is None:
raise HTTPException(status_code=404, detail="学生不存在或已删除")
student.is_deleted = True
db.commit()
return {"message": f"学生 {id} 已逻辑删除,数据仍保留在库中"}