from fastapi import APIRouter, Depends, HTTPException from sqlalchemy.orm import Session from typing import List, Optional from database import get_db from models import Student, Class, Teacher from schemas import StudentCreate, StudentUpdate, StudentBase router = APIRouter(prefix="/api/students", tags=["students"]) @router.get("/", response_model=List[StudentBase]) def list_students( class_id: Optional[int] = None, name: Optional[str] = None, db: Session = Depends(get_db), skip: int = 0, limit: int = 100, ): query = db.query(Student).filter(Student.is_deleted == False) if class_id is not None: query = query.filter(Student.class_id == class_id) if name: query = query.filter(Student.name.contains(name)) students = query.offset(skip).limit(limit).all() return students @router.get("/{student_id}", response_model=StudentBase) def get_student(student_id: int, db: Session = Depends(get_db)): student = db.query(Student).filter(Student.id == student_id, Student.is_deleted == False).first() if not student: raise HTTPException(status_code=404, detail="学生不存在") return student @router.post("/", response_model=StudentBase) def create_student(data: StudentCreate, db: Session = Depends(get_db)): existing = db.query(Student).filter(Student.num == data.num, Student.is_deleted == False).first() if existing: raise HTTPException(status_code=400, detail="学生编号已存在") if not db.query(Class).filter(Class.id == data.class_id, Class.is_deleted == False).first(): raise HTTPException(status_code=400, detail="班级不存在") if data.advisor_id: if not db.query(Teacher).filter(Teacher.id == data.advisor_id, Teacher.is_deleted == False).first(): raise HTTPException(status_code=400, detail="顾问教师不存在") student = Student(**data.model_dump()) db.add(student) db.commit() db.refresh(student) return student @router.put("/{student_id}", response_model=StudentBase) def update_student(student_id: int, data: StudentUpdate, db: Session = Depends(get_db)): student = db.query(Student).filter(Student.id == student_id, Student.is_deleted == False).first() if not student: raise HTTPException(status_code=404, detail="学生不存在") if data.class_id is not None: if not db.query(Class).filter(Class.id == data.class_id, Class.is_deleted == False).first(): raise HTTPException(status_code=400, detail="班级不存在") if data.advisor_id is not None: if not db.query(Teacher).filter(Teacher.id == data.advisor_id, Teacher.is_deleted == False).first(): raise HTTPException(status_code=400, detail="顾问教师不存在") for key, value in data.model_dump(exclude_unset=True).items(): setattr(student, key, value) db.commit() db.refresh(student) return student @router.delete("/{student_id}") def delete_student(student_id: int, db: Session = Depends(get_db)): student = db.query(Student).filter(Student.id == student_id, Student.is_deleted == False).first() if not student: raise HTTPException(status_code=404, detail="学生不存在") student.is_deleted = True db.commit() return {"message": "删除成功"}