system.py 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. """
  2. 系统配置模型文件
  3. 定义系统配置表结构,用于存储和管理系统的各种配置参数,
  4. 包括服务器配置、业务参数、数据源配置等,支持热更新和权限控制
  5. """
  6. from app.database.db_manager import db
  7. from datetime import datetime
  8. import json
  9. class SystemConfig(db.Model):
  10. """
  11. 系统配置表
  12. 用于统一管理系统中的各种配置参数,替代硬编码的配置值
  13. 支持不同类型的配置值(字符串、数字、布尔、列表等)
  14. 支持热更新标识和权限控制
  15. """
  16. __tablename__ = 'system_config'
  17. id = db.Column(db.Integer, primary_key=True, comment='ID')
  18. parameter_name = db.Column(db.String(100), unique=True, nullable=False, comment='参数名称,唯一标识符')
  19. current_value = db.Column(db.Text, comment='当前值,以字符串形式存储,根据参数类型解析')
  20. parameter_type = db.Column(db.String(20), nullable=False, comment='参数类型:int, float, string, bool, list, json')
  21. category = db.Column(db.String(50), nullable=False, comment='所属分类:服务器配置、业务配置等')
  22. code_location = db.Column(db.String(200), comment='代码位置:便于定位参数使用位置')
  23. description = db.Column(db.String(500), comment='参数说明:详细说明参数的作用')
  24. hot_update_support = db.Column(db.String(20), default='热更新', comment='热更新支持:热更新、需重启、不可更新')
  25. edit_permission = db.Column(db.String(20), default='管理员', comment='修改权限:系统、运维、管理员')
  26. importance_level = db.Column(db.String(10), default='中', comment='重要程度:高、中、低')
  27. notes = db.Column(db.String(500), comment='备注:额外说明信息')
  28. created_time = db.Column(db.DateTime, default=datetime.now, comment='创建时间')
  29. updated_time = db.Column(db.DateTime, default=datetime.now, onupdate=datetime.now, comment='最后更新时间')
  30. is_active = db.Column(db.Boolean, default=True, comment='是否启用')
  31. def __repr__(self):
  32. return f'<SystemConfig {self.parameter_name}: {self.current_value}>'
  33. def to_dict(self):
  34. """转换为字典格式"""
  35. return {
  36. 'id': self.id,
  37. 'parameter_name': self.parameter_name,
  38. 'current_value': self.current_value,
  39. 'parameter_type': self.parameter_type,
  40. 'category': self.category,
  41. 'code_location': self.code_location,
  42. 'description': self.description,
  43. 'hot_update_support': self.hot_update_support,
  44. 'edit_permission': self.edit_permission,
  45. 'importance_level': self.importance_level,
  46. 'notes': self.notes,
  47. 'created_time': self.created_time.isoformat() if self.created_time else None,
  48. 'updated_time': self.updated_time.isoformat() if self.updated_time else None,
  49. 'is_active': self.is_active
  50. }
  51. def get_typed_value(self):
  52. """
  53. 根据参数类型返回正确类型的值
  54. Returns:
  55. 根据parameter_type返回对应类型的值
  56. """
  57. if self.current_value is None:
  58. return None
  59. # 对于字符串类型,允许空字符串
  60. if self.parameter_type == 'string':
  61. return str(self.current_value)
  62. if not self.current_value:
  63. return None
  64. try:
  65. if self.parameter_type == 'int':
  66. return int(self.current_value)
  67. elif self.parameter_type == 'float':
  68. return float(self.current_value)
  69. elif self.parameter_type == 'bool':
  70. return self.current_value.upper() in ['TRUE', 'YES', '1', 'ON']
  71. elif self.parameter_type == 'list':
  72. # 处理简单列表格式,如 [item1,item2,item3]
  73. if self.current_value.startswith('[') and self.current_value.endswith(']'):
  74. content = self.current_value[1:-1] # 去掉方括号
  75. if content.strip():
  76. return [item.strip() for item in content.split(',')]
  77. else:
  78. return []
  79. else:
  80. # 如果不是方括号格式,尝试用逗号分割
  81. return [item.strip() for item in self.current_value.split(',')]
  82. elif self.parameter_type == 'json':
  83. return json.loads(self.current_value)
  84. else: # string 或其他类型
  85. return str(self.current_value)
  86. except (ValueError, TypeError, json.JSONDecodeError) as e:
  87. # 如果转换失败,记录错误并返回原始字符串
  88. print(f"配置参数 {self.parameter_name} 类型转换失败: {e}")
  89. return str(self.current_value)
  90. def set_typed_value(self, value):
  91. """
  92. 设置值,自动转换为字符串存储
  93. Args:
  94. value: 要设置的值,任意类型
  95. """
  96. if value is None:
  97. self.current_value = None
  98. return
  99. if self.parameter_type == 'list':
  100. # 列表格式化为 [item1,item2,item3]
  101. if isinstance(value, (list, tuple)):
  102. self.current_value = '[' + ','.join(str(item) for item in value) + ']'
  103. else:
  104. self.current_value = str(value)
  105. elif self.parameter_type == 'json':
  106. self.current_value = json.dumps(value, ensure_ascii=False)
  107. elif self.parameter_type == 'bool':
  108. self.current_value = 'TRUE' if value else 'FALSE'
  109. else:
  110. self.current_value = str(value)
  111. self.updated_time = datetime.now()
  112. @staticmethod
  113. def get_config_value(parameter_name, default_value=None):
  114. """
  115. 静态方法:根据参数名获取配置值
  116. Args:
  117. parameter_name: 参数名称
  118. default_value: 默认值
  119. Returns:
  120. 配置的实际类型值,如果不存在则返回默认值
  121. """
  122. config = SystemConfig.query.filter_by(
  123. parameter_name=parameter_name,
  124. is_active=True
  125. ).first()
  126. if config:
  127. return config.get_typed_value()
  128. else:
  129. return default_value
  130. @staticmethod
  131. def set_config_value(parameter_name, value):
  132. """
  133. 静态方法:设置配置值
  134. Args:
  135. parameter_name: 参数名称
  136. value: 要设置的值
  137. Returns:
  138. bool: 是否设置成功
  139. """
  140. config = SystemConfig.query.filter_by(parameter_name=parameter_name).first()
  141. if config:
  142. config.set_typed_value(value)
  143. try:
  144. db.session.commit()
  145. return True
  146. except Exception as e:
  147. db.session.rollback()
  148. print(f"设置配置参数 {parameter_name} 失败: {e}")
  149. return False
  150. else:
  151. print(f"配置参数 {parameter_name} 不存在")
  152. return False