73 lines
3.7 KiB
Python
73 lines
3.7 KiB
Python
# # api/c_lass.py
|
||||
|
|
# # 本文件定义班级的所有 API 路由(Controller 层)
|
|||
|
|
|
|||
|
|
from fastapi import APIRouter, Depends, HTTPException, Query
|
|||
|
|
# APIRouter=创建路由,Depends=依赖注入,HTTPException=错误响应,Query=查询参数校验
|
|||
|
|
from sqlalchemy.orm import Session # 会话类型
|
|||
|
|
from database import get_db # 导入会话生成器
|
|||
|
|
from dao.c_lass import create_c_lass, get_c_lass, get_all_c_lass, update_c_lass, delete_c_lass
|
|||
|
|
# 把DAO层的5个函数都导入进来,接口里直接调用
|
|||
|
|
from scheme.c_lass import ClassCreate, ClassUpdate, ClassResponse
|
|||
|
|
# 路由对象,具体前缀(/c_lass)在 main.py 统一注册
|
|||
|
|
router = APIRouter()# 创建本模块的路由对象,main.py会把它注册进应用
|
|||
|
|
|
|||
|
|
|
|||
|
|
# ---------- 1. 新增班级 POST ----------
|
|||
|
|
# 完整地址:POST /c_lass/add
|
|||
|
|
@router.post("/add", response_model=ClassResponse, summary="新增班级")
|
|||
|
|
# 装饰器:注册一个POST接口,路径/add;response_model=返回时按ClassResponse格式化
|
|||
|
|
def add_c_lass(class_data: ClassCreate, db: Session = Depends(get_db)):
|
|||
|
|
# class_data: ClassCreate = FastAPI自动校验请求体并转成对象;db = FastAPI自动注入会话
|
|||
|
|
# 先查重:如果这个班级ID已经存在(包括逻辑删除的),进入if
|
|||
|
|
if get_c_lass(db, class_data.class_id):
|
|||
|
|
raise HTTPException(status_code=400, detail="该班级ID已存在,不能重复添加")
|
|||
|
|
return create_c_lass(db, class_data)# 通过查重,调DAO层真正插入,返回结果
|
|||
|
|
|
|||
|
|
|
|||
|
|
# ---------- 2. 根据id查询单个班级 GET ----------
|
|||
|
|
# 完整地址:GET /c_lass/{class_id}
|
|||
|
|
@router.get("/{class_id}", response_model=ClassResponse, summary="根据id查询班级")
|
|||
|
|
# GET接口,路径里带班级编号,如 GET /c_lass/101
|
|||
|
|
def get_class_by_id(class_id: int, db: Session = Depends(get_db)): # 调DAO查询
|
|||
|
|
db_class = get_c_lass(db, class_id)
|
|||
|
|
if not db_class:
|
|||
|
|
raise HTTPException(status_code=404, detail="该班级不存在") # 查不到就返回404,带提示信息
|
|||
|
|
return db_class
|
|||
|
|
|
|||
|
|
|
|||
|
|
# ---------- 3. 分页查询所有班级 GET ----------
|
|||
|
|
# 完整地址:GET /c_lass/?skip=0&limit=10
|
|||
|
|
@router.get("/", response_model=list[ClassResponse], summary="分页查询班级列表")
|
|||
|
|
# GET根路径,如 GET /c_lass/?skip=0&limit=10;response_model是列表
|
|||
|
|
def get_class_list(
|
|||
|
|
skip: int = Query(0, ge=0, description="跳过的记录数"), # 查询参数skip,默认0,必须≥0
|
|||
|
|
limit: int = Query(10, ge=1, le=200, description="每页最大记录数"), # 查询参数limit,默认10,范围1~200
|
|||
|
|
db: Session = Depends(get_db),
|
|||
|
|
):
|
|||
|
|
return get_all_c_lass(db, skip, limit) # 调DAO分页查询
|
|||
|
|
|
|||
|
|
|
|||
|
|
# ---------- 4. 修改班级 PUT ----------
|
|||
|
|
# 完整地址:PUT /c_lass/{class_id}
|
|||
|
|
@router.put("/{class_id}/", response_model=ClassResponse, summary="修改班级信息")
|
|||
|
|
def update_class(class_id: int, update_data: ClassUpdate, db: Session = Depends(get_db)):
|
|||
|
|
# def update_class(class_id: int, start_time: date, db: Session = Depends(get_db)):
|
|||
|
|
|
|||
|
|
if not get_c_lass(db, class_id): # 先确认要改的班级存在(存在且没删)
|
|||
|
|
raise HTTPException(status_code=404, detail="要修改的班级不存在")
|
|||
|
|
return update_c_lass(db, class_id, update_data) # 调DAO执行局部更新
|
|||
|
|
|
|||
|
|
|
|||
|
|
# ---------- 5. 删除班级 DELETE ----------
|
|||
|
|
# 完整地址:DELETE /c_lass/{class_id}
|
|||
|
|
@router.delete("/{class_id}", summary="删除班级")
|
|||
|
|
def delete_class(class_id: int, db: Session = Depends(get_db)):
|
|||
|
|
if not delete_c_lass(db, class_id):
|
|||
|
|
raise HTTPException(status_code=404, detail="该班级不存在")
|
|||
|
|
# 删除失败(查不到)返回404
|
|||
|
|
return {"message": "删除成功"}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
#API 层只做三件事—— 接请求、校验 / 查重、调 DAO,自己不写 SQL
|