59 lines
2.4 KiB
Python
59 lines
2.4 KiB
Python
# 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} |