2025-09-06 21:06:18 +08:00
|
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
|
"""
|
2025-11-05 10:16:34 +08:00
|
|
|
|
TSP智能助手综合管理平台
|
2025-09-06 21:06:18 +08:00
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
|
|
import sys
|
|
|
|
|
|
import os
|
|
|
|
|
|
import logging
|
2025-09-10 23:13:08 +08:00
|
|
|
|
import threading
|
|
|
|
|
|
import asyncio
|
2025-09-06 21:06:18 +08:00
|
|
|
|
from datetime import datetime
|
|
|
|
|
|
|
|
|
|
|
|
# 添加项目根目录到Python路径
|
|
|
|
|
|
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
|
|
|
|
|
|
|
2026-02-11 00:08:09 +08:00
|
|
|
|
|
|
|
|
|
|
def setup_logging(start_time: str):
|
|
|
|
|
|
"""设置日志,按启动时间创建子目录"""
|
|
|
|
|
|
# 日志根目录
|
|
|
|
|
|
log_root = "logs"
|
|
|
|
|
|
# 以启动时间命名的子目录(避免路径中的空格和冒号)
|
|
|
|
|
|
safe_start_time = start_time.replace(" ", "_").replace(":", "-")
|
|
|
|
|
|
log_dir = os.path.join(log_root, safe_start_time)
|
|
|
|
|
|
os.makedirs(log_dir, exist_ok=True)
|
|
|
|
|
|
|
|
|
|
|
|
log_file_path = os.path.join(log_dir, "dashboard.log")
|
|
|
|
|
|
|
2025-09-06 21:06:18 +08:00
|
|
|
|
logging.basicConfig(
|
|
|
|
|
|
level=logging.INFO,
|
2026-02-11 00:08:09 +08:00
|
|
|
|
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
|
2025-09-06 21:06:18 +08:00
|
|
|
|
handlers=[
|
2026-02-11 00:08:09 +08:00
|
|
|
|
logging.FileHandler(log_file_path, encoding="utf-8"),
|
|
|
|
|
|
logging.StreamHandler(),
|
|
|
|
|
|
],
|
2025-09-06 21:06:18 +08:00
|
|
|
|
)
|
|
|
|
|
|
|
2025-09-10 23:13:08 +08:00
|
|
|
|
def start_websocket_server():
|
|
|
|
|
|
"""启动WebSocket服务器"""
|
|
|
|
|
|
try:
|
|
|
|
|
|
from src.web.websocket_server import WebSocketServer
|
|
|
|
|
|
server = WebSocketServer(host="localhost", port=8765)
|
|
|
|
|
|
server.run()
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
|
print(f"WebSocket服务器启动失败: {e}")
|
|
|
|
|
|
|
2025-12-08 00:53:23 +08:00
|
|
|
|
def check_database_connection():
|
|
|
|
|
|
"""检查数据库连接"""
|
|
|
|
|
|
try:
|
|
|
|
|
|
from src.core.database import db_manager
|
|
|
|
|
|
if db_manager.check_connection():
|
|
|
|
|
|
print("✓ 数据库连接正常")
|
|
|
|
|
|
return True
|
|
|
|
|
|
else:
|
|
|
|
|
|
print("✗ 数据库连接失败,请检查数据库配置和网络连接。")
|
|
|
|
|
|
return False
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
|
print(f"✗ 数据库连接检查出错: {e}")
|
|
|
|
|
|
return False
|
|
|
|
|
|
|
2025-09-06 21:06:18 +08:00
|
|
|
|
def main():
|
|
|
|
|
|
"""主函数"""
|
|
|
|
|
|
print("=" * 60)
|
|
|
|
|
|
print("TSP智能助手 - 综合管理平台")
|
|
|
|
|
|
print("=" * 60)
|
2026-02-11 00:08:09 +08:00
|
|
|
|
start_time = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
|
|
|
|
|
|
print(f"启动时间: {start_time}")
|
2025-09-06 21:06:18 +08:00
|
|
|
|
print()
|
2025-12-08 00:53:23 +08:00
|
|
|
|
|
2026-02-11 00:08:09 +08:00
|
|
|
|
# 设置日志(日志目录按启动时间区分)
|
|
|
|
|
|
setup_logging(start_time)
|
2025-09-06 21:06:18 +08:00
|
|
|
|
logger = logging.getLogger(__name__)
|
2025-12-08 00:53:23 +08:00
|
|
|
|
|
2025-09-06 21:06:18 +08:00
|
|
|
|
try:
|
|
|
|
|
|
# 检查必要目录
|
2026-02-11 00:08:09 +08:00
|
|
|
|
os.makedirs("logs", exist_ok=True)
|
|
|
|
|
|
os.makedirs("data", exist_ok=True)
|
2025-12-08 00:53:23 +08:00
|
|
|
|
|
2025-09-06 21:06:18 +08:00
|
|
|
|
logger.info("正在启动TSP智能助手综合管理平台...")
|
2025-12-08 00:53:23 +08:00
|
|
|
|
|
|
|
|
|
|
# 检查数据库连接
|
|
|
|
|
|
if not check_database_connection():
|
|
|
|
|
|
logger.error("数据库连接失败,退出启动")
|
|
|
|
|
|
print("请根据日志检查数据库配置和网络连接。")
|
|
|
|
|
|
sys.exit(1) # 数据库连接失败时直接退出
|
|
|
|
|
|
|
2025-09-18 19:57:35 +01:00
|
|
|
|
# 跳过系统检查,直接启动(避免重复初始化)
|
|
|
|
|
|
logger.info("跳过系统检查,直接启动服务...")
|
2025-12-08 00:53:23 +08:00
|
|
|
|
|
2025-09-06 21:06:18 +08:00
|
|
|
|
# 导入并启动Flask应用
|
|
|
|
|
|
from src.web.app import app
|
2026-02-11 00:08:09 +08:00
|
|
|
|
from src.config.unified_config import get_config
|
|
|
|
|
|
|
|
|
|
|
|
# 获取配置
|
|
|
|
|
|
config = get_config()
|
|
|
|
|
|
|
2025-09-06 21:06:18 +08:00
|
|
|
|
print()
|
|
|
|
|
|
print("访问地址:")
|
2026-02-11 00:08:09 +08:00
|
|
|
|
print(f" 主页: http://localhost:{config.server.port}")
|
|
|
|
|
|
print(f" 预警管理: http://localhost:{config.server.port}/alerts")
|
|
|
|
|
|
print(f" 实时对话: http://localhost:{config.server.port}/chat")
|
|
|
|
|
|
print(f" WebSocket: ws://localhost:{config.server.websocket_port}")
|
2025-09-06 21:06:18 +08:00
|
|
|
|
print()
|
|
|
|
|
|
print("按 Ctrl+C 停止服务")
|
|
|
|
|
|
print("=" * 60)
|
2026-02-11 00:08:09 +08:00
|
|
|
|
|
2025-09-10 23:13:08 +08:00
|
|
|
|
# 在单独线程中启动WebSocket服务器
|
|
|
|
|
|
websocket_thread = threading.Thread(target=start_websocket_server, daemon=True)
|
|
|
|
|
|
websocket_thread.start()
|
2026-02-11 00:08:09 +08:00
|
|
|
|
|
2025-09-06 21:06:18 +08:00
|
|
|
|
# 启动Flask应用
|
|
|
|
|
|
app.run(
|
2026-02-11 00:08:09 +08:00
|
|
|
|
debug=config.server.debug,
|
|
|
|
|
|
host=config.server.host,
|
|
|
|
|
|
port=config.server.port,
|
|
|
|
|
|
threaded=True,
|
|
|
|
|
|
use_reloader=False # 禁用重载器,避免重复启动WebSocket服务器
|
2025-09-06 21:06:18 +08:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
except KeyboardInterrupt:
|
|
|
|
|
|
print("\n正在停止服务...")
|
|
|
|
|
|
logger.info("用户手动停止服务")
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
|
print(f"启动失败: {e}")
|
|
|
|
|
|
logger.error(f"启动失败: {e}")
|
|
|
|
|
|
sys.exit(1)
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
|
|
main()
|