| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176 |
- """
- 系统配置模型文件
- 定义系统配置表结构,用于存储和管理系统的各种配置参数,
- 包括服务器配置、业务参数、数据源配置等,支持热更新和权限控制
- """
- 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'<SystemConfig {self.parameter_name}: {self.current_value}>'
- 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
|