双向聊天

pull/30/head
taoshihan1991 4 years ago
parent 90b36f2a90
commit f3da4b2c9c

@ -31,7 +31,27 @@ func ChatUsers(w http.ResponseWriter, r *http.Request) {
})
w.Write(msg)
}
type TypeMessage struct {
Type interface{} `json:"type"`
Data interface{} `json:"data"`
}
type KfMessage struct {
Kf_name string `json:"kf_name"`
Avatar string `json:"avatar"`
Kf_id string `json:"kf_id"`
Time string `json:"time"`
Guest_id string `json:"guest_id"`
Content string `json:"content"`
}
type UserMessage struct {
From_avatar string `json:"from_avatar"`
From_id string `json:"from_id"`
From_name string `json:"from_name"`
To_id string `json:"to_id"`
To_name string `json:"to_name"`
Time string `json:"time"`
Content string `json:"content"`
}
//兼容之前的聊天服务
func ChatServer(w *websocket.Conn) {
var error error
@ -44,18 +64,26 @@ func ChatServer(w *websocket.Conn) {
}
log.Println("客户端:", receive)
var loginMsg Message
json.Unmarshal([]byte(receive), &loginMsg)
var typeMsg TypeMessage
var kfMsg KfMessage
var userMsg UserMessage
json.Unmarshal([]byte(receive), &typeMsg)
if typeMsg.Type==nil||typeMsg.Data==nil{
break
}
msgType:=typeMsg.Type.(string)
msgData, _ :=json.Marshal(typeMsg.Data)
switch loginMsg.Type.(string) {
switch msgType {
//用户上线
case "userInit":
json.Unmarshal(msgData,&userMsg)
//用户id对应的连接
clientList[loginMsg.Uid.(string)] = w
clientList[userMsg.From_id] = w
if len(kefuList)==0{
websocket.Message.Send(w, "无客服在线")
}else{
//发送给客服通知
//发送给客服通知s
for _, conn := range kefuList {
result := make([]map[string]string, 0)
for uid, _ := range clientList {
@ -73,21 +101,24 @@ func ChatServer(w *websocket.Conn) {
}
//客服上线
case "kfOnline":
json.Unmarshal(msgData,&kfMsg)
//客服id对应的连接
kefuList[loginMsg.Uid.(string)] = w
sendMsg := ChatKfMessage{
Message_type: "kfOnline",
Data: KfMessageData{
Kf_name: loginMsg.Name,
Avatar: loginMsg.Avatar,
Kf_id: loginMsg.Uid,
kefuList[kfMsg.Kf_id] = w
sendMsg := TypeMessage{
Type: "kfOnline",
Data: KfMessage{
Kf_name: kfMsg.Kf_name,
Avatar: kfMsg.Avatar,
Kf_id: kfMsg.Kf_id,
Time: time.Now().Format("2006-01-02 15:04:05"),
Content: "客服上线",
},
}
jsonStrByte, _ := json.Marshal(sendMsg)
//发送给客户
log.Println("发送给客户",clientList,string(jsonStrByte))
if len(clientList)==0{
break
}
for _, conn := range clientList {
websocket.Message.Send(conn, string(jsonStrByte))
}
@ -104,8 +135,39 @@ func ChatServer(w *websocket.Conn) {
}
str,_:=json.Marshal(msg);sendStr:=string(str)
websocket.Message.Send(w,sendStr)
case "kfChatMessage":
json.Unmarshal(msgData,&kfMsg)
conn:=clientList[kfMsg.Guest_id]
msg:=NoticeMessage{
Type: "kfChatMessage",
Data:KfMessage{
Kf_name: kfMsg.Kf_name,
Avatar: kfMsg.Avatar,
Kf_id: kfMsg.Kf_id,
Time: time.Now().Format("2006-01-02 15:04:05"),
Guest_id: kfMsg.Guest_id,
Content: kfMsg.Content,
},
}
str,_:=json.Marshal(msg);sendStr:=string(str)
websocket.Message.Send(conn,sendStr)
case "chatMessage":
json.Unmarshal(msgData,&userMsg)
conn:=kefuList[userMsg.To_id]
msg:=NoticeMessage{
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,
Time: time.Now().Format("2006-01-02 15:04:05"),
},
}
str,_:=json.Marshal(msg);sendStr:=string(str)
websocket.Message.Send(conn,sendStr)
}
}
}

@ -66,18 +66,11 @@
</el-col>
<el-col :span="12">
<div class="sw-bg chatContext">
<el-row :gutter="2">
<el-col :span="3"><el-avatar :size="60" ></el-avatar></el-col>
<el-row :gutter="2" v-for="v in msgList" v-bind:class="{'chatBoxMe': v.is_kefu==true}">
<el-col :span="3"><el-avatar :size="60" :src="v.avatar"></el-avatar></el-col>
<el-col :span="21">
<div class="chatUser">内容</div>
<div class="chatContent">内容</div>
</el-col>
</el-row>
<el-row :gutter="2" class="chatBoxMe">
<el-col :span="3"><el-avatar :size="60" ></el-avatar></el-col>
<el-col :span="21">
<div class="chatUser">内容</div>
<div class="chatContent">内容</div>
<div class="chatUser"><{v.name}></div>
<div class="chatContent"><{v.content}></div>
</el-col>
</el-row>
<el-input type="textarea" class="chatArea" v-model="messageContent"></el-input>
@ -104,6 +97,8 @@
socket:null,
messageContent:"",
currentGuest:"",
msgList:[],
msgListUser:[],
},
methods: {
//跳转
@ -128,12 +123,14 @@
},
OnOpen(){
let data={};
data.type="kfOnline";
data.uid="kf_1";
data.name="客服丽丽";
let mes={}
mes.type="kfOnline";
data.kf_id="kf_1";
data.kf_name="客服丽丽";
data.avatar="https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=4217138672,2588039002&fm=26&gp=0.jpg";
data.group="1";
this.socket.send(JSON.stringify(data));
mes.data=data;
this.socket.send(JSON.stringify(mes));
},
OnMessage(e){
const redata = JSON.parse(e.data);
@ -147,16 +144,35 @@
this.users=redata.data;
this.currentGuest=redata.data[0].uid;
}
if (redata.type=="chatMessage"){
let msg=redata.data
let content={}
content.avatar=msg.from_avatar;
content.name=msg.from_name;
content.content=msg.content;
content.is_kefu=false;
content.time=msg.time;
if(msg.from_id==this.currentGuest){
this.msgList.push(content);
}
if (typeof(this.msgListUser[msg.from_id])=="undefined"){
this.msgListUser[msg.from_id]=[];
}
this.msgListUser[msg.from_id].push(content);
}
},
//接手客户
talkTo(guestId){
this.currentGuest=guestId;
this.msgList=[];
this.msgList=this.msgListUser[guestId];
},
//发送给客户
chatToUser(){
let mes={};
let data={};
mes.type="messageType";
mes.type="kfChatMessage";
data.content=this.messageContent;
data.kf_id="kf_1";
data.guest_id=this.currentGuest;
@ -164,6 +180,19 @@
data.avatar="https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=4217138672,2588039002&fm=26&gp=0.jpg";
mes.data=data;
this.socket.send(JSON.stringify(mes));
this.messageContent="";
let content={}
content.avatar=data.avatar;
content.name=data.kf_name;
content.content=data.content;
content.is_kefu=true;
content.time=data.time;
this.msgList.push(content);
if (typeof(this.msgListUser[this.currentGuest])=="undefined"){
this.msgListUser[this.currentGuest]=[];
}
this.msgListUser[this.currentGuest].push(content);
},
},
created: function () {

@ -685,8 +685,8 @@
socket = new ReconnectingWebSocket(protocol + config.socket);//创建Socket实例
uinfo = getCache('swchatUserInfo');
socket.onopen = function (res) {
var login_data = '{"type":"userInit", "uid": "' + uinfo[0].userId + '", "name" : "' + uinfo[0].name +
'", "avatar" : "' + config.avatar + '", "group" : ' + config.group + '}';
var login_data = '{"type":"userInit", "data":{"from_id": "' + uinfo[0].userId + '", "name" : "' + uinfo[0].name +
'", "avatar" : "' + config.avatar + '", "group" : ' + config.group + '}}';
socket.send(login_data);
ping(30000);
isLock(false);
@ -695,7 +695,8 @@
socket.onmessage = function (res) {
try {
var data=JSON.parse(res.data);
switch(data['message_type']){
console.log(data);
switch(data['type']){
// 已经被分配了客服
case 'connect':
kf_id = data.data.kf_id;
@ -738,7 +739,7 @@
break;
// 监测聊天数据
case 'chatMessage':
case 'kfChatMessage':
kf_id = data.data.kf_id;
kf_name =typeof(data.data.kf_name) == 'undefined'?"客服":data.data.kf_name;
data.data.name=kf_name;

Loading…
Cancel
Save