base.py 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. """
  2. 基础Schema模型
  3. """
  4. from pydantic import BaseModel, Field
  5. from typing import Optional, Any, Dict
  6. from datetime import datetime
  7. class BaseSchema(BaseModel):
  8. """基础Schema"""
  9. class Config:
  10. from_attributes = True
  11. json_encoders = {
  12. datetime: lambda v: v.isoformat() if v else None
  13. }
  14. class ResponseSchema(BaseSchema):
  15. """统一响应Schema"""
  16. code: int = Field(default=0, description="响应码")
  17. message: str = Field(default="success", description="响应消息")
  18. data: Optional[Any] = Field(default=None, description="响应数据")
  19. timestamp: datetime = Field(default_factory=datetime.utcnow, description="响应时间")
  20. class PaginationSchema(BaseSchema):
  21. """分页Schema"""
  22. page: int = Field(default=1, ge=1, description="页码")
  23. page_size: int = Field(default=20, ge=1, le=100, description="每页数量")
  24. total: int = Field(default=0, description="总数量")
  25. total_pages: int = Field(default=0, description="总页数")
  26. class PaginatedResponseSchema(ResponseSchema):
  27. """分页响应Schema"""
  28. data: Optional[Any] = Field(default=None, description="响应数据")
  29. meta: Optional[PaginationSchema] = Field(default=None, description="分页信息")
  30. class IDSchema(BaseSchema):
  31. """ID Schema"""
  32. id: str = Field(..., description="ID")
  33. class TimestampSchema(BaseSchema):
  34. """时间戳Schema"""
  35. created_at: Optional[datetime] = Field(default=None, description="创建时间")
  36. updated_at: Optional[datetime] = Field(default=None, description="更新时间")
  37. class BaseModelSchema(IDSchema, TimestampSchema):
  38. """基础模型Schema"""
  39. is_deleted: bool = Field(default=False, description="是否删除")
  40. class PageQuery(BaseModel):
  41. """分页查询参数"""
  42. page: int = Field(1, ge=1)
  43. page_size: int = Field(20, ge=1, le=200)
  44. class ApiResponse(BaseModel):
  45. code: int
  46. message: str
  47. data: Optional[Any] = None
  48. timestamp: str