Files
DoubaoTeam/api/teacher.py
T
wolin_zhangyi 883b287e66 1.teacher dao
2.class_teacher
3.teacher  api
4.teacher  models
5.teacher schemas
2026-09-21 18:46:42 +08:00

130 lines
6.1 KiB
Python

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": "解除班级带班关系成功"}