129 lines
3.9 KiB
Python
129 lines
3.9 KiB
Python
# ============================================================
|
||
# 数据校验 / 序列化模型层(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] |