Fix API compatibility and add user/role/permission and asset import/export
This commit is contained in:
152
backend_new/app/core/response.py
Normal file
152
backend_new/app/core/response.py
Normal file
@@ -0,0 +1,152 @@
|
||||
"""
|
||||
统一响应封装模块
|
||||
"""
|
||||
from typing import Any, Generic, TypeVar, Optional, List
|
||||
from pydantic import BaseModel, Field
|
||||
from datetime import datetime
|
||||
|
||||
# 泛型类型变量
|
||||
T = TypeVar("T")
|
||||
|
||||
|
||||
class ResponseModel(BaseModel, Generic[T]):
|
||||
"""统一响应模型"""
|
||||
|
||||
code: int = Field(default=200, description="响应状态码")
|
||||
message: str = Field(default="success", description="响应消息")
|
||||
data: Optional[T] = Field(default=None, description="响应数据")
|
||||
timestamp: int = Field(default_factory=lambda: int(datetime.now().timestamp()), description="时间戳")
|
||||
|
||||
@classmethod
|
||||
def success(cls, data: Optional[T] = None, message: str = "success") -> "ResponseModel[T]":
|
||||
"""
|
||||
成功响应
|
||||
|
||||
Args:
|
||||
data: 响应数据
|
||||
message: 响应消息
|
||||
|
||||
Returns:
|
||||
ResponseModel: 响应对象
|
||||
"""
|
||||
return cls(code=200, message=message, data=data)
|
||||
|
||||
@classmethod
|
||||
def error(
|
||||
cls,
|
||||
code: int,
|
||||
message: str,
|
||||
data: Optional[T] = None
|
||||
) -> "ResponseModel[T]":
|
||||
"""
|
||||
错误响应
|
||||
|
||||
Args:
|
||||
code: 错误码
|
||||
message: 错误消息
|
||||
data: 附加数据
|
||||
|
||||
Returns:
|
||||
ResponseModel: 响应对象
|
||||
"""
|
||||
return cls(code=code, message=message, data=data)
|
||||
|
||||
|
||||
class PaginationMeta(BaseModel):
|
||||
"""分页元数据"""
|
||||
|
||||
total: int = Field(..., description="总记录数")
|
||||
page: int = Field(..., ge=1, description="当前页码")
|
||||
page_size: int = Field(..., ge=1, le=100, description="每页记录数")
|
||||
total_pages: int = Field(..., ge=0, description="总页数")
|
||||
|
||||
|
||||
class PaginatedResponse(BaseModel, Generic[T]):
|
||||
"""分页响应模型"""
|
||||
|
||||
total: int = Field(..., description="总记录数")
|
||||
page: int = Field(..., ge=1, description="当前页码")
|
||||
page_size: int = Field(..., ge=1, description="每页记录数")
|
||||
total_pages: int = Field(..., ge=0, description="总页数")
|
||||
items: List[T] = Field(default_factory=list, description="数据列表")
|
||||
|
||||
|
||||
class ValidationError(BaseModel):
|
||||
"""验证错误详情"""
|
||||
|
||||
field: str = Field(..., description="字段名")
|
||||
message: str = Field(..., description="错误消息")
|
||||
|
||||
|
||||
class ErrorResponse(BaseModel):
|
||||
"""错误响应模型"""
|
||||
|
||||
code: int = Field(..., description="错误码")
|
||||
message: str = Field(..., description="错误消息")
|
||||
errors: Optional[List[ValidationError]] = Field(default=None, description="错误详情列表")
|
||||
timestamp: int = Field(default_factory=lambda: int(datetime.now().timestamp()), description="时间戳")
|
||||
|
||||
|
||||
def success_response(data: Any = None, message: str = "success") -> dict:
|
||||
"""
|
||||
生成成功响应
|
||||
|
||||
Args:
|
||||
data: 响应数据
|
||||
message: 响应消息
|
||||
|
||||
Returns:
|
||||
dict: 响应字典
|
||||
"""
|
||||
return ResponseModel.success(data=data, message=message).model_dump()
|
||||
|
||||
|
||||
def error_response(code: int, message: str, errors: Optional[List[dict]] = None) -> dict:
|
||||
"""
|
||||
生成错误响应
|
||||
|
||||
Args:
|
||||
code: 错误码
|
||||
message: 错误消息
|
||||
errors: 错误详情列表
|
||||
|
||||
Returns:
|
||||
dict: 响应字典
|
||||
"""
|
||||
error_data = ErrorResponse(
|
||||
code=code,
|
||||
message=message,
|
||||
errors=[ValidationError(**e) for e in errors] if errors else None
|
||||
)
|
||||
return error_data.model_dump()
|
||||
|
||||
|
||||
def paginated_response(
|
||||
items: List[Any],
|
||||
total: int,
|
||||
page: int,
|
||||
page_size: int
|
||||
) -> dict:
|
||||
"""
|
||||
生成分页响应
|
||||
|
||||
Args:
|
||||
items: 数据列表
|
||||
total: 总记录数
|
||||
page: 当前页码
|
||||
page_size: 每页记录数
|
||||
|
||||
Returns:
|
||||
dict: 响应字典
|
||||
"""
|
||||
total_pages = (total + page_size - 1) // page_size if page_size > 0 else 0
|
||||
|
||||
response = PaginatedResponse(
|
||||
total=total,
|
||||
page=page,
|
||||
page_size=page_size,
|
||||
total_pages=total_pages,
|
||||
items=items
|
||||
)
|
||||
|
||||
return success_response(data=response.model_dump())
|
||||
Reference in New Issue
Block a user