1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170
| import os import json from typing import Dict, Any, Optional from pathlib import Path import logging
class ConfigManager: """配置管理器""" def __init__(self, config_path: Optional[str] = None): self.config_path = config_path or self._get_default_config_path() self._config = self._load_config() def _get_default_config_path(self) -> str: """获取默认配置文件路径""" if os.getenv('STREAMLIT_SHARING'): return "/tmp/office_tools_config.json" else: return str(Path.home() / ".office_tools" / "config.json") def _load_config(self) -> Dict[str, Any]: """加载配置""" default_config = { "file_limits": { "max_file_size": 100 * 1024 * 1024, "max_batch_files": 10, "allowed_extensions": [".pdf", ".docx", ".xlsx", ".pptx"] }, "performance": { "enable_caching": True, "cache_size": 100, "max_workers": 3 }, "ui": { "theme": "light", "language": "zh-CN", "enable_analytics": False }, "api": { "timeout": 30, "retry_attempts": 3 } } try: if os.path.exists(self.config_path): with open(self.config_path, 'r', encoding='utf-8') as f: user_config = json.load(f) return self._deep_merge(default_config, user_config) except Exception as e: logging.warning(f"加载配置文件失败: {e}, 使用默认配置") return default_config def _deep_merge(self, base: Dict, update: Dict) -> Dict: """深度合并字典""" result = base.copy() for key, value in update.items(): if isinstance(value, dict) and key in result and isinstance(result[key], dict): result[key] = self._deep_merge(result[key], value) else: result[key] = value return result def get(self, key: str, default: Any = None) -> Any: """获取配置值""" keys = key.split('.') value = self._config try: for k in keys: value = value[k] return value except (KeyError, TypeError): return default def set(self, key: str, value: Any): """设置配置值""" keys = key.split('.') config = self._config for k in keys[:-1]: if k not in config: config[k] = {} config = config[k] config[keys[-1]] = value self._save_config() def _save_config(self): """保存配置到文件""" try: os.makedirs(os.path.dirname(self.config_path), exist_ok=True) with open(self.config_path, 'w', encoding='utf-8') as f: json.dump(self._config, f, indent=2, ensure_ascii=False) except Exception as e: logging.error(f"保存配置文件失败: {e}")
def create_config_ui(): """创建配置界面""" st.sidebar.title("⚙️ 系统配置") config_manager = ConfigManager() with st.sidebar.expander("📁 文件设置"): max_size = st.number_input( "最大文件大小 (MB)", min_value=1, max_value=500, value=config_manager.get("file_limits.max_file_size") // (1024 * 1024), help="单个文件的最大大小限制" ) config_manager.set("file_limits.max_file_size", max_size * 1024 * 1024) max_files = st.number_input( "最大批量文件数", min_value=1, max_value=50, value=config_manager.get("file_limits.max_batch_files"), help="批量处理时的最大文件数量" ) config_manager.set("file_limits.max_batch_files", max_files) with st.sidebar.expander("⚡ 性能设置"): enable_cache = st.checkbox( "启用缓存", value=config_manager.get("performance.enable_caching"), help="启用文件处理缓存提高性能" ) config_manager.set("performance.enable_caching", enable_cache) max_workers = st.slider( "最大工作线程", min_value=1, max_value=10, value=config_manager.get("performance.max_workers"), help="同时处理文件的最大线程数" ) config_manager.set("performance.max_workers", max_workers) with st.sidebar.expander("🎨 界面设置"): theme = st.selectbox( "主题", ["light", "dark"], index=0 if config_manager.get("ui.theme") == "light" else 1 ) config_manager.set("ui.theme", theme) language = st.selectbox( "语言", ["zh-CN", "en-US"], index=0 if config_manager.get("ui.language") == "zh-CN" else 1 ) config_manager.set("ui.language", language) return config_manager
|