""" 客户端API统一格式规范 """ from typing import Dict, Any, Optional from pydantic import BaseModel, Field from datetime import datetime class ClientApiRequest(BaseModel): """客户端API请求基础格式""" action: str = Field(..., description="API操作类型") params: Dict[str, Any] = Field(default_factory=dict, description="请求参数") timestamp: int = Field(..., description="请求时间戳(秒级)") version: str = Field(default="1.0", description="API版本") session_id: Optional[str] = Field(None, description="会话ID(登录后提供)") class ClientApiResponse(BaseModel): """客户端API响应基础格式""" code: int = Field(..., description="响应码:200-成功,400-参数错误,401-未授权,500-服务器错误") msg: str = Field(..., description="响应消息") data: Optional[Dict[str, Any]] = Field(None, description="响应数据") timestamp: int = Field(..., description="响应时间戳") version: str = Field(default="1.0", description="API版本") class EncryptedRequest(BaseModel): """加密请求格式""" encrypted: str = Field(..., description="RSA+AES加密后的数据") key_version: int = Field(..., description="使用的密钥版本") class EncryptedResponse(BaseModel): """加密响应格式""" encrypted: str = Field(..., description="RSA+AES加密后的数据") key_version: int = Field(..., description="使用的密钥版本") new_public_key: Optional[str] = Field(None, description="新的公钥(密钥轮换时提供)") # 具体业务请求格式 class LoginRequest(BaseModel): """登录请求""" username: str = Field(..., description="用户名") password: str = Field(..., description="密码") machine_code: str = Field(..., description="机器码") class RegisterRequest(BaseModel): """注册请求""" username: str = Field(..., description="用户名") password: str = Field(..., description="密码") email: str = Field(..., description="邮箱") card_code: str = Field(..., description="卡密") machine_code: Optional[str] = Field(None, description="机器码(可选,第一次登录时绑定)") class HeartbeatRequest(BaseModel): """心跳请求""" user_id: int = Field(..., description="用户ID") session_id: str = Field(..., description="会话ID") machine_code: str = Field(..., description="机器码") class ActivateCardRequest(BaseModel): """激活卡密请求""" user_id: int = Field(..., description="用户ID") card_code: str = Field(..., description="卡密") software_code: str = Field(..., description="软件特征码") class LogoutRequest(BaseModel): """登出请求""" user_id: int = Field(..., description="用户ID") session_id: str = Field(..., description="会话ID") class UnbindRequest(BaseModel): """解绑请求""" username: str = Field(..., description="用户名") password: str = Field(..., description="密码") # 响应数据格式 class LoginResponseData(BaseModel): """登录响应数据""" user_id: int = Field(..., description="用户ID") username: str = Field(..., description="用户名") session_id: str = Field(..., description="会话ID") expire_time: str = Field(..., description="到期时间") machine_code: str = Field(..., description="机器码") class RegisterResponseData(BaseModel): """注册响应数据""" user_id: int = Field(..., description="用户ID") class HeartbeatResponseData(BaseModel): """心跳响应数据""" expire_time: str = Field(..., description="到期时间") new_public_key: Optional[str] = Field(None, description="新公钥") class ValidateSessionRequest(BaseModel): """验证会话请求""" session_id: str = Field(..., description="会话ID") class ValidateSessionResponseData(BaseModel): """验证会话响应数据""" user_id: int = Field(..., description="用户ID") username: str = Field(..., description="用户名") expire_time: str = Field(..., description="到期时间") is_active: bool = Field(..., description="用户是否激活") machine_code: str = Field(..., description="机器码") class ActivateCardResponseData(BaseModel): """激活卡密响应数据""" expire_time: str = Field(..., description="新到期时间") days: int = Field(..., description="激活天数") # API操作类型常量 class ApiActions: """API操作类型常量""" LOGIN = "login" REGISTER = "register" LOGOUT = "logout" HEARTBEAT = "heartbeat" VALIDATE_SESSION = "validate_session" ACTIVATE_CARD = "activate_card" UNBIND = "unbind" GET_ANNOUNCEMENTS = "get_announcements" GET_RECHARGE_RECORDS = "get_recharge_records"