From 200fa57b8bc70d4315904cb007a2ae8694e0ccc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=B6=E5=A3=AB=E6=B6=B5?= <630892807@qq.com> Date: Sat, 24 Oct 2020 12:03:48 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=87=E6=8D=A2=E4=B8=BA=E6=8B=86=E5=88=86?= =?UTF-8?q?=E5=90=8E=E7=9A=84=E6=96=B0=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- controller/response.go | 6 ++++ controller/visitor.go | 56 ++++++++++++++++++++++++++++++++++---- router/api.go | 1 + static/html/chat_main.html | 8 ++++-- static/html/chat_page.html | 2 +- static/js/chat-main.js | 44 +++++++++++++++++++++++------- static/js/chat-page.js | 34 +++++++++++++---------- ws/user.go | 12 ++++---- ws/visitor.go | 6 +++- 9 files changed, 129 insertions(+), 40 deletions(-) diff --git a/controller/response.go b/controller/response.go index cd63d15..d650fab 100644 --- a/controller/response.go +++ b/controller/response.go @@ -12,3 +12,9 @@ type ChatMessage struct { Name string `json:"name"` Avator string `json:"avator"` } +type VisitorOnline struct { + Uid string `json:"uid"` + Username string `json:"username"` + Avator string `json:"avator"` + LastMessage string `json:"last_message"` +} diff --git a/controller/visitor.go b/controller/visitor.go index 8fec8b4..fce8dec 100644 --- a/controller/visitor.go +++ b/controller/visitor.go @@ -8,6 +8,7 @@ import ( "github.com/taoshihan1991/imaptool/config" "github.com/taoshihan1991/imaptool/models" "github.com/taoshihan1991/imaptool/tools" + "github.com/taoshihan1991/imaptool/ws" "log" "math/rand" "strconv" @@ -63,7 +64,7 @@ func PostVisitorLogin(c *gin.Context) { ipcity := tools.ParseIp(c.ClientIP()) avator := fmt.Sprintf("/static/images/%d.jpg", rand.Intn(14)) toId := c.PostForm("to_id") - id := c.PostForm("id") + id := c.PostForm("visitor_id") if id == "" { id = tools.Uuid() } @@ -184,13 +185,13 @@ func GetVisitorMessage(c *gin.Context) { func GetVisitorOnlines(c *gin.Context) { users := make([]map[string]string, 0) visitorIds := make([]string, 0) - for uid, visitor := range clientList { + for uid, visitor := range ws.ClientList { userInfo := make(map[string]string) userInfo["uid"] = uid - userInfo["name"] = visitor.name - userInfo["avator"] = visitor.avator + userInfo["name"] = visitor.Name + userInfo["avator"] = visitor.Avator users = append(users, userInfo) - visitorIds = append(visitorIds, visitor.id) + visitorIds = append(visitorIds, visitor.Id) } //查询最新消息 @@ -216,3 +217,48 @@ func GetVisitorOnlines(c *gin.Context) { }, }) } + +// @Summary 获取客服的在线访客列表接口 +// @Produce json +// @Success 200 {object} controller.Response +// @Failure 200 {object} controller.Response +// @Router /visitors_kefu_online [get] +func GetKefusVisitorOnlines(c *gin.Context) { + kefuName, _ := c.Get("kefu_name") + users := make([]*VisitorOnline, 0) + visitorIds := make([]string, 0) + for uid, visitor := range ws.ClientList { + if visitor.To_id != kefuName { + continue + } + userInfo := new(VisitorOnline) + userInfo.Uid = uid + userInfo.Username = visitor.Name + userInfo.Avator = visitor.Avator + users = append(users, userInfo) + visitorIds = append(visitorIds, visitor.Id) + } + + //查询最新消息 + messages := models.FindLastMessage(visitorIds) + temp := make(map[string]string, 0) + for _, mes := range messages { + temp[mes.VisitorId] = mes.Content + } + for _, user := range users { + user.LastMessage = temp[user.Uid] + if user.LastMessage == "" { + user.LastMessage = "新访客" + } + } + + tcps := make([]string, 0) + for ip, _ := range clientTcpList { + tcps = append(tcps, ip) + } + c.JSON(200, gin.H{ + "code": 200, + "msg": "ok", + "result": users, + }) +} diff --git a/router/api.go b/router/api.go index dcb73e0..ae0fe57 100644 --- a/router/api.go +++ b/router/api.go @@ -50,6 +50,7 @@ func InitApiRouter(engine *gin.Engine) { engine.GET("/mysql", middleware.JwtApiMiddleware, middleware.RbacAuth, controller.MysqlGetConf) engine.POST("/mysql", middleware.JwtApiMiddleware, middleware.RbacAuth, controller.MysqlSetConf) engine.GET("/visitors_online", controller.GetVisitorOnlines) + engine.GET("/visitors_kefu_online", middleware.JwtApiMiddleware, controller.GetKefusVisitorOnlines) engine.GET("/clear_online_tcp", controller.DeleteOnlineTcp) engine.POST("/visitor_login", middleware.Ipblack, controller.PostVisitorLogin) engine.POST("/visitor", controller.PostVisitor) diff --git a/static/html/chat_main.html b/static/html/chat_main.html index 74e1616..c07c1ac 100644 --- a/static/html/chat_main.html +++ b/static/html/chat_main.html @@ -168,7 +168,11 @@ - 时间:<{visitor.created_at}> + 创建时间:<{visitor.created_at}> + + + + 访问时间:<{visitor.updated_at}> @@ -198,5 +202,5 @@ - + \ No newline at end of file diff --git a/static/html/chat_page.html b/static/html/chat_page.html index 4c2be06..46e2921 100644 --- a/static/html/chat_page.html +++ b/static/html/chat_page.html @@ -76,5 +76,5 @@ var KEFU_ID='{{.KEFU_ID}}'; var REFER='{{.Refer}}'; - + diff --git a/static/js/chat-main.js b/static/js/chat-main.js index 9b1335d..f8a145d 100644 --- a/static/js/chat-main.js +++ b/static/js/chat-main.js @@ -7,8 +7,8 @@ var app=new Vue({ rightTabActive:"visitorInfo", users:[], usersMap:[], - //server:getWsBaseUrl()+"/ws_kefu?token="+localStorage.getItem("token"), - server:getWsBaseUrl()+"/chat_server", + server:getWsBaseUrl()+"/ws_kefu?token="+localStorage.getItem("token"), + //server:getWsBaseUrl()+"/chat_server", socket:null, messageContent:"", currentGuest:"", @@ -182,7 +182,7 @@ var app=new Vue({ mes.from_id = this.kfConfig.id; mes.to_id = this.currentGuest; mes.content = this.messageContent; - $.post("/message",mes,function(){ + $.post("/2/message",mes,function(){ _this.messageContent = ""; }); @@ -198,7 +198,7 @@ var app=new Vue({ //处理当前在线用户列表 addOnlineUser:function (retData) { var flag=false; - retData.last_message="新访客"; + retData.last_message=retData.last_message; retData.status=1; retData.name=retData.username; for(let i=0;i"], data: { window:window, - server:getWsBaseUrl()+"/chat_server", + //server:getWsBaseUrl()+"/chat_server", + server:getWsBaseUrl()+"/ws_visitor", socket:null, msgList:[], messageContent:"", @@ -17,7 +18,7 @@ new Vue({ methods: { //初始化websocket initConn() { - let socket = new ReconnectingWebSocket(this.server);//创建Socket实例 + let socket = new ReconnectingWebSocket(this.server+"?visitor_id="+this.visitor.visitor_id);//创建Socket实例 socket.maxReconnectAttempts = 30; this.socket = socket this.socket.onmessage = this.OnMessage; @@ -28,11 +29,11 @@ new Vue({ }, OnOpen() { this.chatTitle="连接成功!" - let mes = {} - mes.type = "userInit"; - this.visitor.refer=REFER; - mes.data = this.visitor; - this.socket.send(JSON.stringify(mes)); + // let mes = {} + // mes.type = "userInit"; + // this.visitor.refer=REFER; + // mes.data = this.visitor; + // this.socket.send(JSON.stringify(mes)); }, OnMessage(e) { const redata = JSON.parse(e.data); @@ -107,7 +108,7 @@ new Vue({ mes.to_id = this.visitor.to_id; mes.content = this.messageContent; //发送消息 - $.post("/message",mes,function(res){ + $.post("/2/message",mes,function(res){ if(res.code!=200){ _this.$message({ message: res.msg, @@ -135,10 +136,13 @@ new Vue({ //获取当前用户信息 getUserInfo(){ let obj=this.getCache("visitor"); - if(!obj){ + var visitor_id="" + if(obj){ + visitor_id=obj.visitor_id; + } let _this=this; //发送消息 - $.post("/visitor_login",{refer:REFER,to_id:KEFU_ID,client_ip:returnCitySN["cip"],},function(res){ + $.post("/visitor_login",{visitor_id:visitor_id,refer:REFER,to_id:KEFU_ID,client_ip:returnCitySN["cip"],},function(res){ if(res.code!=200){ _this.$message({ message: res.msg, @@ -148,12 +152,13 @@ new Vue({ } _this.visitor=res.result; _this.setCache("visitor",res.result); + _this.getMesssagesByVisitorId(); _this.initConn(); }); - }else{ - this.visitor=obj; - this.initConn(); - } + // }else{ + // this.visitor=obj; + // this.initConn(); + // } }, //获取信息列表 getMesssagesByVisitorId(){ @@ -381,7 +386,6 @@ new Vue({ this.init(); this.getUserInfo(); //加载历史记录 - this.getMesssagesByVisitorId(); //this.msgList=this.getHistory(); //滚动底部 //this.scrollBottom(); diff --git a/ws/user.go b/ws/user.go index 1d9a774..446f50b 100644 --- a/ws/user.go +++ b/ws/user.go @@ -54,18 +54,18 @@ func AddKefuToList(kefu *User) { var newKefuConns = []*User{kefu} kefuConns := KefuList[kefu.Id] if kefuConns != nil { - for _, kefu := range kefuConns { + for _, otherKefu := range kefuConns { msg := TypeMessage{ - Type: "pong", + Type: "many pong", } str, _ := json.Marshal(msg) - err := kefu.Conn.WriteMessage(websocket.TextMessage, str) - if err != nil { - newKefuConns = append(newKefuConns, kefu) + err := otherKefu.Conn.WriteMessage(websocket.TextMessage, str) + if err == nil { + newKefuConns = append(newKefuConns, otherKefu) } } } - log.Println(newKefuConns) + log.Println("xxxxxxxxxxxxxxxxxxxxxxxx", newKefuConns) KefuList[kefu.Id] = newKefuConns } diff --git a/ws/visitor.go b/ws/visitor.go index a8078ab..ac2523c 100644 --- a/ws/visitor.go +++ b/ws/visitor.go @@ -74,11 +74,15 @@ func NewVisitorServer(c *gin.Context) { func AddVisitorToList(user *User) { //用户id对应的连接 ClientList[user.Id] = user - + lastMessage := models.FindLastMessageByVisitorId(user.Id) userInfo := make(map[string]string) userInfo["uid"] = user.Id userInfo["username"] = user.Name userInfo["avator"] = user.Avator + userInfo["last_message"] = lastMessage.Content + if userInfo["last_message"] == "" { + userInfo["last_message"] = "新访客" + } msg := TypeMessage{ Type: "userOnline", Data: userInfo,