from typing import List from fastapi import APIRouter, Depends, HTTPException from sqlalchemy.orm import Session from core import database from core.database import get_db from schemas.teacher import TeacherOut, TeacherCreate, TeacherUpdate, ClassTeachersCreate, ClassTeacherOut # 导入dao层所有函数 from models.teacher import Teacher from models.class_teacher import ClassTeachers from dao.teacher import ( get_teacher_list, get_teacher_by_id, create_teacher, update_teacher, delete_teacher, get_class_teacher_by_class_id, create_class_teacher, update_class_teacher_full, delete_class_teacher ) router = APIRouter(prefix="/teacher", tags=["老师管理模块"]) #============================老师表=============================== @router.get("/list", response_model=List[TeacherOut]) def api_get_teacher_list(db: Session = Depends(get_db)): """ GET 查询全部有效老师列表 :param db: 数据库会话,Depends自动注入 :return: List[TeacherOut] 老师列表,使用TeacherOut做响应格式化 """ return get_teacher_list(db) @router.get("/{teacher_id}", response_model=TeacherOut) def api_get_teacher_by_id(teacher_id: int,db: Session = Depends(get_db)): """ 根据老师主键ID查询单个有效老师 :param teacher_id: int 老师表主键ID :param db: Session 数据库会话对象,依赖注入自动获取 :return: TeacherOut 老师详情信息 """ return get_teacher_by_id(db,teacher_id) @router.post("", response_model=TeacherOut, summary="新增老师") def api_create_teacher(obj: TeacherCreate, db: Session = Depends(get_db)): """ 新增老师记录,自动校验姓名、编号唯一性,并自动生成老师业务编号 :param obj: TeacherCreate Pydantic模型,前端提交新增老师表单数据 :param db: Session 数据库会话对象,依赖注入自动获取 :return: TeacherOut 新增成功后的老师完整信息 """ return create_teacher(db, obj) @router.put("/{teacher_id}", response_model=TeacherOut, summary="修改老师信息(局部更新)") def api_update_teacher(teacher_id: int, obj: TeacherUpdate, db: Session = Depends(get_db)): """ 修改老师信息,支持局部更新,仅更新前端传入的字段 :param teacher_id: int 需要修改的老师主键ID :param obj: TeacherUpdate Pydantic模型,前端提交待修改字段 :param db: Session 数据库会话对象,依赖注入自动获取 :return: TeacherOut 更新后的老师完整信息 """ db_teacher = get_teacher_by_id(db, teacher_id) if not db_teacher: raise HTTPException(status_code=404, detail="老师不存在或已删除!") result = update_teacher(db, teacher_id, obj) return result @router.delete("/{teacher_id}", summary="逻辑删除老师") def api_delete_teacher(teacher_id: int, db: Session = Depends(get_db)): """ 逻辑删除老师,存在有效班级带班关系时禁止删除 :param teacher_id: int 需要删除的老师主键ID :param db: Session 数据库会话对象,依赖注入自动获取 :return: dict 操作成功提示 """ result = delete_teacher(db, teacher_id) if not result: raise HTTPException(status_code=404, detail="老师不存在或已删除!") return {"msg": "老师逻辑删除成功"} # ===================== 班级老师关联路由组 ===================== class_teacher_router = APIRouter(prefix="/class-teacher", tags=["班级老师分配管理模块"]) @class_teacher_router.get("/class/{class_id}", response_model=List[ClassTeacherOut], summary="根据班级ID查询该班级所有带班老师") def api_get_class_teacher_by_class_id(class_id: int, db: Session = Depends(get_db)): """ 根据班级主键ID,查询该班级全部有效的班级-老师绑定记录 :param class_id: int 班级表主键ID :param db: Session 数据库会话对象,依赖注入自动获取 :return: List[ClassTeachersOut] 班级老师关联记录列表 """ return get_class_teacher_by_class_id(db, class_id) @class_teacher_router.post("", response_model=ClassTeacherOut, summary="分配老师到班级,新增班级老师关联记录") def api_create_class_teacher(obj: ClassTeachersCreate, db: Session = Depends(get_db)): """ 新增班级与老师的绑定关系,做重复性校验与老师有效性校验 :param obj: ClassTeachersCreate Pydantic模型,前端提交class_id、teacher_id、role :param db: Session 数据库会话对象,依赖注入自动获取 :return: ClassTeachersOut 新增成功后的班级老师关联记录 """ return create_class_teacher(db, obj) @class_teacher_router.put("/{rel_id}", response_model=ClassTeacherOut, summary="更新班级老师绑定关系") def api_update_class_teacher_full(rel_id: int, obj: ClassTeachersCreate, db: Session = Depends(get_db)): """ 修改班级老师中间表记录,支持修改class_id、teacher_id、role;自动校验老师有效性、三元组合唯一性 :param rel_id: int class_teachers中间表主键ID(待修改的关联记录id) :param obj: ClassTeachersCreate Pydantic模型,前端提交新的class_id、teacher_id、role :param db: Session 数据库会话对象,依赖注入自动获取 :return: ClassTeachersOut 更新后的班级老师关联记录 """ result = update_class_teacher_full(db, rel_id, obj) if not result: raise HTTPException(status_code=404, detail="班级老师关联记录不存在!") return result @class_teacher_router.delete("/{rel_id}", summary="逻辑删除班级老师带班关联") def api_delete_class_teacher(rel_id: int, db: Session = Depends(get_db)): """ 逻辑删除班级老师绑定关系,修改is_deleted标记为1,非物理删除 :param rel_id: int class_teachers中间表主键ID :param db: Session 数据库会话对象,依赖注入自动获取 :return: dict 操作成功提示 """ result = delete_class_teacher(db, rel_id) if not result: raise HTTPException(status_code=404, detail="班级老师关联记录不存在!") return {"msg": "解除班级带班关系成功"}