diff --git a/dsSzxy/.idea/workspace.xml b/dsSzxy/.idea/workspace.xml
index c89ec96e..24651ba1 100644
--- a/dsSzxy/.idea/workspace.xml
+++ b/dsSzxy/.idea/workspace.xml
@@ -5,7 +5,7 @@
-
+
@@ -43,7 +43,7 @@
-
+
@@ -52,7 +52,7 @@
-
+
@@ -73,8 +73,8 @@
-
+
diff --git a/dsSzxy/Business/ImRelate/ImRelateController/ImRelateController.go b/dsSzxy/Business/ImRelate/ImRelateController/ImRelateController.go
index b91e6690..b42f9076 100644
--- a/dsSzxy/Business/ImRelate/ImRelateController/ImRelateController.go
+++ b/dsSzxy/Business/ImRelate/ImRelateController/ImRelateController.go
@@ -12,267 +12,122 @@ import (
//模块的路由配置
func Routers(r *gin.RouterGroup) {
rr := r.Group("/imRelate")
- rr.POST("/sendTxtMsg", sendTxtMsg)
- rr.POST("/sendImgMsg", sendImgMsg)
- rr.POST("/sendFileMsg", sendFileMsg)
- rr.POST("/sendSightMsg", sendSightMsg)
+ rr.POST("/saveChatRecord", saveChatRecord)
}
/**
-功能:发送融云文本消息
+功能:保存聊天记录
作者:吴缤
-日期:2021-08-16
+日期:2021-08-23
*/
-func sendTxtMsg(c *gin.Context) {
+func saveChatRecord(c *gin.Context) {
//发送方Id。
fromId := c.PostForm("fromId")
//接收方Id。
toId := c.PostForm("toId")
//发送类型 p:单聊 g:群聊
sendType := c.PostForm("sendType")
- //内容。
- content := c.PostForm("content")
- m := map[string]string{"content": content}
- contentJsonObj, _ := json.Marshal(m)
- contentJsonStr := string(contentJsonObj)
-
- sendErr := ImRelateDao.SendRongYunMsg(sendType, fromId, toId, "RC:TxtMsg", contentJsonStr)
- if sendErr != nil {
- c.JSON(http.StatusOK, gin.H{"success": false, "info": "发送消息失败!"})
+ //获取姓名和头像
+ fromName, fromAvatar, toName, toAvatar := ImRelateDao.GetPersonNameAvatar(fromId, toId, sendType)
+
+ var crs ImRelateDao.ChatRecordStruct
+
+ objectName := c.PostForm("objectName")
+ if objectName == "RC:TxtMsg" {
+ //内容。
+ content := c.PostForm("content")
+ crs = ImRelateDao.ChatRecordStruct{
+ SenderUserId: fromId,
+ SenderUserName: fromName,
+ SenderUserAvatar: fromAvatar,
+ ReceiverUserId: toId,
+ ReceiverUserName: toName,
+ ReceiverUserAvatar: toAvatar,
+ SendTime: CommonUtil.GetCurrentTime(),
+ Content: content,
+ MessageType: objectName,
+ ChatType: sendType,
+ }
+ } else if objectName == "RC:ImgMsg" {
+ //图片base64。
+ imgBase64 := c.PostForm("imgBase64")
+ //imgUrl
+ imgUrl := c.PostForm("imgUrl")
+ //文件名
+ fileName := c.PostForm("fileName")
+
+ crs = ImRelateDao.ChatRecordStruct{
+ SenderUserId: fromId,
+ SenderUserName: fromName,
+ SenderUserAvatar: fromAvatar,
+ ReceiverUserId: toId,
+ ReceiverUserName: toName,
+ ReceiverUserAvatar: toAvatar,
+ SendTime: CommonUtil.GetCurrentTime(),
+ Content: fileName,
+ Base64: imgBase64,
+ Url: imgUrl,
+ MessageType: objectName,
+ ChatType: sendType,
+ }
+ } else if objectName == "RC:FileMsg" {
+ //文件名
+ fileName := c.PostForm("fileName")
+ //文件大小
+ fileSize := c.PostForm("fileSize")
+ //文件类型
+ fileType := c.PostForm("fileType")
+ //文件URL
+ fileUrl := c.PostForm("fileUrl")
+
+ crs = ImRelateDao.ChatRecordStruct{
+ SenderUserId: fromId,
+ SenderUserName: fromName,
+ SenderUserAvatar: fromAvatar,
+ ReceiverUserId: toId,
+ ReceiverUserName: toName,
+ ReceiverUserAvatar: toAvatar,
+ SendTime: CommonUtil.GetCurrentTime(),
+ Content: fileName,
+ Size: fileSize,
+ FileType: fileType,
+ Url: fileUrl,
+ MessageType: objectName,
+ ChatType: sendType,
+ }
+ } else if objectName == "RC:SightMsg" {
+ //视频URL
+ videoUrl := c.PostForm("videoUrl")
+ //视频缩略图base64编码
+ thumbBase64 := ConfigUtil.VideoThumb
+ //视频大小
+ videoSize := c.PostForm("videoSize")
+ //视频名称
+ videoName := c.PostForm("fileName")
+
+ crs = ImRelateDao.ChatRecordStruct{
+ SenderUserId: fromId,
+ SenderUserName: fromName,
+ SenderUserAvatar: fromAvatar,
+ ReceiverUserId: toId,
+ ReceiverUserName: toName,
+ ReceiverUserAvatar: toAvatar,
+ SendTime: CommonUtil.GetCurrentTime(),
+ Content: videoName,
+ Size: videoSize,
+ Base64: thumbBase64,
+ Url: videoUrl,
+ MessageType: objectName,
+ ChatType: sendType,
+ }
+ } else {
+ c.JSON(http.StatusOK, gin.H{"success": false, "info": "objectName参数错误!"})
return
}
- fromName := ImRelateDao.GetPersonNameByUserId(fromId)
- fromAvatar := ImRelateDao.GetPersonAvatarByUserId(fromId)
- var toName, toAvatar string
- if sendType == "p" {
- toName = ImRelateDao.GetPersonNameByUserId(toId)
- toAvatar = ImRelateDao.GetPersonAvatarByUserId(toId)
- } else
- {
- toName, toAvatar = ImRelateDao.GetGroupNameAvatarByGroupId(toId)
- }
-
- cm := map[string]string{
- "sender_user_id": fromId,
- "sender_user_name": fromName,
- "sender_user_avatar": fromAvatar,
- "receiver_user_id": toId,
- "receiver_user_name": toName,
- "receiver_user_avatar": toAvatar,
- "send_time": CommonUtil.GetCurrentTime(),
- "content": content,
- "message_type": "TxtMsg",
- "chat_type": sendType,
- }
- bodyJsonObj, _ := json.Marshal(cm)
+ bodyJsonObj, _ := json.Marshal(crs)
bodyString := string(bodyJsonObj)
-
- saveErr := ImRelateDao.SaveChatRecord("chat_record", bodyString)
- if saveErr != nil {
- c.JSON(http.StatusOK, gin.H{"success": false, "info": "聊天记录保存失败!"})
- return
- }
-
- c.JSON(http.StatusOK, gin.H{"success": true, "info": "发送消息成功!"})
-}
-
-/**
-功能:发送融云图片消息
-作者:吴缤
-日期:2021-08-16
-*/
-func sendImgMsg(c *gin.Context) {
- //发送方Id。
- fromId := c.PostForm("fromId")
- //接收方Id。
- toId := c.PostForm("toId")
- //发送类型 p:单聊 g:群聊
- sendType := c.PostForm("sendType")
- //图片base64。
- imgBase64 := c.PostForm("imgBase64")
- //imgUrl
- imgUrl := c.PostForm("imgUrl")
- //文件名
- fileName := c.PostForm("fileName")
-
- m := map[string]string{"content": imgBase64, "imageUri": imgUrl}
- contentJsonObj, _ := json.Marshal(m)
- contentJsonStr := string(contentJsonObj)
-
- err := ImRelateDao.SendRongYunMsg(sendType, fromId, toId, "RC:ImgMsg", contentJsonStr)
- if err != nil {
- c.JSON(http.StatusOK, gin.H{"success": false, "info": "发送消息失败!"})
- return
- }
-
- fromName := ImRelateDao.GetPersonNameByUserId(fromId)
- fromAvatar := ImRelateDao.GetPersonAvatarByUserId(fromId)
- var toName, toAvatar string
- if sendType == "p" {
- toName = ImRelateDao.GetPersonNameByUserId(toId)
- toAvatar = ImRelateDao.GetPersonAvatarByUserId(toId)
- } else
- {
- toName, toAvatar = ImRelateDao.GetGroupNameAvatarByGroupId(toId)
- }
-
- cm := map[string]string{
- "sender_user_id": fromId,
- "sender_user_name": fromName,
- "sender_user_avatar": fromAvatar,
- "receiver_user_id": toId,
- "receiver_user_name": toName,
- "receiver_user_avatar": toAvatar,
- "send_time": CommonUtil.GetCurrentTime(),
- "content": fileName,
- "base64": imgBase64,
- "url": imgUrl,
- "message_type": "ImgMsg",
- "chat_type": sendType,
- }
- bodyJsonObj, _ := json.Marshal(cm)
- bodyString := string(bodyJsonObj)
-
- saveErr := ImRelateDao.SaveChatRecord("chat_record", bodyString)
- if saveErr != nil {
- c.JSON(http.StatusOK, gin.H{"success": false, "info": "聊天记录保存失败!"})
- return
- }
-
- c.JSON(http.StatusOK, gin.H{"success": true, "info": "发送消息成功!"})
-}
-
-/**
-功能:发送融云文件消息
-作者:吴缤
-日期:2021-08-16
-*/
-func sendFileMsg(c *gin.Context) {
- //发送方Id。
- fromId := c.PostForm("fromId")
- //接收方Id。
- toId := c.PostForm("toId")
- //发送类型 p:单聊 g:群聊
- sendType := c.PostForm("sendType")
- //文件名
- fileName := c.PostForm("fileName")
- //文件大小
- fileSize := c.PostForm("fileSize")
- //文件类型
- fileType := c.PostForm("fileType")
- //文件URL
- fileUrl := c.PostForm("fileUrl")
-
- m := map[string]string{"name": fileName, "size": fileSize, "type": fileType, "fileUrl": fileUrl}
- contentJsonObj, _ := json.Marshal(m)
- contentJsonStr := string(contentJsonObj)
-
- err := ImRelateDao.SendRongYunMsg(sendType, fromId, toId, "RC:FileMsg", contentJsonStr)
- if err != nil {
- c.JSON(http.StatusOK, gin.H{"success": false, "info": "发送消息失败!"})
- return
- }
-
- fromName := ImRelateDao.GetPersonNameByUserId(fromId)
- fromAvatar := ImRelateDao.GetPersonAvatarByUserId(fromId)
- var toName, toAvatar string
- if sendType == "p" {
- toName = ImRelateDao.GetPersonNameByUserId(toId)
- toAvatar = ImRelateDao.GetPersonAvatarByUserId(toId)
- } else
- {
- toName, toAvatar = ImRelateDao.GetGroupNameAvatarByGroupId(toId)
- }
-
- cm := map[string]string{
- "sender_user_id": fromId,
- "sender_user_name": fromName,
- "sender_user_avatar": fromAvatar,
- "receiver_user_id": toId,
- "receiver_user_name": toName,
- "receiver_user_avatar": toAvatar,
- "send_time": CommonUtil.GetCurrentTime(),
- "content": fileName,
- "size": fileSize,
- "file_type": fileType,
- "url": fileUrl,
- "message_type": "FileMsg",
- "chat_type": sendType,
- }
- bodyJsonObj, _ := json.Marshal(cm)
- bodyString := string(bodyJsonObj)
-
- saveErr := ImRelateDao.SaveChatRecord("chat_record", bodyString)
- if saveErr != nil {
- c.JSON(http.StatusOK, gin.H{"success": false, "info": "聊天记录保存失败!"})
- return
- }
-
- c.JSON(http.StatusOK, gin.H{"success": true, "info": "发送消息成功!"})
-}
-
-/**
-功能:发送融云视频消息
-作者:吴缤
-日期:2021-08-16
-*/
-func sendSightMsg(c *gin.Context) {
- //发送方Id。
- fromId := c.PostForm("fromId")
- //接收方Id。
- toId := c.PostForm("toId")
- //发送类型 p:单聊 g:群聊
- sendType := c.PostForm("sendType")
- //视频URL
- videoUrl := c.PostForm("videoUrl")
- //视频缩略图base64编码
- thumbBase64 := ConfigUtil.VideoThumb
- //视频大小
- videoSize := c.PostForm("videoSize")
- //视频名称
- videoName := c.PostForm("fileName")
-
- m := map[string]string{"sightUrl": videoUrl, "content": thumbBase64, "duration": "60", "size": videoSize, "name": videoName}
- contentJsonObj, _ := json.Marshal(m)
- contentJsonStr := string(contentJsonObj)
-
- err := ImRelateDao.SendRongYunMsg(sendType, fromId, toId, "RC:SightMsg", contentJsonStr)
- if err != nil {
- c.JSON(http.StatusOK, gin.H{"success": false, "info": "发送消息失败!"})
- return
- }
-
- fromName := ImRelateDao.GetPersonNameByUserId(fromId)
- fromAvatar := ImRelateDao.GetPersonAvatarByUserId(fromId)
- var toName, toAvatar string
- if sendType == "p" {
- toName = ImRelateDao.GetPersonNameByUserId(toId)
- toAvatar = ImRelateDao.GetPersonAvatarByUserId(toId)
- } else
- {
- toName, toAvatar = ImRelateDao.GetGroupNameAvatarByGroupId(toId)
- }
-
- cm := map[string]string{
- "sender_user_id": fromId,
- "sender_user_name": fromName,
- "sender_user_avatar": fromAvatar,
- "receiver_user_id": toId,
- "receiver_user_name": toName,
- "receiver_user_avatar": toAvatar,
- "send_time": CommonUtil.GetCurrentTime(),
- "content": videoName,
- "size": videoSize,
- "base64": thumbBase64,
- "url": videoUrl,
- "message_type": "SightMsg",
- "chat_type": sendType,
- }
- bodyJsonObj, _ := json.Marshal(cm)
- bodyString := string(bodyJsonObj)
-
saveErr := ImRelateDao.SaveChatRecord("chat_record", bodyString)
if saveErr != nil {
c.JSON(http.StatusOK, gin.H{"success": false, "info": "聊天记录保存失败!"})
diff --git a/dsSzxy/Business/ImRelate/ImRelateDao/ImRelateDao.go b/dsSzxy/Business/ImRelate/ImRelateDao/ImRelateDao.go
index ca2423ea..7c37d2c4 100644
--- a/dsSzxy/Business/ImRelate/ImRelateDao/ImRelateDao.go
+++ b/dsSzxy/Business/ImRelate/ImRelateDao/ImRelateDao.go
@@ -15,6 +15,24 @@ import (
"strings"
)
+//聊天记录结构
+type ChatRecordStruct struct {
+ SenderUserId string `json:"sender_user_id"`
+ SenderUserName string `json:"sender_user_name"`
+ SenderUserAvatar string `json:"sender_user_avatar"`
+ ReceiverUserId string `json:"receiver_user_id"`
+ ReceiverUserName string `json:"receiver_user_name"`
+ ReceiverUserAvatar string `json:"receiver_user_avatar"`
+ SendTime string `json:"send_time"`
+ Content string `json:"content"`
+ Base64 string `json:"base64"`
+ FileType string `json:"file_type"`
+ Url string `json:"url"`
+ Size string `json:"size"`
+ MessageType string `json:"message_type"`
+ ChatType string `json:"chat_type"`
+}
+
/**
功能:获取头像
作者:吴缤
@@ -158,10 +176,10 @@ func SendRongYunMsg(sendType string, fromId string, toId string, objectName stri
if configErr != nil {
return configErr
}
- ak := configMap["rong_key"]
+ ak := configMap["app_key"]
r := CommonUtil.GetSixRandom()
ts := CommonUtil.GetTimeStamp()
- sk := configMap["rong_secret"]
+ sk := configMap["app_secret"]
st := CommonUtil.SHA1(sk + r + ts)
@@ -265,3 +283,21 @@ func GetGroupNameAvatarByGroupId(groupId string) (string, string) {
groupName, groupAvatar := GetGroupNameAvatar(gId, "36", "36")
return groupName, groupAvatar
}
+
+/**
+功能:根据发送人、接收人和发送类型获取人名和头像
+作者:吴缤
+日期:2021-08-23
+*/
+func GetPersonNameAvatar(fromId string, toId string, sendType string) (fromName, fromAvatar, toName, toAvatar string) {
+ fromName = GetPersonNameByUserId(fromId)
+ fromAvatar = GetPersonAvatarByUserId(fromId)
+ if sendType == "p" {
+ toName = GetPersonNameByUserId(toId)
+ toAvatar = GetPersonAvatarByUserId(toId)
+ } else
+ {
+ toName, toAvatar = GetGroupNameAvatarByGroupId(toId)
+ }
+ return
+}
diff --git a/dsSzxy/Config/Config.ini b/dsSzxy/Config/Config.ini
index 7f3155db..7f25cc27 100644
--- a/dsSzxy/Config/Config.ini
+++ b/dsSzxy/Config/Config.ini
@@ -23,16 +23,16 @@ user = root
pwd = DsideaL147258369
[redis]
-ip = 10.10.14.169
+ip = 10.10.14.199
port = 18890
db = 0
[ssdb]
-ip = 10.10.14.169
+ip = 10.10.14.199
port = 8888
[elasticsearch]
-url = http://10.10.14.212:9200
+url = http://10.10.14.188:9200
#minio配置
[minio]
@@ -63,7 +63,4 @@ path = /usr/local/dsMin/dsSzxy/files/
config_path = c:/1/config.properties
[videoThumb]
-thumb = data:image/jpeg;base64,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
-
-
-
+thumb = data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/PjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+PHN2ZyB0PSIxNjI5NDQ3MDA4MTUxIiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDE1MTIgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjE5MzU3IiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgd2lkdGg9IjIyLjE0ODQzNzUiIGhlaWdodD0iMTUiPjxkZWZzPjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTY2LjU2MjEzMiAxNDMuMzI1MzU3bTE2OS4wODMxMTcgMGwzNTAuOTE3NiAwcTE2OS4wODMxMTcgMCAxNjkuMDgzMTE3IDE2OS4wODMxMTdsMCAzNTAuOTE3NnEwIDE2OS4wODMxMTctMTY5LjA4MzExNyAxNjkuMDgzMTE3bC0zNTAuOTE3NiAwcS0xNjkuMDgzMTE3IDAtMTY5LjA4MzExNy0xNjkuMDgzMTE3bDAtMzUwLjkxNzZxMC0xNjkuMDgzMTE3IDE2OS4wODMxMTctMTY5LjA4MzExN1oiIGZpbGw9IiNGRkM4OEIiIG9wYWNpdHk9Ii40IiBwLWlkPSIxOTM1OCI+PC9wYXRoPjxwYXRoIGQ9Ik04ODkuMjgwMjg1IDQ1MC4xMjMyM0w2MjYuODU3MTY3IDI5OC4zODE5NzFBNDMuNjA5NjczIDQzLjYwOTY3MyAwIDAgMCA1NjEuMDYwMTE3IDMzNi4zODEwNDN2MzAyLjk3MjQ2M2E0My4zNTQ2NDUgNDMuMzU0NjQ1IDAgMCAwIDY1LjI4Njk5NSAzNy43NDQwNDRsMjYyLjQyMzExOC0xNTEuNDg2MjMyYTQzLjM1NDY0NSA0My4zNTQ2NDUgMCAwIDAgMC41MTAwNTUtNzUuNDg4MDg4eiIgZmlsbD0iI0ZGQzg4QiIgcC1pZD0iMTkzNTkiPjwvcGF0aD48cGF0aCBkPSJNOTkuNzE1Njg0IDc3MC40Mzc1NTFtLTk5LjcxNTY4NCAwYTk5LjcxNTY4NCA5OS43MTU2ODQgMCAxIDAgMTk5LjQzMTM2OSAwIDk5LjcxNTY4NCA5OS43MTU2ODQgMCAxIDAtMTk5LjQzMTM2OSAwWiIgZmlsbD0iI0ZGQzg4QiIgcC1pZD0iMTkzNjAiPjwvcGF0aD48cGF0aCBkPSJNMTM4My4yNjgyMTUgNDIxLjMwNTE0Mm0tNTguNDAxMjU4IDBhNTguNDAxMjU4IDU4LjQwMTI1OCAwIDEgMCAxMTYuODAyNTE2IDAgNTguNDAxMjU4IDU4LjQwMTI1OCAwIDEgMC0xMTYuODAyNTE2IDBaIiBmaWxsPSIjRkZDODhCIiBwLWlkPSIxOTM2MSI+PC9wYXRoPjxwYXRoIGQ9Ik0yNDEuMjU1ODUgMG0xNjkuMDgzMTE3IDBsNjM3LjU2ODMxNSAwcTE2OS4wODMxMTcgMCAxNjkuMDgzMTE3IDE2OS4wODMxMTdsMCA2MzcuNTY4MzE0cTAgMTY5LjA4MzExNy0xNjkuMDgzMTE3IDE2OS4wODMxMTdsLTYzNy41NjgzMTUgMHEtMTY5LjA4MzExNyAwLTE2OS4wODMxMTctMTY5LjA4MzExN2wwLTYzNy41NjgzMTRxMC0xNjkuMDgzMTE3IDE2OS4wODMxMTctMTY5LjA4MzExN1oiIGZpbGw9IiNGRkM4OEIiIHAtaWQ9IjE5MzYyIj48L3BhdGg+PHBhdGggZD0iTTg4OS4yODAyODUgNDUwLjEyMzIzTDYyNi44NTcxNjcgMjk4LjM4MTk3MUE0My42MDk2NzMgNDMuNjA5NjczIDAgMCAwIDU2MS4wNjAxMTcgMzM2LjM4MTA0M3YzMDIuOTcyNDYzYTQzLjM1NDY0NSA0My4zNTQ2NDUgMCAwIDAgNjUuMjg2OTk1IDM3Ljc0NDA0NGwyNjIuNDIzMTE4LTE1MS40ODYyMzJhNDMuMzU0NjQ1IDQzLjM1NDY0NSAwIDAgMCAwLjUxMDA1NS03NS40ODgwODh6IiBmaWxsPSIjRkZGRkZGIiBwLWlkPSIxOTM2MyI+PC9wYXRoPjwvc3ZnPg==