""" 统一返回结果类 - 对齐JAVA Result @author: {{ author }} @date: {{ date }} """ from typing import TypeVar, Generic, Optional, Any from pydantic import BaseModel, Field from datetime import datetime import time T = TypeVar('T') class Result(BaseModel, Generic[T]): """接口返回数据格式 - 对齐JAVA Result""" success: bool = Field(True, description="成功标志") message: str = Field("", description="返回处理消息") code: int = Field(0, description="返回代码, 0=成功, 500=错误") result: Optional[T] = Field(None, description="返回数据对象") timestamp: int = Field(default_factory=lambda: int(time.time() * 1000), description="时间戳") @staticmethod def OK(data: Any = None, message: str = "") -> dict: """成功返回""" return { "success": True, "message": message, "code": 200, "result": data, "timestamp": int(time.time() * 1000) } @staticmethod def error(message: str, code: int = 500) -> dict: """错误返回""" return { "success": False, "message": message, "code": code, "result": None, "timestamp": int(time.time() * 1000) } @staticmethod def noauth(message: str = "无权限访问") -> dict: """无权限返回""" return { "success": False, "message": message, "code": 210, "result": None, "timestamp": int(time.time() * 1000) } def to_camel_case(name: str) -> str: """snake_case 转 camelCase""" if not name or "_" not in name: return name parts = name.split("_") return parts[0].lower() + "".join(p.capitalize() for p in parts[1:] if p) def to_camel_dict(obj) -> dict: """把 SQLAlchemy 模型实例(或任意对象)转成驼峰 key 的字典。 只提取 __table__.columns 中声明的列,避免泄露 _sa_instance_state 等 SQLAlchemy 内部状态字段。数据库列名是 snake_case,输出 key 转成驼峰。 """ if obj is None: return None if hasattr(obj, "__table__"): keys = [c.name for c in obj.__table__.columns] result = {} for k in keys: result[to_camel_case(k)] = getattr(obj, k, None) return result if isinstance(obj, dict): return {to_camel_case(k): v for k, v in obj.items()} if hasattr(obj, "__dict__"): return {to_camel_case(k): v for k, v in obj.__dict__.items() if not k.startswith("_")} return obj