首次
This commit is contained in:
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.
Binary file not shown.
@@ -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)
|
||||
@@ -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
|
||||
@@ -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)
|
||||
@@ -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
|
||||
@@ -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 # 单位为天
|
||||
@@ -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
|
||||
@@ -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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user