diff --git a/api/student.py b/api/student.py index 996c47a..4703c4e 100644 --- a/api/student.py +++ b/api/student.py @@ -1,4 +1,5 @@ -from fastapi import APIRouter, Depends, HTTPException + +from fastapi import APIRouter, Depends, HTTPException,Query,Path from sqlalchemy.orm import Session from core.database import get_db @@ -6,7 +7,7 @@ from schemas.student import StudentCreate, StudentUpdate from dao import student as student_dao student_router = APIRouter() -@student_router.post("",summary='添加学生') +@student_router.put("",summary='添加学生') def create_student(request:StudentCreate,db:Session = Depends(get_db)): d = request.model_dump() r = student_dao.create_students(d,db) @@ -14,7 +15,7 @@ def create_student(request:StudentCreate,db:Session = Depends(get_db)): raise HTTPException(status_code=500,detail='服务器繁忙,请稍后添加!') return {'code':200,'detail':"添加学生成功"} -@student_router.put("/{id}", summary="修改学生") +@student_router.post("/{id}", summary="更新学生信息") def update_student( id: int, request: StudentUpdate, @@ -34,38 +35,69 @@ def update_student( if student is False: raise HTTPException(status_code=500, detail="修改学生失败") + #传入空字典报400 + if not data: + raise HTTPException( + status_code=400, + detail="没有传入需要修改的字段", + ) + return { "code": 200, "detail": "修改学生成功", "data": student, } -@student_router.get("", summary="查询学生列表") +@student_router.get("", summary="分页查询学生列表") def get_students( # 三个查询条件都可以不传 - student_no: str | None = None, - student_name: str | None = None, - class_id: int | None = None, + student_no: str | None = Query(default=None,description="按学号精确查询"), + student_name: str | None = Query(default=None,description="按名字模糊查询"), + class_id: int | None = Query(default=None,gt=0,description="按班级号精确查询"), # 获取本次请求使用的数据库连接 db: Session = Depends(get_db), + page:int = Query(default=1,ge=1,description="页码,从1开始"), + page_size:int = Query(default=10,ge=1,le=100,description="每页条数,最多100条"), ): # 调用 DAO 查询数据库 - students = student_dao.get_students( + total, students = student_dao.get_students( db=db, student_no=student_no, student_name=student_name, class_id=class_id, + page=page, + page_size=page_size, ) - + data = [ + { + "id": student.id, + "student_no": student.student_no, + "student_name": student.student_name, + "class_id": student.class_id, + "consultant_id": student.consultant_id, + "native_place": student.native_place, + "graduation_school": student.graduation_school, + "major": student.major, + "enrollment_date": student.enrollment_date, + "graduation_date": student.graduation_date, + "education": student.education, + "age": student.age, + "gender": student.gender, + } + for student in students + ] return { "code": 200, "detail": "查询成功", - "total": len(students), - "data": students, + "total": total, + "page": page, + "page_size": page_size, + "data": data, } @student_router.get("/{id}", summary="查询学生详情") -def get_student(id: int, db: Session = Depends(get_db)): +def get_student(id: int = Path(gt=0), + db: Session = Depends(get_db)): # 根据路径中的 ID 查询学生 student = student_dao.get_student_by_id(id, db) @@ -73,10 +105,26 @@ def get_student(id: int, db: Session = Depends(get_db)): # 404 表示请求的数据不存在 raise HTTPException(status_code=404, detail="学生不存在") + result = { + "id": student.id, + "student_no": student.student_no, + "student_name": student.student_name, + "class_id": student.class_id, + "consultant_id": student.consultant_id, + "native_place": student.native_place, + "graduation_school": student.graduation_school, + "major": student.major, + "enrollment_date": student.enrollment_date, + "graduation_date": student.graduation_date, + "education": student.education, + "age": student.age, + "gender": student.gender, + } + return { "code": 200, "detail": "查询成功", - "data": student, + "data": result, } @student_router.delete("/{id}", summary="逻辑删除学生") diff --git a/dao/student.py b/dao/student.py index e11ce68..3fc6d18 100644 --- a/dao/student.py +++ b/dao/student.py @@ -1,9 +1,7 @@ -from schemas.student import * -from core.database import get_db -from models.student import * +from models.student import Student from sqlalchemy.orm import Session - +#新建学生 def create_students(d: dict, db: Session): stu = Student(**d) @@ -22,6 +20,7 @@ def create_students(d: dict, db: Session): print(f"插入学生失败: {e}") return None +#查询学生是否已经被逻辑删除 def get_student_by_id(student_id: int, db: Session): # 同时判断 is_deleted,已经逻辑删除的学生不会被查到 return db.query(Student).filter( @@ -29,6 +28,7 @@ def get_student_by_id(student_id: int, db: Session): Student.is_deleted == 0, ).first() +#更新学生信息 def update_student(student_id: int, data: dict, db: Session): # 第一步:先查询学生 student = get_student_by_id(student_id, db) @@ -54,11 +54,14 @@ def update_student(student_id: int, data: dict, db: Session): print("修改学生失败:", e) return False +#允许条件输入的列表查询 def get_students( db: Session, student_no: str | None = None, student_name: str | None = None, class_id: int | None = None, + page: int = 1, + page_size: int = 10, ): # 第一步:只查询没有被删除的学生 query = db.query(Student).filter(Student.is_deleted == 0) @@ -72,12 +75,22 @@ def get_students( # 姓名使用模糊查询,例如“张”可以查到“张三” query = query.filter(Student.student_name.like(f"%{student_name}%")) - if class_id: # 班级 ID 使用精确查询 - query = query.filter(Student.class_id == class_id) + if class_id is not None: + query = query.filter(Student.class_id == class_id) - # 第三步:执行查询并返回全部结果 - return query.all() + # 分页之前统计符合条件的总条数 + total = query.count() + + #默认按学生id排序 + students = ( + query + .order_by(Student.id.desc()) + .offset((page - 1) * page_size) + .limit(page_size) + .all() + ) + return total, students #逻辑删除学生 def delete_student(student_id: int, db: Session): diff --git a/schemas/student.py b/schemas/student.py index 47f9b13..a916070 100644 --- a/schemas/student.py +++ b/schemas/student.py @@ -1,7 +1,8 @@ -from pydantic import BaseModel from datetime import date from pydantic import BaseModel, ConfigDict, Field, model_validator +from typing import Literal +#新建学生请求体 class StudentCreate(BaseModel): student_no: str | None = Field(default=None, min_length=1, max_length=50) student_name: str = Field(min_length=1, max_length=50) @@ -14,7 +15,7 @@ class StudentCreate(BaseModel): graduation_date: date | None = None education: str | None = Field(default=None, max_length=50) age: int = Field(ge=0, le=150) - gender: str = Field(min_length=1, max_length=10) + gender: Literal["男", "女"] @model_validator(mode="after") def check_dates(self): @@ -23,18 +24,19 @@ class StudentCreate(BaseModel): raise ValueError("毕业日期不能早于入学日期") return self +#更新学生请求体 class StudentUpdate(BaseModel): # 全部设为可选,前端只传需要修改的字段 - 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 = None - age: int | None = None - gender: str | None = 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) + 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: Literal["男", "女"] | None = None