feat: 优化数据分析页面,添加Excel工单导入功能
- 优化数据分析页面,添加可定制的图表功能 - 支持多种图表类型:折线图、柱状图、饼图、环形图、雷达图、极坐标图 - 添加图表定制功能:时间范围选择、数据维度选择 - 实现Excel工单导入功能,支持详情.xlsx文件 - 添加工单编辑功能,包括前端UI和后端API - 修复WebSocket连接错误,处理invalid Connection header问题 - 简化预警管理参数,改为卡片式选择 - 实现Agent主动调用,无需人工干预 - 改进知识库导入,结合累计工单内容与大模型输出
This commit is contained in:
@@ -213,6 +213,19 @@ class WebSocketServer:
|
||||
|
||||
async def handle_client(self, websocket: WebSocketServerProtocol, path: str):
|
||||
"""处理客户端连接"""
|
||||
# 检查连接头
|
||||
headers = websocket.request_headers
|
||||
connection = headers.get("Connection", "").lower()
|
||||
|
||||
# 处理不同的连接头格式
|
||||
if "upgrade" not in connection and "keep-alive" in connection:
|
||||
logger.warning(f"收到非标准连接头: {connection}")
|
||||
# 对于keep-alive连接头,我们仍然接受连接
|
||||
elif "upgrade" not in connection:
|
||||
logger.warning(f"连接头不包含upgrade: {connection}")
|
||||
await websocket.close(code=1002, reason="Invalid connection header")
|
||||
return
|
||||
|
||||
await self.register_client(websocket)
|
||||
|
||||
try:
|
||||
@@ -220,6 +233,8 @@ class WebSocketServer:
|
||||
await self.handle_message(websocket, message)
|
||||
except websockets.exceptions.ConnectionClosed:
|
||||
pass
|
||||
except Exception as e:
|
||||
logger.error(f"WebSocket连接错误: {e}")
|
||||
finally:
|
||||
await self.unregister_client(websocket)
|
||||
|
||||
@@ -227,9 +242,48 @@ class WebSocketServer:
|
||||
"""启动WebSocket服务器"""
|
||||
logger.info(f"启动WebSocket服务器: ws://{self.host}:{self.port}")
|
||||
|
||||
async with websockets.serve(self.handle_client, self.host, self.port):
|
||||
# 添加CORS支持
|
||||
async def handle_client_with_cors(websocket: WebSocketServerProtocol, path: str):
|
||||
# 设置CORS头
|
||||
if websocket.request_headers.get("Origin"):
|
||||
# 允许跨域连接
|
||||
pass
|
||||
await self.handle_client(websocket, path)
|
||||
|
||||
async with websockets.serve(
|
||||
handle_client_with_cors,
|
||||
self.host,
|
||||
self.port,
|
||||
# 添加额外的服务器选项
|
||||
process_request=self._process_request
|
||||
):
|
||||
await asyncio.Future() # 保持服务器运行
|
||||
|
||||
def _process_request(self, path, request_headers):
|
||||
"""处理HTTP请求,支持CORS"""
|
||||
# 检查是否是WebSocket升级请求
|
||||
if request_headers.get("Upgrade", "").lower() == "websocket":
|
||||
return None # 允许WebSocket连接
|
||||
|
||||
# 对于非WebSocket请求,返回简单的HTML页面
|
||||
return (
|
||||
200,
|
||||
[("Content-Type", "text/html; charset=utf-8")],
|
||||
b"""
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>WebSocket Server</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>WebSocket Server is running</h1>
|
||||
<p>This is a WebSocket server. Please use a WebSocket client to connect.</p>
|
||||
<p>WebSocket URL: ws://localhost:8765</p>
|
||||
</body>
|
||||
</html>
|
||||
"""
|
||||
)
|
||||
|
||||
def run(self):
|
||||
"""运行服务器"""
|
||||
asyncio.run(self.start_server())
|
||||
|
||||
Reference in New Issue
Block a user