VWED_server/utils/component_manager.py
2025-04-30 16:57:46 +08:00

87 lines
3.4 KiB
Python

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
组件配置管理模块
负责加载和管理任务编辑器中使用的组件配置
"""
import os
import json
from typing import Dict, List, Any, Optional
from utils.logger import get_logger
logger = get_logger("utils.component_manager")
class ComponentManager:
"""组件配置管理类"""
def __init__(self) -> None:
"""初始化组件管理器"""
# 组件配置目录
self._components_dir = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'config', 'components')
# 组件类别缓存
self._components_cache: Dict[str, Any] = {}
# 组件类型映射
self._block_types: Dict[str, Any] = {}
# 按顺序排列的组件类别
self._ordered_categories: List[Dict[str, Any]] = []
# 加载所有组件
self._load_all_components()
def _load_all_components(self) -> None:
"""加载所有组件配置文件"""
try:
if not os.path.exists(self._components_dir):
logger.error(f"组件目录不存在: {self._components_dir}")
return
# 加载所有组件配置文件
for filename in os.listdir(self._components_dir):
if filename.endswith('.json'):
component_type = os.path.splitext(filename)[0]
file_path = os.path.join(self._components_dir, filename)
try:
with open(file_path, 'r', encoding='utf-8') as f:
component_data = json.load(f)
self._components_cache[component_type] = component_data
# 记录每个block类型对应的信息
if 'blocks' in component_data:
for block in component_data['blocks']:
self._block_types[block['name']] = block
except Exception as e:
logger.error(f"加载组件配置文件失败: {file_path}, 错误: {str(e)}")
# 按order排序分类
ordered_categories = sorted(
[comp for comp in self._components_cache.values()],
key=lambda x: x.get('order', 999)
)
self._ordered_categories = ordered_categories
logger.info(f"已加载 {len(self._components_cache)} 个组件分类,共 {len(self._block_types)} 个组件类型")
except Exception as e:
logger.error(f"加载组件配置失败: {str(e)}")
def get_all_blocks(self) -> List[Dict[str, Any]]:
"""获取所有组件分类及其对应的组件"""
return self._ordered_categories
def get_block_type(self, block_type: str) -> Optional[Dict[str, Any]]:
"""获取指定类型的组件定义"""
return self._block_types.get(block_type)
def get_component_category(self, category: str) -> Optional[Dict[str, Any]]:
"""获取指定分类的组件配置"""
return self._components_cache.get(category)
def reload_components(self) -> None:
"""重新加载所有组件配置"""
self._components_cache = {}
self._block_types = {}
self._ordered_categories = []
self._load_all_components()
# 创建组件管理器单例
component_manager = ComponentManager()