Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wecloud_im_server
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
hewei
wecloud_im_server
Commits
605fa942
Commit
605fa942
authored
Oct 29, 2021
by
hewei
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch '1.3' into 'master'
1.3 See merge request
!4
parents
22172dc3
6f7ab054
Hide whitespace changes
Inline
Side-by-side
Showing
25 changed files
with
429 additions
and
51 deletions
+429
-51
README-zh.md
+3
-0
common/src/main/java/com/wecloud/im/controller/ImClientController.java
+13
-0
common/src/main/java/com/wecloud/im/controller/ImMessageController.java
+3
-3
common/src/main/java/com/wecloud/im/mapper/ImClientMapper.java
+4
-0
common/src/main/java/com/wecloud/im/mapper/ImConversationMapper.java
+10
-0
common/src/main/java/com/wecloud/im/mapper/ImInboxMapper.java
+8
-0
common/src/main/java/com/wecloud/im/param/add/ImMsgRecall.java
+30
-0
common/src/main/java/com/wecloud/im/service/ImClientService.java
+12
-0
common/src/main/java/com/wecloud/im/service/ImConversationService.java
+10
-0
common/src/main/java/com/wecloud/im/service/ImInboxService.java
+8
-0
common/src/main/java/com/wecloud/im/service/ImMessageService.java
+2
-2
common/src/main/java/com/wecloud/im/service/impl/ImClientServiceImpl.java
+44
-1
common/src/main/java/com/wecloud/im/service/impl/ImConversationServiceImpl.java
+18
-20
common/src/main/java/com/wecloud/im/service/impl/ImInboxServiceImpl.java
+13
-0
common/src/main/java/com/wecloud/im/service/impl/ImMessageServiceImpl.java
+102
-6
common/src/main/java/com/wecloud/im/ws/model/request/PushModel.java
+0
-4
common/src/main/java/com/wecloud/im/ws/sender/PushTask.java
+38
-8
common/src/main/java/com/wecloud/im/ws/strategy/concrete/ImConcreteReceiveStrategy.java
+2
-2
common/src/main/resources/mapper/ImClientMapper.xml
+6
-0
common/src/main/resources/mapper/ImConversationMapper.xml
+19
-0
common/src/main/resources/mapper/ImInboxMapper.xml
+6
-0
config/src/main/resources/config/application-dev.yml
+6
-1
config/src/main/resources/config/application-prod.yml
+12
-1
docs/config/imapi.wecloud.cn.conf
+35
-0
开发记录.md
+25
-3
No files found.
README-zh.md
View file @
605fa942
...
...
@@ -30,6 +30,9 @@ docker run -p 3306:3306 --name mysql57 -v $PWD/dockerData/mysql57/data:/var/lib/
---
tail -f /data0/java_projects_jenkins/logs/spring-boot-plus-error.log
## 开发规范
### 关于模块
...
...
common/src/main/java/com/wecloud/im/controller/ImClientController.java
View file @
605fa942
...
...
@@ -58,6 +58,19 @@ public class ImClientController extends BaseController {
/**
* 退出登陆
*
* @return
* @throws Exception
*/
@PostMapping
(
"/logout"
)
@ApiOperation
(
value
=
"退出登陆 清除推送token等"
)
public
ApiResult
<
Boolean
>
logout
()
throws
Exception
{
boolean
flag
=
imClientService
.
logout
();
return
ApiResult
.
result
(
flag
);
}
/**
* 获取用户在线状态(批量)
*
* @return true:在线, false 不在线
...
...
common/src/main/java/com/wecloud/im/controller/ImMessageController.java
View file @
605fa942
package
com
.
wecloud
.
im
.
controller
;
import
com.wecloud.im.param.ImHistoryMessagePageParam
;
import
com.wecloud.im.param.add.ImMsgRecall
;
import
com.wecloud.im.param.add.ImMsgUpdate
;
import
com.wecloud.im.service.ImMessageService
;
import
com.wecloud.im.vo.ImMessageOfflineListVo
;
...
...
@@ -18,7 +19,6 @@ import org.springframework.validation.annotation.Validated;
import
org.springframework.web.bind.annotation.PostMapping
;
import
org.springframework.web.bind.annotation.RequestBody
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RequestParam
;
import
org.springframework.web.bind.annotation.RestController
;
import
java.util.List
;
...
...
@@ -43,8 +43,8 @@ public class ImMessageController extends BaseController {
*/
@PostMapping
(
"/withdraw"
)
@ApiOperation
(
value
=
"消息撤回"
,
notes
=
"只能撤回客户端自己发送的消息"
)
public
ApiResult
<
Boolean
>
updateMsgWithdrawById
(
@Request
Param
Long
msgId
)
throws
Exception
{
return
imMessageService
.
updateMsgWithdrawById
(
msgId
);
public
ApiResult
<
Boolean
>
updateMsgWithdrawById
(
@Request
Body
ImMsgRecall
imMsgRecall
)
throws
Exception
{
return
imMessageService
.
updateMsgWithdrawById
(
imMsgRecall
);
}
/**
...
...
common/src/main/java/com/wecloud/im/mapper/ImClientMapper.java
View file @
605fa942
...
...
@@ -37,4 +37,8 @@ public interface ImClientMapper extends BaseMapper<ImClient> {
*/
IPage
<
ImClientQueryVo
>
getImClientPageList
(
@Param
(
"page"
)
Page
page
,
@Param
(
"param"
)
ImClientPageParam
imClientPageParam
);
int
removeOldToken
(
@Param
(
"appId"
)
Long
appId
,
@Param
(
"deviceToken"
)
String
deviceToken
);
}
common/src/main/java/com/wecloud/im/mapper/ImConversationMapper.java
View file @
605fa942
...
...
@@ -65,6 +65,16 @@ public interface ImConversationMapper extends BaseMapper<ImConversation> {
*/
Integer
getRepetitionConversation
(
@Param
(
"clientId1"
)
Long
clientId1
,
@Param
(
"clientId2"
)
Long
clientId2
);
/**
* 判断重复会话中的Attributes是否一样
*
* @param clientId1
* @param clientId2
* @param attributes
* @return 大于等于1为有重复会话
*/
Long
getRepetitionConversationAttributes
(
@Param
(
"clientId1"
)
Long
clientId1
,
@Param
(
"clientId2"
)
Long
clientId2
,
@Param
(
"attributes"
)
String
attributes
);
/**
* 查询已经存在的会话信息
...
...
common/src/main/java/com/wecloud/im/mapper/ImInboxMapper.java
View file @
605fa942
...
...
@@ -42,4 +42,12 @@ public interface ImInboxMapper extends BaseMapper<ImInbox> {
Long
updateImMsgReceivedByIds
(
@Param
(
"clientId"
)
Long
clientId
,
@Param
(
"msgIds"
)
List
<
Long
>
msgIds
);
Long
updateImMsgReadByIds
(
@Param
(
"clientId"
)
Long
clientId
,
@Param
(
"msgIds"
)
List
<
Long
>
msgIds
);
/**
* 统计未读消息数量
*
* @param clientId
* @return
*/
Integer
countMyNotReadCount
(
@Param
(
"clientId"
)
Long
clientId
);
}
common/src/main/java/com/wecloud/im/param/add/ImMsgRecall.java
0 → 100644
View file @
605fa942
package
com
.
wecloud
.
im
.
param
.
add
;
import
com.wecloud.im.ws.model.request.PushModel
;
import
io.geekidea.springbootplus.framework.common.entity.BaseEntity
;
import
io.swagger.annotations.ApiModel
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.Data
;
import
lombok.EqualsAndHashCode
;
import
lombok.experimental.Accessors
;
/**
* 撤回消息
*
* @author wei
*/
@Data
@Accessors
(
chain
=
true
)
@EqualsAndHashCode
(
callSuper
=
true
)
@ApiModel
(
value
=
"ImMsgRecall"
)
public
class
ImMsgRecall
extends
BaseEntity
{
private
static
final
long
serialVersionUID
=
1L
;
@ApiModelProperty
(
"消息id"
)
private
Long
msgId
;
@ApiModelProperty
(
"自定义推送字段"
)
private
PushModel
push
;
}
common/src/main/java/com/wecloud/im/service/ImClientService.java
View file @
605fa942
...
...
@@ -32,6 +32,9 @@ public interface ImClientService extends BaseService<ImClient> {
*/
boolean
updateDeviceInfo
(
ImClientDeviceInfoAdd
imClientDevice
);
boolean
logout
();
/**
* 修改
*
...
...
@@ -60,6 +63,15 @@ public interface ImClientService extends BaseService<ImClient> {
ImClientQueryVo
getImClientById
(
Long
id
)
throws
Exception
;
/**
* 移除旧的设备token
*
* @param appId
* @param deviceToken
* @return
*/
int
removeOldToken
(
Long
appId
,
String
deviceToken
);
/**
* 获取分页对象
*
* @param imClientPageParam
...
...
common/src/main/java/com/wecloud/im/service/ImConversationService.java
View file @
605fa942
...
...
@@ -102,5 +102,15 @@ public interface ImConversationService extends BaseService<ImConversation> {
*/
Integer
getRepetitionConversation
(
Long
clientId1
,
Long
clientId2
);
/**
* 判断重复会话中的Attributes是否一样
*
* @param clientId1
* @param clientId2
* @param attributes
* @return 大于等于1为有重复会话
*/
Long
getRepetitionConversationAttributes
(
Long
clientId1
,
Long
clientId2
,
String
attributes
);
}
common/src/main/java/com/wecloud/im/service/ImInboxService.java
View file @
605fa942
...
...
@@ -70,6 +70,14 @@ public interface ImInboxService extends BaseService<ImInbox> {
ApiResult
<
Boolean
>
updateImMsgReceived
(
ImMsgReceivedStatusUpdate
imMsgReceivedUpdate
);
/**
* 统计未读消息数量
*
* @param clientId
* @return
*/
Integer
countMyNotReadCount
(
Long
clientId
);
/**
* 消息修改为已读状态
*
* @return
...
...
common/src/main/java/com/wecloud/im/service/ImMessageService.java
View file @
605fa942
...
...
@@ -2,6 +2,7 @@ package com.wecloud.im.service;
import
com.wecloud.im.entity.ImMessage
;
import
com.wecloud.im.param.ImHistoryMessagePageParam
;
import
com.wecloud.im.param.add.ImMsgRecall
;
import
com.wecloud.im.param.add.ImMsgUpdate
;
import
com.wecloud.im.vo.ImMessageOfflineListVo
;
import
com.wecloud.im.vo.OfflineMsgDto
;
...
...
@@ -23,10 +24,9 @@ public interface ImMessageService extends BaseService<ImMessage> {
/**
* 消息撤回 只能撤回客户端自己发送的消息
*
* @param msgId
* @return
*/
ApiResult
<
Boolean
>
updateMsgWithdrawById
(
Long
msgId
);
ApiResult
<
Boolean
>
updateMsgWithdrawById
(
ImMsgRecall
imMsgRecall
);
/**
* 修改消息体
...
...
common/src/main/java/com/wecloud/im/service/impl/ImClientServiceImpl.java
View file @
605fa942
package
com
.
wecloud
.
im
.
service
.
impl
;
import
com.baomidou.mybatisplus.core.conditions.query.QueryWrapper
;
import
com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper
;
import
com.baomidou.mybatisplus.core.metadata.IPage
;
import
com.baomidou.mybatisplus.core.metadata.OrderItem
;
import
com.baomidou.mybatisplus.extension.plugins.pagination.Page
;
...
...
@@ -51,18 +52,53 @@ public class ImClientServiceImpl extends BaseServiceImpl<ImClientMapper, ImClien
@Override
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
boolean
updateDeviceInfo
(
ImClientDeviceInfoAdd
imClientDevice
)
{
// shiro线程中获取当前token
JwtToken
curentJwtToken
=
JwtUtil
.
getCurentJwtToken
();
// 根据appKey查询appid
ImApplication
imApplication
=
imApplicationService
.
getOneByAppKey
(
curentJwtToken
.
getAppKey
());
// 清除旧client的redis缓存
ImClient
imClient
=
this
.
getOne
(
new
QueryWrapper
<
ImClient
>().
lambda
()
.
eq
(
ImClient:
:
getFkAppid
,
imApplication
.
getId
())
.
eq
(
ImClient:
:
getDeviceToken
,
imClientDevice
.
getDeviceToken
()));
if
(
imClient
!=
null
)
{
deleteCacheImClient
(
imClient
.
getFkAppid
(),
imClient
.
getClientId
());
// client登陆的时候 判断数据库内是否已经存在这个设备token,如果存在就清空旧的
this
.
removeOldToken
(
imApplication
.
getId
(),
curentJwtToken
.
getToken
());
}
ImClient
client
=
getCurentClient
();
ImClient
clientNew
=
new
ImClient
();
BeanUtils
.
copyProperties
(
imClientDevice
,
clientNew
);
clientNew
.
setId
(
client
.
getId
());
// 清
楚
缓存
// 清
除新client的redis
缓存
deleteCacheImClient
(
client
.
getFkAppid
(),
client
.
getClientId
());
// 修改
return
this
.
updateImClient
(
clientNew
);
}
@Override
public
boolean
logout
()
{
ImClient
curentClient
=
getCurentClient
();
// 清除设备token
boolean
update
=
this
.
update
(
new
UpdateWrapper
<
ImClient
>().
lambda
()
.
eq
(
ImClient:
:
getFkAppid
,
curentClient
.
getFkAppid
())
.
eq
(
ImClient:
:
getId
,
curentClient
.
getId
())
.
set
(
ImClient:
:
getDeviceToken
,
null
)
);
if
(
update
)
{
// 清除新client的redis缓存
deleteCacheImClient
(
curentClient
.
getFkAppid
(),
curentClient
.
getClientId
());
}
return
update
;
}
@Transactional
(
rollbackFor
=
Exception
.
class
)
@Override
public
boolean
updateImClient
(
ImClient
imClient
)
{
...
...
@@ -75,6 +111,13 @@ public class ImClientServiceImpl extends BaseServiceImpl<ImClientMapper, ImClien
return
super
.
removeById
(
id
);
}
@Transactional
(
rollbackFor
=
Exception
.
class
)
@Override
public
int
removeOldToken
(
Long
appId
,
String
deviceToken
)
{
return
imClientMapper
.
removeOldToken
(
appId
,
deviceToken
);
}
@Override
public
ImClientQueryVo
getImClientById
(
Long
id
)
throws
Exception
{
return
imClientMapper
.
getImClientById
(
id
);
...
...
common/src/main/java/com/wecloud/im/service/impl/ImConversationServiceImpl.java
View file @
605fa942
...
...
@@ -123,37 +123,30 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
}
}
else
{
//创建重复会话时对比扩展字段
0不
1是
//创建重复会话时对比扩展字段 1是
if
(
imApplication
.
getContrastExtendedFieldStatus
()
==
1
)
{
// 被邀请client
ImClient
inviteClient
=
imClientService
.
getOne
(
new
QueryWrapper
<
ImClient
>().
lambda
()
.
eq
(
ImClient:
:
getFkAppid
,
createClient
.
getFkAppid
())
.
eq
(
ImClient:
:
getClientId
,
imConversationCreate
.
getClientIds
().
get
(
0
)));
JsonMapper
jsonMapper
=
new
JsonMapper
();
String
asString
=
jsonMapper
.
writeValueAsString
(
imConversationCreate
.
getAttributes
());
log
.
info
(
"RequestAttributes:"
+
asString
);
// 是否存在重复会话
Integer
repetitionConversation
=
getRepetitionConversation
(
createClient
.
getId
(),
inviteClient
.
getId
());
if
(
repetitionConversation
!=
0
)
{
ImConversation
repetitionConversationInfo
=
imConversationMapper
.
getRepetitionConversationInfo
(
createClient
.
getId
(),
inviteClient
.
getId
());
log
.
info
(
"出现Conversation重复"
);
JsonMapper
jsonMapper
=
new
JsonMapper
();
HashMap
dbAttributesMap
=
jsonMapper
.
readValue
(
repetitionConversationInfo
.
getAttributes
(),
HashMap
.
class
);
Long
repetitionConversation
=
getRepetitionConversationAttributes
(
createClient
.
getId
(),
inviteClient
.
getId
(),
asString
);
log
.
info
(
"DBAttributes:"
+
repetitionConversationInfo
.
getAttributes
());
log
.
info
(
"RequestAttributes:"
+
jsonMapper
.
writeValueAsString
(
imConversationCreate
.
getAttributes
()));
if
(
dbAttributesMap
.
equals
(
imConversationCreate
.
getAttributes
()))
{
log
.
info
(
"出现Attributes重复"
);
ImConversationCreateVo
imConversationCreateVo
=
new
ImConversationCreateVo
();
imConversationCreateVo
.
setId
(
repetitionConversationInfo
.
getId
());
// 为重复
return
ApiResult
.
ok
(
imConversationCreateVo
);
}
// 存在重复会话
if
(
repetitionConversation
!=
null
)
{
log
.
info
(
"出现Attributes重复"
);
ImConversationCreateVo
imConversationCreateVo
=
new
ImConversationCreateVo
();
imConversationCreateVo
.
setId
(
repetitionConversation
);
// 为重复
return
ApiResult
.
ok
(
imConversationCreateVo
);
}
}
}
// 会话id
...
...
@@ -289,4 +282,9 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
return
imConversationMapper
.
getRepetitionConversation
(
clientId1
,
clientId2
);
}
@Override
public
Long
getRepetitionConversationAttributes
(
Long
clientId1
,
Long
clientId2
,
String
attributes
)
{
return
imConversationMapper
.
getRepetitionConversationAttributes
(
clientId1
,
clientId2
,
attributes
);
}
}
common/src/main/java/com/wecloud/im/service/impl/ImInboxServiceImpl.java
View file @
605fa942
...
...
@@ -116,6 +116,19 @@ public class ImInboxServiceImpl extends BaseServiceImpl<ImInboxMapper, ImInbox>
return
ApiResult
.
ok
();
}
/**
* 统计未读消息数量
*
* @param clientId
* @return
*/
@Override
public
Integer
countMyNotReadCount
(
Long
clientId
)
{
return
imInboxMapper
.
countMyNotReadCount
(
clientId
);
}
@Override
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
ApiResult
<
Boolean
>
updateImMsgRead
(
ImMsgReadStatusUpdate
imMsgReadStatusUpdate
)
{
...
...
common/src/main/java/com/wecloud/im/service/impl/ImMessageServiceImpl.java
View file @
605fa942
package
com
.
wecloud
.
im
.
service
.
impl
;
import
com.baomidou.mybatisplus.core.conditions.query.QueryWrapper
;
import
com.baomidou.mybatisplus.core.metadata.IPage
;
import
com.baomidou.mybatisplus.core.metadata.OrderItem
;
import
com.baomidou.mybatisplus.extension.plugins.pagination.Page
;
import
com.fasterxml.jackson.core.JsonProcessingException
;
import
com.fasterxml.jackson.databind.json.JsonMapper
;
import
com.wecloud.im.entity.ImApplication
;
import
com.wecloud.im.entity.ImClient
;
import
com.wecloud.im.entity.ImConversation
;
import
com.wecloud.im.entity.ImConversationMembers
;
import
com.wecloud.im.entity.ImMessage
;
import
com.wecloud.im.entity.ImMessageOnlineSend
;
import
com.wecloud.im.mapper.ImMessageMapper
;
import
com.wecloud.im.param.ImHistoryMessagePageParam
;
import
com.wecloud.im.param.add.ImMsgRecall
;
import
com.wecloud.im.param.add.ImMsgUpdate
;
import
com.wecloud.im.service.ImApplicationService
;
import
com.wecloud.im.service.ImClientService
;
import
com.wecloud.im.service.ImConversationMembersService
;
import
com.wecloud.im.service.ImConversationService
;
import
com.wecloud.im.service.ImMessageService
;
import
com.wecloud.im.vo.ImMessageOfflineListVo
;
import
com.wecloud.im.vo.OfflineMsgDto
;
import
com.wecloud.im.ws.model.ResponseModel
;
import
com.wecloud.im.ws.model.request.PushModel
;
import
com.wecloud.im.ws.sender.PushTask
;
import
com.wecloud.im.ws.service.WriteDataService
;
import
io.geekidea.springbootplus.framework.common.api.ApiCode
;
import
io.geekidea.springbootplus.framework.common.api.ApiResult
;
import
io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl
;
import
io.geekidea.springbootplus.framework.core.pagination.PageInfo
;
import
io.geekidea.springbootplus.framework.core.pagination.Paging
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.BeanUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Transactional
;
...
...
@@ -48,14 +61,34 @@ public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMes
@Autowired
private
ImConversationService
imConversationService
;
@Autowired
private
PushTask
pushTask
;
@Autowired
private
ImApplicationService
imApplicationService
;
@Autowired
private
ImConversationMembersService
imConversationMembersService
;
@Autowired
private
WriteDataService
writeDataService
;
@Override
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
ApiResult
<
Boolean
>
updateMsgWithdrawById
(
Long
msgId
)
{
ImClient
client
=
imClientService
.
getCurentClient
();
public
ApiResult
<
Boolean
>
updateMsgWithdrawById
(
ImMsgRecall
imMsgRecall
)
{
ImClient
imClientSender
=
imClientService
.
getCurentClient
();
// 查询imApplication
ImApplication
imApplication
=
imApplicationService
.
getById
(
imClientSender
.
getFkAppid
());
if
(
imApplication
==
null
)
{
log
.
info
(
"imApplication为空"
);
return
ApiResult
.
fail
();
}
// 判断该消息是否是该客户端发送
ImMessage
messageById
=
this
.
getById
(
msgId
);
if
(!
messageById
.
getSender
().
equals
(
client
.
getId
()))
{
ImMessage
messageById
=
this
.
getById
(
imMsgRecall
.
getMsgId
()
);
if
(!
messageById
.
getSender
().
equals
(
imClientSender
.
getId
()))
{
log
.
error
(
"判断该消息是否是该客户端发送"
);
return
ApiResult
.
fail
();
}
...
...
@@ -63,13 +96,76 @@ public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMes
return
ApiResult
.
ok
();
}
// 修改消息体
messageById
.
setWithdraw
(
Boolean
.
TRUE
);
messageById
.
setWithdrawTime
(
new
Date
());
messageById
.
setContent
(
"{}"
);
boolean
saveOk
=
this
.
updateById
(
messageById
);
if
(
saveOk
)
{
boolean
b
=
this
.
updateById
(
messageById
);
if
(
b
)
{
// 查询该会话所有成员
List
<
ImConversationMembers
>
membersList
=
imConversationMembersService
.
list
(
new
QueryWrapper
<
ImConversationMembers
>().
lambda
()
.
eq
(
ImConversationMembers:
:
getFkConversationId
,
messageById
.
getFkConversationId
())
.
notIn
(
ImConversationMembers:
:
getFkClientId
,
imClientSender
.
getId
())
);
if
(
membersList
.
isEmpty
())
{
log
.
info
(
"membersList为空,toConversationId:"
+
messageById
.
getFkConversationId
());
return
ApiResult
.
fail
();
}
// 遍历发送
for
(
ImConversationMembers
conversationMembers
:
membersList
)
{
// // 保存收件箱
// long imInboxId = SnowflakeUtil.getId();
// ImInbox imInbox = new ImInbox();
// imInbox.setId(imInboxId);
// imInbox.setCreateTime(new Date());
// imInbox.setFkAppid(imApplication.getId());
// imInbox.setReceiver(conversationMembers.getFkClientId());
// imInbox.setFkMsgId(messageId);
// imInbox.setReadMsgStatus(0);
// imInbox.setReceiverMsgStatus(0);
// imInbox.setFkConversationId(toConversationId);
// imInboxService.save(imInbox);
// 查询接收方
ImClient
imClientReceiver
=
imClientService
.
getOne
(
new
QueryWrapper
<
ImClient
>().
lambda
()
.
eq
(
ImClient:
:
getFkAppid
,
imApplication
.
getId
())
.
eq
(
ImClient:
:
getId
,
conversationMembers
.
getFkClientId
()));
if
(
imClientReceiver
==
null
)
{
continue
;
}
// 封装响应的实体
ImMessageOnlineSend
imMessageOnlineSend
=
new
ImMessageOnlineSend
();
BeanUtils
.
copyProperties
(
messageById
,
imMessageOnlineSend
);
imMessageOnlineSend
.
setMsgId
(
messageById
.
getId
());
imMessageOnlineSend
.
setSender
(
imClientSender
.
getClientId
());
imMessageOnlineSend
.
setContent
(
null
);
imMessageOnlineSend
.
setConversationId
(
conversationMembers
.
getFkConversationId
());
imMessageOnlineSend
.
setWithdraw
(
Boolean
.
TRUE
);
imMessageOnlineSend
.
setEvent
(
Boolean
.
TRUE
);
// 向接收方推送
ResponseModel
<
ImMessageOnlineSend
>
responseModel
=
new
ResponseModel
<>();
responseModel
.
setCmd
(
ResponseModel
.
ONLINE_EVENT_MSG
);
ApiResult
<
Boolean
>
result
=
ApiResult
.
result
(
ApiCode
.
SUCCESS
);
responseModel
.
setCode
(
result
.
getCode
());
responseModel
.
setMsg
(
result
.
getMessage
());
responseModel
.
setData
(
imMessageOnlineSend
);
responseModel
.
setReqId
(
null
);
writeDataService
.
write
(
responseModel
,
imApplication
.
getAppKey
(),
imClientReceiver
.
getClientId
());
// 获取自定义推送字段
PushModel
pushModel
=
imMsgRecall
.
getPush
();
// 异步推送系统通知消息
pushTask
.
push
(
pushModel
,
imClientReceiver
,
imApplication
);
}
return
ApiResult
.
ok
();
}
else
{
...
...
common/src/main/java/com/wecloud/im/ws/model/request/PushModel.java
View file @
605fa942
package
com
.
wecloud
.
im
.
ws
.
model
.
request
;
import
lombok.AllArgsConstructor
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
import
java.io.Serializable
;
...
...
@@ -12,8 +10,6 @@ import java.io.Serializable;
* @Date 2019-12-05
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public
class
PushModel
implements
Serializable
{
/**
...
...
common/src/main/java/com/wecloud/im/ws/sender/PushTask.java
View file @
605fa942
...
...
@@ -7,6 +7,7 @@ import com.wecloud.im.entity.ImApplication;
import
com.wecloud.im.entity.ImClient
;
import
com.wecloud.im.entity.ImIosApns
;
import
com.wecloud.im.push.PushUtils
;
import
com.wecloud.im.service.ImInboxService
;
import
com.wecloud.im.service.ImIosApnsService
;
import
com.wecloud.im.ws.model.request.PushModel
;
import
lombok.extern.slf4j.Slf4j
;
...
...
@@ -35,6 +36,10 @@ public class PushTask {
@Autowired
private
ImIosApnsService
imIosApnsService
;
@Autowired
private
ImInboxService
imInboxService
;
/**
* 谷歌推送地址
*/
...
...
@@ -50,23 +55,23 @@ public class PushTask {
*/
private
static
final
String
PUSH_BODY
=
"Click to view"
;
private
static
final
String
title
=
"title"
;
private
static
final
String
subTitle
=
"subTitle"
;
/**
* 异步系统推送
*
* @param imClientReceiver
*/
@Async
public
void
push
(
HashMap
<
String
,
String
>
pushMap
,
ImClient
imClientReceiver
,
ImApplication
imApplication
)
{
public
void
push
(
PushModel
pushModel
,
ImClient
imClientReceiver
,
ImApplication
imApplication
)
{
log
.
info
(
"push:"
+
imClientReceiver
.
getClientId
());
PushModel
pushModel
=
new
PushModel
();
if
(
pushMap
.
isEmpty
())
{
if
(
pushModel
==
null
)
{
pushModel
=
new
PushModel
();
pushModel
.
setTitle
(
PUSH_TITLE
);
pushModel
.
setSubTitle
(
PUSH_BODY
);
}
else
{
pushModel
.
setTitle
(
pushMap
.
get
(
"title"
));
pushModel
.
setSubTitle
(
pushMap
.
get
(
"subTitle"
));
}
// 校验参数
...
...
@@ -89,6 +94,30 @@ public class PushTask {
}
}
/**
* 异步系统推送
*
* @param imClientReceiver
*/
@Async
public
void
push
(
HashMap
<
String
,
String
>
pushMap
,
ImClient
imClientReceiver
,
ImApplication
imApplication
)
{
log
.
info
(
"push:"
+
imClientReceiver
.
getClientId
());
PushModel
pushModel
=
new
PushModel
();
if
(
pushMap
==
null
||
pushMap
.
isEmpty
())
{
pushModel
.
setTitle
(
PUSH_TITLE
);
pushModel
.
setSubTitle
(
PUSH_BODY
);
}
else
{
pushModel
.
setTitle
(
pushMap
.
get
(
title
));
pushModel
.
setSubTitle
(
pushMap
.
get
(
subTitle
));
}
this
.
push
(
pushModel
,
imClientReceiver
,
imApplication
);
}
private
void
android
(
PushModel
pushModel
,
ImClient
imClientReceiver
,
ImApplication
imApplication
)
{
// 安卓推送通道,友盟:1;firebase:2; 信鸽3
if
(
imApplication
.
getAndroidPushChannel
()
==
1
)
{
...
...
@@ -207,7 +236,8 @@ public class PushTask {
String
deviceToken
=
imClientReceiver
.
getDeviceToken
();
String
alertTitle
=
pushModel
.
getTitle
();
String
alertBody
=
pushModel
.
getSubTitle
();
int
badge
=
1
;
// 统计未读消息数量
int
badge
=
imInboxService
.
countMyNotReadCount
(
imClientReceiver
.
getId
());
String
topicBundleId
=
apns
.
getBundleId
();
String
certificatePassword
=
apns
.
getPwd
();
boolean
contentAvailable
=
false
;
...
...
common/src/main/java/com/wecloud/im/ws/strategy/concrete/ImConcreteReceiveStrategy.java
View file @
605fa942
...
...
@@ -44,8 +44,8 @@ import java.util.List;
public
class
ImConcreteReceiveStrategy
extends
AbstractReceiveStrategy
{
private
static
final
String
TO_CONVERSATION_KEY
=
"toConversation"
;
p
rivate
static
final
String
PUSH_KEY
=
"push"
;
p
rivate
static
final
String
MSG_ID
=
"msgId"
;
p
ublic
static
final
String
PUSH_KEY
=
"push"
;
p
ublic
static
final
String
MSG_ID
=
"msgId"
;
private
static
final
JsonMapper
JSON_MAPPER
=
new
JsonMapper
();
...
...
common/src/main/resources/mapper/ImClientMapper.xml
View file @
605fa942
...
...
@@ -7,6 +7,12 @@
id
, create_time, update_time, fk_appid, attributes,device_type,valid
</sql>
<update
id=
"removeOldToken"
>
UPDATE im_client
SET device_token = NULL
WHERE device_token = #{deviceToken}
AND fk_appid = #{appId}
</update>
<select
id=
"getImClientById"
resultType=
"com.wecloud.im.param.ImClientQueryVo"
>
select
...
...
common/src/main/resources/mapper/ImConversationMapper.xml
View file @
605fa942
...
...
@@ -72,6 +72,25 @@
) AS r1
WHERE members_count = 2
</select>
<select
id=
"getRepetitionConversationAttributes"
resultType=
"java.lang.Long"
>
SELECT *
FROM im_conversation
WHERE id IN (
SELECT im_conversation_members.fk_conversation_id
FROM im_conversation_members
INNER JOIN (SELECT *
FROM im_conversation_members
WHERE im_conversation_members.fk_client_id = #{clientId2}) AS im_conversation_members2
ON im_conversation_members.fk_conversation_id =
im_conversation_members2.fk_conversation_id
WHERE im_conversation_members.fk_client_id = #{clientId1}
)
AND attributes = CAST(#{attributes} AS json) LIMIT 1
</select>
<select
id=
"getRepetitionConversationInfo"
resultType=
"com.wecloud.im.entity.ImConversation"
>
SELECT im_conversation.*
FROM im_conversation_members
...
...
common/src/main/resources/mapper/ImInboxMapper.xml
View file @
605fa942
...
...
@@ -46,5 +46,11 @@
<include
refid=
"Base_Column_List"
/>
from im_Inbox
</select>
<select
id=
"countMyNotReadCount"
resultType=
"java.lang.Integer"
>
SELECT COUNT(id)
FROM im_inbox
WHERE receiver = #{clientId}
AND receiver_msg_status = 0
</select>
</mapper>
config/src/main/resources/config/application-dev.yml
View file @
605fa942
...
...
@@ -15,10 +15,15 @@ spring-boot-plus:
spring
:
datasource
:
url
:
jdbc:mysql://localhost:3306/wecloud_im?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true
url
:
jdbc:mysql://localhost:3306/wecloud_im
_v1_3
?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true
username
:
root
password
:
123
#//测试外网
# url: jdbc:mysql://18.136.207.16:3306/wecloud_im?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true
# username: web
# password: axT8knPN5hAP
# Redis配置
redis
:
database
:
0
...
...
config/src/main/resources/config/application-prod.yml
View file @
605fa942
...
...
@@ -30,9 +30,20 @@ spring:
# port: 6379
# 飞蛙
# datasource:
# url: jdbc:mysql://127.0.0.1:3306/wecloud_im?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true
# username: web
# password: axT8knPN5hAP
# redis:
# database: 0
# host: 127.0.0.1
# password: JH86uc53r8Ca
# port: 6379
# 国内IM集成版
datasource
:
url
:
jdbc:mysql://127.0.0.1:3306/wecloud_im?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true
username
:
web
username
:
root
password
:
axT8knPN5hAP
redis
:
database
:
0
...
...
docs/config/imapi.wecloud.cn.conf
0 → 100644
View file @
605fa942
map
$
http_upgrade
$
connection_upgrade
{
default
upgrade
;
''
close
;
}
server
{
listen
443
ssl
;
server_name
xxx
.
com
;
ssl_certificate
ssl
/
_
.
im199
.
com
.
crt
;
ssl_certificate_key
ssl
/
_
.
im199
.
com
.
key
;
ssl_session_cache
shared
:
SSL
:
1
m
;
ssl_session_timeout
5
m
;
ssl_ciphers
HIGH
:!
aNULL
:!
MD5
;
ssl_prefer_server_ciphers
on
;
location
/
api
{
proxy_pass
http
://
localhost
:
8082
/
api
/;
}
location
/
ws
{
proxy_pass
http
://
localhost
:
8899
/
ws
;
# ws结尾不带"/",实际请求服务器时不会去掉"/ws"
proxy_set_header
Upgrade
$
http_upgrade
;
# 升级协议头
proxy_set_header
Connection
upgrade
;
# 升级长连接协议头
}
location
/ {
root
html
;
index
index
.
html
index
.
htm
;
}
}
\ No newline at end of file
开发记录.md
View file @
605fa942
...
...
@@ -75,4 +75,27 @@ Invoke-RestMethod http://169.254.169.254/latest/meta-data/public-ipv4
服务器负载均衡配置
load-blance:
服务器配置 Local,AWS,AlibabaCloud,HuaweiCloud
server-type: Local
\ No newline at end of file
server-type: Local
2021年09月27日17:00:50部署国内IM集成版
部署1.3 版本
| weikeyun_imapi | 121.37.208.9 | 国内IM集成版
docker run -p 6379:6379 -d --restart=always --name redis6 -v $PWD/dockerData/redis6:/data redis:6 --appendonly yes --requirepass "axT8knPN5hAP"
##mysql5.7(如果本地不开,可以连上测试环境)
### docker 安装mysql
docker run -p 3306:3306 --name mysql57 -v $PWD/dockerData/mysql57/data:/var/lib/mysql --restart always -e MYSQL_ROOT_PASSWORD=JH86uc53r8Ca -d mysql:5.7
mysql
username: root
password: axT8knPN5hAP
redis:
database: 0
host: 127.0.0.1
password: JH86uc53r8Ca
port: 6379
utf8mb4_unicode_ci
建库语句
CREATE DATABASE IF NOT EXISTS wecloud_im DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_general_ci;
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment