mirror of
https://github.com/fastapiadmin/FastapiAdmin.git
synced 2026-10-13 20:51:09 +00:00
这是一次综合性的项目迭代,包含以下核心变更:
1. **目录与模块重构**
- 调整工作流节点类型模块目录结构,迁移节点类型相关代码
- 重命名platform模块为system模块,更新插件配置信息
- 重构代码生成模块导入路径
2. **数据库与CRUD优化**
- 统一所有CRUD类构造函数,新增数据库会话参数
- 修复权限过滤器数据库会话使用问题
- 更新模板生成器的CRUD代码模板
3. **认证与安全改进**
- 重构JWT密钥配置,移除默认密钥强制要求环境变量
- 重命名密码工具类,统一密码加密校验逻辑
- 优化OAuth认证流程,修复匿名认证使用问题
4. **前端与静态资源**
- 重构前端挂载逻辑,增加目录存在性校验
- 使用标准StaticFiles替换自定义前端挂载实现
5. **工具类与依赖更新**
- 修复导入工具的表名重复检测逻辑
- 优化限流回调代码,移除冗余依赖
- 更新用户、租户等模块的响应模型字段
6. **数据与配置修正**
- 修复系统版本数据字段命名不统一问题
- 简化枚举类校验逻辑,移除冗余注释
- 修复测试用例中的密码工具类导入错误
357 lines
11 KiB
Python
357 lines
11 KiB
Python
from enum import Enum, unique
|
|
|
|
|
|
@unique
|
|
class EnvironmentEnum(str, Enum):
|
|
"""应用运行环境(开发 / 生产)。"""
|
|
|
|
DEV = "dev"
|
|
PROD = "prod"
|
|
|
|
|
|
@unique
|
|
class BusinessType(Enum):
|
|
"""业务操作类型
|
|
|
|
OTHER: 其它
|
|
INSERT: 新增
|
|
UPDATE: 修改
|
|
DELETE: 删除
|
|
GRANT: 授权
|
|
EXPORT: 导出
|
|
IMPORT: 导入
|
|
FORCE: 强退
|
|
GENCODE: 生成代码
|
|
CLEAN: 清空数据
|
|
"""
|
|
|
|
OTHER = 0
|
|
INSERT = 1
|
|
UPDATE = 2
|
|
DELETE = 3
|
|
GRANT = 4
|
|
EXPORT = 5
|
|
IMPORT = 6
|
|
FORCE = 7
|
|
GENCODE = 8
|
|
CLEAN = 9
|
|
|
|
|
|
@unique
|
|
class RedisInitKeyConfig(Enum):
|
|
"""系统内置Redis键名枚举"""
|
|
|
|
ACCESS_TOKEN = {"key": "access_token", "remark": "登录令牌信息"}
|
|
REFRESH_TOKEN = {"key": "refresh_token", "remark": "刷新令牌信息"}
|
|
USER_SESSION = {"key": "user_session", "remark": "用户会话信息"}
|
|
CAPTCHA_CODES = {"key": "captcha_codes", "remark": "图片验证码"}
|
|
SYSTEM_CONFIG = {"key": "system_config", "remark": "系统配置"}
|
|
TENANT_CONFIG = {"key": "tenant_config", "remark": "租户配置"}
|
|
SYSTEM_DICT = {"key": "system_dict", "remark": "数据字典"}
|
|
APSCHEDULER_LOCK_KEY = {
|
|
"key": "scheduler_job_lock",
|
|
"remark": "定时任务初始化锁",
|
|
}
|
|
AI_MODEL_CONFIG = {"key": "ai_model_config", "remark": "用户AI模型配置"}
|
|
|
|
@property
|
|
def key(self) -> str:
|
|
"""获取 Redis 键名。
|
|
|
|
返回:
|
|
- str: 键名字符串。
|
|
"""
|
|
return self.value.get("key", "")
|
|
|
|
@property
|
|
def remark(self) -> str:
|
|
"""获取 Redis 键说明。
|
|
|
|
返回:
|
|
- str: 说明文案。
|
|
"""
|
|
return self.value.get("remark", "")
|
|
|
|
|
|
class McpType(Enum):
|
|
"""Mcp 服务器类型"""
|
|
|
|
stdio = 0
|
|
sse = 1
|
|
|
|
|
|
class McpLLMProvider(Enum):
|
|
"""MCP 大语言模型供应商"""
|
|
|
|
openai = "openai"
|
|
deepseek = "deepseek"
|
|
anthropic = "anthropic"
|
|
gemini = "gemini"
|
|
qwen = "qwen"
|
|
|
|
|
|
@unique
|
|
class QueueEnum(str, Enum):
|
|
"""队列枚举"""
|
|
|
|
none = "None"
|
|
not_none = "not None"
|
|
date = "date"
|
|
month = "month"
|
|
like = "like"
|
|
eq = "eq"
|
|
in_ = "in"
|
|
between = "between"
|
|
ne = "!="
|
|
gt = ">"
|
|
ge = ">="
|
|
lt = "<"
|
|
le = "<="
|
|
|
|
|
|
class PermissionFilterStrategy(str, Enum):
|
|
"""权限过滤策略枚举
|
|
|
|
每个策略对应一种过滤实现,模型通过 ``__permission_strategy__`` 选择。
|
|
注意:``DATA_SCOPE`` 是 dispatcher(基于 ``data_scope`` 字段再分发到
|
|
5 个具体的 data_scope 子策略),其余是具体策略。
|
|
"""
|
|
|
|
DATA_SCOPE = "data_scope" # 数据范围权限分发器(默认)
|
|
MENU_AUTH = "menu_auth" # 菜单授权(用于 MenuModel,按角色-菜单绑定过滤)
|
|
DEPT_RELATION = "dept_relation" # 部门关联(用于 DeptModel、RoleModel,按所属部门过滤)
|
|
OWN = "own" # 仅本人数据
|
|
USER_BINDING = "user_binding" # 用户绑定角色(用于 RoleModel,仅显示当前用户绑定的角色)
|
|
|
|
|
|
@unique
|
|
class OrderTypeEnum(str, Enum):
|
|
"""订单类型"""
|
|
|
|
NEW = "new"
|
|
BUY = "buy"
|
|
RENEW = "renew"
|
|
UPGRADE = "upgrade"
|
|
DOWNGRADE = "downgrade"
|
|
|
|
|
|
@unique
|
|
class InvoiceTypeEnum(str, Enum):
|
|
"""发票类型"""
|
|
|
|
VAT_NORMAL = "vat_normal"
|
|
VAT_SPECIAL = "vat_special"
|
|
|
|
|
|
@unique
|
|
class TicketTypeEnum(str, Enum):
|
|
"""工单类型"""
|
|
|
|
SUGGESTION = "suggestion"
|
|
BUG = "bug"
|
|
OPTIMIZE = "optimize"
|
|
OTHER = "other"
|
|
|
|
|
|
@unique
|
|
class TenantStatusEnum(int, Enum):
|
|
"""租户状态枚举
|
|
|
|
状态流转:
|
|
NORMAL(正常) ←→ TRIAL(试用) ←→ ARREARS(欠费) → FROZEN(冻结) → CANCELLED(注销)
|
|
"""
|
|
|
|
NORMAL = 0
|
|
TRIAL = 1
|
|
ARREARS = 2
|
|
FROZEN = 3
|
|
CANCELLED = 4
|
|
|
|
|
|
# ==================== 系统返回码 ====================
|
|
|
|
|
|
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) -> None:
|
|
self._code = code
|
|
self._msg = msg
|
|
|
|
@property
|
|
def code(self) -> int:
|
|
return self._code
|
|
|
|
@property
|
|
def msg(self) -> str:
|
|
return self._msg
|