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