48 lines
1.4 KiB
Python
48 lines
1.4 KiB
Python
|
|
"""统一响应格式封装"""
|
||
|
|
from typing import Any, Optional, Generic, TypeVar
|
||
|
|
from pydantic import BaseModel
|
||
|
|
from datetime import datetime
|
||
|
|
|
||
|
|
T = TypeVar("T")
|
||
|
|
|
||
|
|
class ApiResponse(BaseModel, Generic[T]):
|
||
|
|
"""统一 API 响应格式"""
|
||
|
|
code: int = 0
|
||
|
|
message: str = "success"
|
||
|
|
data: Optional[T] = None
|
||
|
|
timestamp: str = ""
|
||
|
|
|
||
|
|
def __init__(self, code: int = 0, message: str = "success", data: T = None, **kwargs):
|
||
|
|
super().__init__(
|
||
|
|
code=code,
|
||
|
|
message=message,
|
||
|
|
data=data,
|
||
|
|
timestamp=datetime.now().isoformat() + "Z"
|
||
|
|
)
|
||
|
|
|
||
|
|
@classmethod
|
||
|
|
def success(cls, data: T = None, message: str = "success"):
|
||
|
|
return cls(code=0, message=message, data=data)
|
||
|
|
|
||
|
|
@classmethod
|
||
|
|
def error(cls, code: int = 50000, message: str = "Internal error"):
|
||
|
|
return cls(code=code, message=message, data=None)
|
||
|
|
|
||
|
|
class PaginatedData(BaseModel, Generic[T]):
|
||
|
|
"""分页数据封装"""
|
||
|
|
items: list[T]
|
||
|
|
pagination: dict
|
||
|
|
|
||
|
|
@classmethod
|
||
|
|
def create(cls, items: list, page: int = 1, page_size: int = 20, total: int = 0):
|
||
|
|
total_pages = (total + page_size - 1) // page_size if page_size > 0 else 0
|
||
|
|
return cls(
|
||
|
|
items=items,
|
||
|
|
pagination={
|
||
|
|
"page": page,
|
||
|
|
"page_size": page_size,
|
||
|
|
"total": total,
|
||
|
|
"total_pages": total_pages
|
||
|
|
}
|
||
|
|
)
|