""" 系统配置模型文件 定义系统配置表结构,用于存储和管理系统的各种配置参数, 包括服务器配置、业务参数、数据源配置等,支持热更新和权限控制 """ from app.database.db_manager import db from datetime import datetime import json class SystemConfig(db.Model): """ 系统配置表 用于统一管理系统中的各种配置参数,替代硬编码的配置值 支持不同类型的配置值(字符串、数字、布尔、列表等) 支持热更新标识和权限控制 """ __tablename__ = 'system_config' id = db.Column(db.Integer, primary_key=True, comment='ID') parameter_name = db.Column(db.String(100), unique=True, nullable=False, comment='参数名称,唯一标识符') current_value = db.Column(db.Text, comment='当前值,以字符串形式存储,根据参数类型解析') parameter_type = db.Column(db.String(20), nullable=False, comment='参数类型:int, float, string, bool, list, json') category = db.Column(db.String(50), nullable=False, comment='所属分类:服务器配置、业务配置等') code_location = db.Column(db.String(200), comment='代码位置:便于定位参数使用位置') description = db.Column(db.String(500), comment='参数说明:详细说明参数的作用') hot_update_support = db.Column(db.String(20), default='热更新', comment='热更新支持:热更新、需重启、不可更新') edit_permission = db.Column(db.String(20), default='管理员', comment='修改权限:系统、运维、管理员') importance_level = db.Column(db.String(10), default='中', comment='重要程度:高、中、低') notes = db.Column(db.String(500), comment='备注:额外说明信息') created_time = db.Column(db.DateTime, default=datetime.now, comment='创建时间') updated_time = db.Column(db.DateTime, default=datetime.now, onupdate=datetime.now, comment='最后更新时间') is_active = db.Column(db.Boolean, default=True, comment='是否启用') def __repr__(self): return f'' def to_dict(self): """转换为字典格式""" return { 'id': self.id, 'parameter_name': self.parameter_name, 'current_value': self.current_value, 'parameter_type': self.parameter_type, 'category': self.category, 'code_location': self.code_location, 'description': self.description, 'hot_update_support': self.hot_update_support, 'edit_permission': self.edit_permission, 'importance_level': self.importance_level, 'notes': self.notes, 'created_time': self.created_time.isoformat() if self.created_time else None, 'updated_time': self.updated_time.isoformat() if self.updated_time else None, 'is_active': self.is_active } def get_typed_value(self): """ 根据参数类型返回正确类型的值 Returns: 根据parameter_type返回对应类型的值 """ if self.current_value is None: return None # 对于字符串类型,允许空字符串 if self.parameter_type == 'string': return str(self.current_value) if not self.current_value: return None try: if self.parameter_type == 'int': return int(self.current_value) elif self.parameter_type == 'float': return float(self.current_value) elif self.parameter_type == 'bool': return self.current_value.upper() in ['TRUE', 'YES', '1', 'ON'] elif self.parameter_type == 'list': # 处理简单列表格式,如 [item1,item2,item3] if self.current_value.startswith('[') and self.current_value.endswith(']'): content = self.current_value[1:-1] # 去掉方括号 if content.strip(): return [item.strip() for item in content.split(',')] else: return [] else: # 如果不是方括号格式,尝试用逗号分割 return [item.strip() for item in self.current_value.split(',')] elif self.parameter_type == 'json': return json.loads(self.current_value) else: # string 或其他类型 return str(self.current_value) except (ValueError, TypeError, json.JSONDecodeError) as e: # 如果转换失败,记录错误并返回原始字符串 print(f"配置参数 {self.parameter_name} 类型转换失败: {e}") return str(self.current_value) def set_typed_value(self, value): """ 设置值,自动转换为字符串存储 Args: value: 要设置的值,任意类型 """ if value is None: self.current_value = None return if self.parameter_type == 'list': # 列表格式化为 [item1,item2,item3] if isinstance(value, (list, tuple)): self.current_value = '[' + ','.join(str(item) for item in value) + ']' else: self.current_value = str(value) elif self.parameter_type == 'json': self.current_value = json.dumps(value, ensure_ascii=False) elif self.parameter_type == 'bool': self.current_value = 'TRUE' if value else 'FALSE' else: self.current_value = str(value) self.updated_time = datetime.now() @staticmethod def get_config_value(parameter_name, default_value=None): """ 静态方法:根据参数名获取配置值 Args: parameter_name: 参数名称 default_value: 默认值 Returns: 配置的实际类型值,如果不存在则返回默认值 """ config = SystemConfig.query.filter_by( parameter_name=parameter_name, is_active=True ).first() if config: return config.get_typed_value() else: return default_value @staticmethod def set_config_value(parameter_name, value): """ 静态方法:设置配置值 Args: parameter_name: 参数名称 value: 要设置的值 Returns: bool: 是否设置成功 """ config = SystemConfig.query.filter_by(parameter_name=parameter_name).first() if config: config.set_typed_value(value) try: db.session.commit() return True except Exception as e: db.session.rollback() print(f"设置配置参数 {parameter_name} 失败: {e}") return False else: print(f"配置参数 {parameter_name} 不存在") return False