From 40feb350af6c7376f5a15d0445effd766cf45430 Mon Sep 17 00:00:00 2001 From: 0919word <835535015@qq.com> Date: Wed, 23 Sep 2026 15:29:41 +0800 Subject: [PATCH] =?UTF-8?q?=E8=92=8B=E7=AB=8B=E5=BB=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PythonProject/api/cla_api.py | 21 +++--- PythonProject/dao/cla_dao.py | 100 ++++++++++++++++++++++++----- PythonProject/schema/cla_schema.py | 20 +----- 3 files changed, 98 insertions(+), 43 deletions(-) diff --git a/PythonProject/api/cla_api.py b/PythonProject/api/cla_api.py index cdb3714..3989adf 100644 --- a/PythonProject/api/cla_api.py +++ b/PythonProject/api/cla_api.py @@ -2,26 +2,31 @@ from fastapi import APIRouter, Depends, Query from typing import Annotated from util.database import get_db from schema.cla_schema import claRequest -from dao.cla_dao import add_class_dao,get_class_dao,update_class_dao,delete_class_dao +from dao.cla_dao import add_class_dao, get_class_dao, update_class_dao, delete_class_dao + +claAPI = APIRouter(prefix="/class", tags=["班级管理模块"]) -claAPI = APIRouter(prefix="/class", tags=["班级管理模块"]) #定义路由 统一前缀 归类显示 @claAPI.post("/", summary="新增班级信息") -def add_class(data: claRequest, Session = Depends(get_db)): #调用dao层方法 将请求数据和数据库传进去 - return add_class_dao(data, Session) #依赖注入数据库会话 获取session +def add_class(data: claRequest, Session=Depends(get_db)): + return add_class_dao(data, Session) + @claAPI.get("/list", summary="查询班级信息") def list_class( n: Annotated[int, Query(ge=1, description="页码,从1开始")], - m: Annotated[int, Query(ge=1, description="每页条数")],Session = Depends(get_db)): - return get_class_dao(n,m,Session) + m: Annotated[int, Query(ge=1, description="每页条数")], + Session=Depends(get_db)): + return get_class_dao(n, m, Session) + @claAPI.put("/{class_id}", summary="更新班级信息") -def update_class(class_id: int, data: claRequest, Session = Depends(get_db)): +def update_class(class_id: int, data: claRequest, Session=Depends(get_db)): return update_class_dao(class_id, data, Session) + @claAPI.delete("/{class_id}", summary="逻辑删除班级信息") -def delete_class(class_id: int, Session = Depends(get_db)): +def delete_class(class_id: int, Session=Depends(get_db)): return delete_class_dao(class_id, Session) diff --git a/PythonProject/dao/cla_dao.py b/PythonProject/dao/cla_dao.py index a0d5c4c..c967bd0 100644 --- a/PythonProject/dao/cla_dao.py +++ b/PythonProject/dao/cla_dao.py @@ -2,45 +2,111 @@ from model.all_model import ClassManagement from fastapi import HTTPException from schema.cla_schema import claRequest from datetime import datetime +from sqlalchemy.exc import SQLAlchemyError +import logging + +logger = logging.getLogger(__name__) def add_class_dao(c: claRequest, session): try: + # ---------- 校验:班级名称不能重复 ---------- + # 只查未删除的记录,含义是:已逻辑删除的班级允许重建同名 + exists = ( + session.query(ClassManagement) + .filter(ClassManagement.class_name == c.class_name) + .filter(ClassManagement.delete_status == 0) + .first() + ) + if exists: + raise HTTPException(400, f"班级 '{c.class_name}' 已存在,不能重复添加") + + # 班主任和授课教师可以是同一个人,无需校验 + data = c.model_dump() d = ClassManagement(**data) session.add(d) session.commit() session.refresh(d) return d - except: + + except HTTPException: + raise + except SQLAlchemyError as e: session.rollback() + logger.error(f"新增班级失败: {e}") raise HTTPException(400, "输入有误,请重新添加班级!") -def get_class_dao(n,m,session): + +def get_class_dao(n: int, m: int, session): try: - class_list=session.query(ClassManagement).filter(ClassManagement.delete_status==0).offset((n-1)*m).limit(m).all() + if n < 1 or m < 1: + return [] + class_list = ( + session.query(ClassManagement) + .filter(ClassManagement.delete_status == 0) + .offset((n - 1) * m) + .limit(m) + .all() + ) return class_list - except: - raise HTTPException(status_code=406,detail="输入查询信息有误,请重新输入!") + except SQLAlchemyError as e: + logger.error(f"查询班级列表失败: {e}") + raise HTTPException(status_code=400, detail="查询失败,请稍后重试!") -def update_class_dao(id:int,req:claRequest,session): + +def update_class_dao(class_id: int, req: claRequest, session): try: - session.query(ClassManagement).filter(ClassManagement.class_id==id)\ - .filter(ClassManagement.delete_status==0).update(req.model_dump(exclude_unset=True)) #只更新用户传过来的数据 + rows = ( + session.query(ClassManagement) + .filter(ClassManagement.class_id == class_id) + .filter(ClassManagement.delete_status == 0) + .update(req.model_dump(exclude_unset=True), synchronize_session=False) + ) session.commit() - except: - raise HTTPException(status_code=400,detail="更新格式错误或参数缺失,请重新输入!") - return '更新成功,请核对信息!' + if rows == 0: + raise HTTPException(status_code=404, detail="该班级不存在或已被删除") + except HTTPException: + session.rollback() + raise + except SQLAlchemyError as e: + session.rollback() + logger.error(f"更新班级失败: {e}") + raise HTTPException(status_code=400, detail="更新失败,请检查参数") + return {"code": 200, "msg": "更新成功"} -def delete_class_dao(id:int,session): + +def delete_class_dao(class_id: int, session): try: - session.query(ClassManagement).filter(ClassManagement.class_id==id,ClassManagement.delete_status==0)\ - .update({'delete_status': 1,'delete_time': datetime.now()}) + # 先按 class_id 查记录,再判断状态,从而区分"不存在"和"已删除" + obj = ( + session.query(ClassManagement) + .filter(ClassManagement.class_id == class_id) + .first() + ) + + # 情况 1:记录不存在 + if obj is None: + raise HTTPException(status_code=404, detail="该班级不存在") + + # 情况 2:记录存在但已删除 → 提示"已删除" + if obj.delete_status == 1: + raise HTTPException(status_code=400, detail="该班级已被删除,请勿重复操作") + + # 情况 3:执行逻辑删除 + obj.delete_status = 1 + obj.delete_time = datetime.now() session.commit() - except: - raise HTTPException(status_code=404, detail="删除异常,请重新核对之后删除!") #只置1,非真删除 - return '删除成功,请核对信息!' + except HTTPException: + session.rollback() + raise + except SQLAlchemyError as e: + session.rollback() + logger.error(f"删除班级失败: {e}") + raise HTTPException(status_code=400, detail="删除异常,请核对后重试!") + + return {"code": 200, "msg": "删除成功"} diff --git a/PythonProject/schema/cla_schema.py b/PythonProject/schema/cla_schema.py index dad7082..47c4e77 100644 --- a/PythonProject/schema/cla_schema.py +++ b/PythonProject/schema/cla_schema.py @@ -1,26 +1,10 @@ from datetime import date from pydantic import BaseModel -class claRequest(BaseModel): - - class_name : str|None = None - - start_class_date :date - - head_teacher_id : int|None = None - - class_teacher_id : int|None = None - -class claResponse(BaseModel): - - code: int = 200 - - detail: str = 'ok' - +class claRequest(BaseModel): #请求体,获取json格式数据给api层再给schema校验,校验后给dao层操作数据库 class_name: str | None = None - + start_class_date: date head_teacher_id: int | None = None - class_teacher_id: int | None = None