From b2cb6bd1ae01265e16f635ec48d37f823ad95530 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, 27 Jun 2020 19:32:10 +0800
Subject: [PATCH] =?UTF-8?q?=E5=AD=98=E5=82=A8=E8=AE=BF=E5=AE=A2=E6=95=B0?=
=?UTF-8?q?=E6=8D=AE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
config/go-fly.sql | 16 ++++++-
config/mysql.json | 7 +++
controller/chat.go | 87 ++++++++++++++++++++++----------------
controller/kefu.go | 4 +-
models/visitors.go | 31 ++++++++++++++
static/html/chat_main.html | 16 +++----
static/html/chat_page.html | 20 ++++-----
7 files changed, 124 insertions(+), 57 deletions(-)
create mode 100644 config/mysql.json
create mode 100644 models/visitors.go
diff --git a/config/go-fly.sql b/config/go-fly.sql
index 6b4839d..02f8603 100644
--- a/config/go-fly.sql
+++ b/config/go-fly.sql
@@ -8,4 +8,18 @@ CREATE TABLE `user` (
`deleted_at` timestamp NULL DEFAULT NULL,
`avator` varchar(100) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
-) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8
\ No newline at end of file
+) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
+
+CREATE TABLE `visitor` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `name` varchar(50) NOT NULL DEFAULT '',
+ `avator` varchar(500) NOT NULL DEFAULT '',
+ `source_ip` varchar(50) NOT NULL DEFAULT '',
+ `to_id` varchar(50) NOT NULL DEFAULT '',
+ `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ `deleted_at` timestamp NULL DEFAULT NULL,
+ `visitor_id` varchar(100) NOT NULL DEFAULT '',
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `visitor_id` (`visitor_id`)
+) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
\ No newline at end of file
diff --git a/config/mysql.json b/config/mysql.json
new file mode 100644
index 0000000..bfc2cdb
--- /dev/null
+++ b/config/mysql.json
@@ -0,0 +1,7 @@
+{
+ "Server":"127.0.0.1",
+ "Port":"3306",
+ "Database":"go-fly",
+ "Username":"go-fly",
+ "Password":"go-fly"
+}
diff --git a/controller/chat.go b/controller/chat.go
index 8befcbc..95f7790 100644
--- a/controller/chat.go
+++ b/controller/chat.go
@@ -4,6 +4,7 @@ import (
"encoding/json"
"github.com/gin-gonic/gin"
"github.com/gorilla/websocket"
+ "github.com/taoshihan1991/imaptool/models"
"log"
"time"
)
@@ -15,6 +16,7 @@ type vistor struct{
}
type Message struct{
conn *websocket.Conn
+ ip string
content []byte
}
var clientList = make(map[string]*vistor)
@@ -25,6 +27,15 @@ type TypeMessage struct {
Type interface{} `json:"type"`
Data interface{} `json:"data"`
}
+type ClientMessage struct {
+ Name string `json:"name"`
+ Avator string `json:"avator"`
+ Id string `json:"id"`
+ Group string `json:"group"`
+ Time string `json:"time"`
+ ToId string `json:"to_id"`
+ Content string `json:"content"`
+}
type KfMessage struct {
Kf_name string `json:"kf_name"`
Avatar string `json:"avatar"`
@@ -73,25 +84,26 @@ func NewChatServer(c *gin.Context){
message<-&Message{
conn:conn,
content: receive,
+ ip:c.ClientIP(),
}
}
}
//发送给客户客服上线
-func SendKefuOnline(kfMsg KfMessage, conn *websocket.Conn) {
+func SendKefuOnline(clientMsg ClientMessage, conn *websocket.Conn) {
sendMsg := TypeMessage{
Type: "kfOnline",
- Data: KfMessage{
- Kf_name: kfMsg.Kf_name,
- Avatar: kfMsg.Avatar,
- Kf_id: kfMsg.Kf_id,
- Kf_group: kfMsg.Kf_group,
+ Data: ClientMessage{
+ Name: clientMsg.Name,
+ Avator: clientMsg.Avator,
+ Id: clientMsg.Id,
+ Group: clientMsg.Group,
Time: time.Now().Format("2006-01-02 15:04:05"),
Content: "客服上线",
},
}
jsonStrByte, _ := json.Marshal(sendMsg)
- conn.WriteMessage(1,jsonStrByte)
+ conn.WriteMessage(websocket.TextMessage,jsonStrByte)
}
//定时给客户端发送消息判断客户端是否在线
@@ -150,8 +162,7 @@ func singleBroadcaster(){
for {
message:=<-message
var typeMsg TypeMessage
- var kfMsg KfMessage
- var userMsg UserMessage
+ var clientMsg ClientMessage
json.Unmarshal(message.content, &typeMsg)
conn:=message.conn
if typeMsg.Type == nil || typeMsg.Data == nil {
@@ -165,21 +176,23 @@ func singleBroadcaster(){
getOnlineUser(conn)
//用户上线
case "userInit":
- json.Unmarshal(msgData, &userMsg)
+ json.Unmarshal(msgData, &clientMsg)
//用户id对应的连接
user:=&vistor{
conn:conn,
- name: userMsg.From_name,
- avator: userMsg.From_avatar,
- id:userMsg.From_id,
+ name: clientMsg.Name,
+ avator: clientMsg.Avator,
+ id:clientMsg.Id,
}
- clientList[userMsg.From_id] = user
+ clientList[clientMsg.Id] = user
+ //插入数据表
+ models.CreateVisitor(clientMsg.Name,clientMsg.Avator,message.ip,clientMsg.ToId,clientMsg.Id)
SendNoticeToAllKefu()
//客服上线
case "kfOnline":
- json.Unmarshal(msgData, &kfMsg)
+ json.Unmarshal(msgData, &clientMsg)
//客服id对应的连接
- kefuList[kfMsg.Kf_id] = conn
+ kefuList[clientMsg.Id] = conn
//发送给客户
if len(clientList) == 0 {
break
@@ -191,12 +204,12 @@ func singleBroadcaster(){
//SendOnekfuAllNotice(w)
//客服接手
case "kfConnect":
- json.Unmarshal(msgData, &kfMsg)
- kefuList[kfMsg.Kf_id] = conn
- SendKefuOnline(kfMsg, clientList[kfMsg.Guest_id].conn)
+ json.Unmarshal(msgData, &clientMsg)
+ kefuList[clientMsg.Id] = conn
+ SendKefuOnline(clientMsg, clientList[clientMsg.ToId].conn)
case "kfChatMessage":
- json.Unmarshal(msgData, &kfMsg)
- guest,ok:=clientList[kfMsg.Guest_id]
+ json.Unmarshal(msgData, &clientMsg)
+ guest,ok:=clientList[clientMsg.ToId]
if guest==nil||!ok{
return
}
@@ -204,29 +217,31 @@ func singleBroadcaster(){
msg := TypeMessage{
Type: "kfChatMessage",
- Data: KfMessage{
- Kf_name: kfMsg.Kf_name,
- Avatar: kfMsg.Avatar,
- Kf_id: kfMsg.Kf_id,
+ Data: ClientMessage{
+ Name: clientMsg.Name,
+ Avator: clientMsg.Avator,
+ Id: clientMsg.Id,
Time: time.Now().Format("2006-01-02 15:04:05"),
- Guest_id: kfMsg.Guest_id,
- Content: kfMsg.Content,
+ ToId: clientMsg.ToId,
+ Content: clientMsg.Content,
},
}
str, _ := json.Marshal(msg)
conn.WriteMessage(websocket.TextMessage,str)
case "chatMessage":
- json.Unmarshal(msgData, &userMsg)
- conn := kefuList[userMsg.To_id]
+ json.Unmarshal(msgData, &clientMsg)
+ conn,ok := kefuList[clientMsg.ToId]
+ if conn==nil||!ok{
+ return
+ }
msg := TypeMessage{
Type: "chatMessage",
- Data: UserMessage{
- From_avatar: userMsg.From_avatar,
- From_id: userMsg.From_id,
- From_name: userMsg.From_name,
- To_id: userMsg.To_id,
- To_name: userMsg.To_name,
- Content: userMsg.Content,
+ Data: ClientMessage{
+ Avator: clientMsg.Avator,
+ Id: clientMsg.Id,
+ Name: clientMsg.Name,
+ ToId: clientMsg.ToId,
+ Content: clientMsg.Content,
Time: time.Now().Format("2006-01-02 15:04:05"),
},
}
diff --git a/controller/kefu.go b/controller/kefu.go
index 021a05d..0b54f13 100644
--- a/controller/kefu.go
+++ b/controller/kefu.go
@@ -9,8 +9,8 @@ func GetKefuInfo(c *gin.Context){
kefuId, _ := c.Get("kefu_id")
user:=models.FindUserById(kefuId)
info:=make(map[string]interface{})
- info["kf_name"]=user.Nickname
- info["kf_id"]=user.Name
+ info["name"]=user.Nickname
+ info["id"]=user.Name
info["avator"]=user.Avator
c.JSON(200, gin.H{
"code": 200,
diff --git a/models/visitors.go b/models/visitors.go
new file mode 100644
index 0000000..64bd62f
--- /dev/null
+++ b/models/visitors.go
@@ -0,0 +1,31 @@
+package models
+
+import "github.com/jinzhu/gorm"
+
+type Visitor struct {
+ gorm.Model
+ Name string
+ Avator string
+ SourceIp string
+ ToId string
+ VisitorId string
+}
+func CreateVisitor(name string,avator string,sourceIp string,toId string,visitorId string){
+ old:=FindVisitorByVistorId(visitorId)
+ if old.Name!=""{
+ return
+ }
+ v:=&Visitor{
+ Name:name,
+ Avator: avator,
+ SourceIp:sourceIp,
+ ToId:toId,
+ VisitorId: visitorId,
+ }
+ DB.Create(v)
+}
+func FindVisitorByVistorId(visitorId string)Visitor{
+ var v Visitor
+ DB.Where("visitor_id = ?", visitorId).First(&v)
+ return v
+}
\ No newline at end of file
diff --git a/static/html/chat_main.html b/static/html/chat_main.html
index acd9780..204aac4 100644
--- a/static/html/chat_main.html
+++ b/static/html/chat_main.html
@@ -122,10 +122,10 @@
msgListUser:[],
chatTitle:"暂时未处理咨询",
kfConfig:{
- kf_id : "kf_1",
- kf_name : "客服丽丽",
+ id : "kf_1",
+ name : "客服丽丽",
avatar : "",
- guest_id : "",
+ to_id : "",
}
},
methods: {
@@ -225,13 +225,13 @@
//发送给客户
let mes = {}
mes.type = "kfConnect";
- this.kfConfig.guest_id=guestId;
+ this.kfConfig.to_id=guestId;
mes.data = this.kfConfig;
this.socket.send(JSON.stringify(mes));
},
//发送给客户
chatToUser() {
- if(this.messageContent==""||this.guest_id==""){
+ if(this.messageContent==""||this.currentGuest==""){
return;
}
let mes = {};
@@ -243,7 +243,7 @@
let content = {}
content.avatar = this.kfConfig.avatar;
- content.name = this.kfConfig.kf_name;
+ content.name = this.kfConfig.name;
content.content = this.kfConfig.content;
content.is_kefu = true;
content.time = '';
@@ -280,8 +280,8 @@
},
success: function(data) {
if(data.result!=null){
- _this.kfConfig.kf_id=data.result.kf_id;
- _this.kfConfig.kf_name=data.result.kf_name;
+ _this.kfConfig.id=data.result.id;
+ _this.kfConfig.name=data.result.name;
_this.kfConfig.avatar=data.result.avator;
}
if(data.code!=200){
diff --git a/static/html/chat_page.html b/static/html/chat_page.html
index 82d7560..c927b6e 100644
--- a/static/html/chat_page.html
+++ b/static/html/chat_page.html
@@ -101,10 +101,10 @@