# api/teacher_api.py # 教师信息管理模块:接口层只负责 HTTP 出入参,查库/校验/事务交给 dao.teacher_dao from typing import Optional from fastapi import APIRouter, Depends, Query from sqlalchemy.orm import Session from dao import teacher_dao from database import get_db from schemas.teacher_schema import TeacherCreate, TeacherUpdate, TeacherOut router = APIRouter() @router.get("", summary="分页查询教师列表") def list_teachers( page: int = Query(1, ge=1, description="页码"), size: int = Query(10, ge=1, le=100, description="每页数量"), name: Optional[str] = Query(None, description="按姓名模糊查询"), type: Optional[str] = Query(None, description="按职位过滤"), db: Session = Depends(get_db), ): total, items = teacher_dao.list_teachers(db, page=page, size=size, name=name, type=type) return { "total": total, "page": page, "size": size, "items": [TeacherOut.model_validate(x) for x in items], } @router.get("/{tea_id}", summary="查询单个教师详情") def get_teacher(tea_id: str, db: Session = Depends(get_db)): """查询教师详情,附带其担任班主任/主讲老师的班级编号。""" teacher = teacher_dao.assert_teacher_alive(db, tea_id, "教师不存在或已删除") data = TeacherOut.model_validate(teacher).model_dump() data["head_classes"] = [c.id for c in teacher.head_classes if not c.is_deleted] data["lecturer_classes"] = [c.id for c in teacher.lecturer_classes if not c.is_deleted] return data @router.post("", response_model=TeacherOut, status_code=201, summary="新增教师") def create_teacher(payload: TeacherCreate, db: Session = Depends(get_db)): """新增教师(编号与电话唯一,由 DAO 校验)。""" return teacher_dao.create_teacher(db, payload.model_dump()) @router.put("/{tea_id}", response_model=TeacherOut, summary="更新教师信息") def update_teacher(tea_id: str, payload: TeacherUpdate, db: Session = Depends(get_db)): """按传入字段局部更新教师信息,改电话时由 DAO 重新校验唯一。""" return teacher_dao.update_teacher(db, tea_id, payload.model_dump(exclude_unset=True)) @router.delete("/{tea_id}", summary="删除教师(软删除)") def delete_teacher(tea_id: str, db: Session = Depends(get_db)): """软删除教师。""" teacher_dao.soft_delete_teacher(db, tea_id) return {"message": "删除成功", "id": tea_id}