切换为拆分后的新接口

pull/23/head
陶士涵 4 years ago
parent ee12f9cb68
commit 200fa57b8b

@ -12,3 +12,9 @@ type ChatMessage struct {
Name string `json:"name"` Name string `json:"name"`
Avator string `json:"avator"` Avator string `json:"avator"`
} }
type VisitorOnline struct {
Uid string `json:"uid"`
Username string `json:"username"`
Avator string `json:"avator"`
LastMessage string `json:"last_message"`
}

@ -8,6 +8,7 @@ import (
"github.com/taoshihan1991/imaptool/config" "github.com/taoshihan1991/imaptool/config"
"github.com/taoshihan1991/imaptool/models" "github.com/taoshihan1991/imaptool/models"
"github.com/taoshihan1991/imaptool/tools" "github.com/taoshihan1991/imaptool/tools"
"github.com/taoshihan1991/imaptool/ws"
"log" "log"
"math/rand" "math/rand"
"strconv" "strconv"
@ -63,7 +64,7 @@ func PostVisitorLogin(c *gin.Context) {
ipcity := tools.ParseIp(c.ClientIP()) ipcity := tools.ParseIp(c.ClientIP())
avator := fmt.Sprintf("/static/images/%d.jpg", rand.Intn(14)) avator := fmt.Sprintf("/static/images/%d.jpg", rand.Intn(14))
toId := c.PostForm("to_id") toId := c.PostForm("to_id")
id := c.PostForm("id") id := c.PostForm("visitor_id")
if id == "" { if id == "" {
id = tools.Uuid() id = tools.Uuid()
} }
@ -184,13 +185,13 @@ func GetVisitorMessage(c *gin.Context) {
func GetVisitorOnlines(c *gin.Context) { func GetVisitorOnlines(c *gin.Context) {
users := make([]map[string]string, 0) users := make([]map[string]string, 0)
visitorIds := make([]string, 0) visitorIds := make([]string, 0)
for uid, visitor := range clientList { for uid, visitor := range ws.ClientList {
userInfo := make(map[string]string) userInfo := make(map[string]string)
userInfo["uid"] = uid userInfo["uid"] = uid
userInfo["name"] = visitor.name userInfo["name"] = visitor.Name
userInfo["avator"] = visitor.avator userInfo["avator"] = visitor.Avator
users = append(users, userInfo) 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,
})
}

@ -50,6 +50,7 @@ func InitApiRouter(engine *gin.Engine) {
engine.GET("/mysql", middleware.JwtApiMiddleware, middleware.RbacAuth, controller.MysqlGetConf) engine.GET("/mysql", middleware.JwtApiMiddleware, middleware.RbacAuth, controller.MysqlGetConf)
engine.POST("/mysql", middleware.JwtApiMiddleware, middleware.RbacAuth, controller.MysqlSetConf) engine.POST("/mysql", middleware.JwtApiMiddleware, middleware.RbacAuth, controller.MysqlSetConf)
engine.GET("/visitors_online", controller.GetVisitorOnlines) engine.GET("/visitors_online", controller.GetVisitorOnlines)
engine.GET("/visitors_kefu_online", middleware.JwtApiMiddleware, controller.GetKefusVisitorOnlines)
engine.GET("/clear_online_tcp", controller.DeleteOnlineTcp) engine.GET("/clear_online_tcp", controller.DeleteOnlineTcp)
engine.POST("/visitor_login", middleware.Ipblack, controller.PostVisitorLogin) engine.POST("/visitor_login", middleware.Ipblack, controller.PostVisitorLogin)
engine.POST("/visitor", controller.PostVisitor) engine.POST("/visitor", controller.PostVisitor)

@ -168,7 +168,11 @@
</el-menu-item> </el-menu-item>
<el-menu-item style="padding-left:2px;"> <el-menu-item style="padding-left:2px;">
<i class="el-icon-s-tools"></i> <i class="el-icon-s-tools"></i>
<span slot="title">时间:<{visitor.created_at}></span> <span slot="title">创建时间:<{visitor.created_at}></span>
</el-menu-item>
<el-menu-item style="padding-left:2px;">
<i class="el-icon-s-tools"></i>
<span slot="title">访问时间:<{visitor.updated_at}></span>
</el-menu-item> </el-menu-item>
<el-tooltip content="点击关闭连接" placement="left"> <el-tooltip content="点击关闭连接" placement="left">
<el-menu-item v-on:click="closeVisitor(visitor.visitor_id)" style="padding-left:2px;"> <el-menu-item v-on:click="closeVisitor(visitor.visitor_id)" style="padding-left:2px;">
@ -198,5 +202,5 @@
</template> </template>
</div> </div>
</body> </body>
<script src="/static/js/chat-main.js?v=0.1.1"></script> <script src="/static/js/chat-main.js?v=0.3.1"></script>
</html> </html>

@ -76,5 +76,5 @@
var KEFU_ID='{{.KEFU_ID}}'; var KEFU_ID='{{.KEFU_ID}}';
var REFER='{{.Refer}}'; var REFER='{{.Refer}}';
</script> </script>
<script src="/static/js/chat-page.js?v=0.2.5"></script> <script src="/static/js/chat-page.js?v=0.3.1"></script>
</html> </html>

@ -7,8 +7,8 @@ var app=new Vue({
rightTabActive:"visitorInfo", rightTabActive:"visitorInfo",
users:[], users:[],
usersMap:[], usersMap:[],
//server:getWsBaseUrl()+"/ws_kefu?token="+localStorage.getItem("token"), server:getWsBaseUrl()+"/ws_kefu?token="+localStorage.getItem("token"),
server:getWsBaseUrl()+"/chat_server", //server:getWsBaseUrl()+"/chat_server",
socket:null, socket:null,
messageContent:"", messageContent:"",
currentGuest:"", currentGuest:"",
@ -182,7 +182,7 @@ var app=new Vue({
mes.from_id = this.kfConfig.id; mes.from_id = this.kfConfig.id;
mes.to_id = this.currentGuest; mes.to_id = this.currentGuest;
mes.content = this.messageContent; mes.content = this.messageContent;
$.post("/message",mes,function(){ $.post("/2/message",mes,function(){
_this.messageContent = ""; _this.messageContent = "";
}); });
@ -198,7 +198,7 @@ var app=new Vue({
//处理当前在线用户列表 //处理当前在线用户列表
addOnlineUser:function (retData) { addOnlineUser:function (retData) {
var flag=false; var flag=false;
retData.last_message="新访客"; retData.last_message=retData.last_message;
retData.status=1; retData.status=1;
retData.name=retData.username; retData.name=retData.username;
for(let i=0;i<this.users.length;i++){ for(let i=0;i<this.users.length;i++){
@ -280,6 +280,28 @@ var app=new Vue({
} }
}); });
}, },
//获取客服信息
getOnlineVisitors(){
let _this=this;
$.ajax({
type:"get",
url:"/visitors_kefu_online",
headers:{
"token":localStorage.getItem("token")
},
success: function(data) {
if(data.code==200 && data.result!=null){
_this.users=data.result;
}
if(data.code!=200){
_this.$message({
message: data.msg,
type: 'error'
});
}
}
});
},
//获取信息列表 //获取信息列表
getMesssagesByVisitorId(visitorId){ getMesssagesByVisitorId(visitorId){
let _this=this; let _this=this;
@ -333,13 +355,14 @@ var app=new Vue({
success: function(data) { success: function(data) {
if(data.result!=null){ if(data.result!=null){
let r=data.result; let r=data.result;
_this.visitor.created_at=r.created_at; _this.visitor=r;
_this.visitor.refer=r.refer; // _this.visitor.created_at=r.created_at;
_this.visitor.city=r.city; // _this.visitor.refer=r.refer;
_this.visitor.client_ip=r.client_ip; // _this.visitor.city=r.city;
_this.visitor.source_ip=r.source_ip; // _this.visitor.client_ip=r.client_ip;
// _this.visitor.source_ip=r.source_ip;
_this.visitor.status=r.status==1?"在线":"离线"; _this.visitor.status=r.status==1?"在线":"离线";
_this.visitor.visitor_id=r.visitor_id; //_this.visitor.visitor_id=r.visitor_id;
} }
if(data.code!=200){ if(data.code!=200){
_this.$message({ _this.$message({
@ -551,6 +574,7 @@ var app=new Vue({
//jquery //jquery
this.initJquery(); this.initJquery();
this.getKefuInfo(); this.getKefuInfo();
this.getOnlineVisitors();
//心跳 //心跳
this.ping(); this.ping();
} }

@ -4,7 +4,8 @@ new Vue({
delimiters:["<{","}>"], delimiters:["<{","}>"],
data: { data: {
window:window, window:window,
server:getWsBaseUrl()+"/chat_server", //server:getWsBaseUrl()+"/chat_server",
server:getWsBaseUrl()+"/ws_visitor",
socket:null, socket:null,
msgList:[], msgList:[],
messageContent:"", messageContent:"",
@ -17,7 +18,7 @@ new Vue({
methods: { methods: {
//初始化websocket //初始化websocket
initConn() { initConn() {
let socket = new ReconnectingWebSocket(this.server);//创建Socket实例 let socket = new ReconnectingWebSocket(this.server+"?visitor_id="+this.visitor.visitor_id);//创建Socket实例
socket.maxReconnectAttempts = 30; socket.maxReconnectAttempts = 30;
this.socket = socket this.socket = socket
this.socket.onmessage = this.OnMessage; this.socket.onmessage = this.OnMessage;
@ -28,11 +29,11 @@ new Vue({
}, },
OnOpen() { OnOpen() {
this.chatTitle="连接成功!" this.chatTitle="连接成功!"
let mes = {} // let mes = {}
mes.type = "userInit"; // mes.type = "userInit";
this.visitor.refer=REFER; // this.visitor.refer=REFER;
mes.data = this.visitor; // mes.data = this.visitor;
this.socket.send(JSON.stringify(mes)); // this.socket.send(JSON.stringify(mes));
}, },
OnMessage(e) { OnMessage(e) {
const redata = JSON.parse(e.data); const redata = JSON.parse(e.data);
@ -107,7 +108,7 @@ new Vue({
mes.to_id = this.visitor.to_id; mes.to_id = this.visitor.to_id;
mes.content = this.messageContent; mes.content = this.messageContent;
//发送消息 //发送消息
$.post("/message",mes,function(res){ $.post("/2/message",mes,function(res){
if(res.code!=200){ if(res.code!=200){
_this.$message({ _this.$message({
message: res.msg, message: res.msg,
@ -135,10 +136,13 @@ new Vue({
//获取当前用户信息 //获取当前用户信息
getUserInfo(){ getUserInfo(){
let obj=this.getCache("visitor"); let obj=this.getCache("visitor");
if(!obj){ var visitor_id=""
if(obj){
visitor_id=obj.visitor_id;
}
let _this=this; 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){ if(res.code!=200){
_this.$message({ _this.$message({
message: res.msg, message: res.msg,
@ -148,12 +152,13 @@ new Vue({
} }
_this.visitor=res.result; _this.visitor=res.result;
_this.setCache("visitor",res.result); _this.setCache("visitor",res.result);
_this.getMesssagesByVisitorId();
_this.initConn(); _this.initConn();
}); });
}else{ // }else{
this.visitor=obj; // this.visitor=obj;
this.initConn(); // this.initConn();
} // }
}, },
//获取信息列表 //获取信息列表
getMesssagesByVisitorId(){ getMesssagesByVisitorId(){
@ -381,7 +386,6 @@ new Vue({
this.init(); this.init();
this.getUserInfo(); this.getUserInfo();
//加载历史记录 //加载历史记录
this.getMesssagesByVisitorId();
//this.msgList=this.getHistory(); //this.msgList=this.getHistory();
//滚动底部 //滚动底部
//this.scrollBottom(); //this.scrollBottom();

@ -54,18 +54,18 @@ func AddKefuToList(kefu *User) {
var newKefuConns = []*User{kefu} var newKefuConns = []*User{kefu}
kefuConns := KefuList[kefu.Id] kefuConns := KefuList[kefu.Id]
if kefuConns != nil { if kefuConns != nil {
for _, kefu := range kefuConns { for _, otherKefu := range kefuConns {
msg := TypeMessage{ msg := TypeMessage{
Type: "pong", Type: "many pong",
} }
str, _ := json.Marshal(msg) str, _ := json.Marshal(msg)
err := kefu.Conn.WriteMessage(websocket.TextMessage, str) err := otherKefu.Conn.WriteMessage(websocket.TextMessage, str)
if err != nil { if err == nil {
newKefuConns = append(newKefuConns, kefu) newKefuConns = append(newKefuConns, otherKefu)
} }
} }
} }
log.Println(newKefuConns) log.Println("xxxxxxxxxxxxxxxxxxxxxxxx", newKefuConns)
KefuList[kefu.Id] = newKefuConns KefuList[kefu.Id] = newKefuConns
} }

@ -74,11 +74,15 @@ func NewVisitorServer(c *gin.Context) {
func AddVisitorToList(user *User) { func AddVisitorToList(user *User) {
//用户id对应的连接 //用户id对应的连接
ClientList[user.Id] = user ClientList[user.Id] = user
lastMessage := models.FindLastMessageByVisitorId(user.Id)
userInfo := make(map[string]string) userInfo := make(map[string]string)
userInfo["uid"] = user.Id userInfo["uid"] = user.Id
userInfo["username"] = user.Name userInfo["username"] = user.Name
userInfo["avator"] = user.Avator userInfo["avator"] = user.Avator
userInfo["last_message"] = lastMessage.Content
if userInfo["last_message"] == "" {
userInfo["last_message"] = "新访客"
}
msg := TypeMessage{ msg := TypeMessage{
Type: "userOnline", Type: "userOnline",
Data: userInfo, Data: userInfo,

Loading…
Cancel
Save