schema.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. from datetime import datetime
  2. from typing import Optional
  3. from pydantic import BaseModel, ConfigDict, Field, model_validator
  4. from sqlalchemy.ext.asyncio import AsyncSession
  5. from app.api.v1.module_system.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. tenant_id: int = Field(default=-1, description="租户ID")
  13. class JWTPayloadSchema(BaseModel):
  14. """JWT载荷模型"""
  15. sub: str = Field(..., description="用户登录信息")
  16. is_refresh: bool = Field(default=False, description="是否刷新token")
  17. exp: datetime | int = Field(..., description="过期时间")
  18. @model_validator(mode="after")
  19. def validate_fields(self):
  20. """
  21. 校验 JWT 载荷字段的基本合法性。
  22. 返回:
  23. - JWTPayloadSchema: 校验后的载荷实例。
  24. 异常:
  25. - ValueError: 必填字段为空或格式不正确时抛出。
  26. """
  27. if not self.sub or len(self.sub.strip()) == 0:
  28. raise ValueError("会话编号不能为空")
  29. return self
  30. class JWTOutSchema(BaseModel):
  31. """JWT响应模型"""
  32. model_config = ConfigDict(from_attributes=True)
  33. access_token: str = Field(..., min_length=1, description="访问token")
  34. refresh_token: str = Field(..., min_length=1, description="刷新token")
  35. token_type: str = Field(default="Bearer", description="token类型")
  36. expires_in: int = Field(..., gt=0, description="过期时间(秒)")
  37. class RefreshTokenPayloadSchema(BaseModel):
  38. """刷新Token载荷模型"""
  39. refresh_token: str = Field(..., min_length=1, description="刷新token")
  40. class LogoutPayloadSchema(BaseModel):
  41. """退出登录载荷模型"""
  42. token: str = Field(..., min_length=1, description="token")
  43. class CaptchaOutSchema(BaseModel):
  44. """验证码响应模型"""
  45. model_config = ConfigDict(from_attributes=True)
  46. enable: bool = Field(default=True, description="是否启用验证码")
  47. key: str = Field(..., min_length=1, description="验证码唯一标识")
  48. img_base: str = Field(..., min_length=1, description="Base64编码的验证码图片")
  49. class AutoLoginUserSchema(BaseModel):
  50. """免登录用户信息模型"""
  51. model_config = ConfigDict(from_attributes=True)
  52. id: int = Field(..., description="用户ID")
  53. username: str = Field(..., description="用户名")
  54. name: str = Field(..., description="用户姓名")
  55. avatar: str | None = Field(default=None, description="头像")
  56. class AutoLoginTokenSchema(BaseModel):
  57. """免登录Token响应模型"""
  58. model_config = ConfigDict(from_attributes=True)
  59. token: str = Field(..., description="免登录Token")
  60. user: AutoLoginUserSchema = Field(..., description="用户信息")
  61. class LoginMiniRequestSchema(BaseModel):
  62. """小程序登录请求模型"""
  63. model_config = ConfigDict(from_attributes=True)
  64. username: str = Field(..., min_length=1, description="用户名")
  65. password: str = Field(..., min_length=1, description="密码")
  66. login_type: Optional[str] = Field(default="mini", description="登录类型")