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} 已逻辑删除,数据仍保留在库中"}