diff --git a/backend/gateway/internal/ws/client.go b/backend/gateway/internal/ws/client.go index 503214c..489bab6 100644 --- a/backend/gateway/internal/ws/client.go +++ b/backend/gateway/internal/ws/client.go @@ -36,6 +36,47 @@ func NewClient(hub *Hub, conn *websocket.Conn) *Client { } } +// sendWs 发送 WebSocket 消息,自动生成 seq、cmd、timestamp +func (c *Client) sendWs(cmd string, data interface{}) error { + // 生成唯一请求ID + seq := "req_" + time.Now().Format("20060102150405") + "_" + generateRandomString(8) + + // 构建消息 + message := map[string]interface{}{ + "seq": seq, + "cmd": cmd, + "data": data, + "timestamp": time.Now().UnixMilli(), + } + + // 将消息转换为 JSON + msgBytes, err := json.Marshal(message) + if err != nil { + log.Printf("error marshaling message: %v", err) + return err + } + + // 写入 WebSocket 连接 + c.conn.SetWriteDeadline(time.Now().Add(writeWait)) + if err := c.conn.WriteMessage(websocket.TextMessage, msgBytes); err != nil { + log.Printf("error writing message: %v", err) + return err + } + + return nil +} + +// generateRandomString 生成随机字符串 +func generateRandomString(length int) string { + const charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" + result := make([]byte, length) + for i := range result { + result[i] = charset[time.Now().UnixNano()%int64(len(charset))] + time.Sleep(1 * time.Nanosecond) + } + return string(result) +} + func (c *Client) readPump() { defer func() { c.hub.unregister <- c @@ -244,14 +285,10 @@ func (c *Client) handleNewCommand(seq string, cmd string, data interface{}) { if !accountOk || !passwordOk { // 回复错误信息 - errorResponse := map[string]interface{}{ - "seq": seq, - "cmd": cmd, - "type": "error", - "content": "Invalid register command: missing account or password", - "timestamp": time.Now().UnixMilli(), - } - c.sendJSON(errorResponse) + c.sendWs(cmd, map[string]interface{}{ + "type": "error", + "content": "Invalid register command: missing account or password", + }) return } @@ -262,71 +299,42 @@ func (c *Client) handleNewCommand(seq string, cmd string, data interface{}) { resp, err := c.hub.userService.Register(nil, account, password) if err != nil { // 回复错误信息 - errorResponse := map[string]interface{}{ - "seq": seq, - "cmd": cmd, - "type": "error", - "content": "Register failed: " + err.Error(), - "timestamp": time.Now().UnixMilli(), - } - c.sendJSON(errorResponse) + c.sendWs(cmd, map[string]interface{}{ + "type": "error", + "content": "Register failed: " + err.Error(), + }) return } // 回复成功信息 - successResponse := map[string]interface{}{ - "seq": seq, - "cmd": cmd, - "type": "text", - "content": "Register successful", + c.sendWs(cmd, map[string]interface{}{ + "type": "text", + "content": "Register successful", "data": map[string]interface{}{ "user_id": resp.UserId, "account": resp.Account, "message": resp.Response.Message, "code": resp.Response.Code, }, - "timestamp": time.Now().UnixMilli(), - } - c.sendJSON(successResponse) + }) }() } else { // 回复错误信息 - errorResponse := map[string]interface{}{ - "seq": seq, - "cmd": cmd, - "type": "error", - "content": "User service not available", - "timestamp": time.Now().UnixMilli(), - } - c.sendJSON(errorResponse) + c.sendWs(cmd, map[string]interface{}{ + "type": "error", + "content": "User service not available", + }) } } return default: // 其他命令处理 - response := map[string]interface{}{ - "seq": seq, - "cmd": cmd, - "type": "text", - "content": "Command executed successfully", - "data": data, - "timestamp": time.Now().UnixMilli(), - } - c.sendJSON(response) + c.sendWs(cmd, map[string]interface{}{ + "type": "text", + "content": "Command executed successfully", + "data": data, + }) } } -func (c *Client) sendJSON(data interface{}) { - // 将数据转换为 JSON 并发送 - msgBytes, err := json.Marshal(data) - if err != nil { - log.Printf("error marshaling message: %v", err) - return - } - // 写入 WebSocket 连接 - c.conn.SetWriteDeadline(time.Now().Add(writeWait)) - if err := c.conn.WriteMessage(websocket.TextMessage, msgBytes); err != nil { - log.Printf("error writing message: %v", err) - } -}