diff --git a/middleware/jwt.go b/middleware/jwt.go index 1f03ee1..edf7ca7 100644 --- a/middleware/jwt.go +++ b/middleware/jwt.go @@ -17,6 +17,9 @@ func JwtPageMiddleware(c *gin.Context) { } func JwtApiMiddleware(c *gin.Context) { token := c.GetHeader("token") + if token == "" { + token = c.Query("token") + } userinfo := tools.ParseToken(token) if userinfo == nil || userinfo["name"] == nil || userinfo["create_time"] == nil { c.JSON(200, gin.H{ diff --git a/router/api.go b/router/api.go index a22d2c7..a45b984 100644 --- a/router/api.go +++ b/router/api.go @@ -4,6 +4,7 @@ import ( "github.com/gin-gonic/gin" "github.com/taoshihan1991/imaptool/controller" "github.com/taoshihan1991/imaptool/middleware" + "github.com/taoshihan1991/imaptool/websocket" ) func InitApiRouter(engine *gin.Engine) { @@ -13,6 +14,8 @@ func InitApiRouter(engine *gin.Engine) { engine.POST("/check_auth", middleware.JwtApiMiddleware, controller.MainCheckAuth) //前后聊天 engine.GET("/chat_server", middleware.Ipblack, controller.NewChatServer) + engine.GET("/ws_kefu", middleware.JwtApiMiddleware, websocket.NewKefuServer) + //获取消息 engine.GET("/messages", controller.GetVisitorMessage) engine.GET("/message_notice", controller.SendVisitorNotice) diff --git a/static/js/chat-main.js b/static/js/chat-main.js index 6ddf63c..9b1335d 100644 --- a/static/js/chat-main.js +++ b/static/js/chat-main.js @@ -7,6 +7,7 @@ var app=new Vue({ rightTabActive:"visitorInfo", users:[], usersMap:[], + //server:getWsBaseUrl()+"/ws_kefu?token="+localStorage.getItem("token"), server:getWsBaseUrl()+"/chat_server", socket:null, messageContent:"", diff --git a/websocket/user.go b/websocket/user.go new file mode 100644 index 0000000..02483d4 --- /dev/null +++ b/websocket/user.go @@ -0,0 +1,86 @@ +package websocket + +import ( + "encoding/json" + "github.com/gin-gonic/gin" + "github.com/gorilla/websocket" + "github.com/taoshihan1991/imaptool/models" + "log" +) + +func NewKefuServer(c *gin.Context) { + kefuId, _ := c.Get("kefu_name") + kefuInfo := models.FindUser(kefuId.(string)) + if kefuInfo.ID == 0 { + c.JSON(200, gin.H{ + "code": 400, + "msg": "用户不存在", + }) + return + } + + go kefuServerBackend() + conn, err := upgrader.Upgrade(c.Writer, c.Request, nil) + if err != nil { + log.Print("upgrade:", err) + return + } + for { + //接受消息 + var receive []byte + messageType, receive, err := conn.ReadMessage() + if err != nil { + log.Println(err) + return + } + + //获取GET参数,创建WS + var kefu User + kefu.id = kefuInfo.Name + kefu.name = kefuInfo.Nickname + kefu.avator = kefuInfo.Avator + kefu.conn = conn + AddKefuToList(&kefu) + + message <- &Message{ + conn: conn, + content: receive, + context: c, + messageType: messageType, + } + } +} +func AddKefuToList(kefu *User) { + var newKefuConns = []*User{kefu} + kefuConns := kefuList[kefu.id] + if kefuConns != nil { + newKefuConns = append(newKefuConns, kefuConns...) + } + kefuList[kefu.id] = newKefuConns +} + +//后端广播发送消息 +func kefuServerBackend() { + for { + message := <-message + var typeMsg TypeMessage + json.Unmarshal(message.content, &typeMsg) + conn := message.conn + if typeMsg.Type == nil || typeMsg.Data == nil { + continue + } + msgType := typeMsg.Type.(string) + log.Println("客户端:", msgType) + + switch msgType { + //心跳 + case "ping": + msg := TypeMessage{ + Type: "pong", + } + str, _ := json.Marshal(msg) + conn.WriteMessage(websocket.TextMessage, str) + } + + } +} diff --git a/websocket/visitor.go b/websocket/visitor.go new file mode 100644 index 0000000..708bc8c --- /dev/null +++ b/websocket/visitor.go @@ -0,0 +1 @@ +package websocket diff --git a/websocket/ws.go b/websocket/ws.go new file mode 100644 index 0000000..a46c191 --- /dev/null +++ b/websocket/ws.go @@ -0,0 +1,49 @@ +package websocket + +import ( + "github.com/gin-gonic/gin" + "github.com/gorilla/websocket" +) + +type User struct { + conn *websocket.Conn + name string + id string + avator string + to_id string +} +type Message struct { + conn *websocket.Conn + context *gin.Context + content []byte + messageType int +} +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"` + VisitorId string `json:"visitor_id"` + Group string `json:"group"` + Time string `json:"time"` + ToId string `json:"to_id"` + Content string `json:"content"` + City string `json:"city"` + ClientIp string `json:"client_ip"` + Refer string `json:"refer"` +} + +var clientList = make(map[string]*User) +var kefuList = make(map[string][]*User) +var message = make(chan *Message) +var upgrader = websocket.Upgrader{} + +func init() { + upgrader = websocket.Upgrader{ + ReadBufferSize: 1024, + WriteBufferSize: 1024, + } +}