mirror of
https://github.com/fastapiadmin/FastapiAdmin.git
synced 2026-09-21 04:46:26 +00:00
refactor: 移除多租户和客户相关代码及功能
refactor: 统一状态字段为字符串类型并更新相关组件 refactor: 更新模型基类移除租户和客户相关字段 refactor: 简化数据权限控制逻辑 refactor: 优化类型注解使用Python 3.10+语法 refactor: 清理无用导入和注释 docs: 更新文档移除多租户相关内容
This commit is contained in:
@@ -6,10 +6,10 @@ from redis.asyncio.client import Redis
|
||||
|
||||
from app.common.request import PaginationService
|
||||
from app.common.response import StreamResponse, SuccessResponse
|
||||
from app.core.router_class import OperationLogRoute
|
||||
from app.utils.common_util import bytes2file_response
|
||||
from app.core.base_params import PaginationQueryParam
|
||||
from app.core.dependencies import AuthPermission, redis_getter
|
||||
from app.core.router_class import OperationLogRoute
|
||||
from app.core.logger import log
|
||||
|
||||
from ..auth.schema import AuthSchema
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from typing import Dict, List, Optional, Sequence, Union, Any
|
||||
from typing import Sequence
|
||||
|
||||
from app.core.base_crud import CRUDBase
|
||||
|
||||
@@ -22,47 +22,47 @@ class ParamsCRUD(CRUDBase[ParamsModel, ParamsCreateSchema, ParamsUpdateSchema]):
|
||||
self.auth = auth
|
||||
super().__init__(model=ParamsModel, auth=auth)
|
||||
|
||||
async def get_obj_by_id_crud(self, id: int, preload: Optional[List[Union[str, Any]]] = None) -> Optional[ParamsModel]:
|
||||
async def get_obj_by_id_crud(self, id: int, preload: list | None = None) -> ParamsModel | None:
|
||||
"""
|
||||
获取配置管理型详情
|
||||
|
||||
参数:
|
||||
- id (int): 配置管理型ID
|
||||
- preload (Optional[List[Union[str, Any]]]): 预加载关系,未提供时使用模型默认项
|
||||
- preload (list | None): 预加载关系,未提供时使用模型默认项
|
||||
|
||||
返回:
|
||||
- Optional[ParamsModel]: 配置管理型模型实例
|
||||
- ParamsModel | None: 配置管理型模型实例
|
||||
"""
|
||||
return await self.get(id=id, preload=preload)
|
||||
|
||||
async def get_obj_by_key_crud(self, key: str, preload: Optional[List[Union[str, Any]]] = None) -> Optional[ParamsModel]:
|
||||
async def get_obj_by_key_crud(self, key: str, preload: list | None = None) -> ParamsModel | None:
|
||||
"""
|
||||
根据key获取配置管理型详情
|
||||
|
||||
参数:
|
||||
- key (str): 配置管理型key
|
||||
- preload (Optional[List[Union[str, Any]]]): 预加载关系,未提供时使用模型默认项
|
||||
- preload (list | None): 预加载关系,未提供时使用模型默认项
|
||||
|
||||
返回:
|
||||
- Optional[ParamsModel]: 配置管理型模型实例
|
||||
- ParamsModel | None: 配置管理型模型实例
|
||||
"""
|
||||
return await self.get(config_key=key, preload=preload)
|
||||
|
||||
async def get_obj_list_crud(self, search: Optional[Dict] = None, order_by: Optional[List[Dict[str, str]]] = None, preload: Optional[List[Union[str, Any]]] = None) -> Sequence[ParamsModel]:
|
||||
async def get_obj_list_crud(self, search: dict | None = None, order_by: list | None = None, preload: list | None = None) -> Sequence[ParamsModel]:
|
||||
"""
|
||||
获取配置管理型列表
|
||||
|
||||
参数:
|
||||
- search (Dict | None): 查询参数对象。
|
||||
- order_by (List[Dict[str, str]] | None): 排序参数列表。
|
||||
- preload (Optional[List[Union[str, Any]]]): 预加载关系,未提供时使用模型默认项
|
||||
- search (dict | None): 查询参数对象。
|
||||
- order_by (list | None): 排序参数列表。
|
||||
- preload (list | None): 预加载关系,未提供时使用模型默认项
|
||||
|
||||
返回:
|
||||
- Sequence[ParamsModel]: 配置管理型模型实例列表
|
||||
"""
|
||||
return await self.list(search=search, order_by=order_by, preload=preload)
|
||||
|
||||
async def create_obj_crud(self, data: ParamsCreateSchema) -> Optional[ParamsModel]:
|
||||
async def create_obj_crud(self, data: ParamsCreateSchema) -> ParamsModel | None:
|
||||
"""
|
||||
创建配置管理型
|
||||
|
||||
@@ -70,11 +70,11 @@ class ParamsCRUD(CRUDBase[ParamsModel, ParamsCreateSchema, ParamsUpdateSchema]):
|
||||
- data (ParamsCreateSchema): 创建配置管理型负载模型
|
||||
|
||||
返回:
|
||||
- Optional[ParamsModel]: 配置管理型模型实例
|
||||
- ParamsModel | None: 配置管理型模型实例
|
||||
"""
|
||||
return await self.create(data=data)
|
||||
|
||||
async def update_obj_crud(self, id: int, data: ParamsUpdateSchema) -> Optional[ParamsModel]:
|
||||
async def update_obj_crud(self, id: int, data: ParamsUpdateSchema) -> ParamsModel | None:
|
||||
"""
|
||||
更新配置管理型
|
||||
|
||||
@@ -83,16 +83,16 @@ class ParamsCRUD(CRUDBase[ParamsModel, ParamsCreateSchema, ParamsUpdateSchema]):
|
||||
- data (ParamsUpdateSchema): 更新配置管理型负载模型
|
||||
|
||||
返回:
|
||||
- Optional[ParamsModel]: 配置管理型模型实例
|
||||
- ParamsModel | None: 配置管理型模型实例
|
||||
"""
|
||||
return await self.update(id=id, data=data)
|
||||
|
||||
async def delete_obj_crud(self, ids: List[int]) -> None:
|
||||
async def delete_obj_crud(self, ids: list[int]) -> None:
|
||||
"""
|
||||
删除配置管理型
|
||||
|
||||
参数:
|
||||
- ids (List[int]): 配置管理型ID列表
|
||||
- ids (list[int]): 配置管理型ID列表
|
||||
|
||||
返回:
|
||||
- None
|
||||
|
||||
@@ -9,26 +9,6 @@ from app.core.base_model import ModelMixin
|
||||
class ParamsModel(ModelMixin):
|
||||
"""
|
||||
参数配置表
|
||||
|
||||
参数配置隔离策略:
|
||||
=============
|
||||
- 系统级参数(tenant_id=NULL):
|
||||
* 平台级配置参数,影响所有租户
|
||||
* config_type=True表示系统内置,不可删除
|
||||
* 如:系统名称、Logo、邮件配置等
|
||||
|
||||
- 租户级参数(tenant_id>1):
|
||||
* 租户自定义配置参数,仅本租户生效
|
||||
* config_type=False表示可自定义
|
||||
* 如:租户LOGO、业务配置等
|
||||
|
||||
- 不需要customer_id:
|
||||
* 参数是租户级配置,不属于客户
|
||||
|
||||
用于存储系统配置参数,包括:
|
||||
- 系统级别参数
|
||||
- 租户级别参数
|
||||
- 配置项的名称、键、值和类型等信息
|
||||
"""
|
||||
__tablename__: str = "sys_param"
|
||||
__table_args__: dict[str, str] = ({'comment': '系统参数表'})
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from typing import Optional
|
||||
from pydantic import BaseModel, ConfigDict, Field, field_validator
|
||||
from fastapi import Query
|
||||
|
||||
@@ -10,13 +9,12 @@ from app.core.base_schema import BaseSchema
|
||||
|
||||
class ParamsCreateSchema(BaseModel):
|
||||
"""配置创建模型"""
|
||||
config_name: str = Field(..., max_length=500, description="参数名称")
|
||||
config_name: str = Field(..., max_length=64, description="参数名称")
|
||||
config_key: str = Field(..., max_length=500, description="参数键名")
|
||||
config_value: Optional[str] = Field(default=None, description="参数键值")
|
||||
config_value: str | None = Field(default=None, description="参数键值")
|
||||
config_type: bool = Field(default=False, description="系统内置(True:是 False:否)")
|
||||
status: str = Field(default="0", description="状态(True:正常 False:停用)")
|
||||
description: Optional[str] = Field(default=None, max_length=500, description="描述")
|
||||
|
||||
description: str | None = Field(default=None, max_length=500, description="描述")
|
||||
|
||||
@field_validator('config_key')
|
||||
@classmethod
|
||||
@@ -43,10 +41,11 @@ class ParamsQueryParam:
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
config_name: Optional[str] = Query(None, description="配置名称"),
|
||||
config_key: Optional[str] = Query(None, description="配置键名"),
|
||||
config_type: Optional[bool] = Query(None, description="系统内置((True:是 False:否))"),
|
||||
created_time: Optional[list[DateTimeStr]] = Query(None, description="创建时间范围", example=["2025-01-01 00:00:00", "2025-12-31 23:59:59"]),
|
||||
config_name: str | None = Query(None, description="配置名称"),
|
||||
config_key: str | None = Query(None, description="配置键名"),
|
||||
config_type: bool | None = Query(None, description="系统内置((True:是 False:否))"),
|
||||
created_time: list[DateTimeStr] | None = Query(None, description="创建时间范围", example=["2025-01-01 00:00:00", "2025-12-31 23:59:59"]),
|
||||
updated_time: list[DateTimeStr] | None = Query(None, description="更新时间范围", example=["2025-01-01 00:00:00", "2025-12-31 23:59:59"]),
|
||||
) -> None:
|
||||
|
||||
# 模糊查询字段
|
||||
@@ -59,5 +58,6 @@ class ParamsQueryParam:
|
||||
# 时间范围查询
|
||||
if created_time and len(created_time) == 2:
|
||||
self.created_time = ("between", (created_time[0], created_time[1]))
|
||||
|
||||
if updated_time and len(updated_time) == 2:
|
||||
self.updated_time = ("between", (updated_time[0], updated_time[1]))
|
||||
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import json
|
||||
from typing import Any, Dict, List, Optional
|
||||
|
||||
from redis.asyncio.client import Redis
|
||||
from fastapi import UploadFile
|
||||
from redis.asyncio.client import Redis
|
||||
@@ -26,7 +24,7 @@ class ParamsService:
|
||||
配置管理模块服务层
|
||||
"""
|
||||
@classmethod
|
||||
async def get_obj_detail_service(cls, auth: AuthSchema, id: int) -> Dict:
|
||||
async def get_obj_detail_service(cls, auth: AuthSchema, id: int) -> dict:
|
||||
"""
|
||||
获取配置详情
|
||||
|
||||
@@ -35,13 +33,13 @@ class ParamsService:
|
||||
- id (int): 配置管理型ID
|
||||
|
||||
返回:
|
||||
- Dict: 配置管理型模型实例字典表示
|
||||
- dict: 配置管理型模型实例字典表示
|
||||
"""
|
||||
obj = await ParamsCRUD(auth).get_obj_by_id_crud(id=id)
|
||||
return ParamsOutSchema.model_validate(obj).model_dump()
|
||||
|
||||
@classmethod
|
||||
async def get_obj_by_key_service(cls, auth: AuthSchema, config_key: str) -> Dict:
|
||||
async def get_obj_by_key_service(cls, auth: AuthSchema, config_key: str) -> dict:
|
||||
"""
|
||||
根据配置键获取配置详情
|
||||
|
||||
@@ -75,17 +73,17 @@ class ParamsService:
|
||||
return obj.config_value
|
||||
|
||||
@classmethod
|
||||
async def get_obj_list_service(cls, auth: AuthSchema, search: Optional[ParamsQueryParam] = None, order_by: Optional[List[Dict[str, str]]]= None) -> List[Dict]:
|
||||
async def get_obj_list_service(cls, auth: AuthSchema, search: ParamsQueryParam | None = None, order_by: list[dict] | None = None) -> list[dict]:
|
||||
"""
|
||||
获取配置管理型列表
|
||||
|
||||
参数:
|
||||
- auth (AuthSchema): 认证信息模型
|
||||
- search (ParamsQueryParam | None): 查询参数对象
|
||||
- order_by (List[Dict[str, str]] | None): 排序参数列表
|
||||
- order_by (list[dict] | None): 排序参数列表
|
||||
|
||||
返回:
|
||||
- List[Dict]: 配置管理型模型实例字典列表表示
|
||||
- list[dict]: 配置管理型模型实例字典列表表示
|
||||
"""
|
||||
obj_list = None
|
||||
if search:
|
||||
@@ -95,7 +93,7 @@ class ParamsService:
|
||||
return [ParamsOutSchema.model_validate(obj).model_dump() for obj in obj_list]
|
||||
|
||||
@classmethod
|
||||
async def create_obj_service(cls, auth: AuthSchema, redis: Redis, data: ParamsCreateSchema) -> Dict:
|
||||
async def create_obj_service(cls, auth: AuthSchema, redis: Redis, data: ParamsCreateSchema) -> dict:
|
||||
"""
|
||||
创建配置管理型
|
||||
|
||||
@@ -105,7 +103,7 @@ class ParamsService:
|
||||
- data (ParamsCreateSchema): 配置管理型创建模型
|
||||
|
||||
返回:
|
||||
- Dict: 新创建的配置管理型模型实例字典表示
|
||||
- dict: 新创建的配置管理型模型实例字典表示
|
||||
"""
|
||||
exist_obj = await ParamsCRUD(auth).get(config_key=data.config_key)
|
||||
if exist_obj:
|
||||
@@ -131,7 +129,7 @@ class ParamsService:
|
||||
return new_obj_dict
|
||||
|
||||
@classmethod
|
||||
async def update_obj_service(cls, auth: AuthSchema, redis: Redis, id:int, data: ParamsUpdateSchema) -> Dict:
|
||||
async def update_obj_service(cls, auth: AuthSchema, redis: Redis, id:int, data: ParamsUpdateSchema) -> dict:
|
||||
"""
|
||||
更新配置管理型
|
||||
|
||||
@@ -212,12 +210,12 @@ class ParamsService:
|
||||
raise CustomException(msg="删除字典类型失败")
|
||||
|
||||
@classmethod
|
||||
async def export_obj_service(cls, data_list: List[Dict[str, Any]]) -> bytes:
|
||||
async def export_obj_service(cls, data_list: list[dict]) -> bytes:
|
||||
"""
|
||||
导出系统配置列表
|
||||
|
||||
参数:
|
||||
- data_list (List[Dict[str, Any]]): 系统配置模型实例字典列表表示
|
||||
- data_list (list[dict]): 系统配置模型实例字典列表表示
|
||||
|
||||
返回:
|
||||
- bytes: Excel文件二进制数据
|
||||
@@ -232,7 +230,7 @@ class ParamsService:
|
||||
'created_time': '创建时间',
|
||||
'updated_time': '更新时间',
|
||||
'created_id': '创建者ID',
|
||||
'creator': '创建者',
|
||||
'updated_id': '更新者ID',
|
||||
}
|
||||
|
||||
# 复制数据并转换状态
|
||||
@@ -245,7 +243,7 @@ class ParamsService:
|
||||
return ExcelUtil.export_list2excel(list_data=data, mapping_dict=mapping_dict)
|
||||
|
||||
@classmethod
|
||||
async def upload_service(cls, base_url: str, file: UploadFile) -> Dict:
|
||||
async def upload_service(cls, base_url: str, file: UploadFile) -> dict:
|
||||
"""
|
||||
上传文件
|
||||
|
||||
@@ -254,7 +252,7 @@ class ParamsService:
|
||||
- file (UploadFile): 上传的文件对象
|
||||
|
||||
返回:
|
||||
- Dict: 上传文件的响应模型实例字典表示
|
||||
- dict: 上传文件的响应模型实例字典表示
|
||||
"""
|
||||
filename, filepath, file_url = await UploadUtil.upload_file(file=file, base_url=base_url)
|
||||
|
||||
@@ -301,7 +299,7 @@ class ParamsService:
|
||||
raise CustomException(msg="初始化系统配置失败")
|
||||
|
||||
@classmethod
|
||||
async def get_init_config_service(cls, redis: Redis) -> List[Dict]:
|
||||
async def get_init_config_service(cls, redis: Redis) -> list[dict]:
|
||||
"""
|
||||
获取系统配置
|
||||
|
||||
@@ -309,7 +307,7 @@ class ParamsService:
|
||||
- redis (Redis): Redis 客户端实例
|
||||
|
||||
返回:
|
||||
- List[Dict]: 系统配置模型实例字典列表表示
|
||||
- list[dict]: 系统配置模型实例字典列表表示
|
||||
"""
|
||||
redis_keys = await RedisCURD(redis).get_keys(f"{RedisInitKeyConfig.SYSTEM_CONFIG.key}:*")
|
||||
redis_configs = await RedisCURD(redis).mget(redis_keys)
|
||||
@@ -327,7 +325,7 @@ class ParamsService:
|
||||
return configs
|
||||
|
||||
@classmethod
|
||||
async def get_system_config_for_middleware(cls, redis: Redis) -> Dict[str, Any]:
|
||||
async def get_system_config_for_middleware(cls, redis: Redis) -> dict:
|
||||
"""
|
||||
获取中间件所需的系统配置
|
||||
|
||||
@@ -335,7 +333,7 @@ class ParamsService:
|
||||
- redis (Redis): Redis 客户端实例
|
||||
|
||||
返回:
|
||||
- Dict[str, Any]: 包含演示模式、IP白名单、API白名单和IP黑名单的配置字典
|
||||
- dict: 包含演示模式、IP白名单、API白名单和IP黑名单的配置字典
|
||||
"""
|
||||
# 定义需要获取的配置键
|
||||
config_keys = [
|
||||
|
||||
Reference in New Issue
Block a user