feat: 数据库架构优化 v1.3.0

- 恢复MySQL主数据库配置,SQLite作为备份系统
- 修复工单详情API的数据库会话管理问题
- 新增备份管理系统(backup_manager.py)
- 添加备份管理API接口(/api/backup/*)
- 更新系统架构图和版本信息
- 完善README文档和更新日志

主要改进:
- MySQL作为主数据库存储所有业务数据
- SQLite文件作为数据备份和恢复使用
- 自动备份MySQL数据到SQLite文件
- 支持数据恢复和备份状态监控
This commit is contained in:
赵杰 Jie Zhao (雄狮汽车科技)
2025-09-17 17:27:46 +01:00
parent bb1956ed6c
commit d75199b234
4 changed files with 381 additions and 9 deletions

View File

@@ -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()