Files
xs_system/schema/statistics_schema.py
T
2026-09-23 09:28:16 +08:00

129 lines
3.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ============================================================
# 数据校验 / 序列化模型层(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]