113 lines
4.2 KiB
Python
113 lines
4.2 KiB
Python
from fastapi import APIRouter, Depends, HTTPException
|
|
from pymysql import IntegrityError
|
|
from sqlalchemy.orm import Session
|
|
from typing import List
|
|
from model.classes_model import Classes
|
|
from dao.student_dao import update_student
|
|
from database import get_db
|
|
from model.student_info import Student
|
|
from schemas.student_info import StudentCreate, StudentUpdate, StudentResponse,student_date
|
|
|
|
router = APIRouter(prefix="/students", tags=["学生基本信息"])
|
|
|
|
# 1. 查询
|
|
@router.get("", response_model=List[StudentResponse], summary="查询学生")
|
|
def list_students(
|
|
id: str = None,
|
|
name: str = None,
|
|
class_name: str = None,
|
|
db: Session = Depends(get_db)
|
|
):
|
|
query = db.query(Student).filter(Student.is_deleted == False)
|
|
if id:
|
|
query = query.filter(Student.id == id)
|
|
if name:
|
|
query = query.filter(Student.name.like(f"%{name}%"))
|
|
if class_name:
|
|
query = query.filter(Student.class_name == class_name)
|
|
return query.all()
|
|
|
|
|
|
# 2. 创建
|
|
@router.post("", response_model=StudentResponse, summary="创建新学生")
|
|
def create_student(student: StudentCreate, db: Session = Depends(get_db)):
|
|
# 调用校验函数 如果入学日期存在,就把它变成字符串;如果不存在,就赋值为空
|
|
enroll_str = student.enrollment_date.strftime("%Y-%m-%d") if student.enrollment_date else None
|
|
grad_str = student.graduation_date.strftime("%Y-%m-%d") if student.graduation_date else None
|
|
date_check_result = student_date(enroll_str, grad_str)
|
|
|
|
#如果不存在,直接抛出异常中断请求
|
|
if date_check_result != "时间校验通过":
|
|
raise HTTPException(status_code=400, detail=date_check_result)
|
|
# 检查学号是否已存在
|
|
exist = db.query(Student).filter(Student.id == student.id).first()
|
|
if exist:
|
|
raise HTTPException(status_code=400, detail=f"学号 {student.id} 已存在")
|
|
|
|
# 不存在的班级导致外键约束报错
|
|
class_exists = db.query(Classes).filter(
|
|
Classes.class_name == student.class_name,
|
|
).first()
|
|
if not class_exists:
|
|
raise HTTPException(status_code=400,detail=f"班级 '{student.class_name}' 不存在,请检查输入是否正确!")
|
|
|
|
# 3. 构建数据库模型对象 一个个赋值
|
|
db_student = Student(
|
|
id=student.id,
|
|
name=student.name,
|
|
gender=student.gender,
|
|
class_name=student.class_name,
|
|
age=student.age,
|
|
hometown=student.hometown,
|
|
graduate_school=student.graduate_school,
|
|
major=student.major,
|
|
education=student.education,
|
|
enrollment_date=student.enrollment_date,
|
|
graduation_date=student.graduation_date,
|
|
status=student.status,
|
|
is_deleted=False
|
|
)
|
|
db.add(db_student)
|
|
db.commit()
|
|
db.refresh(db_student)
|
|
return db_student #返回响应
|
|
|
|
|
|
# 3. 详情
|
|
@router.get("/{id}", response_model=StudentResponse, summary="获取特定学生信息")
|
|
def get_student(id: str, db: Session = Depends(get_db)):
|
|
student = db.query(Student).filter(
|
|
Student.id == id,
|
|
Student.is_deleted == False
|
|
).first()
|
|
if student is None:
|
|
raise HTTPException(status_code=404, detail="学生不存在或已删除")
|
|
return student
|
|
|
|
|
|
# 4. 更新
|
|
@router.put("/{id}", response_model=StudentResponse, summary="更新学生信息")
|
|
def api_update_student(id: str, payload: StudentUpdate, db: Session = Depends(get_db)):
|
|
try:
|
|
student = update_student(db, id, payload)
|
|
if student is None:
|
|
raise HTTPException(status_code=404, detail="学生不存在或已删除")
|
|
return student
|
|
except IntegrityError:
|
|
db.rollback()
|
|
raise HTTPException(status_code=400, detail="更新失败:指定的班级不存在,请先创建对应班级!")
|
|
|
|
|
|
|
|
# 5. 逻辑删除
|
|
@router.delete("/{id}", summary="逻辑删除学生")
|
|
def delete_student(id: str, db: Session = Depends(get_db)):
|
|
student = db.query(Student).filter(
|
|
Student.id == id,
|
|
Student.is_deleted == False
|
|
).first()
|
|
if student is None:
|
|
raise HTTPException(status_code=404, detail="学生不存在或已删除")
|
|
student.is_deleted = True
|
|
db.commit()
|
|
return {"message": f"学生 {id} 已逻辑删除,数据仍保留在库中"} |