From 7ae2f0009bddf2b2a6e33ced3f78d18c7dba553a Mon Sep 17 00:00:00 2001 From: Windows <2209639385@qq.com> Date: Tue, 22 Sep 2026 10:56:12 +0800 Subject: [PATCH] nb --- PythonProject/api/grade_api.py | 48 ++++++++++++++++++---------- PythonProject/schema/grade_schema.py | 6 ++-- 2 files changed, 34 insertions(+), 20 deletions(-) diff --git a/PythonProject/api/grade_api.py b/PythonProject/api/grade_api.py index 0f87fc8..6cbce56 100644 --- a/PythonProject/api/grade_api.py +++ b/PythonProject/api/grade_api.py @@ -3,6 +3,7 @@ from util.database import get_db from model.all_model import Student_Model from dao.grade_dao import * from schema.grade_schema import * +from fastapi import APIRouter, Depends, HTTPException, Body gradeAPI = APIRouter(tags=['学生考核成绩']) @@ -22,37 +23,50 @@ def post_grade(o:GradeRequest,db=Depends(get_db)): raise HTTPException(status_code=400, detail='学生不存在') return o -@gradeAPI.put('/{score_id}',summary='成绩修改') +@gradeAPI.put("/grade/{score_id}", summary="成绩修改") def put_grade( - score_id: int - ,o:GradeUpdate - ,db=Depends(get_db) + score_id: int, + exam_order: int | None = Body(default=None), + score: float | None = Body(default=None), + db=Depends(get_db) ): + # 1. 查询这条成绩记录是否存在(未删除) old_obj = get_score_by_id_dao(score_id=score_id, db=db) if not old_obj: raise HTTPException(status_code=404, detail="成绩记录不存在(已删除)") - d = o.model_dump(exclude_unset=True) - if not d: - raise HTTPException(status_code=400,detail='请传入需要修改的字段') - if "exam_order" in d: + # 2. 组装需要更新的字典,只把不为None的字段放进去 + update_data = {} + if exam_order is not None: + update_data["exam_order"] = exam_order + if score is not None: + update_data["score"] = score + + # 没有传入任何要修改的字段 + if not update_data: + raise HTTPException(status_code=400, detail="请传入需要修改的字段:exam_order 或 score") + + # 3. 如果要修改考核序次,做重复校验:同一个学生不能重复的exam_order + if "exam_order" in update_data: exist_obj = get_score_by_stu_exam_order_dao( stu_id=old_obj.stu_id, - exam_order=d["exam_order"], + exam_order=update_data["exam_order"], db=db ) - if exist_obj and exist_obj.id != score_id: + # 查询到别的记录占用该学生该考核序次 + if exist_obj and exist_obj.score_id != score_id: raise HTTPException(status_code=409, detail="修改后的考核序次,该学生已有成绩!") - try: - r = update_grade_dao(score_id=score_id, update_data=d, db=db) - except Exception: - raise HTTPException(status_code=409, detail="数据冲突,重复数据") + # 4.执行数据库更新 + try: + rows = update_grade_dao(score_id=score_id, update_data=update_data, db=db) + except Exception: + raise HTTPException(status_code=409, detail="数据冲突,重复数据") - if r == 0: - return {"code": 200, "totals": r, "detail": "数据未发生变化"} + if rows == 0: + return {"code": 200, "totals": rows, "detail": "数据未发生变化"} - return {"code": 200, "totals": r, "detail": "更新成功"} + return {"code": 200, "totals": rows, "detail": "更新成功"} @gradeAPI.delete('/{score_id}',summary='删除成绩') def delete_grade(score_id:int,db=Depends(get_db)): diff --git a/PythonProject/schema/grade_schema.py b/PythonProject/schema/grade_schema.py index cb7cacc..4d89cd4 100644 --- a/PythonProject/schema/grade_schema.py +++ b/PythonProject/schema/grade_schema.py @@ -15,6 +15,6 @@ class GradeResponse(BaseModel): exam_order:int score:float -class GradeUpdate(BaseModel): - exam_order: int | None = Field( None,description="考核序次") - score: float | None = Field( None,description="成绩") +# class GradeUpdate(BaseModel): +# exam_order: int | None = Field( None,description="考核序次") +# score: float | None = Field( None,description="成绩")