from typing import List from fastapi import APIRouter, Depends, Query, HTTPException from sqlalchemy.orm import Session # 坚决把下面这三行开头的 sqlalchemy_fastapi_demo. 全删掉! from scheme.teachers import TeacherAdd, TeacherResponse, TeacherUpdate from database import get_db from dao.teachers_dao import TeacherDAO router=APIRouter() # ---------- 创建新教师 ---------- @router.post("/teacher/add",response_model=TeacherResponse) async def add_teacher(teacher:TeacherAdd,db:Session=Depends(get_db)): existing_foreign_key=TeacherDAO.inspect_class_id_unq(db,teacher.class_id) if existing_foreign_key:# 外键校验 existing_teacher_id=TeacherDAO.inspect_teacher_id_unq(db,teacher.teacher_id) if existing_teacher_id:# 主键校验 raise HTTPException(status_code=409, detail="主键教师ID已被占用,包括软删除") # 资源冲突 return TeacherDAO.add_teacher(db,teacher) else: raise HTTPException(status_code=404, detail="班级ID不存在,数据库无数据,或已被软删除") # 关联资源不存在 # ---------- 软删除教师 ---------- @router.delete("/teacher/delete", status_code=204) async def light_delete_teacher(teacher_id:int=Query(...,ge=1,description='输入想要删除的教师ID'), db:Session=Depends(get_db)): """ 删除用户,成功返回 204 No Content """ success = TeacherDAO.delete_light(db, teacher_id) if not success: # 目标删除教师ID不存在(被硬删除或软删除) raise HTTPException(status_code=404, detail="教师ID不存在") # 关联资源不存在 # 返回 None 表示目标教师ID已删除 return None # ---------- 更新教师信息 ---------- @router.put("/teacher/update",response_model=TeacherResponse) async def update_teacher( teacher_data: TeacherUpdate, teacher_id:int=Query(...,ge=1,description='输入教师想要更新的教师ID'), db: Session = Depends(get_db) ): """ 更新用户信息(只更新传入的字段,也就是非None) """ # 检查教师ID是否存在 existing_teacher_id = TeacherDAO.inspect_teacher_id_unq(db,teacher_id) if (not existing_teacher_id) or (existing_teacher_id.is_deleted==1): raise HTTPException(status_code=404, detail="教师ID不存在,已被硬删除或软删除") # 关联资源不存在 # 更新班级ID if teacher_data.class_id is not None: # 校验外键,校验班级ID是否在Class表存在 existing_foreign_key=TeacherDAO.inspect_class_id_unq(db,teacher_data.class_id) if not existing_foreign_key: raise HTTPException(status_code=404, detail="班级ID不存在,已被硬删除或软删除") # 关联资源不存在 updated = TeacherDAO.update(db, teacher_id, teacher_data) return updated updated = TeacherDAO.update(db, teacher_id, teacher_data) return updated # ---------- 查询所有教师(分页) ---------- @router.get("/teacher/total_query",response_model=List[TeacherResponse]) 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) # 依赖注入获得数据库会话 ): """ 获取用户列表,支持分页,从skip+1条开始返回 """ users = TeacherDAO.get_all(db, skip=skip, limit=limit) return users # FastAPI 自动根据 response_model 转换为 JSON # ---------- 根据 ID 查询单个教师 ---------- @router.get("/teacher/single_query", response_model=TeacherResponse) async def get_teacher( teacher_id: int, db: Session = Depends(get_db) ): """ 根据用户 ID 获取详细信息,不显示软删除 """ teacher = TeacherDAO.inspect_teacher_id_unq(db, teacher_id) if (not teacher) or teacher.is_deleted==1: raise HTTPException(status_code=404, detail="教师ID不存在") # 关联资源不存在 return teacher