81 lines
3.9 KiB
Python
81 lines
3.9 KiB
Python
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
|