# ============================================================ # 数据校验 / 序列化模型层(Pydantic Schema) # 职责: # 1. 定义接口请求参数和响应数据的结构,自动做类型校验 # 2. 作为 FastAPI 自动生成 Swagger 文档的依据 # 3. ResponseModel* 系列封装统一响应格式 { code, message, total, total_pages, data } # ============================================================ from pydantic import BaseModel,ConfigDict # FastAPI 推荐用 pydantic 做数据校验和序列化 from datetime import date # 日期类型,用于 birthday、enrollment_date 等字段 from typing import List # 类型提示,声明列表 class StudentInfo1(BaseModel): model_config = ConfigDict(from_attributes=True) student_id: str # 学号 student_name: str # 姓名 gender: str # 性别(男/女) id_card: str # 身份证号 birthday: date # 出生日期 ethnicity: str # 民族 region_id: str # 籍贯编码(关联 region表) phone: str # 手机号 major: str # 专业 class_id: str # 班级编号 enrollment_date: date # 入学日期 graduation_date: date # 毕业日期 student_status: str # 学籍状态(在读/休学/退学/毕业) education_level: str # 学历(大专/本科/硕士/博士) class ResponseModel(BaseModel): """统一响应格式 — 所有接口都返回这个结构,方便前端统一处理""" code: int # 状态码,200=成功,400=参数错误 message: str = 'ok' # 提示信息 total:int #总条数 total_pages:int #总页数 data: List[StudentInfo1] # 真正的数据,这里是学员列表 class StudentInfo2(BaseModel): student_id: str student_name: str score:float class ResponseModel1(BaseModel): """统一响应格式 — 所有接口都返回这个结构,方便前端统一处理""" code: int # 状态码,200=成功,400=参数错误 message: str = 'ok' # 提示信息 total:int #总条数 total_pages:int #总页数 data: List[StudentInfo2] # 真正的数据,这里是学员列表 class StudentInfo3(BaseModel): student_id: str student_name: str fail_count: int class ResponseModel2(BaseModel): code: int message: str = 'ok' total: int total_pages: int data: List[StudentInfo3] class ClassExamAvg(BaseModel): course_id: str class_id: str class_name: str avg_score: float class ResponseModel3(BaseModel): code: int message: str = 'ok' total: int total_pages: int data: List[ClassExamAvg] class SalaryTop(BaseModel): student_name: str class_name: str company_name: str part_time: date salary: float class ResponseModel4(BaseModel): code: int message: str = 'ok' data: List[SalaryTop] class TimeSize(BaseModel): student_id: str student_name: str offer_date: date resume_open_date: date time_size: int # 就业时长(天数) class ResponseModel5(BaseModel): code: int message: str = 'ok' total: int total_pages: int data: List[TimeSize] class ClassAvgTimeSize(BaseModel): class_id: str class_name: str avg_time_size: float # 平均就业时长(天数) class ResponseModel6(BaseModel): code: int message: str = 'ok' total: int total_pages: int data: List[ClassAvgTimeSize] class ClassStats(BaseModel): class_id: str class_name: str total_count: int male_count: int female_count: int class ResponseModel7(BaseModel): code: int message: str = 'ok' data: ClassStats class ResponseModel8(BaseModel): code: int message: str = 'ok' data: List[ClassStats]