feat: 数据库架构优化 v1.3.0
- 恢复MySQL主数据库配置,SQLite作为备份系统 - 修复工单详情API的数据库会话管理问题 - 新增备份管理系统(backup_manager.py) - 添加备份管理API接口(/api/backup/*) - 更新系统架构图和版本信息 - 完善README文档和更新日志 主要改进: - MySQL作为主数据库存储所有业务数据 - SQLite文件作为数据备份和恢复使用 - 自动备份MySQL数据到SQLite文件 - 支持数据恢复和备份状态监控
This commit is contained in:
@@ -29,7 +29,8 @@ from src.analytics.alert_system import AlertRule, AlertLevel, AlertType
|
||||
from src.dialogue.realtime_chat import RealtimeChatManager
|
||||
from src.vehicle.vehicle_data_manager import VehicleDataManager
|
||||
from src.core.database import db_manager
|
||||
from src.core.models import WorkOrder, Alert, Conversation, KnowledgeEntry, WorkOrderSuggestion
|
||||
from src.core.models import WorkOrder, Alert, Conversation, KnowledgeEntry, WorkOrderSuggestion, VehicleData
|
||||
from src.core.backup_manager import backup_manager
|
||||
|
||||
app = Flask(__name__)
|
||||
CORS(app)
|
||||
@@ -691,7 +692,8 @@ def get_workorder_details(workorder_id):
|
||||
"assistant_response": c.assistant_response,
|
||||
"timestamp": c.timestamp.isoformat() if c.timestamp else None
|
||||
})
|
||||
workorder = {
|
||||
# 在会话内构建工单数据
|
||||
workorder = {
|
||||
"id": w.id,
|
||||
"order_id": w.order_id,
|
||||
"title": w.title,
|
||||
@@ -704,8 +706,8 @@ def get_workorder_details(workorder_id):
|
||||
"resolution": w.resolution,
|
||||
"satisfaction_score": w.satisfaction_score,
|
||||
"conversations": conv_list
|
||||
}
|
||||
return jsonify(workorder)
|
||||
}
|
||||
return jsonify(workorder)
|
||||
except Exception as e:
|
||||
return jsonify({"error": str(e)}), 500
|
||||
|
||||
@@ -1339,6 +1341,80 @@ def test_model_response():
|
||||
except Exception as e:
|
||||
return jsonify({"success": False, "error": str(e)}), 500
|
||||
|
||||
# 数据库备份管理API
|
||||
@app.route('/api/backup/info')
|
||||
def get_backup_info():
|
||||
"""获取备份信息"""
|
||||
try:
|
||||
info = backup_manager.get_backup_info()
|
||||
return jsonify({
|
||||
"success": True,
|
||||
"backup_info": info
|
||||
})
|
||||
except Exception as e:
|
||||
return jsonify({"error": str(e)}), 500
|
||||
|
||||
@app.route('/api/backup/create', methods=['POST'])
|
||||
def create_backup():
|
||||
"""创建数据备份"""
|
||||
try:
|
||||
result = backup_manager.backup_all_data()
|
||||
return jsonify({
|
||||
"success": result["success"],
|
||||
"message": "备份创建成功" if result["success"] else "备份创建失败",
|
||||
"backup_result": result
|
||||
})
|
||||
except Exception as e:
|
||||
return jsonify({"error": str(e)}), 500
|
||||
|
||||
@app.route('/api/backup/restore', methods=['POST'])
|
||||
def restore_backup():
|
||||
"""从备份恢复数据"""
|
||||
try:
|
||||
data = request.get_json() or {}
|
||||
table_name = data.get('table_name') # 可选:指定恢复特定表
|
||||
|
||||
result = backup_manager.restore_from_backup(table_name)
|
||||
return jsonify({
|
||||
"success": result["success"],
|
||||
"message": "数据恢复成功" if result["success"] else "数据恢复失败",
|
||||
"restore_result": result
|
||||
})
|
||||
except Exception as e:
|
||||
return jsonify({"error": str(e)}), 500
|
||||
|
||||
@app.route('/api/database/status')
|
||||
def get_database_status():
|
||||
"""获取数据库状态信息"""
|
||||
try:
|
||||
# MySQL数据库状态
|
||||
mysql_status = {
|
||||
"type": "MySQL",
|
||||
"url": str(db_manager.engine.url).replace(db_manager.engine.url.password, "******") if db_manager.engine.url.password else str(db_manager.engine.url),
|
||||
"connected": db_manager.test_connection()
|
||||
}
|
||||
|
||||
# 统计MySQL数据
|
||||
with db_manager.get_session() as session:
|
||||
mysql_status["table_counts"] = {
|
||||
"work_orders": session.query(WorkOrder).count(),
|
||||
"conversations": session.query(Conversation).count(),
|
||||
"knowledge_entries": session.query(KnowledgeEntry).count(),
|
||||
"vehicle_data": session.query(VehicleData).count(),
|
||||
"alerts": session.query(Alert).count()
|
||||
}
|
||||
|
||||
# SQLite备份状态
|
||||
backup_info = backup_manager.get_backup_info()
|
||||
|
||||
return jsonify({
|
||||
"success": True,
|
||||
"mysql": mysql_status,
|
||||
"sqlite_backup": backup_info
|
||||
})
|
||||
except Exception as e:
|
||||
return jsonify({"error": str(e)}), 500
|
||||
|
||||
if __name__ == '__main__':
|
||||
import time
|
||||
app.config['START_TIME'] = time.time()
|
||||
|
||||
Reference in New Issue
Block a user