schema.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. # -*- coding: utf-8 -*-
  2. from datetime import datetime
  3. from pydantic import ConfigDict, Field, BaseModel, model_validator
  4. from sqlalchemy.ext.asyncio import AsyncSession
  5. from ..user.model import UserModel
  6. class AuthSchema(BaseModel):
  7. """权限认证模型"""
  8. model_config = ConfigDict(arbitrary_types_allowed=True)
  9. user: UserModel | None = Field(default=None, description='用户信息')
  10. check_data_scope: bool = Field(default=True, description='是否检查数据权限')
  11. db: AsyncSession = Field(description='数据库会话')
  12. class JWTPayloadSchema(BaseModel):
  13. """JWT载荷模型"""
  14. sub: str = Field(..., description='用户登录信息')
  15. is_refresh: bool = Field(default=False, description='是否刷新token')
  16. exp: datetime | int = Field(..., description='过期时间')
  17. @model_validator(mode='after')
  18. def validate_fields(self):
  19. if not self.sub or len(self.sub.strip()) == 0:
  20. raise ValueError("会话编号不能为空")
  21. return self
  22. class JWTOutSchema(BaseModel):
  23. """JWT响应模型"""
  24. model_config = ConfigDict(from_attributes=True)
  25. access_token: str = Field(..., min_length=1, description='访问token')
  26. refresh_token: str = Field(..., min_length=1, description='刷新token')
  27. token_type: str = Field(default='Bearer', description='token类型')
  28. expires_in: int = Field(..., gt=0, description='过期时间(秒)')
  29. class RefreshTokenPayloadSchema(BaseModel):
  30. """刷新Token载荷模型"""
  31. refresh_token: str = Field(..., min_length=1, description='刷新token')
  32. class LogoutPayloadSchema(BaseModel):
  33. """退出登录载荷模型"""
  34. token: str = Field(..., min_length=1, description='token')
  35. class CaptchaOutSchema(BaseModel):
  36. """验证码响应模型"""
  37. model_config = ConfigDict(from_attributes=True)
  38. enable: bool = Field(default=True, description='是否启用验证码')
  39. key: str = Field(..., min_length=1, description='验证码唯一标识')
  40. img_base: str = Field(..., min_length=1, description='Base64编码的验证码图片')