From 8be44d8539faac61aee335eaf9e4f894288f8670 Mon Sep 17 00:00:00 2001 From: zxl <2290782958@qq.com> Date: Sun, 13 Sep 2026 17:20:23 +0800 Subject: [PATCH] =?UTF-8?q?test=E4=BA=8C=E8=BD=AE=E5=AE=8C=E6=88=90?= =?UTF-8?q?=E7=9A=84=E7=89=88=E6=9C=AC=EF=BC=8C=E5=B9=B6=E5=85=A5=E4=BA=86?= =?UTF-8?q?=E6=B5=A9=E9=92=A6=E7=9A=84=E7=8F=AD=E7=BA=A7=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/wl_class_api.py | 49 ++++++++++++++++++++ dao/wl_class_dao.py | 94 +++++++++++++++++++++++++++++++++++++++ scheme/wl_class_scheme.py | 22 +++++++++ 3 files changed, 165 insertions(+) create mode 100644 api/wl_class_api.py create mode 100644 dao/wl_class_dao.py create mode 100644 scheme/wl_class_scheme.py diff --git a/api/wl_class_api.py b/api/wl_class_api.py new file mode 100644 index 0000000..d86758a --- /dev/null +++ b/api/wl_class_api.py @@ -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) \ No newline at end of file diff --git a/dao/wl_class_dao.py b/dao/wl_class_dao.py new file mode 100644 index 0000000..86cb6e9 --- /dev/null +++ b/dao/wl_class_dao.py @@ -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": "班级删除成功"} \ No newline at end of file diff --git a/scheme/wl_class_scheme.py b/scheme/wl_class_scheme.py new file mode 100644 index 0000000..20e316f --- /dev/null +++ b/scheme/wl_class_scheme.py @@ -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 \ No newline at end of file