From 3577495b6c5a42fece4da8b42176aaf2402fbc0a Mon Sep 17 00:00:00 2001 From: wolin_liyujie <168155038@qq.com> Date: Mon, 21 Sep 2026 21:39:13 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=A0=E9=99=A4=E4=BA=86=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/student.py | 87 +++++++++++++++++++++++++++++++++++++++++++--- dao/student.py | 80 +++++++++++++++++++++++++++++++++++++++++- schemas/student.py | 22 ++++++------ 3 files changed, 173 insertions(+), 16 deletions(-) diff --git a/api/student.py b/api/student.py index c606935..996c47a 100644 --- a/api/student.py +++ b/api/student.py @@ -1,17 +1,96 @@ -from fastapi import APIRouter,Depends,HTTPException -from dao.student import * -from schemas.student import StudentCreate +from fastapi import APIRouter, Depends, HTTPException from sqlalchemy.orm import Session + +from core.database import get_db +from schemas.student import StudentCreate, StudentUpdate +from dao import student as student_dao student_router = APIRouter() @student_router.post("",summary='添加学生') def create_student(request:StudentCreate,db:Session = Depends(get_db)): d = request.model_dump() - r = create_students(d,db) + r = student_dao.create_students(d,db) if not r: raise HTTPException(status_code=500,detail='服务器繁忙,请稍后添加!') return {'code':200,'detail':"添加学生成功"} +@student_router.put("/{id}", summary="修改学生") +def update_student( + id: int, + request: StudentUpdate, + db: Session = Depends(get_db), +): + # 只取前端真正传来的字段 + # 例如只传 age,就只修改 age + data = request.model_dump(exclude_unset=True) + student = student_dao.update_student(id, data, db) + # None 表示学生不存在 + if student is None: + raise HTTPException(status_code=404, detail="学生不存在") + # False 表示操作数据库失败 + if student is False: + raise HTTPException(status_code=500, detail="修改学生失败") + + return { + "code": 200, + "detail": "修改学生成功", + "data": student, + } + +@student_router.get("", summary="查询学生列表") +def get_students( + # 三个查询条件都可以不传 + student_no: str | None = None, + student_name: str | None = None, + class_id: int | None = None, + # 获取本次请求使用的数据库连接 + db: Session = Depends(get_db), +): + # 调用 DAO 查询数据库 + students = student_dao.get_students( + db=db, + student_no=student_no, + student_name=student_name, + class_id=class_id, + ) + + return { + "code": 200, + "detail": "查询成功", + "total": len(students), + "data": students, + } + +@student_router.get("/{id}", summary="查询学生详情") +def get_student(id: int, db: Session = Depends(get_db)): + # 根据路径中的 ID 查询学生 + student = student_dao.get_student_by_id(id, db) + + if not student: + # 404 表示请求的数据不存在 + raise HTTPException(status_code=404, detail="学生不存在") + + return { + "code": 200, + "detail": "查询成功", + "data": student, + } + +@student_router.delete("/{id}", summary="逻辑删除学生") +def delete_student(id: int, db: Session = Depends(get_db)): + student = student_dao.delete_student(id, db) + + # None 表示不存在,或者以前已经删除 + if student is None: + raise HTTPException(status_code=404, detail="学生不存在或已经删除") + + if student is False: + raise HTTPException(status_code=500, detail="删除学生失败") + + return { + "code": 200, + "detail": "删除学生成功", + } diff --git a/dao/student.py b/dao/student.py index 0030b49..e11ce68 100644 --- a/dao/student.py +++ b/dao/student.py @@ -22,4 +22,82 @@ def create_students(d: dict, db: Session): print(f"插入学生失败: {e}") return None -# def updet_students(): \ No newline at end of file +def get_student_by_id(student_id: int, db: Session): + # 同时判断 is_deleted,已经逻辑删除的学生不会被查到 + return db.query(Student).filter( + Student.id == student_id, + Student.is_deleted == 0, + ).first() + +def update_student(student_id: int, data: dict, db: Session): + # 第一步:先查询学生 + student = get_student_by_id(student_id, db) + + # 没有查到就返回 None + if not student: + return None + + try: + # 第二步:循环修改前端传来的字段 + # field 是字段名,value 是新的值 + for field, value in data.items(): + setattr(student, field, value) + + # 第三步:提交修改并重新读取数据 + db.commit() + db.refresh(student) + return student + + except Exception as e: + # 修改失败时回滚 + db.rollback() + print("修改学生失败:", e) + return False + +def get_students( + db: Session, + student_no: str | None = None, + student_name: str | None = None, + class_id: int | None = None, +): + # 第一步:只查询没有被删除的学生 + query = db.query(Student).filter(Student.is_deleted == 0) + + # 第二步:前端传了哪个条件,就增加哪个条件 + if student_no: + # 学号使用精确查询 + query = query.filter(Student.student_no == student_no) + + if student_name: + # 姓名使用模糊查询,例如“张”可以查到“张三” + query = query.filter(Student.student_name.like(f"%{student_name}%")) + + if class_id: + # 班级 ID 使用精确查询 + query = query.filter(Student.class_id == class_id) + + # 第三步:执行查询并返回全部结果 + return query.all() + +#逻辑删除学生 +def delete_student(student_id: int, db: Session): + # 第一步:查询学生 + student = get_student_by_id(student_id, db) + + if not student: + return None + + try: + # 第二步:不真正删除记录,只把删除标记改成 1 + student.is_deleted = 1 + + # 第三步:提交修改 + db.commit() + return student + + except Exception as e: + # 删除失败时回滚 + db.rollback() + print("删除学生失败:", e) + return False + diff --git a/schemas/student.py b/schemas/student.py index 213ae53..47f9b13 100644 --- a/schemas/student.py +++ b/schemas/student.py @@ -24,17 +24,17 @@ class StudentCreate(BaseModel): return self class StudentUpdate(BaseModel): - # 1. 默认值为 None 是为了允许省略字段,不代表每个字段都能清空。 - student_no: str | None = Field(default=None, min_length=1, max_length=50) - student_name: str | None = Field(default=None, min_length=1, max_length=50) - class_id: int | None = Field(default=None, gt=0) - consultant_id: int | None = Field(default=None, gt=0) - native_place: str | None = Field(default=None, max_length=100) - graduation_school: str | None = Field(default=None, max_length=100) - major: str | None = Field(default=None, max_length=100) + # 全部设为可选,前端只传需要修改的字段 + student_no: str | None = None + student_name: str | None = None + class_id: int | None = None + consultant_id: int | None = None + native_place: str | None = None + graduation_school: str | None = None + major: str | None = None enrollment_date: date | None = None graduation_date: date | None = None - education: str | None = Field(default=None, max_length=50) - age: int | None = Field(default=None, ge=0, le=150) - gender: str | None = Field(default=None, min_length=1, max_length=10) + education: str | None = None + age: int | None = None + gender: str | None = None