visitor.go 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. package controller
  2. import (
  3. "encoding/json"
  4. "github.com/gin-gonic/gin"
  5. "github.com/gorilla/websocket"
  6. "github.com/wenstudio/gofly/config"
  7. "github.com/wenstudio/gofly/models"
  8. "github.com/wenstudio/gofly/tools"
  9. "github.com/wenstudio/gofly/user/provider/twong"
  10. "log"
  11. "strconv"
  12. )
  13. func PostVisitor(c *gin.Context) {
  14. name := c.PostForm("name")
  15. avator := c.PostForm("avator")
  16. toId := c.PostForm("to_id")
  17. id := c.PostForm("id")
  18. refer := c.PostForm("refer")
  19. city := c.PostForm("city")
  20. client_ip := c.PostForm("client_ip")
  21. if name == "" || avator == "" || toId == "" || id == "" || refer == "" || city == "" || client_ip == "" {
  22. c.JSON(200, gin.H{
  23. "code": 400,
  24. "msg": "error",
  25. })
  26. return
  27. }
  28. kefuInfo := models.FindUser(toId)
  29. if kefuInfo.ID == 0 {
  30. c.JSON(200, gin.H{
  31. "code": 400,
  32. "msg": "用户不存在",
  33. })
  34. return
  35. }
  36. models.CreateVisitor(name, avator, c.ClientIP(), toId, id, refer, city, client_ip)
  37. userInfo := make(map[string]string)
  38. userInfo["uid"] = id
  39. userInfo["username"] = name
  40. userInfo["avator"] = avator
  41. msg := TypeMessage{
  42. Type: "userOnline",
  43. Data: userInfo,
  44. }
  45. str, _ := json.Marshal(msg)
  46. kefuConns := kefuList[toId]
  47. if kefuConns != nil {
  48. for k, kefuConn := range kefuConns {
  49. log.Println(k, "xxxxxxxx")
  50. kefuConn.WriteMessage(websocket.TextMessage, str)
  51. }
  52. }
  53. c.JSON(200, gin.H{
  54. "code": 200,
  55. "msg": "ok",
  56. })
  57. }
  58. // post /visitor_login
  59. // 访客第一次连接时请求
  60. func PostVisitorLogin(c *gin.Context) {
  61. suid := c.PostForm("uid")
  62. uid, err := strconv.ParseUint(suid, 10, 64)
  63. if err != nil || uid <= 0 {
  64. c.JSON(200, gin.H{
  65. "code": 400,
  66. "msg": "参数错误",
  67. })
  68. return
  69. }
  70. ipcity := tools.ParseIp(c.ClientIP())
  71. toId := c.PostForm("to_id")
  72. refer := c.PostForm("refer")
  73. var city string
  74. if ipcity != nil {
  75. city = ipcity.CountryName + ipcity.RegionName + ipcity.CityName
  76. } else {
  77. city = "未识别地区"
  78. }
  79. client_ip := c.ClientIP() // c.PostForm("client_ip")
  80. ut := twong.NewTwongUser()
  81. v, err := ut.GetVisitorInfo(uid)
  82. if err != nil {
  83. c.JSON(200, gin.H{
  84. "code": 400,
  85. "msg": err.Error(),
  86. })
  87. }
  88. //log.Println(name,avator,c.ClientIP(),toId,id,refer,city,client_ip)
  89. if v.Name == "" || v.Avator == "" || toId == "" || v.VisitorId == "" || city == "" || client_ip == "" {
  90. c.JSON(200, gin.H{
  91. "code": 400,
  92. "msg": "error",
  93. })
  94. return
  95. }
  96. if refer == "" {
  97. refer = "app"
  98. }
  99. // 找到客服信息
  100. kefuInfo := models.FindUser(toId)
  101. if kefuInfo.ID == 0 {
  102. c.JSON(200, gin.H{
  103. "code": 400,
  104. "msg": "客服不存在",
  105. })
  106. return
  107. }
  108. // 插入或更新 访客信息
  109. models.CreateVisitor(v.Name, v.Avator,
  110. client_ip, toId, v.VisitorId, refer, city, client_ip)
  111. visitor := models.FindVisitorByVistorId(v.VisitorId)
  112. visitor.ToId = toId
  113. c.JSON(200, gin.H{
  114. "code": 200,
  115. "msg": "ok",
  116. "result": visitor,
  117. })
  118. }
  119. func GetVisitor(c *gin.Context) {
  120. visitorId := c.Query("visitorId")
  121. vistor := models.FindVisitorByVistorId(visitorId)
  122. c.JSON(200, gin.H{
  123. "code": 200,
  124. "msg": "ok",
  125. "result": vistor,
  126. })
  127. }
  128. // @Summary 获取访客列表接口
  129. // @Produce json
  130. // @Accept multipart/form-data
  131. // @Param page query string true "分页"
  132. // @Param token header string true "认证token"
  133. // @Success 200 {object} controller.Response
  134. // @Failure 200 {object} controller.Response
  135. // @Router /visitors [get]
  136. func GetVisitors(c *gin.Context) {
  137. page, _ := strconv.Atoi(c.Query("page"))
  138. kefuId, _ := c.Get("kefu_name")
  139. vistors := models.FindVisitorsByKefuId(uint(page), config.VisitorPageSize, kefuId.(string))
  140. count := models.CountVisitorsByKefuId(kefuId.(string))
  141. c.JSON(200, gin.H{
  142. "code": 200,
  143. "msg": "ok",
  144. "result": gin.H{
  145. "list": vistors,
  146. "count": count,
  147. "pagesize": config.PageSize,
  148. },
  149. })
  150. }
  151. // @Summary 获取访客聊天信息接口
  152. // @Produce json
  153. // @Accept multipart/form-data
  154. // @Param visitorId query string true "访客ID"
  155. // @Param token header string true "认证token"
  156. // @Success 200 {object} controller.Response
  157. // @Failure 200 {object} controller.Response
  158. // @Router /messages [get]
  159. func GetVisitorMessage(c *gin.Context) {
  160. visitorId := c.Query("visitorId")
  161. kefuId := c.Query("kefuId")
  162. messages := models.FindMessagesByVisitorAndKefuId(visitorId, kefuId)
  163. result := make([]map[string]interface{}, 0)
  164. for _, message := range messages {
  165. item := make(map[string]interface{})
  166. var visitor models.Visitor
  167. var kefu models.User
  168. if visitor.Name == "" || kefu.Name == "" {
  169. kefu = models.FindUser(message.KefuId)
  170. visitor = models.FindVisitorByVistorId(message.VisitorId)
  171. }
  172. item["time"] = message.CreatedAt.Format("2006-01-02 15:04:05")
  173. item["content"] = message.Content
  174. item["mes_type"] = message.MesType
  175. item["visitor_name"] = visitor.Name
  176. item["visitor_avator"] = visitor.Avator
  177. item["kefu_name"] = kefu.Nickname
  178. item["kefu_avator"] = kefu.Avator
  179. result = append(result, item)
  180. }
  181. models.ReadMessageByVisitorId(visitorId)
  182. c.JSON(200, gin.H{
  183. "code": 200,
  184. "msg": "ok",
  185. "result": result,
  186. })
  187. }
  188. // @Summary 获取在线访客列表接口
  189. // @Produce json
  190. // @Success 200 {object} controller.Response
  191. // @Failure 200 {object} controller.Response
  192. // @Router /visitors_online [get]
  193. func GetVisitorOnlines(c *gin.Context) {
  194. users := make([]map[string]string, 0)
  195. visitorIds := make([]string, 0)
  196. for uid, visitor := range clientList {
  197. userInfo := make(map[string]string)
  198. userInfo["uid"] = uid
  199. userInfo["name"] = visitor.name
  200. userInfo["avator"] = visitor.avator
  201. users = append(users, userInfo)
  202. visitorIds = append(visitorIds, visitor.id)
  203. }
  204. //查询最新消息
  205. messages := models.FindLastMessage(visitorIds)
  206. temp := make(map[string]string, 0)
  207. for _, mes := range messages {
  208. temp[mes.VisitorId] = mes.Content
  209. }
  210. for _, user := range users {
  211. user["last_message"] = temp[user["uid"]]
  212. }
  213. tcps := make([]string, 0)
  214. for ip, _ := range clientTcpList {
  215. tcps = append(tcps, ip)
  216. }
  217. c.JSON(200, gin.H{
  218. "code": 200,
  219. "msg": "ok",
  220. "result": gin.H{
  221. "ws": users,
  222. "tcp": tcps,
  223. },
  224. })
  225. }