This commit is contained in:
z_xl
2026-09-21 20:16:09 +08:00
commit fe44708fa6
91 changed files with 4530 additions and 0 deletions
View File
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+30
View File
@@ -0,0 +1,30 @@
from pydantic import BaseModel, Field, ConfigDict
from typing import Optional
# ---------- 请求模型 ----------
# 顾问模块:入参格式,字段长度跟 model/wl_advisor_model.py 里的列宽保持一致
class AdvisorCreate(BaseModel):
adv_name: str = Field(..., max_length=50, description="顾问姓名")
adv_gender: Optional[str] = Field(None, max_length=8, description="性别")
adv_phone: Optional[str] = Field(None, max_length=20, description="手机号")
adv_email: Optional[str] = Field(None, max_length=64, description="邮箱")
adv_region: Optional[str] = Field(None, max_length=64, description="负责区域/招生渠道")
class AdvisorUpdate(BaseModel):
adv_name: Optional[str] = Field(None, max_length=50)
adv_gender: Optional[str] = Field(None, max_length=8)
adv_phone: Optional[str] = Field(None, max_length=20)
adv_email: Optional[str] = Field(None, max_length=64)
adv_region: Optional[str] = Field(None, max_length=64)
# ---------- 响应模型 ----------
# is_deleted 是逻辑删除标记,不对外暴露
class AdvisorOut(BaseModel):
adv_id: int
adv_name: str
adv_gender: Optional[str] = None
adv_phone: Optional[str] = None
adv_email: Optional[str] = None
adv_region: Optional[str] = None
model_config = ConfigDict(from_attributes=True)
+22
View File
@@ -0,0 +1,22 @@
from pydantic import BaseModel, Field
from typing import Optional
from datetime import datetime
# 新增班级时,前端传过来的数据
class ClassCreate(BaseModel):
start_time: datetime = Field(..., description="开课时间")
# 修改班级时,前端传过来的数据(可选)
class ClassUpdate(BaseModel):
start_time: Optional[datetime] = None
# 返回给前端的数据格式
class ClassOut(ClassCreate):
class_id: int
# 两个额外字段head_teacher_name和course_teacher_names,它们不是数据库字段,而是在DAO
# 层手动塞进对象的。答辩时记得解释:“这是为了前端展示方便,在查询时动态拼装的字段。”
head_teacher_name: str = "暂无" # 班主任名字
course_teacher_names: str = "暂无" # 授课老师名字
class Config:
from_attributes = True
+28
View File
@@ -0,0 +1,28 @@
from pydantic import BaseModel, Field, ConfigDict
from datetime import datetime
from typing import Optional
# ---------- 请求模型 ----------
class EmpCreate(BaseModel):
stu_no: str = Field(..., max_length=20, description="学号")
emp_open_time: Optional[datetime] = Field(None, description="不传用表默认值")
offer_time: Optional[datetime] = Field(None, description="不传用数据库当前时间")
company_name: str = Field(..., max_length=100, description="公司名称")
salary: Optional[int] = Field(None, description="不传用默认值 15000")
class EmpUpdate(BaseModel):
emp_open_time: Optional[datetime] = None
offer_time: Optional[datetime] = None
company_name: Optional[str] = Field(None, max_length=100)
salary: Optional[int] = None
# ---------- 响应模型 ----------
class EmpOut(BaseModel):
stu_no: str
stu_name: Optional[str] = None
emp_open_time: Optional[datetime] = None
offer_time: Optional[datetime] = None
company_name: Optional[str] = None
salary: Optional[int] = None
model_config = ConfigDict(from_attributes=True)
+62
View File
@@ -0,0 +1,62 @@
from pydantic import BaseModel, ConfigDict
from datetime import date
from typing import Optional, List
# ----------------学生----------------
class StudentCreate(BaseModel):
stu_name: str
native_place: Optional[str] = None
graduate_school: Optional[str] = None
major: Optional[str] = None
in_time: Optional[date] = None
out_time: Optional[date] = None
edu: Optional[str] = None
advisor_id: Optional[int] = None
stu_age: Optional[int] = None
stu_gender: Optional[str] = None
class StudentResp(StudentCreate):
stu_id: int
class Config:
from_attributes = True
# ----------------成绩----------------
class ScoreCreate(BaseModel):
stu_no: str
exam_order: int
score: float
class ScoreResp(ScoreCreate):
class Config:
from_attributes = True
# 对外出参:成绩表现在直接用学号做主键,stu_no 就是表里的真实字段,
# 查到 ORM 对象直接读出来即可,不需要额外挂展示字段。
class ScoreOut(BaseModel):
stu_no: str
exam_order: int
score: float
model_config = ConfigDict(from_attributes=True)
# ----------------班级----------------
class ClassCreate(BaseModel):
start_time: Optional[date] = None
class ClassResp(ClassCreate):
class_id: int
class Config:
from_attributes = True
# ----------------老师----------------
class TeacherCreate(BaseModel):
t_name: str
t_gender: Optional[str] = None
t_email: Optional[str] = None
class_id: Optional[int] = None
role: Optional[str] = None
class TeacherResp(TeacherCreate):
t_id: int
class Config:
from_attributes = True
+83
View File
@@ -0,0 +1,83 @@
#统计分析模块 入参/出参定义
from datetime import datetime
from enum import Enum
from typing import Optional, List
from pydantic import BaseModel, ConfigDict
from model.wl_score_model import Score
# ---- 入参:动态查询的比较条件 ----
class AgeCompareOp(str, Enum):
"""年龄比较条件:大于/大于等于/小于/小于等于/等于/区间"""
gt = "gt"
ge = "ge"
lt = "lt"
le = "le"
eq = "eq"
between = "between"
class SortOrder(str, Enum):
"""排序方向:升序/降序"""
asc = "asc"
desc = "desc"
# ---- 出参:后续统计接口的聚合结果 DTO 放这里 ----
class ClassGenderStatOut(BaseModel):
"""班级多维度统计:总人数 + 男女分布"""
class_id: Optional[int] = None
total: int = 0
male_count: int = 0
female_count: int = 0
class ScoreShow(BaseModel):
exam_order:int=0
score:float=0
class ScoreOutLine(BaseModel):
stu_no:str=''
stu_name:str=''
scores:List[ScoreShow]=[]
class FailCountModel(BaseModel):
stu_name:str=''
class_id:int=0
scores:List[ScoreShow]=[]
class ClassAvgScoreOut(BaseModel):
"""每次考试每个班级的平均分"""
# DAO 返回的是 SQLAlchemy Row 对象,必须开 from_attributes 才能按属性名读取
model_config = ConfigDict(from_attributes=True)
class_id:Optional[int]=None
exam_order:Optional[int]=None
avg_score:Optional[float]=None
class EmpTopOut(BaseModel):
"""就业薪资排名 Top N"""
# 同样是 Row 对象,必须开 from_attributes
model_config = ConfigDict(from_attributes=True)
stu_name:Optional[str]=None
class_id:Optional[int]=None
offer_time:Optional[datetime]=None
company_name:Optional[str]=None
# 接口是按薪资排序取前 N 名的,薪资也得一起给出来,
# 否则前端只能看到"谁排前面"却看不出差了多少钱
salary:Optional[int]=None
class ClassAvgEmpTimeOut(BaseModel):
"""每个班级的平均就业时长"""
class_id: Optional[int] = None
# 单位:天,保留 1 位小数;为 None 表示该班无就业学生,前端展示"无就业学生"
avg_emp_time: Optional[float] = None
# 参与统计的人数(平均值的分母),为 0 同样表示该班无就业学生
emp_stu_count: int = 0
class EmpTimeOut(BaseModel):
model_config = ConfigDict(from_attributes=True)
stu_name:str=''
emp_total_time:int=0 # 单位为天
+48
View File
@@ -0,0 +1,48 @@
from pydantic import BaseModel
from datetime import date
from typing import Optional
class StudentCreate(BaseModel):
class_id: Optional[int] = None
advisor_id: Optional[int] = None
stu_name: Optional[str] = None
native_place: Optional[str] = None
graduate_school: Optional[str] = None
major: Optional[str] = None
in_time: Optional[date] = None
out_time: Optional[date] = None
edu: Optional[str] = None
stu_age: Optional[int] = None
stu_gender: Optional[str] = None
# status: Optional[str] = None
class StudentUpdate(BaseModel):
class_id: Optional[int] = None
advisor_id: Optional[int] = None
stu_name: Optional[str] = None
native_place: Optional[str] = None
graduate_school: Optional[str] = None
major: Optional[str] = None
in_time: Optional[date] = None
out_time: Optional[date] = None
edu: Optional[str] = None
stu_age: Optional[int] = None
stu_gender: Optional[str] = None
# status: Optional[str] = None
class StudentOut(BaseModel):
stu_no: str
stu_name: Optional[str] = None
class_id: Optional[int] = None
advisor_id: Optional[int] = None
native_place: Optional[str] = None
graduate_school: Optional[str] = None
major: Optional[str] = None
in_time: Optional[date] = None
out_time: Optional[date] = None
edu: Optional[str] = None
stu_age: Optional[int] = None
stu_gender: Optional[str] = None
# status: Optional[str] = None
class Config:
from_attributes = True
+34
View File
@@ -0,0 +1,34 @@
from pydantic import BaseModel, Field, ConfigDict
from datetime import datetime
from typing import Optional
# ---------- 请求模型 ----------
class TeacherCreate(BaseModel):
t_no: Optional[str] = Field(None, max_length=20, description="老师编号,不传则自动生成")
t_name: str = Field(..., max_length=50, description="老师姓名")
t_phone: Optional[str] = Field(None, max_length=20, description="电话")
t_email: Optional[str] = Field(None, max_length=20, description="邮箱")
class_id: int = Field(..., description="班级ID")
role: str = Field(..., max_length=50, description="角色")
class TeacherUpdate(BaseModel):
t_no: Optional[str] = Field(None, max_length=20)
t_name: Optional[str] = Field(None, max_length=50)
t_phone: Optional[str] = Field(None, max_length=20)
t_email: Optional[str] = Field(None, max_length=20)
class_id: Optional[int] = None
role: Optional[str] = Field(None, max_length=50)
# ---------- 响应模型 ----------
class TeacherResponse(BaseModel):
t_id: int
t_no: str
t_name: str
class_id: int
role: str
t_phone: Optional[str]
t_email: Optional[str]
model_config = ConfigDict(from_attributes=True)