import os import json import logging class ConfigLoader: """配置加载器,用于加载和管理应用配置""" _instance = None @classmethod def get_instance(cls): """获取单例实例""" if cls._instance is None: cls._instance = ConfigLoader() return cls._instance def __init__(self): """初始化配置加载器""" self.config = {} self.config_file = os.path.join('config', 'app_config.json') # 创建配置目录(如果不存在) os.makedirs('config', exist_ok=True) # 加载配置 self.load_config() def load_config(self): """加载配置文件""" try: if os.path.exists(self.config_file): with open(self.config_file, 'r', encoding='utf-8') as f: self.config = json.load(f) logging.info(f"已加载配置文件: {self.config_file}") else: # 创建默认配置 self.config = { "app": { "name": "腾智微丝产线包装系统", "version": "1.0.0", "features": { "enable_serial_ports": False, "enable_keyboard_listener": False } }, "database": { "type": "sqlite", "path": "db/jtDB.db", "host": "", "port": "", "user": "", "password": "", "name": "" } } # 保存默认配置 self.save_config() logging.info(f"已创建默认配置文件: {self.config_file}") except Exception as e: logging.error(f"加载配置文件失败: {e}") # 使用默认配置 self.config = { "app": { "name": "腾智微丝产线包装系统", "version": "1.0.0", "features": { "enable_serial_ports": False, "enable_keyboard_listener": False } } } def save_config(self): """保存配置到文件""" try: with open(self.config_file, 'w', encoding='utf-8') as f: json.dump(self.config, f, indent=4, ensure_ascii=False) logging.info(f"已保存配置文件: {self.config_file}") return True except Exception as e: logging.error(f"保存配置文件失败: {e}") return False def get_value(self, key_path, default=None): """ 获取配置值 Args: key_path: 配置键路径,例如 "app.features.enable_serial_ports" default: 默认值,如果配置项不存在则返回此值 Returns: 配置值或默认值 """ keys = key_path.split('.') value = self.config try: for key in keys: value = value[key] return value except (KeyError, TypeError): return default def set_value(self, key_path, value): """ 设置配置值 Args: key_path: 配置键路径,例如 "app.features.enable_serial_ports" value: 要设置的值 Returns: bool: 是否设置成功 """ keys = key_path.split('.') config = self.config # 遍历路径中的所有键,除了最后一个 for key in keys[:-1]: if key not in config: config[key] = {} config = config[key] # 设置最后一个键的值 config[keys[-1]] = value # 保存配置 return self.save_config() def get_config(self, key): """ 获取serial配置下的指定配置 Args: key: 配置键,例如'mdz', 'cz'等 Returns: dict: 配置值,未找到则返回None """ if 'serial' not in self.config: self.config['serial'] = {} if key not in self.config['serial']: return None return self.config['serial'][key] def set_config(self, key, config_data): """ 设置serial配置下的指定配置 Args: key: 配置键,例如'mdz', 'cz'等 config_data: 要设置的配置数据 Returns: bool: 是否设置成功 """ if 'serial' not in self.config: self.config['serial'] = {} self.config['serial'][key] = config_data # 这里不保存配置,等待调用save_config方法时一并保存 return True