test二轮完成的版本,并入了浩钦的班级模块
This commit is contained in:
@@ -0,0 +1,49 @@
|
||||
from fastapi import APIRouter, Depends
|
||||
from sqlalchemy.orm import Session
|
||||
from typing import List
|
||||
from database import get_db
|
||||
from scheme.wl_class_scheme import ClassCreate,ClassUpdate,ClassOut
|
||||
from dao import wl_class_dao
|
||||
from fastapi import HTTPException
|
||||
|
||||
# 创建班级模块的路由,统一前缀 /classes
|
||||
router = APIRouter(prefix="/classes", tags=["班级管理"])
|
||||
|
||||
# 1. 新增班级
|
||||
@router.post("/", response_model=ClassOut)
|
||||
def create_class(class_data: ClassCreate, db: Session = Depends(get_db)):
|
||||
return wl_class_dao.create_class(db, class_data.model_dump())
|
||||
|
||||
#为了合并先注释的部分
|
||||
# @router.post("/", response_model=ClassOut)
|
||||
# def create_class(class_data: ClassCreate, db: Session = Depends(get_db)):
|
||||
# 把 pydantic 对象转成字典,再传给 dao
|
||||
# if not db_class:
|
||||
# raise HTTPException(status_code=404, detail="班级不存在")
|
||||
|
||||
# 2. 获取班级列表
|
||||
@router.get("/", response_model=List[ClassOut])
|
||||
def read_classes(skip: int = 0, limit: int = 100, db: Session = Depends(get_db)):
|
||||
return wl_class_dao.get_classes(db, skip, limit)
|
||||
|
||||
# 3. 获取单个班级详情
|
||||
@router.get("/{class_id}", response_model=ClassOut)
|
||||
def read_class(class_id: int, db: Session = Depends(get_db)):
|
||||
db_class = wl_class_dao.get_class_by_id(db, class_id)
|
||||
if not db_class:
|
||||
raise HTTPException(status_code=404, detail="班级不存在")
|
||||
return db_class
|
||||
|
||||
# 4. 修改班级
|
||||
@router.put("/{class_id}", response_model=ClassOut)
|
||||
def update_class(class_id: int, class_data: ClassUpdate, db: Session = Depends(get_db)):
|
||||
db_class = wl_class_dao.update_class(db, class_id, class_data.model_dump(exclude_unset=True))
|
||||
if not db_class:
|
||||
raise HTTPException(status_code=404, detail="班级不存在")
|
||||
return db_class
|
||||
|
||||
# 5. 删除班级(逻辑删除)
|
||||
@router.delete("/{class_id}")
|
||||
def delete_class(class_id: int, db: Session = Depends(get_db)):
|
||||
# 直接把 dao 的结果返回给前端,前端根据 code 判断是否成功
|
||||
return wl_class_dao.delete_class(db, class_id)
|
||||
@@ -0,0 +1,94 @@
|
||||
from sqlalchemy.orm import Session
|
||||
from model.wl_class_model import Class_
|
||||
from model.wl_student_model import Student
|
||||
from fastapi import HTTPException
|
||||
|
||||
# 老师模块加入后解除注释
|
||||
# from model.teacher import WlTeacher
|
||||
|
||||
|
||||
# 1. 新增班级
|
||||
def create_class(db: Session, class_data: dict):
|
||||
new_class = Class_(**class_data)
|
||||
db.add(new_class)
|
||||
db.commit()
|
||||
db.refresh(new_class)
|
||||
return new_class
|
||||
|
||||
|
||||
# 2. 查询班级列表(你的亮点:查出了班主任和授课老师)
|
||||
def get_classes(db: Session, skip: int = 0, limit: int = 100):
|
||||
# 先查出所有没被删除的班级
|
||||
class_list = db.query(Class_).filter(Class_.is_deleted == 0).offset(skip).limit(limit).all()
|
||||
#下面的部分等导入老师模块后解除注释
|
||||
# # 循环每个班级,去老师表里找对应的老师
|
||||
# for c in class_list:
|
||||
# # 找班主任(role是"班主任"的第一个老师)
|
||||
# head_teacher = db.query(WlTeacher).filter(
|
||||
# WlTeacher.class_id == c.class_id,
|
||||
# WlTeacher.role == "班主任"
|
||||
# ).first()
|
||||
#
|
||||
# # 找授课老师(可能有多个,用逗号拼起来)
|
||||
# course_teachers = db.query(WlTeacher).filter(
|
||||
# WlTeacher.class_id == c.class_id,
|
||||
# WlTeacher.role == "任课"
|
||||
# ).all()
|
||||
#
|
||||
# # 把查到的名字塞给班级对象,方便传给前端
|
||||
# c.head_teacher_name = head_teacher.t_name if head_teacher else "暂无"
|
||||
# # 下面这两行是初学者常用的拼接字符串写法
|
||||
# if course_teachers:
|
||||
# names = []
|
||||
# for t in course_teachers:
|
||||
# names.append(t.t_name)
|
||||
# c.course_teacher_names = ",".join(names)
|
||||
# else:
|
||||
# c.course_teacher_names = "暂无"
|
||||
|
||||
return class_list
|
||||
|
||||
|
||||
# 3. 根据ID查班级
|
||||
def get_class_by_id(db: Session, class_id: int):
|
||||
return db.query(Class_).filter(Class_.class_id == class_id, Class_.is_deleted == 0).first()
|
||||
|
||||
|
||||
# 4. 修改班级信息
|
||||
def update_class(db: Session, class_id: int, class_data: dict):
|
||||
db_class = get_class_by_id(db, class_id)
|
||||
if not db_class:
|
||||
return None
|
||||
|
||||
# 前端传了什么,就改什么(防止把没传的字段改成空值)
|
||||
for key, value in class_data.items():
|
||||
setattr(db_class, key, value)
|
||||
|
||||
db.commit()
|
||||
db.refresh(db_class)
|
||||
return db_class
|
||||
|
||||
|
||||
# 5. 逻辑删除班级(你的亮点:安全检查)
|
||||
def delete_class(db: Session, class_id: int):
|
||||
db_class = get_class_by_id(db, class_id)
|
||||
if not db_class:
|
||||
return {"code": 404, "msg": "班级不存在"}
|
||||
|
||||
# 检查1:班里还有学生吗?(只要有1个,就不给删)
|
||||
student = db.query(Student).filter(
|
||||
Student.class_id == class_id,
|
||||
Student.is_deleted == 0
|
||||
).first()
|
||||
if student:
|
||||
raise HTTPException(status_code=400, detail="该班级还有学生,不能删除!")
|
||||
#导入老师模块后解除注释
|
||||
# 检查2:班里还有老师吗?
|
||||
# teacher = db.query(WlTeacher).filter(WlTeacher.class_id == class_id).first()
|
||||
# if teacher:
|
||||
# return {"code": 400, "msg": "该班级还有老师,不能删除!"}
|
||||
|
||||
# 检查通过,开始逻辑删除(贴个已删除标签)
|
||||
db_class.is_deleted = 1
|
||||
db.commit()
|
||||
return {"code": 200, "msg": "班级删除成功"}
|
||||
@@ -0,0 +1,22 @@
|
||||
from pydantic import BaseModel, Field
|
||||
from typing import Optional
|
||||
from datetime import datetime
|
||||
|
||||
# 新增班级时,前端传过来的数据
|
||||
class ClassCreate(BaseModel):
|
||||
start_time: datetime = Field(..., description="开课时间")
|
||||
|
||||
# 修改班级时,前端传过来的数据(可选)
|
||||
class ClassUpdate(BaseModel):
|
||||
start_time: Optional[datetime] = None
|
||||
|
||||
# 返回给前端的数据格式
|
||||
class ClassOut(ClassCreate):
|
||||
class_id: int
|
||||
# 两个额外字段head_teacher_name和course_teacher_names,它们不是数据库字段,而是在DAO
|
||||
# 层手动塞进对象的。答辩时记得解释:“这是为了前端展示方便,在查询时动态拼装的字段。”
|
||||
head_teacher_name: str = "暂无" # 班主任名字
|
||||
course_teacher_names: str = "暂无" # 授课老师名字
|
||||
|
||||
class Config:
|
||||
from_attributes = True
|
||||
Reference in New Issue
Block a user