# api/teachers.py # 老师模块接口:增、查(分页)、改、逻辑删除(沿用原 teacher 模块接口风格) from fastapi import APIRouter, Depends, HTTPException, Query from sqlalchemy.orm import Session from core.deps import get_current_user, require_roles from dao.teachers_dao import TeacherDAO from database import get_db from model.user import User from scheme.teachers import TeacherAdd, TeacherUpdate, TeacherResponse, TeacherListResponse router = APIRouter() # ---------- 创建新教师 ---------- @router.post("/teacher/add", response_model=TeacherResponse, summary="创建教师(工号可自动生成)") async def add_teacher( teacher: TeacherAdd, db: Session = Depends(get_db), current_user: User = Depends(require_roles("admin")), ): # 外键校验:班级必须存在 existing_class = TeacherDAO.inspect_class_id_unq(db, teacher.class_id) if not existing_class: raise HTTPException(status_code=404, detail="班级ID不存在,或已被软删除") # 主键校验(显式传入工号时) if teacher.teacher_id is not None: existing_teacher = TeacherDAO.inspect_teacher_id_unq(db, teacher.teacher_id) if existing_teacher: raise HTTPException(status_code=409, detail="工号已存在(包括软删除记录)") return TeacherDAO.add_teacher(db, teacher) # ---------- 软删除教师 ---------- @router.delete("/teacher/delete", status_code=204, summary="逻辑删除教师") async def light_delete_teacher( teacher_id: int = Query(..., ge=1, description="要删除的教师工号"), db: Session = Depends(get_db), current_user: User = Depends(require_roles("admin")), ): success = TeacherDAO.delete_light(db, teacher_id) if not success: raise HTTPException(status_code=404, detail="教师工号不存在,或已被删除") return None # ---------- 更新教师信息 ---------- @router.put("/teacher/update", response_model=TeacherResponse, summary="更新教师信息") async def update_teacher( teacher_data: TeacherUpdate, teacher_id: int = Query(..., ge=1, description="要更新的教师工号"), db: Session = Depends(get_db), current_user: User = Depends(require_roles("admin")), ): if teacher_data.class_id is not None: existing_class = TeacherDAO.inspect_class_id_unq(db, teacher_data.class_id) if not existing_class: raise HTTPException(status_code=404, detail="班级ID不存在,或已被软删除") updated = TeacherDAO.update(db, teacher_id, teacher_data) if updated is None: raise HTTPException(status_code=404, detail="教师工号不存在,或已被软删除") return TeacherDAO.get_by_id(db, teacher_id) # ---------- 查询所有教师(分页) ---------- @router.get("/teacher/total_query", response_model=TeacherListResponse, summary="查询教师列表(分页,含班级名称)") async def get_teachers( skip: int = Query(0, ge=0, description="跳过的记录数"), limit: int = Query(100, ge=1, le=200, description="返回的最大记录数"), db: Session = Depends(get_db), current_user: User = Depends(get_current_user), ): total, items = TeacherDAO.get_all(db, skip=skip, limit=limit) return TeacherListResponse(total=total, items=items) # ---------- 根据 ID 查询单个教师 ---------- @router.get("/teacher/single_query", response_model=TeacherResponse, summary="根据工号查询教师") async def get_teacher( teacher_id: int = Query(..., ge=1), db: Session = Depends(get_db), current_user: User = Depends(get_current_user), ): teacher = TeacherDAO.get_by_id(db, teacher_id) if teacher is None: raise HTTPException(status_code=404, detail="教师工号不存在,或已被删除") return teacher