切换为拆分后的新接口

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

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

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

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

@ -168,7 +168,11 @@
</el-menu-item>
<el-menu-item style="padding-left:2px;">
<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-tooltip content="点击关闭连接" placement="left">
<el-menu-item v-on:click="closeVisitor(visitor.visitor_id)" style="padding-left:2px;">
@ -198,5 +202,5 @@
</template>
</div>
</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>

@ -76,5 +76,5 @@
var KEFU_ID='{{.KEFU_ID}}';
var REFER='{{.Refer}}';
</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>

@ -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<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){
let _this=this;
@ -333,13 +355,14 @@ var app=new Vue({
success: function(data) {
if(data.result!=null){
let r=data.result;
_this.visitor.created_at=r.created_at;
_this.visitor.refer=r.refer;
_this.visitor.city=r.city;
_this.visitor.client_ip=r.client_ip;
_this.visitor.source_ip=r.source_ip;
_this.visitor=r;
// _this.visitor.created_at=r.created_at;
// _this.visitor.refer=r.refer;
// _this.visitor.city=r.city;
// _this.visitor.client_ip=r.client_ip;
// _this.visitor.source_ip=r.source_ip;
_this.visitor.status=r.status==1?"在线":"离线";
_this.visitor.visitor_id=r.visitor_id;
//_this.visitor.visitor_id=r.visitor_id;
}
if(data.code!=200){
_this.$message({
@ -551,6 +574,7 @@ var app=new Vue({
//jquery
this.initJquery();
this.getKefuInfo();
this.getOnlineVisitors();
//心跳
this.ping();
}

@ -4,7 +4,8 @@ new Vue({
delimiters:["<{","}>"],
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();

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

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

Loading…
Cancel
Save