Files
stu_teacher/api/classes.py
T

81 lines
3.0 KiB
Python
Raw Normal View History

2026-09-21 23:17:51 +08:00
# api/classes.py
# 班级模块接口:增、查(分页)、改、逻辑删除
from fastapi import APIRouter, Depends, HTTPException, Query
from sqlalchemy.orm import Session
from core.deps import get_current_user, require_roles
from dao.classes_dao import ClassDAO
from database import get_db
from model.user import User
from scheme.classes import ClassAdd, ClassUpdate, ClassResponse, ClassListResponse
router = APIRouter()
# ---------- 创建班级 ----------
@router.post("/add", response_model=ClassResponse, summary="创建班级")
async def add_class(
class_data: ClassAdd,
db: Session = Depends(get_db),
current_user: User = Depends(require_roles("admin")),
):
if class_data.class_id is not None:
existing = ClassDAO.inspect_class_id_unq(db, class_data.class_id)
if existing:
raise HTTPException(status_code=409, detail="班级ID已存在(包括软删除记录)")
return ClassDAO.add_class(db, class_data)
# ---------- 查询班级列表(分页) ----------
@router.get("/total_query", response_model=ClassListResponse, summary="查询班级列表(分页)")
async def get_classes(
skip: int = Query(0, ge=0),
limit: int = Query(100, ge=1, le=200),
db: Session = Depends(get_db),
current_user: User = Depends(get_current_user),
):
total, items = ClassDAO.get_all(db, skip=skip, limit=limit)
return ClassListResponse(total=total, items=items)
# ---------- 根据 ID 查询单个班级 ----------
@router.get("/single_query", response_model=ClassResponse, summary="根据ID查询班级")
async def get_class(
class_id: int = Query(..., ge=1),
db: Session = Depends(get_db),
current_user: User = Depends(get_current_user),
):
db_class = ClassDAO.get_active(db, class_id)
if db_class is None:
raise HTTPException(status_code=404, detail="班级不存在,或已被软删除")
return db_class
# ---------- 更新班级 ----------
@router.put("/update", response_model=ClassResponse, summary="更新班级信息")
async def update_class(
class_data: ClassUpdate,
class_id: int = Query(..., ge=1, description="要更新的班级ID"),
db: Session = Depends(get_db),
current_user: User = Depends(require_roles("admin")),
):
updated = ClassDAO.update(db, class_id, class_data)
if updated is None:
raise HTTPException(status_code=404, detail="班级不存在,或已被软删除")
return updated
# ---------- 逻辑删除班级 ----------
@router.delete("/delete", status_code=204, summary="逻辑删除班级(班级下有学生时拒绝)")
async def delete_class(
class_id: int = Query(..., ge=1, description="要删除的班级ID"),
db: Session = Depends(get_db),
current_user: User = Depends(require_roles("admin")),
):
result = ClassDAO.delete_light(db, class_id)
if result is False:
raise HTTPException(status_code=404, detail="班级不存在,或已被软删除")
if result == -1:
raise HTTPException(status_code=409, detail="班级下仍有学生,不能删除")
return None