From a603c88a070c8e0d00d8393f341e6023c8d7b2fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=B6=E5=A3=AB=E6=B6=B5?= <630892807@qq.com> Date: Wed, 21 Oct 2020 22:01:45 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E8=B7=A8=E5=9F=9Fws?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- controller/chat.go | 20 +++++---- router/api.go | 5 ++- websocket/visitor.go | 1 - {websocket => ws}/user.go | 21 ++++----- ws/visitor.go | 95 +++++++++++++++++++++++++++++++++++++++ {websocket => ws}/ws.go | 8 +++- 6 files changed, 128 insertions(+), 22 deletions(-) delete mode 100644 websocket/visitor.go rename {websocket => ws}/user.go (86%) create mode 100644 ws/visitor.go rename {websocket => ws}/ws.go (90%) diff --git a/controller/chat.go b/controller/chat.go index 80bd17e..decebba 100644 --- a/controller/chat.go +++ b/controller/chat.go @@ -5,7 +5,7 @@ import ( "github.com/gin-gonic/gin" "github.com/gorilla/websocket" "github.com/taoshihan1991/imaptool/models" - myws "github.com/taoshihan1991/imaptool/websocket" + "github.com/taoshihan1991/imaptool/ws" "log" "sort" "time" @@ -276,6 +276,16 @@ func singleBroadcaster() { Data: userInfo, } str, _ := json.Marshal(msg) + + //新版 + mKefuConns := ws.KefuList[user.to_id] + if mKefuConns != nil { + for _, kefu := range mKefuConns { + kefu.Conn.WriteMessage(websocket.TextMessage, str) + } + } + + //兼容旧版 kefuConns := kefuList[user.to_id] if kefuConns != nil { for k, kefuConn := range kefuConns { @@ -283,13 +293,7 @@ func singleBroadcaster() { kefuConn.WriteMessage(websocket.TextMessage, str) } } - mKefuConns := myws.KefuList[user.to_id] - if mKefuConns != nil { - for k, kefu := range mKefuConns { - log.Println(k, "xxxxxxxx") - kefu.Conn.WriteMessage(websocket.TextMessage, str) - } - } + //客户上线发微信通知 go SendServerJiang(userInfo["username"]) sendPingOnlineUsers() diff --git a/router/api.go b/router/api.go index a45b984..8526364 100644 --- a/router/api.go +++ b/router/api.go @@ -4,7 +4,7 @@ import ( "github.com/gin-gonic/gin" "github.com/taoshihan1991/imaptool/controller" "github.com/taoshihan1991/imaptool/middleware" - "github.com/taoshihan1991/imaptool/websocket" + "github.com/taoshihan1991/imaptool/ws" ) func InitApiRouter(engine *gin.Engine) { @@ -14,7 +14,8 @@ func InitApiRouter(engine *gin.Engine) { engine.POST("/check_auth", middleware.JwtApiMiddleware, controller.MainCheckAuth) //前后聊天 engine.GET("/chat_server", middleware.Ipblack, controller.NewChatServer) - engine.GET("/ws_kefu", middleware.JwtApiMiddleware, websocket.NewKefuServer) + engine.GET("/ws_kefu", middleware.JwtApiMiddleware, ws.NewKefuServer) + engine.GET("/ws_visitor", ws.NewVisitorServer) //获取消息 engine.GET("/messages", controller.GetVisitorMessage) diff --git a/websocket/visitor.go b/websocket/visitor.go deleted file mode 100644 index 708bc8c..0000000 --- a/websocket/visitor.go +++ /dev/null @@ -1 +0,0 @@ -package websocket diff --git a/websocket/user.go b/ws/user.go similarity index 86% rename from websocket/user.go rename to ws/user.go index 14be27e..5384992 100644 --- a/websocket/user.go +++ b/ws/user.go @@ -1,4 +1,4 @@ -package websocket +package ws import ( "encoding/json" @@ -25,6 +25,14 @@ func NewKefuServer(c *gin.Context) { log.Print("upgrade:", err) return } + //获取GET参数,创建WS + var kefu User + kefu.Id = kefuInfo.Name + kefu.Name = kefuInfo.Nickname + kefu.Avator = kefuInfo.Avator + kefu.Conn = conn + AddKefuToList(&kefu) + for { //接受消息 var receive []byte @@ -34,14 +42,6 @@ func NewKefuServer(c *gin.Context) { return } - //获取GET参数,创建WS - var kefu User - kefu.Id = kefuInfo.Name - kefu.Name = kefuInfo.Nickname - kefu.Avator = kefuInfo.Avator - kefu.Conn = conn - AddKefuToList(&kefu) - message <- &Message{ conn: conn, content: receive, @@ -65,6 +65,7 @@ func AddKefuToList(kefu *User) { } } } + log.Println(newKefuConns) KefuList[kefu.Id] = newKefuConns } @@ -79,7 +80,7 @@ func kefuServerBackend() { continue } msgType := typeMsg.Type.(string) - log.Println("客户端:", msgType) + log.Println("客户端:", string(message.content)) switch msgType { //心跳 diff --git a/ws/visitor.go b/ws/visitor.go new file mode 100644 index 0000000..a8078ab --- /dev/null +++ b/ws/visitor.go @@ -0,0 +1,95 @@ +package ws + +import ( + "encoding/json" + "github.com/gin-gonic/gin" + "github.com/gorilla/websocket" + "github.com/taoshihan1991/imaptool/models" + "log" +) + +func NewVisitorServer(c *gin.Context) { + go kefuServerBackend() + conn, err := upgrader.Upgrade(c.Writer, c.Request, nil) + if err != nil { + log.Print("upgrade:", err) + return + } + //获取GET参数,创建WS + vistorInfo := models.FindVisitorByVistorId(c.Query("visitor_id")) + if vistorInfo.VisitorId == "" { + c.JSON(200, gin.H{ + "code": 400, + "msg": "访客不存在", + }) + return + } + user := &User{ + Conn: conn, + Name: vistorInfo.Name, + Avator: vistorInfo.Avator, + Id: vistorInfo.VisitorId, + To_id: vistorInfo.ToId, + } + AddVisitorToList(user) + + for { + //接受消息 + var receive []byte + messageType, receive, err := conn.ReadMessage() + if err != nil { + for uid, visitor := range ClientList { + if visitor.Conn == conn { + log.Println("删除用户", uid) + delete(ClientList, uid) + models.UpdateVisitorStatus(uid, 0) + userInfo := make(map[string]string) + userInfo["uid"] = uid + userInfo["name"] = visitor.Name + msg := TypeMessage{ + Type: "userOffline", + Data: userInfo, + } + str, _ := json.Marshal(msg) + kefuConns := KefuList[visitor.To_id] + if kefuConns != nil { + for _, kefuConn := range kefuConns { + kefuConn.Conn.WriteMessage(websocket.TextMessage, str) + } + } + } + } + log.Println(err) + return + } + + message <- &Message{ + conn: conn, + content: receive, + context: c, + messageType: messageType, + } + } +} +func AddVisitorToList(user *User) { + //用户id对应的连接 + ClientList[user.Id] = user + + userInfo := make(map[string]string) + userInfo["uid"] = user.Id + userInfo["username"] = user.Name + userInfo["avator"] = user.Avator + msg := TypeMessage{ + Type: "userOnline", + Data: userInfo, + } + str, _ := json.Marshal(msg) + + //新版 + mKefuConns := KefuList[user.To_id] + if mKefuConns != nil { + for _, kefu := range mKefuConns { + kefu.Conn.WriteMessage(websocket.TextMessage, str) + } + } +} diff --git a/websocket/ws.go b/ws/ws.go similarity index 90% rename from websocket/ws.go rename to ws/ws.go index 3edeaaa..0b5078d 100644 --- a/websocket/ws.go +++ b/ws/ws.go @@ -1,8 +1,9 @@ -package websocket +package ws import ( "github.com/gin-gonic/gin" "github.com/gorilla/websocket" + "net/http" ) type User struct { @@ -45,5 +46,10 @@ func init() { upgrader = websocket.Upgrader{ ReadBufferSize: 1024, WriteBufferSize: 1024, + // 解决跨域问题 + CheckOrigin: func(r *http.Request) bool { + return true + }, } + }