From 9daff59ed75dcee4d9f92b2d2ac5c4c1aed4279f Mon Sep 17 00:00:00 2001 From: taoshihan <630892807@qq.com> Date: Sat, 26 Mar 2022 18:14:38 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=A2=E6=9C=8D=E7=BB=88=E7=AB=AF=E5=8F=AA?= =?UTF-8?q?=E5=85=81=E8=AE=B8=E4=B8=80=E4=B8=AA=E5=9C=A8=E7=BA=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/common.go | 2 +- controller/kefu.go | 4 +-- controller/main.go | 3 -- controller/message.go | 4 +-- controller/notice.go | 4 +-- static/js/chat-main.js | 11 +++++-- ws/user.go | 67 ++++++++++++------------------------------ ws/visitor.go | 4 +-- ws/ws.go | 2 +- 9 files changed, 36 insertions(+), 65 deletions(-) diff --git a/common/common.go b/common/common.go index c40c558..0b79b39 100644 --- a/common/common.go +++ b/common/common.go @@ -8,5 +8,5 @@ var ( Upload string = "static/upload/" Dir string = "config/" MysqlConf string = Dir + "mysql.json" - IsCompireTemplate bool = true //是否编译静态模板到二进制 + IsCompireTemplate bool = false //是否编译静态模板到二进制 ) diff --git a/controller/kefu.go b/controller/kefu.go index 3b58775..b2c27c0 100644 --- a/controller/kefu.go +++ b/controller/kefu.go @@ -114,8 +114,8 @@ func GetOtherKefuList(c *gin.Context) { item["nickname"] = kefu.Nickname item["avator"] = kefu.Avator item["status"] = "offline" - kefus, ok := ws.KefuList[kefu.Name] - if ok && len(kefus) != 0 { + kefu, ok := ws.KefuList[kefu.Name] + if ok && kefu != nil { item["status"] = "online" } result = append(result, item) diff --git a/controller/main.go b/controller/main.go index 2fe5a79..e1bbaef 100644 --- a/controller/main.go +++ b/controller/main.go @@ -113,9 +113,6 @@ func GetStatistics(c *gin.Context) { message := models.CountMessage() session := len(ws.ClientList) kefuNum := 0 - for _, kefus := range ws.KefuList { - kefuNum += len(kefus) - } c.JSON(200, gin.H{ "code": 200, "msg": "ok", diff --git a/controller/message.go b/controller/message.go index 36a85fc..f1319db 100644 --- a/controller/message.go +++ b/controller/message.go @@ -112,8 +112,8 @@ func SendMessageV2(c *gin.Context) { //ws.KefuMessage(vistorInfo.VisitorId, content, kefuInfo) go ws.SendServerJiang(vistorInfo.Name+"说", content, c.Request.Host) go SendAppGetuiPush(kefuInfo.Name, vistorInfo.Name, content) - kefus, ok := ws.KefuList[kefuInfo.Name] - if !ok || len(kefus) == 0 { + kefu, ok := ws.KefuList[kefuInfo.Name] + if !ok || kefu == nil{ go SendNoticeEmail(content+"|"+vistorInfo.Name, content) } go ws.VisitorAutoReply(vistorInfo, kefuInfo, content) diff --git a/controller/notice.go b/controller/notice.go index 8e894e1..6248609 100644 --- a/controller/notice.go +++ b/controller/notice.go @@ -24,10 +24,8 @@ func GetNotice(c *gin.Context) { result = append(result, h) } status := "online" - if kefus, ok := ws.KefuList[kefuId]; !ok { - if len(kefus) <= 0 { + if _, ok := ws.KefuList[kefuId]; !ok { status = "offline" - } } c.JSON(200, gin.H{ "code": 200, diff --git a/static/js/chat-main.js b/static/js/chat-main.js index 251bd03..09092d6 100644 --- a/static/js/chat-main.js +++ b/static/js/chat-main.js @@ -12,6 +12,7 @@ var app=new Vue({ server:getWsBaseUrl()+"/ws_kefu?token="+localStorage.getItem("token"), //server:getWsBaseUrl()+"/chat_server", socket:null, + socketClosed:false, messageContent:"", currentGuest:"", msgList:[], @@ -94,6 +95,14 @@ var app=new Vue({ OnMessage(e) { const redata = JSON.parse(e.data); switch (redata.type){ + case "close": + this.$message({ + message: "客服在其他地方登录,当前登录状态退出", + type: 'error' + }); + localStorage.removeItem("token"); + this.socket.close(); + break; case "inputing": this.handleInputing(redata.data); //this.sendKefuOnline(); @@ -162,8 +171,6 @@ var app=new Vue({ //接手客户 talkTo(guestId,name) { this.currentGuest = guestId; - //this.chatTitle=name+"|"+guestId+",正在处理中..."; - //发送给客户 let mes = {} mes.type = "kfConnect"; diff --git a/ws/user.go b/ws/user.go index 331be45..801401e 100644 --- a/ws/user.go +++ b/ws/user.go @@ -42,7 +42,6 @@ func NewKefuServer(c *gin.Context) { messageType, receive, err := conn.ReadMessage() if err != nil { log.Println(err) - go SendPingToKefuClient() return } @@ -55,53 +54,31 @@ func NewKefuServer(c *gin.Context) { } } func AddKefuToList(kefu *User) { - var newKefuConns = []*User{kefu} - kefuConns := KefuList[kefu.Id] - if kefuConns != nil { - for _, otherKefu := range kefuConns { - msg := TypeMessage{ - Type: "many pong", - } - str, _ := json.Marshal(msg) - err := otherKefu.Conn.WriteMessage(websocket.TextMessage, str) - if err == nil { - newKefuConns = append(newKefuConns, otherKefu) - } + oldUser, ok := KefuList[kefu.Id] + if oldUser != nil || ok { + msg := TypeMessage{ + Type: "close", + Data: kefu.Id, } - } - log.Println("xxxxxxxxxxxxxxxxxxxxxxxx", newKefuConns) - KefuList[kefu.Id] = newKefuConns -} - -//给超管发消息 -func SuperAdminMessage(str []byte) { - return - //给超管发 - for _, kefuUsers := range KefuList { - for _, kefuUser := range kefuUsers { - if kefuUser.Role_id == "2" { - kefuUser.Conn.WriteMessage(websocket.TextMessage, str) - } + str, _ := json.Marshal(msg) + if err := oldUser.Conn.WriteMessage(websocket.TextMessage, str); err != nil { + oldUser.Conn.Close() } } + KefuList[kefu.Id] = kefu } //给指定客服发消息 func OneKefuMessage(toId string, str []byte) { - //新版 - mKefuConns, ok := KefuList[toId] - if ok && len(mKefuConns) > 0 { - for _, kefu := range mKefuConns { + kefu, ok := KefuList[toId] + if ok{ log.Println("OneKefuMessage lock") kefu.Mux.Lock() defer kefu.Mux.Unlock() log.Println("OneKefuMessage unlock") error := kefu.Conn.WriteMessage(websocket.TextMessage, str) tools.Logger().Println("send_kefu_message", error, string(str)) - } } - - SuperAdminMessage(str) } func KefuMessage(visitorId, content string, kefuInfo models.User) { msg := TypeMessage{ @@ -126,22 +103,14 @@ func SendPingToKefuClient() { Type: "many pong", } str, _ := json.Marshal(msg) - for kefuId, kfConns := range KefuList { - var newKefuConns = []*User{} - for _, kefuConn := range kfConns { - if kefuConn == nil { - continue - } - kefuConn.Mux.Lock() - defer kefuConn.Mux.Unlock() - err := kefuConn.Conn.WriteMessage(websocket.TextMessage, str) - if err == nil { - newKefuConns = append(newKefuConns, kefuConn) - } + for kefuId, kefu := range KefuList { + if kefu == nil { + continue } - if len(newKefuConns) > 0 { - KefuList[kefuId] = newKefuConns - } else { + kefu.Mux.Lock() + defer kefu.Mux.Unlock() + err := kefu.Conn.WriteMessage(websocket.TextMessage, str) + if err == nil { delete(KefuList, kefuId) } } diff --git a/ws/visitor.go b/ws/visitor.go index 79a0175..4437c7f 100644 --- a/ws/visitor.go +++ b/ws/visitor.go @@ -161,7 +161,7 @@ func VisitorMessage(visitorId, content string, kefuInfo models.User) { visitor.Conn.WriteMessage(websocket.TextMessage, str) } func VisitorAutoReply(vistorInfo models.Visitor, kefuInfo models.User, content string) { - kefus, ok := KefuList[kefuInfo.Name] + kefu, ok := KefuList[kefuInfo.Name] reply := models.FindReplyItemByUserIdTitle(kefuInfo.Name, content) if reply.Content != "" { time.Sleep(1 * time.Second) @@ -169,7 +169,7 @@ func VisitorAutoReply(vistorInfo models.Visitor, kefuInfo models.User, content s KefuMessage(vistorInfo.VisitorId, reply.Content, kefuInfo) models.CreateMessage(kefuInfo.Name, vistorInfo.VisitorId, reply.Content, "kefu") } - if !ok || len(kefus) == 0 { + if !ok || kefu == nil { time.Sleep(1 * time.Second) welcome := models.FindWelcomeByUserIdKey(kefuInfo.Name, "offline") if welcome.Content == "" || reply.Content != "" { diff --git a/ws/ws.go b/ws/ws.go index 1c16de6..df91a51 100644 --- a/ws/ws.go +++ b/ws/ws.go @@ -51,7 +51,7 @@ type ClientMessage struct { } var ClientList = make(map[string]*User) -var KefuList = make(map[string][]*User) +var KefuList = make(map[string]*User) var message = make(chan *Message, 10) var upgrader = websocket.Upgrader{} var Mux sync.RWMutex