Files
student-management-system/api/cls_mgmt_api.py
T
2026-09-18 16:53:21 +08:00

66 lines
2.6 KiB
Python

# api/cls_mgmt_api.py
# 班级管理模块:接口层只负责 HTTP 出入参,查库/校验/事务交给 dao.cls_mgmt_dao
from typing import Optional
from fastapi import APIRouter, Depends, Query
from sqlalchemy.orm import Session
from dao import cls_mgmt_dao
from database import get_db
from schemas.cls_mgmt_schema import ClsMgmtCreate, ClsMgmtUpdate, ClsMgmtOut
router = APIRouter()
def _to_detail(cls) -> dict:
"""把班级实体组装成详情响应:基础字段 + 班主任/主讲老师姓名 + 在班人数。"""
data = ClsMgmtOut.model_validate(cls).model_dump()
data["head_teacher_name"] = cls.head_teacher.name if cls.head_teacher else None
data["lecturer_name"] = cls.lecturer.name if cls.lecturer else None
data["student_count"] = sum(1 for s in cls.stu if not s.is_deleted)
return data
@router.get("", summary="分页查询班级列表")
def list_classes(
page: int = Query(1, ge=1, description="页码"),
size: int = Query(10, ge=1, le=100, description="每页数量"),
head_tea_id: Optional[str] = Query(None, description="按班主任id过滤"),
lecturer_id: Optional[str] = Query(None, description="按主讲老师id过滤"),
db: Session = Depends(get_db),
):
total, items = cls_mgmt_dao.list_classes(
db, page=page, size=size, head_tea_id=head_tea_id, lecturer_id=lecturer_id
)
return {
"total": total,
"page": page,
"size": size,
"items": [ClsMgmtOut.model_validate(x) for x in items],
}
@router.get("/{cls_id}", summary="查询单个班级详情")
def get_class(cls_id: str, db: Session = Depends(get_db)):
"""查询班级详情,附带班主任/主讲老师姓名与在班学生数。"""
return _to_detail(cls_mgmt_dao.assert_cls_alive(db, cls_id, "班级不存在或已删除"))
@router.post("", response_model=ClsMgmtOut, status_code=201, summary="新增班级")
def create_class(payload: ClsMgmtCreate, db: Session = Depends(get_db)):
"""新增班级(编号唯一、两位教师必须存在,由 DAO 校验)。"""
return cls_mgmt_dao.create_class(db, payload.model_dump())
@router.put("/{cls_id}", response_model=ClsMgmtOut, summary="更新班级信息")
def update_class(cls_id: str, payload: ClsMgmtUpdate, db: Session = Depends(get_db)):
"""按传入字段局部更新班级信息。"""
return cls_mgmt_dao.update_class(db, cls_id, payload.model_dump(exclude_unset=True))
@router.delete("/{cls_id}", summary="删除班级(软删除)")
def delete_class(cls_id: str, db: Session = Depends(get_db)):
"""软删除班级。"""
cls_mgmt_dao.soft_delete_class(db, cls_id)
return {"message": "删除成功", "id": cls_id}