226 lines
7.2 KiB
Python

# _*_ coding : UTF-8 _*_
# @Time : 2025/01/18 02:13
# @UpdateTime : 2025/01/18 02:13
# @Author : sonder
# @File : response.py
# @Software : PyCharm
# @Comment : 本程序
from datetime import datetime
from typing import Any, Dict, Optional
from fastapi import status
from fastapi.encoders import jsonable_encoder
from fastapi.responses import JSONResponse, StreamingResponse
from pydantic import BaseModel
from config.constant import HttpStatusConstant
class Response:
"""
响应工具类,用于统一封装接口返回格式。
"""
@classmethod
def _build_response(
cls,
code: int,
msg: str,
data: Optional[Any] = None,
rows: Optional[Any] = None,
dict_content: Optional[Dict] = None,
model_content: Optional[BaseModel] = None,
success: bool = True,
) -> Dict:
"""
构建统一的响应结果字典。
:param code: 状态码
:param msg: 响应消息
:param data: 响应数据
:param rows: 响应行数据(通常用于分页)
:param dict_content: 自定义字典内容
:param model_content: 自定义 Pydantic 模型内容
:param success: 是否成功
:return: 统一的响应结果字典
"""
result = {
"code": code,
"msg": msg,
"success": success,
"time": datetime.now().isoformat(), # 添加时间戳
}
# 添加可选字段
if data is not None:
result["data"] = data
if rows is not None:
result["rows"] = rows
if dict_content is not None:
result.update(dict_content)
if model_content is not None:
result.update(model_content.model_dump(by_alias=True))
return result
@classmethod
def success(
cls,
msg: str = "操作成功",
data: Optional[Any] = None,
rows: Optional[Any] = None,
dict_content: Optional[Dict] = None,
model_content: Optional[BaseModel] = None,
) -> JSONResponse:
"""
成功响应方法。
:param msg: 响应消息,默认为 "操作成功"
:param data: 响应数据
:param rows: 响应行数据(通常用于分页)
:param dict_content: 自定义字典内容
:param model_content: 自定义 Pydantic 模型内容
:return: JSONResponse 对象
"""
result = cls._build_response(
code=HttpStatusConstant.SUCCESS,
msg=msg,
data=data,
rows=rows,
dict_content=dict_content,
model_content=model_content,
success=True,
)
return JSONResponse(status_code=status.HTTP_200_OK, content=jsonable_encoder(result))
@classmethod
def failure(
cls,
msg: str = "操作失败",
data: Optional[Any] = None,
rows: Optional[Any] = None,
dict_content: Optional[Dict] = None,
model_content: Optional[BaseModel] = None,
) -> JSONResponse:
"""
失败响应方法。
:param msg: 响应消息,默认为 "操作失败"
:param data: 响应数据
:param rows: 响应行数据(通常用于分页)
:param dict_content: 自定义字典内容
:param model_content: 自定义 Pydantic 模型内容
:return: JSONResponse 对象
"""
result = cls._build_response(
code=400,
msg=msg,
data=data,
rows=rows,
dict_content=dict_content,
model_content=model_content,
success=False,
)
return JSONResponse(status_code=status.HTTP_200_OK, content=jsonable_encoder(result))
@classmethod
def unauthorized(
cls,
msg: str = "登录信息已过期,访问系统资源失败",
data: Optional[Any] = None,
rows: Optional[Any] = None,
dict_content: Optional[Dict] = None,
model_content: Optional[BaseModel] = None,
) -> JSONResponse:
"""
未认证响应方法。
:param msg: 响应消息,默认为 "登录信息已过期,访问系统资源失败"
:param data: 响应数据
:param rows: 响应行数据(通常用于分页)
:param dict_content: 自定义字典内容
:param model_content: 自定义 Pydantic 模型内容
:return: JSONResponse 对象
"""
result = cls._build_response(
code=HttpStatusConstant.UNAUTHORIZED,
msg=msg,
data=data,
rows=rows,
dict_content=dict_content,
model_content=model_content,
success=False,
)
return JSONResponse(status_code=status.HTTP_200_OK, content=jsonable_encoder(result))
@classmethod
def forbidden(
cls,
msg: str = "该用户无此接口权限",
data: Optional[Any] = None,
rows: Optional[Any] = None,
dict_content: Optional[Dict] = None,
model_content: Optional[BaseModel] = None,
) -> JSONResponse:
"""
未授权响应方法。
:param msg: 响应消息,默认为 "该用户无此接口权限"
:param data: 响应数据
:param rows: 响应行数据(通常用于分页)
:param dict_content: 自定义字典内容
:param model_content: 自定义 Pydantic 模型内容
:return: JSONResponse 对象
"""
result = cls._build_response(
code=HttpStatusConstant.FORBIDDEN,
msg=msg,
data=data,
rows=rows,
dict_content=dict_content,
model_content=model_content,
success=False,
)
return JSONResponse(status_code=status.HTTP_200_OK, content=jsonable_encoder(result))
@classmethod
def error(
cls,
msg: str = "接口异常",
data: Optional[Any] = None,
rows: Optional[Any] = None,
dict_content: Optional[Dict] = None,
model_content: Optional[BaseModel] = None,
) -> JSONResponse:
"""
错误响应方法。
:param msg: 响应消息,默认为 "接口异常"
:param data: 响应数据
:param rows: 响应行数据(通常用于分页)
:param dict_content: 自定义字典内容
:param model_content: 自定义 Pydantic 模型内容
:return: JSONResponse 对象
"""
result = cls._build_response(
code=HttpStatusConstant.ERROR,
msg=msg,
data=data,
rows=rows,
dict_content=dict_content,
model_content=model_content,
success=False,
)
return JSONResponse(status_code=status.HTTP_200_OK, content=jsonable_encoder(result))
@classmethod
def streaming(cls, data: Any) -> StreamingResponse:
"""
流式响应方法。
:param data: 流式传输的内容
:return: StreamingResponse 对象
"""
return StreamingResponse(content=data, status_code=status.HTTP_200_OK)