Files

723 lines
21 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# -*- coding: utf-8 -*-
from enum import Enum
from typing import Protocol
from app.config.setting import settings
class RET(Enum):
"""
系统返回码枚举
0~200: 成功状态码
400~600: HTTP标准错误码
4000+: 自定义业务错误码
"""
# 成功状态码
OK = (0, "成功")
SUCCESS = (200, "操作成功")
CREATED = (201, "创建成功")
ACCEPTED = (202, "请求已接受")
NO_CONTENT = (204, "操作成功,无返回数据")
# HTTP标准错误码
ERROR = (1, "请求错误")
BAD_REQUEST = (400, "参数错误")
UNAUTHORIZED = (401, "未授权")
FORBIDDEN = (403, "访问受限")
NOT_FOUND = (404, "资源不存在")
BAD_METHOD = (405, "不支持的请求方法")
NOT_ACCEPTABLE = (406, "不接受的请求")
CONFLICT = (409, "资源冲突")
GONE = (410, "资源已删除")
PRECONDITION_FAILED = (412, "前提条件失败")
UNSUPPORTED_MEDIA_TYPE = (415, "不支持的媒体类型")
UNPROCESSABLE_ENTITY = (422, "无法处理的实体")
TOO_MANY_REQUESTS = (429, "请求过于频繁")
# 服务器错误码
INTERNAL_SERVER_ERROR = (500, "服务器内部错误")
NOT_IMPLEMENTED = (501, "功能未实现")
BAD_GATEWAY = (502, "网关错误")
SERVICE_UNAVAILABLE = (503, "服务不可用")
GATEWAY_TIMEOUT = (504, "网关超时")
HTTP_VERSION_NOT_SUPPORTED = (505, "HTTP版本不支持")
# 自定义业务错误码
EXCEPTION = (-1, "系统异常")
DATAEXIST = (4003, "数据已存在")
DATAERR = (4004, "数据错误")
PARAMERR = (4103, "参数错误")
IOERR = (4302, "IO错误")
SERVERERR = (4500, "服务错误")
UNKOWNERR = (4501, "未知错误")
TIMEOUT = (4502, "请求超时")
RATE_LIMIT_EXCEEDED = (4503, "访问频率超限")
# Token相关错误码
INVALID_TOKEN = (4504, "无效令牌")
EXPIRED_TOKEN = (4505, "令牌过期")
# 认证授权错误码
INVALID_CREDENTIALS = (4506, "无效凭证")
INVALID_REQUEST = (4507, "无效请求")
INVALID_FORMAT = (4508, "格式错误")
INVALID_INPUT = (4509, "输入错误")
INVALID_STATE = (4510, "状态错误")
INVALID_OPERATION = (4511, "操作错误")
INVALID_PERMISSION = (4512, "权限错误")
INVALID_RESOURCE = (4513, "资源错误")
INVALID_CONFIGURATION = (4514, "配置错误")
# 会话安全错误码
INVALID_SESSION = (4515, "会话错误")
INVALID_LICENSE = (4516, "许可证错误")
INVALID_CERTIFICATE = (4517, "证书错误")
INVALID_SIGNATURE = (4518, "签名错误")
INVALID_ENCRYPTION = (4519, "加密错误")
INVALID_DECRYPTION = (4520, "解密错误")
INVALID_COMPRESSION = (4521, "压缩错误")
INVALID_DECOMPRESSION = (4522, "解压错误")
# 权限相关错误码
INVALID_AUTHENTICATION = (4523, "认证错误")
INVALID_AUTHORIZATION = (4524, "授权错误")
INVALID_ACCESS = (4525, "访问错误")
INVALID_SECURITY = (4526, "安全错误")
# 系统组件错误码
INVALID_NETWORK = (4527, "网络错误")
INVALID_DATABASE = (4528, "数据库错误")
INVALID_CACHE = (4529, "缓存错误")
INVALID_QUEUE = (4530, "队列错误")
INVALID_LOCK = (4531, "锁错误")
INVALID_TRANSACTION = (4532, "事务错误")
INVALID_LOG = (4533, "日志错误")
INVALID_MONITORING = (4534, "监控错误")
INVALID_NOTIFICATION = (4535, "通知错误")
# 任务调度错误码
INVALID_SCHEDULING = (4536, "调度错误")
INVALID_TASK = (4537, "任务错误")
INVALID_JOB = (4538, "作业错误")
INVALID_WORKFLOW = (4539, "工作流错误")
# 开发相关错误码
INVALID_SCRIPT = (4540, "脚本错误")
INVALID_PLUGIN = (4541, "插件错误")
INVALID_MODULE = (4542, "模块错误")
INVALID_PACKAGE = (4543, "包错误")
INVALID_CLASS = (4544, "类错误")
INVALID_FUNCTION = (4545, "函数错误")
INVALID_METHOD = (4546, "方法错误")
INVALID_PROPERTY = (4547, "属性错误")
INVALID_VARIABLE = (4548, "变量错误")
INVALID_CONSTANT = (4549, "常量错误")
INVALID_ENUM = (4550, "枚举错误")
INVALID_INTERFACE = (4551, "接口错误")
INVALID_PROTOCOL = (4552, "协议错误")
# 服务相关错误码
INVALID_SERVICE = (4553, "服务错误")
INVALID_CLIENT = (4554, "客户端错误")
INVALID_SERVER = (4555, "服务器错误")
INVALID_SYSTEM = (4556, "系统错误")
# 用户权限错误码
INVALID_USER = (4557, "用户错误")
INVALID_GROUP = (4558, "用户组错误")
INVALID_ROLE = (4559, "角色错误")
INVALID_PERMISSION_GROUP = (4560, "权限组错误")
INVALID_PERMISSION_ROLE = (4561, "权限角色错误")
INVALID_PERMISSION_USER = (4562, "权限用户错误")
INVALID_PERMISSION_RESOURCE = (4563, "权限资源错误")
INVALID_PERMISSION_ACTION = (4564, "权限操作错误")
INVALID_PERMISSION_SCOPE = (4565, "权限范围错误")
INVALID_PERMISSION_LEVEL = (4566, "权限级别错误")
INVALID_PERMISSION_TYPE = (4567, "权限类型错误")
INVALID_PERMISSION_STATUS = (4568, "权限状态错误")
INVALID_PERMISSION_TIME = (4569, "权限时间错误")
INVALID_PERMISSION_CONDITION = (4570, "权限条件错误")
INVALID_PERMISSION_POLICY = (4571, "权限策略错误")
INVALID_PERMISSION_RULE = (4572, "权限规则错误")
INVALID_PERMISSION_EXCEPTION = (4573, "权限异常错误")
INVALID_PERMISSION_VALIDATION = (4574, "权限验证错误")
INVALID_PERMISSION_AUTHENTICATION = (4575, "权限认证错误")
INVALID_PERMISSION_AUTHORIZATION = (4576, "权限授权错误")
INVALID_PERMISSION_ACCESS = (4577, "权限访问错误")
INVALID_PERMISSION_SECURITY = (4578, "权限安全错误")
INVALID_PERMISSION_NETWORK = (4579, "权限网络错误")
INVALID_PERMISSION_DATABASE = (4580, "权限数据库错误")
INVALID_PERMISSION_CACHE = (4581, "权限缓存错误")
INVALID_PERMISSION_QUEUE = (4582, "权限队列错误")
INVALID_PERMISSION_LOCK = (4583, "权限锁错误")
INVALID_PERMISSION_TRANSACTION = (4584, "权限事务错误")
INVALID_PERMISSION_LOG = (4585, "权限日志错误")
INVALID_PERMISSION_MONITORING = (4586, "权限监控错误")
INVALID_PERMISSION_NOTIFICATION = (4587, "权限通知错误")
INVALID_PERMISSION_SCHEDULING = (4588, "权限调度错误")
INVALID_PERMISSION_TASK = (4589, "权限任务错误")
INVALID_PERMISSION_JOB = (4590, "权限作业错误")
INVALID_PERMISSION_WORKFLOW = (4591, "权限工作流错误")
INVALID_PERMISSION_SCRIPT = (4592, "权限脚本错误")
INVALID_PERMISSION_PLUGIN = (4593, "权限插件错误")
INVALID_PERMISSION_MODULE = (4594, "权限模块错误")
INVALID_PERMISSION_PACKAGE = (4595, "权限包错误")
INVALID_PERMISSION_CLASS = (4596, "权限类错误")
INVALID_PERMISSION_FUNCTION = (4597, "权限函数错误")
INVALID_PERMISSION_METHOD = (4598, "权限方法错误")
INVALID_PERMISSION_PROPERTY = (4599, "权限属性错误")
INVALID_PERMISSION_VARIABLE = (4600, "权限变量错误")
INVALID_PERMISSION_CONSTANT = (4601, "权限常量错误")
INVALID_PERMISSION_ENUM = (4602, "权限枚举错误")
INVALID_PERMISSION_INTERFACE = (4603, "权限接口错误")
INVALID_PERMISSION_PROTOCOL = (4604, "权限协议错误")
INVALID_PERMISSION_SERVICE = (4605, "权限服务错误")
INVALID_PERMISSION_CLIENT = (4606, "权限客户端错误")
INVALID_PERMISSION_SERVER = (4607, "权限服务器错误")
INVALID_PERMISSION_SYSTEM = (4608, "权限系统错误")
def __init__(self, code: int, msg: str):
"""
初始化返回码。
参数:
- code (int): 错误码。
- msg (str): 错误信息。
返回:
- None
"""
self._code = code
self._msg = msg
@property
def code(self) -> int:
"""获取错误码"""
return self._code
@property
def msg(self) -> str:
"""获取错误信息"""
return self._msg
class CommonConstant:
"""
常用常量
WWW: www主域名
HTTP: http请求
HTTPS: https请求
LOOKUP_RMI: RMI远程方法调用
LOOKUP_LDAP: LDAP远程方法调用
LOOKUP_LDAPS: LDAPS远程方法调用
YES: 是否为系统默认(是)
NO: 是否为系统默认(否)
DEPT_NORMAL: 部门正常状态
DEPT_DISABLE: 部门停用状态
UNIQUE: 校验是否唯一的返回标识(是)
NOT_UNIQUE: 校验是否唯一的返回标识(否)
"""
# 域名相关
WWW = "www."
HTTP = "http://"
HTTPS = "https://"
# 远程调用
LOOKUP_RMI = "rmi:"
LOOKUP_LDAP = "ldap:"
LOOKUP_LDAPS = "ldaps:"
# 系统标识
YES = "Y"
NO = "N"
# 部门状态
DEPT_NORMAL = "0" # 正常
DEPT_DISABLE = "1" # 停用
# 唯一性校验
UNIQUE = True
NOT_UNIQUE = False
class JobConstant:
"""
定时任务常量
JOB_ERROR_LIST: 定时任务禁止调用模块及违规字符串列表
JOB_WHITE_LIST: 定时任务允许调用模块列表
"""
JOB_ERROR_LIST = [
"app",
"config",
"exceptions",
"import ",
"middlewares",
"module_admin",
"open(",
"os.",
"server",
"sub_applications",
"subprocess.",
"sys.",
"utils",
"while ",
"__import__",
""",
""",
",",
"?",
":",
";",
"/",
"|",
"+",
"-",
"=",
"~",
"!",
"#",
"$",
"%",
"^",
"&",
"*",
"<",
">",
"(",
")",
"[",
"]",
"{",
"}",
" ",
]
JOB_WHITE_LIST = ["function_task"]
class MenuConstant:
"""
菜单常量
TYPE_DIR: 菜单类型(目录)
TYPE_MENU: 菜单类型(菜单)
TYPE_BUTTON: 菜单类型(按钮)
YES_FRAME: 是否菜单外链(是)
NO_FRAME: 是否菜单外链(否)
LAYOUT: Layout组件标识
PARENT_VIEW: ParentView组件标识
INNER_LINK: InnerLink组件标识
"""
TYPE_DIR = "M"
TYPE_MENU = "C"
TYPE_BUTTON = "F"
YES_FRAME = 0
NO_FRAME = 1
LAYOUT = "Layout"
PARENT_VIEW = "ParentView"
INNER_LINK = "InnerLink"
class GenConstant:
"""
代码生成常量
COLUMNTYPE_STR: 数据库字符串类型
COLUMNTYPE_TEXT: 数据库文本类型
COLUMNTYPE_TIME: 数据库时间类型
COLUMNTYPE_GEOMETRY: 数据库字空间类型
COLUMNTYPE_NUMBER: 数据库数字类型
COLUMNNAME_NOT_EDIT: 页面不需要编辑字段
COLUMNNAME_NOT_LIST: 页面不需要显示的列表字段
COLUMNNAME_NOT_QUERY: 页面不需要查询字段
BASE_ENTITY: Entity基类字段
TREE_ENTITY: Tree基类字段
HTML_INPUT: 文本框
HTML_TEXTAREA: 文本域
HTML_SELECT: 下拉框
HTML_RADIO: 单选框
HTML_CHECKBOX: 复选框
HTML_DATETIME: 日期控件
HTML_IMAGE_UPLOAD: 图片上传控件
HTML_FILE_UPLOAD: 文件上传控件
HTML_EDITOR: 富文本控件
TYPE_DECIMAL: 高精度计算类型
TYPE_DATE: 时间类型
QUERY_LIKE: 模糊查询
QUERY_EQ: 相等查询
REQUIRE: 需要
DB_TO_SQLALCHEMY_TYPE_MAPPING: 数据库类型与sqlalchemy类型映射
DB_TO_PYTHON_TYPE_MAPPING: 数据库类型与python类型映射
"""
# 数据库字符串类型
COLUMNTYPE_STR = (
["character varying", "varchar", "character", "char"]
if settings.DATABASE_TYPE == "postgres"
else ["char", "varchar", "nvarchar", "varchar2"]
)
# 数据库文本类型
COLUMNTYPE_TEXT = (
["text", "citext"] if settings.DATABASE_TYPE == "postgres" else ["tinytext", "text", "mediumtext", "longtext"]
)
# 数据库时间类型
COLUMNTYPE_TIME = (
[
"date",
"time",
"time with time zone",
"time without time zone",
"timestamp",
"timestamp with time zone",
"timestamp without time zone",
"interval",
]
if settings.DATABASE_TYPE == "postgres"
else ["datetime", "time", "date", "timestamp"]
)
# 数据库字空间类型
COLUMNTYPE_GEOMETRY = (
["point", "line", "lseg", "box", "path", "polygon", "circle"]
if settings.DATABASE_TYPE == "postgres"
else [
"geometry",
"point",
"linestring",
"polygon",
"multipoint",
"multilinestring",
"multipolygon",
"geometrycollection",
]
)
# 数据库数字类型
COLUMNTYPE_NUMBER = [
"tinyint",
"smallint",
"mediumint",
"int",
"number",
"integer",
"bit",
"bigint",
"float",
"double",
"decimal",
"boolean",
"bool"
]
# 页面不需要显示的添加字段
COLUMNNAME_NOT_ADD_SHOW = ["created_time", "updated_time"]
# 页面不需要显示的编辑字段
COLUMNNAME_NOT_EDIT_SHOW = ["uuid"]
# 页面不需要编辑字段
COLUMNNAME_NOT_EDIT = ["id", "uuid", "created_time", "updated_time"]
# 页面不需要显示的列表字段
COLUMNNAME_NOT_LIST = ["id", "uuid"]
# 页面不需要查询字段
COLUMNNAME_NOT_QUERY = ["id", "uuid", "description"]
# Crud基类字段
CRUD_COLUMN_NOT_EDIT = ["create_by", "description", "created_time", "updated_time"]
# 实体基类字段
BASE_ENTITY = ["id", "uuid", "status", "description", "created_time", "updated_time", "created_id", "updated_id"]
# Tree基类字段
TREE_ENTITY = ["parent_name", "parent_id", "order", "ancestors", "children"]
# 文本框
HTML_INPUT = "input"
# 文本域
HTML_TEXTAREA = "textarea"
# 下拉框
HTML_SELECT = "select"
# 单选框
HTML_RADIO = "radio"
# 复选框
HTML_CHECKBOX = "checkbox"
# 日期控件
HTML_DATETIME = "datetime"
# 图片上传控件
HTML_IMAGE_UPLOAD = "imageUpload"
# 文件上传控件
HTML_FILE_UPLOAD = "fileUpload"
# 富文本控件
HTML_EDITOR = "editor"
# 高精度计算类型
TYPE_DECIMAL = "Decimal"
# 时间类型
TYPE_DATE = ["date", "time", "datetime"]
# 模糊查询
QUERY_LIKE = "LIKE"
# 相等查询
QUERY_EQ = "EQ"
# 需要
REQUIRE = True
# 数据库类型与sqlalchemy类型映射
DB_TO_SQLALCHEMY = {
"boolean": "Boolean",
"smallint": "SmallInteger",
"integer": "Integer",
"int4": "Integer",
"bigint": "BigInteger",
"real": "Float",
"double precision": "Float",
"numeric": "Numeric",
"character varying": "String",
"varchar": "String",
"character": "String",
"text": "Text",
"bytea": "LargeBinary",
"date": "Date",
"time": "Time",
"time with time zone": "Time",
"time without time zone": "Time",
"timestamp": "DateTime",
"timestamp with time zone": "DateTime",
"timestamp without time zone": "DateTime",
"interval": "Interval",
"json": "JSON",
"jsonb": "JSONB",
"uuid": "Uuid",
"inet": "INET",
"cidr": "CIDR",
"macaddr": "MACADDR",
"point": "Geometry",
"line": "Geometry",
"lseg": "Geometry",
"box": "Geometry",
"path": "Geometry",
"polygon": "Geometry",
"circle": "Geometry",
"bit": "Bit",
"bit varying": "Bit",
"tsvector": "TSVECTOR",
"tsquery": "TSQUERY",
"xml": "String",
"array": "ARRAY",
"composite": "JSON",
"enum": "Enum",
"range": "Range",
"money": "Numeric",
"pg_lsn": "BigInteger",
"txid_snapshot": "String",
"oid": "BigInteger",
"regproc": "String",
"regclass": "String",
"regtype": "String",
"regrole": "String",
"regnamespace": "String",
"int2vector": "ARRAY",
"oidvector": "ARRAY",
"pg_node_tree": "Text",
} if settings.DATABASE_TYPE == "postgres" else {
# 数值类型
"TINYINT": "SmallInteger",
"SMALLINT": "SmallInteger",
"MEDIUMINT": "Integer",
"INT": "Integer",
"INTEGER": "Integer",
"BIGINT": "BigInteger",
"FLOAT": "Float",
"DOUBLE": "Float",
"DECIMAL": "DECIMAL",
"BIT": "Integer",
"NUMERIC": "Numeric",
# 日期和时间类型
"DATE": "Date",
"TIME": "Time",
"DATETIME": "DateTime",
"TIMESTAMP": "TIMESTAMP",
"YEAR": "Integer",
# 字符串类型
"CHAR": "CHAR",
"VARCHAR": "String",
"TINYTEXT": "Text",
"TEXT": "Text",
"MEDIUMTEXT": "Text",
"LONGTEXT": "Text",
"BINARY": "BINARY",
"VARBINARY": "VARBINARY",
"TINYBLOB": "LargeBinary",
"BLOB": "LargeBinary",
"MEDIUMBLOB": "LargeBinary",
"LONGBLOB": "LargeBinary",
# 枚举和集合类型
"ENUM": "Enum",
"SET": "String",
# JSON 类型
"JSON": "JSON",
# 空间数据类型(需要扩展支持,如 GeoAlchemy2
"GEOMETRY": "Geometry", # 需要安装 geoalchemy2
"POINT": "Geometry",
"LINESTRING": "Geometry",
"POLYGON": "Geometry",
"MULTIPOINT": "Geometry",
"MULTILINESTRING": "Geometry",
"MULTIPOLYGON": "Geometry",
"GEOMETRYCOLLECTION": "Geometry",
# 其他类型
"BOOL": "Boolean",
"UUID": "String",
}
# 数据库类型与python类型映射
DB_TO_PYTHON = {
"boolean": "bool",
"smallint": "int",
"integer": "int",
"int4": "int",
"bigint": "int",
"real": "float",
"double precision": "float",
"numeric": "Decimal",
"character varying": "str",
"varchar": "str",
"character": "str",
"text": "str",
"bytea": "bytes",
"date": "date",
"time": "time",
"time with time zone": "time",
"time without time zone": "time",
"timestamp": "datetime",
"timestamp with time zone": "datetime",
"timestamp without time zone": "datetime",
"interval": "timedelta",
"json": "dict",
"jsonb": "dict",
"uuid": "str",
"inet": "str",
"cidr": "str",
"macaddr": "str",
"point": "list",
"line": "list",
"lseg": "list",
"box": "list",
"path": "list",
"polygon": "list",
"circle": "list",
"bit": "int",
"bit varying": "int",
"tsvector": "str",
"tsquery": "str",
"xml": "str",
"array": "list",
"composite": "dict",
"enum": "str",
"range": "list",
"money": "Decimal",
"pg_lsn": "int",
"txid_snapshot": "str",
"oid": "int",
"regproc": "str",
"regclass": "str",
"regtype": "str",
"regrole": "str",
"regnamespace": "str",
"int2vector": "list",
"oidvector": "list",
"pg_node_tree": "str",
} if settings.DATABASE_TYPE == "postgres" else {
# 数值类型
"TINYINT": "int",
"SMALLINT": "int",
"MEDIUMINT": "int",
"INT": "int",
"INTEGER": "int",
"BIGINT": "int",
"FLOAT": "float",
"DOUBLE": "float",
"NUMERIC": "float",
"DECIMAL": "Decimal",
"BIT": "int",
# 日期和时间类型
"DATE": "datetime.date",
"TIME": "datetime.time",
"DATETIME": "datetime.datetime",
"TIMESTAMP": "datetime.datetime",
"YEAR": "int",
"TINYINT UNSIGNED": "int", # 无符号小整数类型
# 布尔类型
"BOOLEAN": "bool",
"BOOL": "bool", # 布尔类型,通常与 BOOLEAN 相同
# UUID
"UUID": "str", # UUID 一般作为字符串
# 字符串类型
"CHAR": "str",
"VARCHAR": "str",
"TINYTEXT": "str",
"TEXT": "str",
"MEDIUMTEXT": "str",
"LONGTEXT": "str",
"BINARY": "bytes",
"VARBINARY": "bytes",
"TINYBLOB": "bytes",
"BLOB": "bytes",
"MEDIUMBLOB": "bytes",
"LONGBLOB": "bytes",
# 枚举和集合类型
"ENUM": "str",
"SET": "list",
# JSON 类型
"JSON": "dict",
# 空间数据类型(通常需要特殊处理)
"GEOMETRY": "bytes", # 空间数据类型,通常存储为字节流
"POINT": "bytes", # 点数据类型
"LINESTRING": "bytes", # 线数据类型
"POLYGON": "bytes", # 多边形数据类型
"MULTIPOINT": "bytes", # 多点数据类型
"MULTILINESTRING": "bytes", # 多线数据类型
"MULTIPOLYGON": "bytes", # 多多边形数据类型
"GEOMETRYCOLLECTION": "bytes", # 几何集合类型
}
class TypedContextProtocol(Protocol):
perf_time: float
ip: str
country: str | None
region: str | None
city: str | None
user_agent: str
os: str | None
browser: str | None
device: str | None
permission: str | None
# if __name__ == "__main__":
# print(RET.OK.msg) # 输出: 成功