mirror of
https://github.com/fastapi-practices/fastapi-best-architecture.git
synced 2026-09-20 20:49:53 +00:00
272 lines
5.9 KiB
Python
272 lines
5.9 KiB
Python
#!/usr/bin/env python3
|
||
# -*- coding: utf-8 -*-
|
||
from enum import Enum
|
||
from enum import IntEnum as SourceIntEnum
|
||
from typing import Any, Type, TypeVar
|
||
|
||
T = TypeVar('T', bound=Enum)
|
||
|
||
|
||
class _EnumBase:
|
||
"""枚举基类,提供通用方法"""
|
||
|
||
@classmethod
|
||
def get_member_keys(cls: Type[T]) -> list[str]:
|
||
"""获取枚举成员名称列表"""
|
||
return [name for name in cls.__members__.keys()]
|
||
|
||
@classmethod
|
||
def get_member_values(cls: Type[T]) -> list:
|
||
"""获取枚举成员值列表"""
|
||
return [item.value for item in cls.__members__.values()]
|
||
|
||
@classmethod
|
||
def get_member_dict(cls: Type[T]) -> dict[str, Any]:
|
||
"""获取枚举成员字典"""
|
||
return {name: item.value for name, item in cls.__members__.items()}
|
||
|
||
|
||
class IntEnum(_EnumBase, SourceIntEnum):
|
||
"""整型枚举基类"""
|
||
|
||
pass
|
||
|
||
|
||
class StrEnum(_EnumBase, str, Enum):
|
||
"""字符串枚举基类"""
|
||
|
||
pass
|
||
|
||
|
||
class MenuType(IntEnum):
|
||
"""菜单类型"""
|
||
|
||
directory = 0
|
||
menu = 1
|
||
button = 2
|
||
|
||
|
||
class RoleDataRuleOperatorType(IntEnum):
|
||
"""数据权限规则运算符"""
|
||
|
||
AND = 0
|
||
OR = 1
|
||
|
||
|
||
class RoleDataRuleExpressionType(IntEnum):
|
||
"""数据权限规则表达式"""
|
||
|
||
eq = 0 # ==
|
||
ne = 1 # !=
|
||
gt = 2 # >
|
||
ge = 3 # >=
|
||
lt = 4 # <
|
||
le = 5 # <=
|
||
in_ = 6
|
||
not_in = 7
|
||
|
||
|
||
class MethodType(StrEnum):
|
||
"""HTTP 请求方法"""
|
||
|
||
GET = 'GET'
|
||
POST = 'POST'
|
||
PUT = 'PUT'
|
||
DELETE = 'DELETE'
|
||
PATCH = 'PATCH'
|
||
OPTIONS = 'OPTIONS'
|
||
|
||
|
||
class LoginLogStatusType(IntEnum):
|
||
"""登录日志状态"""
|
||
|
||
fail = 0
|
||
success = 1
|
||
|
||
|
||
class BuildTreeType(StrEnum):
|
||
"""构建树形结构类型"""
|
||
|
||
traversal = 'traversal'
|
||
recursive = 'recursive'
|
||
|
||
|
||
class OperaLogCipherType(IntEnum):
|
||
"""操作日志加密类型"""
|
||
|
||
aes = 0
|
||
md5 = 1
|
||
itsdangerous = 2
|
||
plan = 3
|
||
|
||
|
||
class StatusType(IntEnum):
|
||
"""状态类型"""
|
||
|
||
disable = 0
|
||
enable = 1
|
||
|
||
|
||
class UserSocialType(StrEnum):
|
||
"""用户社交类型"""
|
||
|
||
github = 'GitHub'
|
||
linux_do = 'LinuxDo'
|
||
|
||
|
||
class FileType(StrEnum):
|
||
"""文件类型"""
|
||
|
||
image = 'image'
|
||
video = 'video'
|
||
|
||
|
||
class GenModelMySQLColumnType(StrEnum):
|
||
"""代码生成模型列类型(MySQL)"""
|
||
|
||
# Python 类型映射
|
||
BIGINT = 'int'
|
||
BigInteger = 'int' # BIGINT
|
||
BINARY = 'bytes'
|
||
BLOB = 'bytes'
|
||
BOOLEAN = 'bool' # BOOL
|
||
Boolean = 'bool' # BOOL
|
||
CHAR = 'str'
|
||
CLOB = 'str'
|
||
DATE = 'date'
|
||
Date = 'date' # DATE
|
||
DATETIME = 'datetime'
|
||
DateTime = 'datetime' # DATETIME
|
||
DECIMAL = 'Decimal'
|
||
DOUBLE = 'float'
|
||
Double = 'float' # DOUBLE
|
||
DOUBLE_PRECISION = 'float'
|
||
Enum = 'Enum' # Enum()
|
||
FLOAT = 'float'
|
||
Float = 'float' # FLOAT
|
||
INT = 'int' # INTEGER
|
||
INTEGER = 'int'
|
||
Integer = 'int' # INTEGER
|
||
Interval = 'timedelta' # DATETIME
|
||
JSON = 'dict'
|
||
LargeBinary = 'bytes' # BLOB
|
||
NCHAR = 'str'
|
||
NUMERIC = 'Decimal'
|
||
Numeric = 'Decimal' # NUMERIC
|
||
NVARCHAR = 'str' # String
|
||
PickleType = 'bytes' # BLOB
|
||
REAL = 'float'
|
||
SMALLINT = 'int'
|
||
SmallInteger = 'int' # SMALLINT
|
||
String = 'str' # String
|
||
TEXT = 'str'
|
||
Text = 'str' # TEXT
|
||
TIME = 'time'
|
||
Time = 'time' # TIME
|
||
TIMESTAMP = 'datetime'
|
||
Unicode = 'str' # String
|
||
UnicodeText = 'str' # TEXT
|
||
UUID = 'str | UUID'
|
||
Uuid = 'str' # CHAR(32)
|
||
VARBINARY = 'bytes'
|
||
VARCHAR = 'str' # String
|
||
|
||
# sa.dialects.mysql 导入
|
||
BIT = 'bool'
|
||
ENUM = 'Enum'
|
||
LONGBLOB = 'bytes'
|
||
LONGTEXT = 'str'
|
||
MEDIUMBLOB = 'bytes'
|
||
MEDIUMINT = 'int'
|
||
MEDIUMTEXT = 'str'
|
||
SET = 'list[str]'
|
||
TINYBLOB = 'bytes'
|
||
TINYINT = 'int'
|
||
TINYTEXT = 'str'
|
||
YEAR = 'int'
|
||
|
||
|
||
class GenModelPostgreSQLColumnType(StrEnum):
|
||
"""代码生成模型列类型(PostgreSQL)"""
|
||
|
||
# Python 类型映射
|
||
BIGINT = 'int'
|
||
BigInteger = 'int' # BIGINT
|
||
BINARY = 'bytes'
|
||
BLOB = 'bytes'
|
||
BOOLEAN = 'bool'
|
||
Boolean = 'bool' # BOOLEAN
|
||
CHAR = 'str'
|
||
CLOB = 'str'
|
||
DATE = 'date'
|
||
Date = 'date' # DATE
|
||
DATETIME = 'datetime'
|
||
DateTime = 'datetime' # TIMESTAMP WITHOUT TIME ZONE
|
||
DECIMAL = 'Decimal'
|
||
DOUBLE = 'float'
|
||
Double = 'float' # DOUBLE PRECISION
|
||
DOUBLE_PRECISION = 'float' # DOUBLE PRECISION
|
||
Enum = 'Enum' # Enum(name='enum')
|
||
FLOAT = 'float'
|
||
Float = 'float' # FLOAT
|
||
INT = 'int' # INTEGER
|
||
INTEGER = 'int'
|
||
Integer = 'int' # INTEGER
|
||
Interval = 'timedelta' # INTERVAL
|
||
JSON = 'dict'
|
||
LargeBinary = 'bytes' # BYTEA
|
||
NCHAR = 'str'
|
||
NUMERIC = 'Decimal'
|
||
Numeric = 'Decimal' # NUMERIC
|
||
NVARCHAR = 'str' # String
|
||
PickleType = 'bytes' # BYTEA
|
||
REAL = 'float'
|
||
SMALLINT = 'int'
|
||
SmallInteger = 'int' # SMALLINT
|
||
String = 'str' # String
|
||
TEXT = 'str'
|
||
Text = 'str' # TEXT
|
||
TIME = 'time' # TIME WITHOUT TIME ZONE
|
||
Time = 'time' # TIME WITHOUT TIME ZONE
|
||
TIMESTAMP = 'datetime' # TIMESTAMP WITHOUT TIME ZONE
|
||
Unicode = 'str' # String
|
||
UnicodeText = 'str' # TEXT
|
||
UUID = 'str | UUID'
|
||
Uuid = 'str'
|
||
VARBINARY = 'bytes'
|
||
VARCHAR = 'str' # String
|
||
|
||
# sa.dialects.postgresql 导入
|
||
ARRAY = 'list'
|
||
BIT = 'bool'
|
||
BYTEA = 'bytes'
|
||
CIDR = 'str'
|
||
CITEXT = 'str'
|
||
DATEMULTIRANGE = 'list[date]'
|
||
DATERANGE = 'tuple[date, date]'
|
||
DOMAIN = 'str'
|
||
ENUM = 'Enum'
|
||
HSTORE = 'dict'
|
||
INET = 'str'
|
||
INT4MULTIRANGE = 'list[int]'
|
||
INT4RANGE = 'tuple[int, int]'
|
||
INT8MULTIRANGE = 'list[int]'
|
||
INT8RANGE = 'tuple[int, int]'
|
||
INTERVAL = 'timedelta'
|
||
JSONB = 'dict'
|
||
JSONPATH = 'str'
|
||
MACADDR = 'str'
|
||
MACADDR8 = 'str'
|
||
MONEY = 'Decimal'
|
||
NUMMULTIRANGE = 'list[Decimal]'
|
||
NUMRANGE = 'tuple[Decimal, Decimal]'
|
||
OID = 'int'
|
||
REGCLASS = 'str'
|
||
REGCONFIG = 'str'
|
||
TSMULTIRANGE = 'list[datetime]'
|
||
TSQUERY = 'str'
|
||
TSRANGE = 'tuple[datetime, datetime]'
|
||
TSTZMULTIRANGE = 'list[datetime]'
|
||
TSTZRANGE = 'tuple[datetime, datetime]'
|
||
TSVECTOR = 'str'
|