存储访客数据

pull/30/head
陶士涵 4 years ago
parent 4abe35cdec
commit b2cb6bd1ae

@ -8,4 +8,18 @@ CREATE TABLE `user` (
`deleted_at` timestamp NULL DEFAULT NULL, `deleted_at` timestamp NULL DEFAULT NULL,
`avator` varchar(100) NOT NULL DEFAULT '', `avator` varchar(100) NOT NULL DEFAULT '',
PRIMARY KEY (`id`) PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 ) 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;

@ -0,0 +1,7 @@
{
"Server":"127.0.0.1",
"Port":"3306",
"Database":"go-fly",
"Username":"go-fly",
"Password":"go-fly"
}

@ -4,6 +4,7 @@ import (
"encoding/json" "encoding/json"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/gorilla/websocket" "github.com/gorilla/websocket"
"github.com/taoshihan1991/imaptool/models"
"log" "log"
"time" "time"
) )
@ -15,6 +16,7 @@ type vistor struct{
} }
type Message struct{ type Message struct{
conn *websocket.Conn conn *websocket.Conn
ip string
content []byte content []byte
} }
var clientList = make(map[string]*vistor) var clientList = make(map[string]*vistor)
@ -25,6 +27,15 @@ type TypeMessage struct {
Type interface{} `json:"type"` Type interface{} `json:"type"`
Data interface{} `json:"data"` 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 { type KfMessage struct {
Kf_name string `json:"kf_name"` Kf_name string `json:"kf_name"`
Avatar string `json:"avatar"` Avatar string `json:"avatar"`
@ -73,25 +84,26 @@ func NewChatServer(c *gin.Context){
message<-&Message{ message<-&Message{
conn:conn, conn:conn,
content: receive, content: receive,
ip:c.ClientIP(),
} }
} }
} }
//发送给客户客服上线 //发送给客户客服上线
func SendKefuOnline(kfMsg KfMessage, conn *websocket.Conn) { func SendKefuOnline(clientMsg ClientMessage, conn *websocket.Conn) {
sendMsg := TypeMessage{ sendMsg := TypeMessage{
Type: "kfOnline", Type: "kfOnline",
Data: KfMessage{ Data: ClientMessage{
Kf_name: kfMsg.Kf_name, Name: clientMsg.Name,
Avatar: kfMsg.Avatar, Avator: clientMsg.Avator,
Kf_id: kfMsg.Kf_id, Id: clientMsg.Id,
Kf_group: kfMsg.Kf_group, Group: clientMsg.Group,
Time: time.Now().Format("2006-01-02 15:04:05"), Time: time.Now().Format("2006-01-02 15:04:05"),
Content: "客服上线", Content: "客服上线",
}, },
} }
jsonStrByte, _ := json.Marshal(sendMsg) jsonStrByte, _ := json.Marshal(sendMsg)
conn.WriteMessage(1,jsonStrByte) conn.WriteMessage(websocket.TextMessage,jsonStrByte)
} }
//定时给客户端发送消息判断客户端是否在线 //定时给客户端发送消息判断客户端是否在线
@ -150,8 +162,7 @@ func singleBroadcaster(){
for { for {
message:=<-message message:=<-message
var typeMsg TypeMessage var typeMsg TypeMessage
var kfMsg KfMessage var clientMsg ClientMessage
var userMsg UserMessage
json.Unmarshal(message.content, &typeMsg) json.Unmarshal(message.content, &typeMsg)
conn:=message.conn conn:=message.conn
if typeMsg.Type == nil || typeMsg.Data == nil { if typeMsg.Type == nil || typeMsg.Data == nil {
@ -165,21 +176,23 @@ func singleBroadcaster(){
getOnlineUser(conn) getOnlineUser(conn)
//用户上线 //用户上线
case "userInit": case "userInit":
json.Unmarshal(msgData, &userMsg) json.Unmarshal(msgData, &clientMsg)
//用户id对应的连接 //用户id对应的连接
user:=&vistor{ user:=&vistor{
conn:conn, conn:conn,
name: userMsg.From_name, name: clientMsg.Name,
avator: userMsg.From_avatar, avator: clientMsg.Avator,
id:userMsg.From_id, 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() SendNoticeToAllKefu()
//客服上线 //客服上线
case "kfOnline": case "kfOnline":
json.Unmarshal(msgData, &kfMsg) json.Unmarshal(msgData, &clientMsg)
//客服id对应的连接 //客服id对应的连接
kefuList[kfMsg.Kf_id] = conn kefuList[clientMsg.Id] = conn
//发送给客户 //发送给客户
if len(clientList) == 0 { if len(clientList) == 0 {
break break
@ -191,12 +204,12 @@ func singleBroadcaster(){
//SendOnekfuAllNotice(w) //SendOnekfuAllNotice(w)
//客服接手 //客服接手
case "kfConnect": case "kfConnect":
json.Unmarshal(msgData, &kfMsg) json.Unmarshal(msgData, &clientMsg)
kefuList[kfMsg.Kf_id] = conn kefuList[clientMsg.Id] = conn
SendKefuOnline(kfMsg, clientList[kfMsg.Guest_id].conn) SendKefuOnline(clientMsg, clientList[clientMsg.ToId].conn)
case "kfChatMessage": case "kfChatMessage":
json.Unmarshal(msgData, &kfMsg) json.Unmarshal(msgData, &clientMsg)
guest,ok:=clientList[kfMsg.Guest_id] guest,ok:=clientList[clientMsg.ToId]
if guest==nil||!ok{ if guest==nil||!ok{
return return
} }
@ -204,29 +217,31 @@ func singleBroadcaster(){
msg := TypeMessage{ msg := TypeMessage{
Type: "kfChatMessage", Type: "kfChatMessage",
Data: KfMessage{ Data: ClientMessage{
Kf_name: kfMsg.Kf_name, Name: clientMsg.Name,
Avatar: kfMsg.Avatar, Avator: clientMsg.Avator,
Kf_id: kfMsg.Kf_id, Id: clientMsg.Id,
Time: time.Now().Format("2006-01-02 15:04:05"), Time: time.Now().Format("2006-01-02 15:04:05"),
Guest_id: kfMsg.Guest_id, ToId: clientMsg.ToId,
Content: kfMsg.Content, Content: clientMsg.Content,
}, },
} }
str, _ := json.Marshal(msg) str, _ := json.Marshal(msg)
conn.WriteMessage(websocket.TextMessage,str) conn.WriteMessage(websocket.TextMessage,str)
case "chatMessage": case "chatMessage":
json.Unmarshal(msgData, &userMsg) json.Unmarshal(msgData, &clientMsg)
conn := kefuList[userMsg.To_id] conn,ok := kefuList[clientMsg.ToId]
if conn==nil||!ok{
return
}
msg := TypeMessage{ msg := TypeMessage{
Type: "chatMessage", Type: "chatMessage",
Data: UserMessage{ Data: ClientMessage{
From_avatar: userMsg.From_avatar, Avator: clientMsg.Avator,
From_id: userMsg.From_id, Id: clientMsg.Id,
From_name: userMsg.From_name, Name: clientMsg.Name,
To_id: userMsg.To_id, ToId: clientMsg.ToId,
To_name: userMsg.To_name, Content: clientMsg.Content,
Content: userMsg.Content,
Time: time.Now().Format("2006-01-02 15:04:05"), Time: time.Now().Format("2006-01-02 15:04:05"),
}, },
} }

@ -9,8 +9,8 @@ func GetKefuInfo(c *gin.Context){
kefuId, _ := c.Get("kefu_id") kefuId, _ := c.Get("kefu_id")
user:=models.FindUserById(kefuId) user:=models.FindUserById(kefuId)
info:=make(map[string]interface{}) info:=make(map[string]interface{})
info["kf_name"]=user.Nickname info["name"]=user.Nickname
info["kf_id"]=user.Name info["id"]=user.Name
info["avator"]=user.Avator info["avator"]=user.Avator
c.JSON(200, gin.H{ c.JSON(200, gin.H{
"code": 200, "code": 200,

@ -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
}

@ -122,10 +122,10 @@
msgListUser:[], msgListUser:[],
chatTitle:"暂时未处理咨询", chatTitle:"暂时未处理咨询",
kfConfig:{ kfConfig:{
kf_id : "kf_1", id : "kf_1",
kf_name : "客服丽丽", name : "客服丽丽",
avatar : "", avatar : "",
guest_id : "", to_id : "",
} }
}, },
methods: { methods: {
@ -225,13 +225,13 @@
//发送给客户 //发送给客户
let mes = {} let mes = {}
mes.type = "kfConnect"; mes.type = "kfConnect";
this.kfConfig.guest_id=guestId; this.kfConfig.to_id=guestId;
mes.data = this.kfConfig; mes.data = this.kfConfig;
this.socket.send(JSON.stringify(mes)); this.socket.send(JSON.stringify(mes));
}, },
//发送给客户 //发送给客户
chatToUser() { chatToUser() {
if(this.messageContent==""||this.guest_id==""){ if(this.messageContent==""||this.currentGuest==""){
return; return;
} }
let mes = {}; let mes = {};
@ -243,7 +243,7 @@
let content = {} let content = {}
content.avatar = this.kfConfig.avatar; content.avatar = this.kfConfig.avatar;
content.name = this.kfConfig.kf_name; content.name = this.kfConfig.name;
content.content = this.kfConfig.content; content.content = this.kfConfig.content;
content.is_kefu = true; content.is_kefu = true;
content.time = ''; content.time = '';
@ -280,8 +280,8 @@
}, },
success: function(data) { success: function(data) {
if(data.result!=null){ if(data.result!=null){
_this.kfConfig.kf_id=data.result.kf_id; _this.kfConfig.id=data.result.id;
_this.kfConfig.kf_name=data.result.kf_name; _this.kfConfig.name=data.result.name;
_this.kfConfig.avatar=data.result.avator; _this.kfConfig.avatar=data.result.avator;
} }
if(data.code!=200){ if(data.code!=200){

@ -101,10 +101,10 @@
<script src="https://cdn.bootcss.com/reconnecting-websocket/1.0.0/reconnecting-websocket.min.js"></script> <script src="https://cdn.bootcss.com/reconnecting-websocket/1.0.0/reconnecting-websocket.min.js"></script>
<script> <script>
var guest={}; var guest={};
guest.from_id = ""; guest.id = "";
guest.from_name = typeof(returnCitySN)!="undefined" ?returnCitySN["cip"]+"-"+returnCitySN["cname"]:"小米"; guest.name = typeof(returnCitySN)!="undefined" ?returnCitySN["cip"]+"-"+returnCitySN["cname"]:"小米";
guest.from_avatar = "https://dss2.bdstatic.com/6Ot1bjeh1BF3odCf/it/u=1539628792,3031847515&fm=85&app=92&f=JPEG?w=121&h=75&s=65F03DC608BA199ED70C5D3703009040"; guest.avator = "https://dss2.bdstatic.com/6Ot1bjeh1BF3odCf/it/u=1539628792,3031847515&fm=85&app=92&f=JPEG?w=121&h=75&s=65F03DC608BA199ED70C5D3703009040";
guest.from_group = "1"; guest.group = "1";
guest.to_id=""; guest.to_id="";
new Vue({ new Vue({
@ -140,12 +140,12 @@
const redata = JSON.parse(e.data); const redata = JSON.parse(e.data);
if (redata.type == "kfOnline") { if (redata.type == "kfOnline") {
let msg = redata.data let msg = redata.data
guest.to_id=msg.kf_id; guest.to_id=msg.id;
this.chatTitle=msg.kf_name+",正在与您沟通!" this.chatTitle=msg.name+",正在与您沟通!"
} }
if (redata.type == "kfChatMessage") { if (redata.type == "kfChatMessage") {
let msg = redata.data let msg = redata.data
guest.to_id=msg.kf_id; guest.to_id=msg.id;
let content = {} let content = {}
content.avatar = msg.avatar; content.avatar = msg.avatar;
@ -186,9 +186,9 @@
this.messageContent = ""; this.messageContent = "";
let content = {} let content = {}
content.avatar=guest.from_avatar; content.avatar=guest.avator;
content.content = guest.content; content.content = guest.content;
content.name = guest.from_name; content.name = guest.name;
content.is_kefu = true; content.is_kefu = true;
content.time = this.getNowDate(); content.time = this.getNowDate();
this.msgList.push(content); this.msgList.push(content);
@ -202,7 +202,7 @@
getUserInfo(){ getUserInfo(){
let obj=this.getCache("guest"); let obj=this.getCache("guest");
if(!obj){ if(!obj){
guest.from_id=this.generateUUID(); guest.id=this.generateUUID();
this.setCache("guest",guest); this.setCache("guest",guest);
obj=this.getCache("guest"); obj=this.getCache("guest");
} }

Loading…
Cancel
Save