Merge pull request 'Li yujie' (#41) from LI_YUJIE into main

Reviewed-on: #41
This commit was merged in pull request #41.
This commit is contained in:
2026-09-22 16:36:48 +08:00
3 changed files with 98 additions and 35 deletions
+61 -13
View File
@@ -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="逻辑删除学生")
+20 -7
View File
@@ -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 使用精确查询
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):
+14 -12
View File
@@ -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
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 = None
age: int | None = None
gender: str | 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