56 lines
1.9 KiB
Python
56 lines
1.9 KiB
Python
import re
|
|
from datetime import datetime
|
|
from pydantic import BaseModel, Field, field_serializer, field_validator #进门校验钩子
|
|
from model.advisor_model import GenderEnum
|
|
|
|
#顾问信息请求体数据进入模型 用Field进门校验
|
|
class AdvisorCreate(BaseModel):
|
|
advisor_name:str =Field(...,min_length=2,max_length=10)
|
|
# 电话:非必填;填了必须是11位纯数字
|
|
phone:str|None = None
|
|
# 性别:枚举类型,只接受 男 / 女
|
|
gender:GenderEnum|None = None
|
|
|
|
@field_validator("phone")
|
|
@classmethod
|
|
def validate_phone(cls,v):
|
|
if v is None:
|
|
return v
|
|
if not re.fullmatch(r"\d{11}",v):
|
|
raise ValueError("电话号码必须是11位纯数字")
|
|
return v
|
|
|
|
#顾问信息更改删除状态
|
|
class AdvisorStatus(BaseModel):
|
|
flag: int = Field(ge=0, le=1)
|
|
|
|
#顾问信息响应体返回模型
|
|
class StudentOut(BaseModel):
|
|
student_no: str
|
|
student_name: str
|
|
enrollment_time: datetime
|
|
graduation_time: datetime
|
|
advisor_id: int
|
|
# class Config:
|
|
# from_attributes = True #允许 Pydantic 从 ORM 对象的属性上取值(student.student_name),而不是只从字典取——没有这行
|
|
|
|
class AdvisorOut(BaseModel):
|
|
id:int
|
|
advisor_name:str
|
|
flag:int
|
|
phone:str|None = None
|
|
gender:GenderEnum|None = None
|
|
# class Config:
|
|
# from_attributes=True # 允许把 ORM 对象(Advisor)直接转成这个模型
|
|
|
|
@field_serializer("phone")
|
|
def mask_phone(self,value):
|
|
# 返回时把中间四位加密:13812345678 -> 138****5678
|
|
if value is None:
|
|
return None
|
|
return value[:3] + "****" + value[7:]
|
|
|
|
|
|
#AdvisorCreate:数据是前端传来的 JSON,
|
|
# FastAPI 直接把 JSON 转成这个对象.来源是"普通字典",所以什么都不用配。
|
|
#AdvisorOut:返回信息存在数据库里的 Advisor 对象的属性里 |