From 309ae70c4af1d07891bc7d2a3be161be6463bf4b Mon Sep 17 00:00:00 2001 From: Wu Clan Date: Wed, 30 Jul 2025 00:05:49 +0800 Subject: [PATCH] Simplify the plugin status update logic --- backend/app/admin/service/plugin_service.py | 12 +++------ backend/plugin/tools.py | 30 ++++++++++----------- 2 files changed, 19 insertions(+), 23 deletions(-) diff --git a/backend/app/admin/service/plugin_service.py b/backend/app/admin/service/plugin_service.py index 5f4225db..57157dc5 100644 --- a/backend/app/admin/service/plugin_service.py +++ b/backend/app/admin/service/plugin_service.py @@ -29,7 +29,7 @@ async def get_all() -> list[dict[str, Any]]: keys = [] result = [] - async for key in redis_client.scan_iter(f'{settings.PLUGIN_REDIS_PREFIX}:info:*'): + async for key in redis_client.scan_iter(f'{settings.PLUGIN_REDIS_PREFIX}:*'): keys.append(key) for info in await redis_client.mget(*keys): @@ -74,8 +74,7 @@ async def uninstall(*, plugin: str): await uninstall_requirements_async(plugin) bacup_dir = os.path.join(PLUGIN_DIR, f'{plugin}.{timezone.now().strftime("%Y%m%d%H%M%S")}.backup') shutil.move(plugin_dir, bacup_dir) - await redis_client.delete(f'{settings.PLUGIN_REDIS_PREFIX}:info:{plugin}') - await redis_client.hdel(f'{settings.PLUGIN_REDIS_PREFIX}:status', plugin) + await redis_client.delete(f'{settings.PLUGIN_REDIS_PREFIX}:{plugin}') await redis_client.set(f'{settings.PLUGIN_REDIS_PREFIX}:changed', 'ture') @staticmethod @@ -86,7 +85,7 @@ async def update_status(*, plugin: str): :param plugin: 插件名称 :return: """ - plugin_info = await redis_client.get(f'{settings.PLUGIN_REDIS_PREFIX}:info:{plugin}') + plugin_info = await redis_client.get(f'{settings.PLUGIN_REDIS_PREFIX}:{plugin}') if not plugin_info: raise errors.NotFoundError(msg='插件不存在') plugin_info = json.loads(plugin_info) @@ -98,10 +97,7 @@ async def update_status(*, plugin: str): else str(StatusType.disable.value) ) plugin_info['plugin']['enable'] = new_status - await redis_client.set( - f'{settings.PLUGIN_REDIS_PREFIX}:info:{plugin}', json.dumps(plugin_info, ensure_ascii=False) - ) - await redis_client.hset(f'{settings.PLUGIN_REDIS_PREFIX}:status', plugin, new_status) + await redis_client.set(f'{settings.PLUGIN_REDIS_PREFIX}:{plugin}', json.dumps(plugin_info, ensure_ascii=False)) @staticmethod async def build(*, plugin: str) -> io.BytesIO: diff --git a/backend/plugin/tools.py b/backend/plugin/tools.py index db9957f9..5d634171 100644 --- a/backend/plugin/tools.py +++ b/backend/plugin/tools.py @@ -130,10 +130,10 @@ def parse_plugin_config() -> tuple[list[dict[str, Any]], list[dict[str, Any]]]: current_redis_client = RedisCli() run_await(current_redis_client.open)() - run_await(current_redis_client.delete_prefix)(f'{settings.PLUGIN_REDIS_PREFIX}:info', exclude=plugins) - plugin_status = run_await(current_redis_client.hgetall)(f'{settings.PLUGIN_REDIS_PREFIX}:status') - if not plugin_status: - plugin_status = {} + # 清理未知插件信息 + run_await(current_redis_client.delete_prefix)( + settings.PLUGIN_REDIS_PREFIX, exclude=[f'{settings.PLUGIN_REDIS_PREFIX}:{key}' for key in plugins] + ) for plugin in plugins: data = load_plugin_config(plugin) @@ -164,16 +164,19 @@ def parse_plugin_config() -> tuple[list[dict[str, Any]], list[dict[str, Any]]]: app_plugins.append(data) # 补充插件信息 - data['plugin']['enable'] = plugin_status.setdefault(plugin, str(StatusType.enable.value)) + plugin_cache_info = run_await(current_redis_client.get)(f'{settings.PLUGIN_REDIS_PREFIX}:{plugin}') + if plugin_cache_info: + data['plugin']['enable'] = json.loads(plugin_cache_info)['plugin']['enable'] + else: + data['plugin']['enable'] = str(StatusType.enable.value) data['plugin']['name'] = plugin - # 缓存插件信息 + # 缓存最新插件信息 run_await(current_redis_client.set)( - f'{settings.PLUGIN_REDIS_PREFIX}:info:{plugin}', json.dumps(data, ensure_ascii=False) + f'{settings.PLUGIN_REDIS_PREFIX}:{plugin}', json.dumps(data, ensure_ascii=False) ) - # 缓存插件状态 - run_await(current_redis_client.hset)(f'{settings.PLUGIN_REDIS_PREFIX}:status', mapping=plugin_status) + # 重置插件变更状态 run_await(current_redis_client.delete)(f'{settings.PLUGIN_REDIS_PREFIX}:changed') return extend_plugins, app_plugins @@ -380,13 +383,10 @@ async def __call__(self, request: Request) -> None: :param request: FastAPI 请求对象 :return: """ - plugin_status = await redis_client.hgetall(f'{settings.PLUGIN_REDIS_PREFIX}:status') - if not plugin_status: + plugin_info = await redis_client.get(f'{settings.PLUGIN_REDIS_PREFIX}:{self.plugin}') + if not plugin_info: log.error('插件状态未初始化或丢失,需重启服务自动修复') raise PluginInjectError('插件状态未初始化或丢失,请联系系统管理员') - if self.plugin not in plugin_status: - log.error(f'插件 {self.plugin} 状态未初始化或丢失,需重启服务自动修复') - raise PluginInjectError(f'插件 {self.plugin} 状态未初始化或丢失,请联系系统管理员') - if not int(plugin_status.get(self.plugin)): + if not int(json.loads(plugin_info)['plugin']['enable']): raise errors.ServerError(msg=f'插件 {self.plugin} 未启用,请联系系统管理员')