Commit 673029d4 by hweeeeeei

Merge remote-tracking branch 'origin/feature-cluster' into feature-cluster

parents 0c3334dd aed89500
...@@ -5,7 +5,7 @@ import cn.hutool.crypto.digest.MD5; ...@@ -5,7 +5,7 @@ import cn.hutool.crypto.digest.MD5;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.wecloud.im.entity.ImApplication; import com.wecloud.im.entity.ImApplication;
import com.wecloud.im.entity.ImClient; import com.wecloud.im.entity.ImClient;
import com.wecloud.im.enums.PlatformEnum; import com.wecloud.im.enums.DeviceTypeEnum;
import com.wecloud.im.service.ImApplicationService; import com.wecloud.im.service.ImApplicationService;
import com.wecloud.im.service.ImClientService; import com.wecloud.im.service.ImClientService;
import com.wecloud.im.ws.utils.RedisUtils; import com.wecloud.im.ws.utils.RedisUtils;
...@@ -85,7 +85,7 @@ public class LoginTest { ...@@ -85,7 +85,7 @@ public class LoginTest {
} }
// 生成token // 生成token
String generateToken = JwtUtil.generateToken(clientId, appKey, imApplication.getAppSecret(), Duration.ofDays(99999), PlatformEnum.WEB.getCode()); String generateToken = JwtUtil.generateToken(clientId, appKey, imApplication.getAppSecret(), Duration.ofDays(99999), DeviceTypeEnum.WEB.getCode());
// 保存redis // 保存redis
redisTemplate.opsForValue().set("client:" + imApplication.getAppKey() + ":" + clientId, generateToken); redisTemplate.opsForValue().set("client:" + imApplication.getAppKey() + ":" + clientId, generateToken);
......
...@@ -15,26 +15,34 @@ spring-boot-plus: ...@@ -15,26 +15,34 @@ spring-boot-plus:
spring: spring:
datasource: datasource:
url: jdbc:mysql://192.168.1.51:3306/wecloud-im?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true # url: jdbc:mysql://127.0.0.1:3306/wecloud-im?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true
username: mysql # username: root
password: mysql # password: 123456
# 测试外网
url: jdbc:mysql://121.37.22.224:3306/wecloud_im_feature_cluster?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true
username: root
password: temple123456
#//测试外网
# 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配置
redis: redis:
# database: 0
# host: 127.0.0.1
# password:
# port: 6379
database: 0 database: 0
host: 192.168.1.51 host: 121.37.22.224
password: password: temple123456
port: 6379 port: 6379
cloud: cloud:
nacos: nacos:
discovery: discovery:
server-addr: 192.168.1.51:8848 server-addr: 127.0.0.1:8848
dubbo: dubbo:
...@@ -42,9 +50,11 @@ dubbo: ...@@ -42,9 +50,11 @@ dubbo:
port: 20881 port: 20881
name: dubbo name: dubbo
registry: registry:
address: nacos://192.168.1.51:8848?username=nacos&password=nacos address: nacos://127.0.0.1:8848?username=nacos&password=nacos
provider: provider:
cluster: channelRouterCluster cluster: channelRouterCluster
consumer:
check: false
# 打印SQL语句和结果集,本地开发环境可开启,线上注释掉 # 打印SQL语句和结果集,本地开发环境可开启,线上注释掉
mybatis-plus: mybatis-plus:
......
...@@ -15,7 +15,7 @@ spring-boot-plus: ...@@ -15,7 +15,7 @@ spring-boot-plus:
spring: spring:
datasource: datasource:
url: jdbc:mysql://121.37.234.35:3306/wecloudim_feature_cluster?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true url: jdbc:mysql://121.37.22.224:3306/wecloud_im_feature_cluster?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true
username: root username: root
password: temple123456 password: temple123456
...@@ -27,8 +27,8 @@ spring: ...@@ -27,8 +27,8 @@ spring:
# Redis配置 # Redis配置
redis: redis:
database: 0 database: 0
host: 127.0.0.1 host: 121.37.22.224
password: password: temple123456
port: 6379 port: 6379
cloud: cloud:
......
...@@ -152,7 +152,9 @@ public class NormalChatAction { ...@@ -152,7 +152,9 @@ public class NormalChatAction {
// 异步推送系统通知消息 // 异步推送系统通知消息
PushDTO pushDTO = mqSender.buildPushDto(data.getPush(), imClientReceiver, imApplication); PushDTO pushDTO = mqSender.buildPushDto(data.getPush(), imClientReceiver, imApplication);
mqSender.orderSend(MqConstant.Topic.IM_MSG_TOPIC, MqConstant.Tag.IM_MSG_TAG, pushDTO); if (pushDTO != null) {
mqSender.orderSend(MqConstant.Topic.IM_ORDER_MSG_TOPIC, MqConstant.Tag.IM_ORDER_MSG_TAG, pushDTO);
}
} }
// 响应发送方消息id等信息 // 响应发送方消息id等信息
......
package com.wecloud.im.constant;
/**
* @Author wenzhida
* @Date 2022/3/1 18:17
* @Description 数字常量
*/
public class NumberConstant {
/**
* 数字常量
*/
public static final int NUM_30 = 30;
public static final int NUM_32 = 32;
}
package com.wecloud.im.user.constant; package com.wecloud.im.constant;
/** /**
* @Author wenzhida * @Author wenzhida
......
package com.wecloud.im.controller; package com.wecloud.im.controller;
import com.alibaba.fastjson.JSON;
import com.wecloud.im.entity.ImApplication; import com.wecloud.im.entity.ImApplication;
import com.wecloud.im.entity.ImClient; import com.wecloud.im.entity.ImClient;
import com.wecloud.im.friend.param.ImFriendApplyDto;
import com.wecloud.im.param.ClientInfoParam; import com.wecloud.im.param.ClientInfoParam;
import com.wecloud.im.param.GetClientInfoParam; import com.wecloud.im.param.GetClientInfoParam;
import com.wecloud.im.param.GetOnlineStatusParam; import com.wecloud.im.param.GetOnlineStatusParam;
import com.wecloud.im.param.add.ImClientDeviceInfoAdd; import com.wecloud.im.param.LogoutParam;
import com.wecloud.im.param.add.ClientDeviceUpdateParam;
import com.wecloud.im.param.add.ImClientHeadPortraitAdd; import com.wecloud.im.param.add.ImClientHeadPortraitAdd;
import com.wecloud.im.param.add.ImClientHeadPortraitAndNicknameUpdate; import com.wecloud.im.param.add.ImClientHeadPortraitAndNicknameUpdate;
import com.wecloud.im.param.add.ImClientNicknameAdd; import com.wecloud.im.param.add.ImClientNicknameAdd;
...@@ -93,8 +94,9 @@ public class ImClientController extends BaseController { ...@@ -93,8 +94,9 @@ public class ImClientController extends BaseController {
*/ */
@PostMapping("/addDeviceInfo") @PostMapping("/addDeviceInfo")
@ApiOperation(value = "添加或修改推送设备信息(每次请求都会覆盖之前的数据)") @ApiOperation(value = "添加或修改推送设备信息(每次请求都会覆盖之前的数据)")
public ApiResult<Boolean> addDeviceInfo(@Validated(Add.class) @RequestBody ImClientDeviceInfoAdd imClientDevice) throws Exception { public ApiResult<Boolean> addDeviceInfo(@Validated(Add.class) @RequestBody ClientDeviceUpdateParam param) throws Exception {
boolean flag = imClientService.updateDeviceInfo(imClientDevice); log.info("添加或修改推送设备信息入参 {}", JSON.toJSONString(param));
boolean flag = imClientService.updateDeviceInfo(param);
return ApiResult.result(flag); return ApiResult.result(flag);
} }
...@@ -102,6 +104,7 @@ public class ImClientController extends BaseController { ...@@ -102,6 +104,7 @@ public class ImClientController extends BaseController {
@PostMapping("/updateHeadAndNickname") @PostMapping("/updateHeadAndNickname")
@ApiOperation(value = "添加或修改头像和昵称") @ApiOperation(value = "添加或修改头像和昵称")
public ApiResult<Boolean> updateHeadAndNickname(@Validated(Add.class) @RequestBody ImClientHeadPortraitAndNicknameUpdate imClientHeadPortraitAndNicknameUpdate) throws Exception { public ApiResult<Boolean> updateHeadAndNickname(@Validated(Add.class) @RequestBody ImClientHeadPortraitAndNicknameUpdate imClientHeadPortraitAndNicknameUpdate) throws Exception {
log.info("添加或修改头像和昵称入参 {}", JSON.toJSONString(imClientHeadPortraitAndNicknameUpdate));
boolean flag = imClientService.updateHeadAndNickname(imClientHeadPortraitAndNicknameUpdate); boolean flag = imClientService.updateHeadAndNickname(imClientHeadPortraitAndNicknameUpdate);
return ApiResult.result(flag); return ApiResult.result(flag);
} }
...@@ -110,6 +113,7 @@ public class ImClientController extends BaseController { ...@@ -110,6 +113,7 @@ public class ImClientController extends BaseController {
@PostMapping("/updateHeadPortrait") @PostMapping("/updateHeadPortrait")
@ApiOperation(value = "添加或修改头像") @ApiOperation(value = "添加或修改头像")
public ApiResult<Boolean> updateHeadPortrait(@Validated(Add.class) @RequestBody ImClientHeadPortraitAdd imClientHeadPortraitAdd) throws Exception { public ApiResult<Boolean> updateHeadPortrait(@Validated(Add.class) @RequestBody ImClientHeadPortraitAdd imClientHeadPortraitAdd) throws Exception {
log.info("添加或修改头像入参 {}", JSON.toJSONString(imClientHeadPortraitAdd));
boolean flag = imClientService.updateHeadPortrait(imClientHeadPortraitAdd); boolean flag = imClientService.updateHeadPortrait(imClientHeadPortraitAdd);
return ApiResult.result(flag); return ApiResult.result(flag);
} }
...@@ -117,6 +121,7 @@ public class ImClientController extends BaseController { ...@@ -117,6 +121,7 @@ public class ImClientController extends BaseController {
@PostMapping("/updateNickname") @PostMapping("/updateNickname")
@ApiOperation(value = "添加或修改主昵称") @ApiOperation(value = "添加或修改主昵称")
public ApiResult<Boolean> updateNickname(@Validated(Add.class) @RequestBody ImClientNicknameAdd imClientNicknameAdd) throws Exception { public ApiResult<Boolean> updateNickname(@Validated(Add.class) @RequestBody ImClientNicknameAdd imClientNicknameAdd) throws Exception {
log.info("添加或修改主昵称入参 {}", JSON.toJSONString(imClientNicknameAdd));
boolean flag = imClientService.updateNickname(imClientNicknameAdd); boolean flag = imClientService.updateNickname(imClientNicknameAdd);
return ApiResult.result(flag); return ApiResult.result(flag);
} }
...@@ -130,8 +135,9 @@ public class ImClientController extends BaseController { ...@@ -130,8 +135,9 @@ public class ImClientController extends BaseController {
*/ */
@PostMapping("/logout") @PostMapping("/logout")
@ApiOperation(value = "退出登陆 清除推送token等") @ApiOperation(value = "退出登陆 清除推送token等")
public ApiResult<Boolean> logout() throws Exception { public ApiResult<Boolean> logout(@RequestBody @Validated LogoutParam param) {
boolean flag = imClientService.logout(); log.info("退出登陆入参 {}", JSON.toJSONString(param));
boolean flag = imClientService.logout(param);
return ApiResult.result(flag); return ApiResult.result(flag);
} }
...@@ -144,7 +150,7 @@ public class ImClientController extends BaseController { ...@@ -144,7 +150,7 @@ public class ImClientController extends BaseController {
@ApiOperation(value = "获取用户在线状态(批量)") @ApiOperation(value = "获取用户在线状态(批量)")
ApiResult<List<ImOnlineStatusVo>> getOnlineStatus(@RequestBody GetOnlineStatusParam getOnlineStatusParam) { ApiResult<List<ImOnlineStatusVo>> getOnlineStatus(@RequestBody GetOnlineStatusParam getOnlineStatusParam) {
// shiro线程中获取当前token // shiro线程中获取当前token
JwtToken curentJwtToken = JwtUtil.getCurentJwtToken(); JwtToken curentJwtToken = JwtUtil.getCurrentJwtToken();
// 根据appKey查询appid // 根据appKey查询appid
ImApplication imApplication = imApplicationService.getCacheAppByAppKey(curentJwtToken.getAppKey()); ImApplication imApplication = imApplicationService.getCacheAppByAppKey(curentJwtToken.getAppKey());
......
package com.wecloud.im.controller; package com.wecloud.im.controller;
import com.alibaba.fastjson.JSON;
import com.wecloud.im.param.ImConversationQueryParam; import com.wecloud.im.param.ImConversationQueryParam;
import com.wecloud.im.param.MutedGroupParam; import com.wecloud.im.param.MutedGroupParam;
import com.wecloud.im.param.SetAdminsParam; import com.wecloud.im.param.SetAdminsParam;
...@@ -71,6 +72,7 @@ public class ImConversationController extends BaseController { ...@@ -71,6 +72,7 @@ public class ImConversationController extends BaseController {
@PostMapping("/leave") @PostMapping("/leave")
@ApiOperation(value = "client退出会话", notes = "若是创建者退出,[创建者]权限将会转移给按加入会话时间排序的下一个client") @ApiOperation(value = "client退出会话", notes = "若是创建者退出,[创建者]权限将会转移给按加入会话时间排序的下一个client")
public ApiResult<Boolean> leaveConversation(@RequestBody ImClientLeaveConversation imClientToConversation) throws Exception { public ApiResult<Boolean> leaveConversation(@RequestBody ImClientLeaveConversation imClientToConversation) throws Exception {
log.info("client退出会话入参 {}", JSON.toJSONString(imClientToConversation));
return imConversationService.leaveConversation(imClientToConversation); return imConversationService.leaveConversation(imClientToConversation);
} }
...@@ -81,6 +83,7 @@ public class ImConversationController extends BaseController { ...@@ -81,6 +83,7 @@ public class ImConversationController extends BaseController {
@PostMapping("/delClient") @PostMapping("/delClient")
@ApiOperation(value = "将client从会话移除", notes = "权限:目前只有创建者有权限操作") @ApiOperation(value = "将client从会话移除", notes = "权限:目前只有创建者有权限操作")
public ApiResult<Boolean> delClientToConversation(@RequestBody ImClientToConversation imClientToConversation) throws Exception { public ApiResult<Boolean> delClientToConversation(@RequestBody ImClientToConversation imClientToConversation) throws Exception {
log.info("将client从会话移除入参 {}", JSON.toJSONString(imClientToConversation));
return imConversationService.delClientToConversation(imClientToConversation); return imConversationService.delClientToConversation(imClientToConversation);
} }
...@@ -91,6 +94,7 @@ public class ImConversationController extends BaseController { ...@@ -91,6 +94,7 @@ public class ImConversationController extends BaseController {
@PostMapping("/addClient") @PostMapping("/addClient")
@ApiOperation(value = "将用户添加进会话", notes = "权限:会话中所有client都有权限操作") @ApiOperation(value = "将用户添加进会话", notes = "权限:会话中所有client都有权限操作")
public ApiResult<Boolean> addClientToConversation(@RequestBody ImClientToConversation imClientToConversation) throws Exception { public ApiResult<Boolean> addClientToConversation(@RequestBody ImClientToConversation imClientToConversation) throws Exception {
log.info("将用户添加进会话入参 {}", JSON.toJSONString(imClientToConversation));
return imConversationService.addClientToConversation(imClientToConversation); return imConversationService.addClientToConversation(imClientToConversation);
} }
...@@ -100,6 +104,7 @@ public class ImConversationController extends BaseController { ...@@ -100,6 +104,7 @@ public class ImConversationController extends BaseController {
@PostMapping("/create") @PostMapping("/create")
@ApiOperation(value = "创建会话", notes = "后台可配置:两个客户端如果已经创建过会话,是否重复创建会话") @ApiOperation(value = "创建会话", notes = "后台可配置:两个客户端如果已经创建过会话,是否重复创建会话")
public ApiResult<ImConversationCreateVo> createImConversation(@RequestBody ImConversationCreate imConversationCreate) throws Exception { public ApiResult<ImConversationCreateVo> createImConversation(@RequestBody ImConversationCreate imConversationCreate) throws Exception {
log.info("创建会话入参 {}", JSON.toJSONString(imConversationCreate));
return imConversationService.createImConversation(imConversationCreate); return imConversationService.createImConversation(imConversationCreate);
} }
...@@ -109,6 +114,7 @@ public class ImConversationController extends BaseController { ...@@ -109,6 +114,7 @@ public class ImConversationController extends BaseController {
@PostMapping("/transferOwner") @PostMapping("/transferOwner")
@ApiOperation(value = "群主转让", notes = "权限:目前只有群主有权限操作") @ApiOperation(value = "群主转让", notes = "权限:目前只有群主有权限操作")
public ApiResult<Boolean> transferOwner(@RequestBody TransferOwnerParam param) { public ApiResult<Boolean> transferOwner(@RequestBody TransferOwnerParam param) {
log.info("群主转让入参 {}", JSON.toJSONString(param));
Boolean result = imConversationService.transferOwner(param); Boolean result = imConversationService.transferOwner(param);
return ApiResult.ok(result); return ApiResult.ok(result);
} }
...@@ -119,6 +125,7 @@ public class ImConversationController extends BaseController { ...@@ -119,6 +125,7 @@ public class ImConversationController extends BaseController {
@PostMapping("/setAdmins") @PostMapping("/setAdmins")
@ApiOperation(value = "设置群管理员", notes = "权限:目前只有群主有权限操作") @ApiOperation(value = "设置群管理员", notes = "权限:目前只有群主有权限操作")
public ApiResult<Boolean> setAdmins(@RequestBody @Validated SetAdminsParam param) { public ApiResult<Boolean> setAdmins(@RequestBody @Validated SetAdminsParam param) {
log.info("设置群管理员入参 {}", JSON.toJSONString(param));
if (CollectionUtils.isEmpty(param.getClientIds())) { if (CollectionUtils.isEmpty(param.getClientIds())) {
return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null); return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null);
} }
...@@ -132,6 +139,7 @@ public class ImConversationController extends BaseController { ...@@ -132,6 +139,7 @@ public class ImConversationController extends BaseController {
@PostMapping("/mutedGroup") @PostMapping("/mutedGroup")
@ApiOperation(value = "群禁言、取消群禁言", notes = "权限:群主和管理员有权限操作") @ApiOperation(value = "群禁言、取消群禁言", notes = "权限:群主和管理员有权限操作")
public ApiResult<Boolean> mutedGroup(@RequestBody @Validated MutedGroupParam param) { public ApiResult<Boolean> mutedGroup(@RequestBody @Validated MutedGroupParam param) {
log.info("群禁言、取消群禁言入参 {}", JSON.toJSONString(param));
Boolean result = imConversationService.mutedGroup(param); Boolean result = imConversationService.mutedGroup(param);
return ApiResult.ok(result); return ApiResult.ok(result);
} }
...@@ -142,6 +150,7 @@ public class ImConversationController extends BaseController { ...@@ -142,6 +150,7 @@ public class ImConversationController extends BaseController {
@PostMapping("/mutedGroupMember") @PostMapping("/mutedGroupMember")
@ApiOperation(value = "选择禁言", notes = "权限:群主和管理员有权限操作") @ApiOperation(value = "选择禁言", notes = "权限:群主和管理员有权限操作")
public ApiResult<Boolean> mutedGroupMember(@RequestBody @Validated MutedGroupParam param) { public ApiResult<Boolean> mutedGroupMember(@RequestBody @Validated MutedGroupParam param) {
log.info("选择禁言入参 {}", JSON.toJSONString(param));
if (CollectionUtils.isEmpty(param.getClientIds())) { if (CollectionUtils.isEmpty(param.getClientIds())) {
return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null); return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null);
} }
......
...@@ -36,7 +36,6 @@ public class TokenController extends BaseController { ...@@ -36,7 +36,6 @@ public class TokenController extends BaseController {
@PostMapping("/verify") @PostMapping("/verify")
@ApiOperation(value = "根据sign申请token", notes = "校验客户方生成的签名字符串,验证通过则下发token") @ApiOperation(value = "根据sign申请token", notes = "校验客户方生成的签名字符串,验证通过则下发token")
public ApiResult<TokenVo> verify(@RequestBody ImTokenVerify imTokenVerify) throws NacosException { public ApiResult<TokenVo> verify(@RequestBody ImTokenVerify imTokenVerify) throws NacosException {
return imClientLoginService.verifySign(imTokenVerify); return imClientLoginService.verifySign(imTokenVerify);
} }
......
...@@ -48,25 +48,10 @@ public class ImClient extends BaseEntity { ...@@ -48,25 +48,10 @@ public class ImClient extends BaseEntity {
@ApiModelProperty("客户方提供的唯一id") @ApiModelProperty("客户方提供的唯一id")
private String clientId; private String clientId;
@ApiModelProperty("设备不想收到推送提醒, 1想, 0不想")
private Integer valid;
@ApiModelProperty("设备类型1:ios; 2:android")
private Integer deviceType;
@ApiModelProperty("设备推送token")
private String deviceToken;
@ApiModelProperty("头像") @ApiModelProperty("头像")
private String headPortrait; private String headPortrait;
@ApiModelProperty("主昵称") @ApiModelProperty("主昵称")
private String nickname; private String nickname;
/**
* 客户端平台
* @see com.wecloud.im.enums.PlatformEnum
*/
@NotNull(message = "平台不可为空")
@ApiModelProperty("客户端平台: 1 web, 2 安卓, 3 ios, 4 pc-win, 5 pc-macOs")
private Integer platform;
} }
package com.wecloud.im.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
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;
import javax.validation.constraints.NotNull;
import java.util.Date;
/**
* @Author wenzhida
* @Date 2022/3/2 14:52
* @Description 客户端设备
*/
@Data
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = true)
@ApiModel(value = "客户端设备")
public class ImClientDevice extends BaseEntity {
private static final long serialVersionUID = 6988763580951760226L;
@NotNull(message = "主键id不能为空")
@ApiModelProperty("主键id")
@TableId(value = "id", type = IdType.INPUT)
private Long id;
@ApiModelProperty("应用appid")
private Long fkAppid;
@ApiModelProperty("client主键id")
private Long fkClientId;
@ApiModelProperty("设备不想收到推送提醒, 1想, 0不想")
private Integer valid;
@ApiModelProperty("设备类型 1:ios; 2:android; 3:web; 4:win; 5:mac")
private Integer deviceType;
@ApiModelProperty("设备推送token")
private String deviceToken;
@ApiModelProperty("唯一id")
private String uniqueDeviceId;
@ApiModelProperty("创建时间")
private Date createTime;
@ApiModelProperty("修改时间")
private Date updateTime;
}
...@@ -2,18 +2,23 @@ package com.wecloud.im.enums; ...@@ -2,18 +2,23 @@ package com.wecloud.im.enums;
import io.geekidea.springbootplus.framework.common.enums.BaseEnum; import io.geekidea.springbootplus.framework.common.enums.BaseEnum;
public enum PlatformEnum implements BaseEnum { /**
* @Author wenzhida
WEB(1, "web端"), * @Date 2022/3/2 17:15
* @Description 设备类型枚举
*/
public enum DeviceTypeEnum implements BaseEnum {
IOS(1, "IOS端"),
ANDROID(2, "安卓端"), ANDROID(2, "安卓端"),
IOS(3, "IOS端"), WEB(3, "web端"),
WIN(4, "PC-windows端"), WIN(4, "PC-windows端"),
MAC(5, "PC-macOs端"); MAC(5, "PC-macOs端");
private final Integer code; private final Integer code;
private final String desc; private final String desc;
PlatformEnum(Integer code, String desc) { DeviceTypeEnum(Integer code, String desc) {
this.code = code; this.code = code;
this.desc = desc; this.desc = desc;
} }
......
package com.wecloud.im.user.controller; package com.wecloud.im.externalaccess.controller;
import com.wecloud.im.entity.ImClient;
import com.wecloud.im.friend.param.ImFriendApplyDto;
import com.wecloud.im.friend.param.ImFriendBaseParam; import com.wecloud.im.friend.param.ImFriendBaseParam;
import com.wecloud.im.friend.service.ImFriendService;
import com.wecloud.im.service.ImClientService; import com.wecloud.im.service.ImClientService;
import com.wecloud.im.user.param.FriendDto; import com.wecloud.im.externalaccess.param.FriendDto;
import com.wecloud.im.user.service.FriendService; import com.wecloud.im.externalaccess.service.FriendService;
import io.geekidea.springbootplus.framework.common.api.ApiCode; import io.geekidea.springbootplus.framework.common.api.ApiCode;
import io.geekidea.springbootplus.framework.common.api.ApiResult; import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.common.controller.BaseController; import io.geekidea.springbootplus.framework.common.controller.BaseController;
......
package com.wecloud.im.externalaccess.controller;
import cn.hutool.crypto.digest.MD5;
import com.wecloud.im.externalaccess.param.MultiMeetSignGetParam;
import com.wecloud.im.externalaccess.param.SendVerifyCodeParam;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.common.controller.BaseController;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
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.RestController;
/**
* @Author wenzhida
* @Date 2022/3/3 17:39
* @Description 多人音视频控制器
*/
@Slf4j
@RestController
@RequestMapping("/multiMeet")
@Api(value = "多人音视频API", tags = {"多人音视频"})
public class MultiMeetController extends BaseController {
/**
* 获取sign
*/
@PostMapping("/getSign")
@ApiOperation(value = "获取多人音视频专用sign")
public ApiResult<String> sendVerifyCode(@RequestBody @Validated MultiMeetSignGetParam param) {
String sign = new MD5().digestHex(param.getTimestamp() + param.getClientId()
+ param.getAppKey() + param.getAppSecret() + param.getPlatform());
return ApiResult.ok(sign);
}
}
package com.wecloud.im.user.controller; package com.wecloud.im.externalaccess.controller;
import com.wecloud.im.user.param.ChangePhoneParam; import com.alibaba.fastjson.JSON;
import com.wecloud.im.user.param.CheckPhoneParam; import com.wecloud.im.externalaccess.param.ChangePhoneParam;
import com.wecloud.im.user.param.FindUserParam; import com.wecloud.im.externalaccess.param.CheckPhoneParam;
import com.wecloud.im.user.param.GetUserParam; import com.wecloud.im.externalaccess.param.FindUserParam;
import com.wecloud.im.user.param.LoginSuccessDto; import com.wecloud.im.externalaccess.param.GetUserParam;
import com.wecloud.im.user.param.ModifyHeadPortraitParam; import com.wecloud.im.externalaccess.param.LoginSuccessDto;
import com.wecloud.im.user.param.ModifyLandouParam; import com.wecloud.im.externalaccess.param.ModifyHeadPortraitParam;
import com.wecloud.im.user.param.ModifyNicknameParam; import com.wecloud.im.externalaccess.param.ModifyLandouParam;
import com.wecloud.im.user.param.ModifySexParam; import com.wecloud.im.externalaccess.param.ModifyNicknameParam;
import com.wecloud.im.user.param.RegisterSuccessDto; import com.wecloud.im.externalaccess.param.ModifySexParam;
import com.wecloud.im.user.param.ResetPasswordParam; import com.wecloud.im.externalaccess.param.RegisterSuccessDto;
import com.wecloud.im.user.param.UserBaseDto; import com.wecloud.im.externalaccess.param.ResetPasswordParam;
import com.wecloud.im.user.param.UserLoginParam; import com.wecloud.im.externalaccess.param.UserBaseDto;
import com.wecloud.im.user.param.UserRegisterParam; import com.wecloud.im.externalaccess.param.UserLoginParam;
import com.wecloud.im.user.service.UserService; import com.wecloud.im.externalaccess.param.UserRegisterParam;
import com.wecloud.im.externalaccess.service.UserService;
import io.geekidea.springbootplus.framework.common.api.ApiCode; import io.geekidea.springbootplus.framework.common.api.ApiCode;
import io.geekidea.springbootplus.framework.common.api.ApiResult; import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.common.controller.BaseController; import io.geekidea.springbootplus.framework.common.controller.BaseController;
...@@ -43,8 +44,9 @@ public class UserController extends BaseController { ...@@ -43,8 +44,9 @@ public class UserController extends BaseController {
private UserService userService; private UserService userService;
@PostMapping("/checkPhone") @PostMapping("/checkPhone")
@ApiOperation(value = "校验手机号码是否可使用 true-可使用 false-不可使用") @ApiOperation(value = "校验手机号码是否未注册用户 true-可使用 false-不可使用")
public ApiResult<Boolean> checkPhone(@RequestBody @Validated CheckPhoneParam param) { public ApiResult<Boolean> checkPhone(@RequestBody @Validated CheckPhoneParam param) {
log.info("校验手机号码是否未注册用户 {}", JSON.toJSONString(param));
if (param == null) { if (param == null) {
return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null); return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null);
} }
...@@ -54,6 +56,7 @@ public class UserController extends BaseController { ...@@ -54,6 +56,7 @@ public class UserController extends BaseController {
@PostMapping("/register") @PostMapping("/register")
@ApiOperation(value = "用户注册接口") @ApiOperation(value = "用户注册接口")
public ApiResult<RegisterSuccessDto> register(@RequestBody @Validated UserRegisterParam param) { public ApiResult<RegisterSuccessDto> register(@RequestBody @Validated UserRegisterParam param) {
log.info("用户注册接口入参 {}", JSON.toJSONString(param));
if (param == null) { if (param == null) {
return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null); return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null);
} }
...@@ -64,6 +67,7 @@ public class UserController extends BaseController { ...@@ -64,6 +67,7 @@ public class UserController extends BaseController {
@PostMapping("/login") @PostMapping("/login")
@ApiOperation(value = "用户登录接口") @ApiOperation(value = "用户登录接口")
public ApiResult<LoginSuccessDto> login(@RequestBody @Validated UserLoginParam param) { public ApiResult<LoginSuccessDto> login(@RequestBody @Validated UserLoginParam param) {
log.info("用户登录接口入参 {}", JSON.toJSONString(param));
if (param == null) { if (param == null) {
return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null); return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null);
} }
...@@ -74,6 +78,7 @@ public class UserController extends BaseController { ...@@ -74,6 +78,7 @@ public class UserController extends BaseController {
@PostMapping("/resetPassword") @PostMapping("/resetPassword")
@ApiOperation(value = "重置密码接口") @ApiOperation(value = "重置密码接口")
public ApiResult<Boolean> resetPassword(@RequestBody @Validated ResetPasswordParam param) { public ApiResult<Boolean> resetPassword(@RequestBody @Validated ResetPasswordParam param) {
log.info("重置密码接口入参 {}", JSON.toJSONString(param));
if (param == null) { if (param == null) {
return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null); return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null);
} }
...@@ -84,6 +89,7 @@ public class UserController extends BaseController { ...@@ -84,6 +89,7 @@ public class UserController extends BaseController {
@PostMapping("/changePhone") @PostMapping("/changePhone")
@ApiOperation(value = "更换手机号接口") @ApiOperation(value = "更换手机号接口")
public ApiResult<Boolean> changePhone(@RequestBody @Validated ChangePhoneParam param) { public ApiResult<Boolean> changePhone(@RequestBody @Validated ChangePhoneParam param) {
log.info("更换手机号接口入参 {}", JSON.toJSONString(param));
if (param == null) { if (param == null) {
return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null); return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null);
} }
...@@ -101,6 +107,7 @@ public class UserController extends BaseController { ...@@ -101,6 +107,7 @@ public class UserController extends BaseController {
@PostMapping("/findUser") @PostMapping("/findUser")
@ApiOperation(value = "查找用户") @ApiOperation(value = "查找用户")
public ApiResult<UserBaseDto> findUser(@RequestBody @Validated FindUserParam param) { public ApiResult<UserBaseDto> findUser(@RequestBody @Validated FindUserParam param) {
log.info("查找用户入参 {}", JSON.toJSONString(param));
if (param == null) { if (param == null) {
return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null); return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null);
} }
...@@ -111,6 +118,7 @@ public class UserController extends BaseController { ...@@ -111,6 +118,7 @@ public class UserController extends BaseController {
@PostMapping("/getUserByUserId") @PostMapping("/getUserByUserId")
@ApiOperation(value = "根据用户id查找用户信息") @ApiOperation(value = "根据用户id查找用户信息")
public ApiResult<UserBaseDto> getUserByUserId(@RequestBody @Validated GetUserParam param) { public ApiResult<UserBaseDto> getUserByUserId(@RequestBody @Validated GetUserParam param) {
log.info("根据用户id查找用户信息入参 {}", JSON.toJSONString(param));
if (param == null) { if (param == null) {
return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null); return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null);
} }
...@@ -121,6 +129,7 @@ public class UserController extends BaseController { ...@@ -121,6 +129,7 @@ public class UserController extends BaseController {
@PostMapping("/modifyHeadPortrait") @PostMapping("/modifyHeadPortrait")
@ApiOperation(value = "修改头像") @ApiOperation(value = "修改头像")
public ApiResult<Boolean> modifyHeadPortrait(@RequestBody @Validated ModifyHeadPortraitParam param) { public ApiResult<Boolean> modifyHeadPortrait(@RequestBody @Validated ModifyHeadPortraitParam param) {
log.info("修改头像入参 {}", JSON.toJSONString(param));
if (param == null) { if (param == null) {
return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null); return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null);
} }
...@@ -131,6 +140,7 @@ public class UserController extends BaseController { ...@@ -131,6 +140,7 @@ public class UserController extends BaseController {
@PostMapping("/modifyNickname") @PostMapping("/modifyNickname")
@ApiOperation(value = "修改昵称") @ApiOperation(value = "修改昵称")
public ApiResult<Boolean> modifyNickname(@RequestBody @Validated ModifyNicknameParam param) { public ApiResult<Boolean> modifyNickname(@RequestBody @Validated ModifyNicknameParam param) {
log.info("修改昵称入参 {}", JSON.toJSONString(param));
if (param == null) { if (param == null) {
return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null); return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null);
} }
...@@ -141,6 +151,7 @@ public class UserController extends BaseController { ...@@ -141,6 +151,7 @@ public class UserController extends BaseController {
@PostMapping("/modifyLandouNo") @PostMapping("/modifyLandouNo")
@ApiOperation(value = "修改蓝豆号") @ApiOperation(value = "修改蓝豆号")
public ApiResult<Boolean> modifyLandouNo(@RequestBody @Validated ModifyLandouParam param) { public ApiResult<Boolean> modifyLandouNo(@RequestBody @Validated ModifyLandouParam param) {
log.info("修改蓝豆号入参 {}", JSON.toJSONString(param));
if (param == null) { if (param == null) {
return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null); return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null);
} }
...@@ -151,6 +162,7 @@ public class UserController extends BaseController { ...@@ -151,6 +162,7 @@ public class UserController extends BaseController {
@PostMapping("/modifySex") @PostMapping("/modifySex")
@ApiOperation(value = "修改性别") @ApiOperation(value = "修改性别")
public ApiResult<Boolean> modifySex(@RequestBody @Validated ModifySexParam param) { public ApiResult<Boolean> modifySex(@RequestBody @Validated ModifySexParam param) {
log.info("修改性别入参 {}", JSON.toJSONString(param));
if (param == null) { if (param == null) {
return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null); return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null);
} }
......
package com.wecloud.im.user.controller; package com.wecloud.im.externalaccess.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.wecloud.im.enums.VerifySceneEnum; import com.wecloud.im.enums.VerifySceneEnum;
import com.wecloud.im.user.constant.RedisKeyPrefixConstant; import com.wecloud.im.constant.RedisKeyPrefixConstant;
import com.wecloud.im.user.param.SendVerifyCodeParam; import com.wecloud.im.externalaccess.entity.User;
import com.wecloud.im.externalaccess.param.SendVerifyCodeParam;
import com.wecloud.im.externalaccess.service.UserService;
import com.wecloud.im.ws.utils.RedisUtils; import com.wecloud.im.ws.utils.RedisUtils;
import io.geekidea.springbootplus.framework.common.api.ApiCode; import io.geekidea.springbootplus.framework.common.api.ApiCode;
import io.geekidea.springbootplus.framework.common.api.ApiResult; import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.common.controller.BaseController; import io.geekidea.springbootplus.framework.common.controller.BaseController;
import io.geekidea.springbootplus.framework.common.enums.BaseEnum; import io.geekidea.springbootplus.framework.common.enums.BaseEnum;
import io.geekidea.springbootplus.framework.common.exception.BusinessException;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
...@@ -34,6 +38,9 @@ public class VerifyCodeController extends BaseController { ...@@ -34,6 +38,9 @@ public class VerifyCodeController extends BaseController {
@Autowired @Autowired
private RedisUtils redisUtils; private RedisUtils redisUtils;
@Autowired
private UserService userService;
/** /**
* 发送验证码接口 * 发送验证码接口
*/ */
...@@ -46,6 +53,14 @@ public class VerifyCodeController extends BaseController { ...@@ -46,6 +53,14 @@ public class VerifyCodeController extends BaseController {
if (BaseEnum.valueOf(VerifySceneEnum.class, param.getVerifyScene()) == null) { if (BaseEnum.valueOf(VerifySceneEnum.class, param.getVerifyScene()) == null) {
return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null); return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null);
} }
if (VerifySceneEnum.RESET_PWD.getCode().equals(param.getVerifyScene())) {
// 重置密码、找回密码校验手机号码已注册
User user = userService.getOne(new QueryWrapper<User>().lambda()
.eq(User::getPhone, param.getPhone()));
if (user == null) {
throw new BusinessException("账号不存在");
}
}
// String verifyCode = RandomUtil.generateVerifyCode(); // String verifyCode = RandomUtil.generateVerifyCode();
String verifyCode = "666666"; String verifyCode = "666666";
String key = new StringBuilder(RedisKeyPrefixConstant.VERIFY_CODE_PREFIX).append(param.getVerifyScene()).append(param.getPhone()).toString(); String key = new StringBuilder(RedisKeyPrefixConstant.VERIFY_CODE_PREFIX).append(param.getVerifyScene()).append(param.getPhone()).toString();
......
package com.wecloud.im.user.entity; package com.wecloud.im.externalaccess.entity;
import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
......
package com.wecloud.im.user.mapper; package com.wecloud.im.externalaccess.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.wecloud.im.user.entity.User; import com.wecloud.im.externalaccess.entity.User;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
/** /**
......
package com.wecloud.im.user.param; package com.wecloud.im.externalaccess.param;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
......
package com.wecloud.im.user.param; package com.wecloud.im.externalaccess.param;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
......
package com.wecloud.im.user.param; package com.wecloud.im.externalaccess.param;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
......
package com.wecloud.im.user.param; package com.wecloud.im.externalaccess.param;
import com.wecloud.im.friend.param.ImFriendBaseDto; import com.wecloud.im.friend.param.ImFriendBaseDto;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import java.io.Serializable;
/** /**
* @Author wenzhida * @Author wenzhida
* @Date 2022/2/22 23:20 * @Date 2022/2/22 23:20
...@@ -23,6 +20,12 @@ public class FriendDto extends ImFriendBaseDto { ...@@ -23,6 +20,12 @@ public class FriendDto extends ImFriendBaseDto {
@ApiModelProperty("昵称") @ApiModelProperty("昵称")
private String nickname; private String nickname;
@ApiModelProperty("好友拒绝原因")
private String rejectRemark;
@ApiModelProperty("好友请求说明")
private String requestRemark;
/** /**
* 头像路径url * 头像路径url
*/ */
......
package com.wecloud.im.user.param; package com.wecloud.im.externalaccess.param;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
......
package com.wecloud.im.user.param; package com.wecloud.im.externalaccess.param;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
......
package com.wecloud.im.user.param; package com.wecloud.im.externalaccess.param;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
......
package com.wecloud.im.user.param; package com.wecloud.im.externalaccess.param;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
......
package com.wecloud.im.user.param; package com.wecloud.im.externalaccess.param;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
......
package com.wecloud.im.user.param; package com.wecloud.im.externalaccess.param;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
......
package com.wecloud.im.externalaccess.param;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
/**
* @Author wenzhida
* @Date 2022/3/3 17:42
* @Description 多人音视频sign获取入参
*/
@Data
public class MultiMeetSignGetParam implements Serializable {
private static final long serialVersionUID = 1538118936608500035L;
@ApiModelProperty("时间戳")
@NotNull(message = "时间戳不能为空")
private String timestamp;
@ApiModelProperty("client客户端id")
@NotNull(message = "client客户端id不能为空")
private String clientId;
@ApiModelProperty("appKey")
@NotNull(message = "appKey不能为空")
private String appKey;
@ApiModelProperty("客户端平台: 1 web, 2 安卓, 3 ios, 4 pc-win, 5 pc-macOs")
@NotNull(message = "客户端平台不能为空")
private Integer platform;
@ApiModelProperty("密钥")
@NotNull(message = "密钥不能为空")
private String appSecret;
}
package com.wecloud.im.user.param; package com.wecloud.im.externalaccess.param;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
......
package com.wecloud.im.user.param; package com.wecloud.im.externalaccess.param;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
......
package com.wecloud.im.user.param; package com.wecloud.im.externalaccess.param;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
......
package com.wecloud.im.user.param; package com.wecloud.im.externalaccess.param;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
......
package com.wecloud.im.user.param; package com.wecloud.im.externalaccess.param;
import com.wecloud.im.enums.DeviceTypeEnum;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
...@@ -35,13 +36,11 @@ public class UserLoginParam implements Serializable { ...@@ -35,13 +36,11 @@ public class UserLoginParam implements Serializable {
private String appKey; private String appKey;
/** /**
* 客户端平台 * 设备类型
* @see com.wecloud.im.enums.PlatformEnum * @see DeviceTypeEnum
*/ */
@NotNull(message = "平台不可为空") @NotNull(message = "设备类型不可为空")
@ApiModelProperty("客户端平台: 1 web, 2 安卓, 3 ios, 4 pc-win, 5 pc-macOs") @ApiModelProperty("设备类型 1:ios; 2:android; 3:web; 4:win; 5:mac")
private Integer platform; private Integer deviceType;
@ApiModelProperty("设备推送token")
private String deviceToken;
} }
package com.wecloud.im.user.param; package com.wecloud.im.externalaccess.param;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
......
package com.wecloud.im.user.service; package com.wecloud.im.externalaccess.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
...@@ -10,9 +10,9 @@ import com.wecloud.im.friend.param.ImFriendBaseParam; ...@@ -10,9 +10,9 @@ import com.wecloud.im.friend.param.ImFriendBaseParam;
import com.wecloud.im.friend.param.ImFriendPageParam; import com.wecloud.im.friend.param.ImFriendPageParam;
import com.wecloud.im.friend.service.ImFriendService; import com.wecloud.im.friend.service.ImFriendService;
import com.wecloud.im.service.ImClientService; import com.wecloud.im.service.ImClientService;
import com.wecloud.im.user.entity.User; import com.wecloud.im.externalaccess.entity.User;
import com.wecloud.im.user.mapper.UserMapper; import com.wecloud.im.externalaccess.mapper.UserMapper;
import com.wecloud.im.user.param.FriendDto; import com.wecloud.im.externalaccess.param.FriendDto;
import io.geekidea.springbootplus.framework.common.exception.BusinessException; import io.geekidea.springbootplus.framework.common.exception.BusinessException;
import io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl; import io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl;
import io.geekidea.springbootplus.framework.core.pagination.Paging; import io.geekidea.springbootplus.framework.core.pagination.Paging;
...@@ -44,7 +44,7 @@ public class FriendService extends BaseServiceImpl<UserMapper, User> { ...@@ -44,7 +44,7 @@ public class FriendService extends BaseServiceImpl<UserMapper, User> {
public FriendDto getFriendInfo(ImFriendBaseParam param) { public FriendDto getFriendInfo(ImFriendBaseParam param) {
ImClient currentClient = imClientService.getCurentClient(); ImClient currentClient = imClientService.getCurrentClient();
if (currentClient == null) { if (currentClient == null) {
throw new BusinessException("当前登录用户未找到"); throw new BusinessException("当前登录用户未找到");
} }
...@@ -74,7 +74,7 @@ public class FriendService extends BaseServiceImpl<UserMapper, User> { ...@@ -74,7 +74,7 @@ public class FriendService extends BaseServiceImpl<UserMapper, User> {
* 全量获取好友列表 * 全量获取好友列表
*/ */
public List<FriendDto> getFriends() { public List<FriendDto> getFriends() {
ImClient currentClient = imClientService.getCurentClient(); ImClient currentClient = imClientService.getCurrentClient();
if (currentClient == null) { if (currentClient == null) {
throw new BusinessException("当前登录用户未找到"); throw new BusinessException("当前登录用户未找到");
} }
...@@ -116,7 +116,7 @@ public class FriendService extends BaseServiceImpl<UserMapper, User> { ...@@ -116,7 +116,7 @@ public class FriendService extends BaseServiceImpl<UserMapper, User> {
* 获取好友列表申请 * 获取好友列表申请
*/ */
public List<FriendDto> getApplyFriends() { public List<FriendDto> getApplyFriends() {
ImClient currentClient = imClientService.getCurentClient(); ImClient currentClient = imClientService.getCurrentClient();
if (currentClient == null) { if (currentClient == null) {
throw new BusinessException("当前登录用户未找到"); throw new BusinessException("当前登录用户未找到");
} }
......
...@@ -58,7 +58,7 @@ public class ImFriendController extends BaseController { ...@@ -58,7 +58,7 @@ public class ImFriendController extends BaseController {
if(param == null) { if(param == null) {
return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null); return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null);
} }
ImClient currentClient = imClientService.getCurentClient(); ImClient currentClient = imClientService.getCurrentClient();
if(currentClient == null) { if(currentClient == null) {
return ApiResult.fail(ApiCode.CLIENT_NOT_FOUNT, null); return ApiResult.fail(ApiCode.CLIENT_NOT_FOUNT, null);
} }
...@@ -79,7 +79,7 @@ public class ImFriendController extends BaseController { ...@@ -79,7 +79,7 @@ public class ImFriendController extends BaseController {
if(param == null) { if(param == null) {
return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null); return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null);
} }
ImClient currentClient = imClientService.getCurentClient(); ImClient currentClient = imClientService.getCurrentClient();
if(currentClient == null) { if(currentClient == null) {
return ApiResult.fail(ApiCode.CLIENT_NOT_FOUNT, null); return ApiResult.fail(ApiCode.CLIENT_NOT_FOUNT, null);
} }
...@@ -100,7 +100,7 @@ public class ImFriendController extends BaseController { ...@@ -100,7 +100,7 @@ public class ImFriendController extends BaseController {
@PostMapping("/unsureFriends") @PostMapping("/unsureFriends")
@ApiOperation(value = "待接受的好友请求列表,最多只返回1000个") @ApiOperation(value = "待接受的好友请求列表,最多只返回1000个")
public ApiResult<List<ImFriendApplyDto>> getUnsureFriends() { public ApiResult<List<ImFriendApplyDto>> getUnsureFriends() {
ImClient currentClient = imClientService.getCurentClient(); ImClient currentClient = imClientService.getCurrentClient();
if(currentClient == null) { if(currentClient == null) {
return ApiResult.fail(ApiCode.CLIENT_NOT_FOUNT, null); return ApiResult.fail(ApiCode.CLIENT_NOT_FOUNT, null);
} }
...@@ -117,7 +117,7 @@ public class ImFriendController extends BaseController { ...@@ -117,7 +117,7 @@ public class ImFriendController extends BaseController {
if(param == null || param.getAgree() == null) { if(param == null || param.getAgree() == null) {
return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null); return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null);
} }
ImClient currentClient = imClientService.getCurentClient(); ImClient currentClient = imClientService.getCurrentClient();
if(currentClient == null) { if(currentClient == null) {
return ApiResult.fail(ApiCode.CLIENT_NOT_FOUNT, null); return ApiResult.fail(ApiCode.CLIENT_NOT_FOUNT, null);
} }
...@@ -137,7 +137,7 @@ public class ImFriendController extends BaseController { ...@@ -137,7 +137,7 @@ public class ImFriendController extends BaseController {
@PostMapping("/batchDelete") @PostMapping("/batchDelete")
@ApiOperation(value = "删除好友") @ApiOperation(value = "删除好友")
public ApiResult<Boolean> batchDeleteFriend(@RequestBody ImDeleteFriendParam param) { public ApiResult<Boolean> batchDeleteFriend(@RequestBody ImDeleteFriendParam param) {
ImClient currentClient = imClientService.getCurentClient(); ImClient currentClient = imClientService.getCurrentClient();
if(currentClient == null) { if(currentClient == null) {
return ApiResult.fail(ApiCode.CLIENT_NOT_FOUNT, null); return ApiResult.fail(ApiCode.CLIENT_NOT_FOUNT, null);
} }
...@@ -153,7 +153,7 @@ public class ImFriendController extends BaseController { ...@@ -153,7 +153,7 @@ public class ImFriendController extends BaseController {
@OperationLog(name = "好友分页列表", type = OperationLogType.PAGE) @OperationLog(name = "好友分页列表", type = OperationLogType.PAGE)
@ApiOperation(value = "好友分页列表") @ApiOperation(value = "好友分页列表")
public ApiResult<Paging<ImFriendBaseDto>> getImFriendPageList(@RequestBody ImFriendPageParam pageParam) { public ApiResult<Paging<ImFriendBaseDto>> getImFriendPageList(@RequestBody ImFriendPageParam pageParam) {
ImClient currentClient = imClientService.getCurentClient(); ImClient currentClient = imClientService.getCurrentClient();
if(currentClient == null) { if(currentClient == null) {
return ApiResult.fail(ApiCode.CLIENT_NOT_FOUNT, null); return ApiResult.fail(ApiCode.CLIENT_NOT_FOUNT, null);
} }
...@@ -169,7 +169,7 @@ public class ImFriendController extends BaseController { ...@@ -169,7 +169,7 @@ public class ImFriendController extends BaseController {
@OperationLog(name = "批量创建好友推荐", type = OperationLogType.PAGE) @OperationLog(name = "批量创建好友推荐", type = OperationLogType.PAGE)
@ApiOperation(value = "批量创建好友推荐") @ApiOperation(value = "批量创建好友推荐")
public ApiResult<Boolean> batchCreateRecommend(@RequestBody ImCreateRecommendParam param) { public ApiResult<Boolean> batchCreateRecommend(@RequestBody ImCreateRecommendParam param) {
ImClient currentClient = imClientService.getCurentClient(); ImClient currentClient = imClientService.getCurrentClient();
if(currentClient == null) { if(currentClient == null) {
return ApiResult.fail(ApiCode.CLIENT_NOT_FOUNT, null); return ApiResult.fail(ApiCode.CLIENT_NOT_FOUNT, null);
} }
...@@ -192,7 +192,7 @@ public class ImFriendController extends BaseController { ...@@ -192,7 +192,7 @@ public class ImFriendController extends BaseController {
@OperationLog(name = "好友推荐分页列表", type = OperationLogType.PAGE) @OperationLog(name = "好友推荐分页列表", type = OperationLogType.PAGE)
@ApiOperation(value = "好友推荐分页列表") @ApiOperation(value = "好友推荐分页列表")
public ApiResult<Paging<ImFriendRecommendDto>> getImFriendRecommendPageList(@RequestBody ImFriendPageParam pageParam) { public ApiResult<Paging<ImFriendRecommendDto>> getImFriendRecommendPageList(@RequestBody ImFriendPageParam pageParam) {
ImClient currentClient = imClientService.getCurentClient(); ImClient currentClient = imClientService.getCurrentClient();
if(currentClient == null) { if(currentClient == null) {
return ApiResult.fail(ApiCode.CLIENT_NOT_FOUNT, null); return ApiResult.fail(ApiCode.CLIENT_NOT_FOUNT, null);
} }
...@@ -207,7 +207,7 @@ public class ImFriendController extends BaseController { ...@@ -207,7 +207,7 @@ public class ImFriendController extends BaseController {
@PostMapping("/recommend/batchDelete") @PostMapping("/recommend/batchDelete")
@ApiOperation(value = "删除好友推荐") @ApiOperation(value = "删除好友推荐")
public ApiResult<Boolean> batchDeleteRecommend(@RequestBody ImDeleteRecommendParam param) { public ApiResult<Boolean> batchDeleteRecommend(@RequestBody ImDeleteRecommendParam param) {
ImClient currentClient = imClientService.getCurentClient(); ImClient currentClient = imClientService.getCurrentClient();
if(currentClient == null) { if(currentClient == null) {
return ApiResult.fail(ApiCode.CLIENT_NOT_FOUNT, null); return ApiResult.fail(ApiCode.CLIENT_NOT_FOUNT, null);
} }
......
...@@ -38,8 +38,8 @@ public class FriendEventSender { ...@@ -38,8 +38,8 @@ public class FriendEventSender {
private final static String FRIEND_APPLY_TITLE = "好友申请"; private final static String FRIEND_APPLY_TITLE = "好友申请";
private final static String FRIEND_APPLY_TITLE_SUB = "您有好友申请待验证"; private final static String FRIEND_APPLY_TITLE_SUB = "您有好友申请待验证";
private final static String FRIEND_APPROVE_TITLE = "好友验证结果"; private final static String FRIEND_APPROVE_TITLE = "好友验证结果";
private final static String FRIEND_APPROVE_TITLE_AGREE = "您的好友拒绝了您的好友申请"; private final static String FRIEND_APPROVE_TITLE_AGREE = "您的好友同意了您的好友申请";
private final static String FRIEND_APPROVE_TITLE_REJECT = "您的好友同意了您的好友申请"; private final static String FRIEND_APPROVE_TITLE_REJECT = "您的好友拒绝了您的好友申请";
public void sendFriendApplyEventMsg(ImClient claimerClient, ImClient receiveClient, String requestRemark) { public void sendFriendApplyEventMsg(ImClient claimerClient, ImClient receiveClient, String requestRemark) {
...@@ -66,7 +66,9 @@ public class FriendEventSender { ...@@ -66,7 +66,9 @@ public class FriendEventSender {
pushVO.setTitle(FRIEND_APPLY_TITLE); pushVO.setTitle(FRIEND_APPLY_TITLE);
pushVO.setSubTitle(FRIEND_APPLY_TITLE_SUB); pushVO.setSubTitle(FRIEND_APPLY_TITLE_SUB);
PushDTO pushDTO = mqSender.buildPushDto(pushVO, receiveClient, app); PushDTO pushDTO = mqSender.buildPushDto(pushVO, receiveClient, app);
mqSender.orderSend(MqConstant.Topic.IM_MSG_TOPIC, MqConstant.Tag.IM_MSG_TAG, pushDTO); if (pushDTO != null) {
mqSender.orderSend(MqConstant.Topic.IM_ORDER_MSG_TOPIC, MqConstant.Tag.IM_ORDER_MSG_TAG, pushDTO);
}
} }
public void sendFriendApproveEventMsg(ImClient claimerClient, ImClient receiveClient, boolean isAgree, String rejectRemark) { public void sendFriendApproveEventMsg(ImClient claimerClient, ImClient receiveClient, boolean isAgree, String rejectRemark) {
...@@ -94,6 +96,8 @@ public class FriendEventSender { ...@@ -94,6 +96,8 @@ public class FriendEventSender {
pushVO.setTitle(FRIEND_APPROVE_TITLE); pushVO.setTitle(FRIEND_APPROVE_TITLE);
pushVO.setSubTitle(isAgree ? FRIEND_APPROVE_TITLE_AGREE : FRIEND_APPROVE_TITLE_REJECT); pushVO.setSubTitle(isAgree ? FRIEND_APPROVE_TITLE_AGREE : FRIEND_APPROVE_TITLE_REJECT);
PushDTO pushDTO = mqSender.buildPushDto(pushVO, receiveClient, app); PushDTO pushDTO = mqSender.buildPushDto(pushVO, receiveClient, app);
mqSender.orderSend(MqConstant.Topic.IM_MSG_TOPIC, MqConstant.Tag.IM_MSG_TAG, pushDTO); if (pushDTO != null) {
mqSender.orderSend(MqConstant.Topic.IM_ORDER_MSG_TOPIC, MqConstant.Tag.IM_ORDER_MSG_TAG, pushDTO);
}
} }
} }
...@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; ...@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.metadata.OrderItem; import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.google.common.collect.Lists;
import com.wecloud.im.entity.ImClient; import com.wecloud.im.entity.ImClient;
import com.wecloud.im.enums.FriendStateEnum; import com.wecloud.im.enums.FriendStateEnum;
import com.wecloud.im.friend.entity.ImFriend; import com.wecloud.im.friend.entity.ImFriend;
...@@ -101,7 +102,7 @@ public class ImFriendService extends BaseServiceImpl<ImFriendMapper, ImFriend> { ...@@ -101,7 +102,7 @@ public class ImFriendService extends BaseServiceImpl<ImFriendMapper, ImFriend> {
if(StringUtils.isNotEmpty(friendName)) { if(StringUtils.isNotEmpty(friendName)) {
my.setFriendName(friendName); my.setFriendName(friendName);
} }
this.updateByKeyAndClaimer(my); this.updateByKey(my);
} else { } else {
my.setId(SnowflakeUtil.getId()); my.setId(SnowflakeUtil.getId());
my.setCreateTime(new Date()); my.setCreateTime(new Date());
...@@ -118,10 +119,7 @@ public class ImFriendService extends BaseServiceImpl<ImFriendMapper, ImFriend> { ...@@ -118,10 +119,7 @@ public class ImFriendService extends BaseServiceImpl<ImFriendMapper, ImFriend> {
if(StringUtils.isNotEmpty(requestRemark)) { if(StringUtils.isNotEmpty(requestRemark)) {
friend.setRequestRemark(requestRemark); friend.setRequestRemark(requestRemark);
} }
if(StringUtils.isNotEmpty(friendName)) { this.updateByKey(friend);
friend.setFriendName(friendName);
}
this.updateByKeyAndClaimer(friend);
} else { } else {
friend.setId(SnowflakeUtil.getId()); friend.setId(SnowflakeUtil.getId());
friend.setCreateTime(new Date()); friend.setCreateTime(new Date());
...@@ -137,7 +135,7 @@ public class ImFriendService extends BaseServiceImpl<ImFriendMapper, ImFriend> { ...@@ -137,7 +135,7 @@ public class ImFriendService extends BaseServiceImpl<ImFriendMapper, ImFriend> {
/** /**
* 根据 自己id和好友id查询好友信息 * 根据 自己id和好友id查询好友信息 - 待确认、已确认
* @param clientId * @param clientId
* @param friendClientId * @param friendClientId
* @return * @return
...@@ -163,6 +161,19 @@ public class ImFriendService extends BaseServiceImpl<ImFriendMapper, ImFriend> { ...@@ -163,6 +161,19 @@ public class ImFriendService extends BaseServiceImpl<ImFriendMapper, ImFriend> {
} }
/** /**
* 根据 自己id和好友id,更新好友信息
* @param imFriend
*/
public boolean updateByKey(ImFriend imFriend) {
// 不更新id
imFriend.setId(null);
imFriend.setCreateTime(null);
return this.update(imFriend, new QueryWrapper<ImFriend>().lambda()
.eq(ImFriend::getClientId, imFriend.getClientId())
.eq(ImFriend::getClientIdFriend, imFriend.getClientIdFriend()));
}
/**
* 好友通过/拒绝 * 好友通过/拒绝
* @param currentClient * @param currentClient
* @param friendClient * @param friendClient
...@@ -184,7 +195,7 @@ public class ImFriendService extends BaseServiceImpl<ImFriendMapper, ImFriend> { ...@@ -184,7 +195,7 @@ public class ImFriendService extends BaseServiceImpl<ImFriendMapper, ImFriend> {
if(StringUtils.isNotEmpty(rejectRemark)) { if(StringUtils.isNotEmpty(rejectRemark)) {
friend.setRejectRemark(rejectRemark); friend.setRejectRemark(rejectRemark);
} }
boolean ok1 = this.updateByKeyAndClaimer(friend); boolean ok1 = this.updateByKey(friend);
// 同时更新我的 // 同时更新我的
ImFriend my = new ImFriend(); ImFriend my = new ImFriend();
my.setClientId(currentClient.getClientId()); my.setClientId(currentClient.getClientId());
...@@ -194,7 +205,7 @@ public class ImFriendService extends BaseServiceImpl<ImFriendMapper, ImFriend> { ...@@ -194,7 +205,7 @@ public class ImFriendService extends BaseServiceImpl<ImFriendMapper, ImFriend> {
if(StringUtils.isNotEmpty(rejectRemark)) { if(StringUtils.isNotEmpty(rejectRemark)) {
my.setRejectRemark(rejectRemark); my.setRejectRemark(rejectRemark);
} }
boolean ok2 = this.updateByKeyAndClaimer(my); boolean ok2 = this.updateByKey(my);
friendEventSender.sendFriendApproveEventMsg(currentClient, friendClient, agree, rejectRemark); friendEventSender.sendFriendApproveEventMsg(currentClient, friendClient, agree, rejectRemark);
......
...@@ -25,7 +25,7 @@ public interface ImClientBlacklistMapper extends BaseMapper<ImClientBlacklist> { ...@@ -25,7 +25,7 @@ public interface ImClientBlacklistMapper extends BaseMapper<ImClientBlacklist> {
* @param clientId * @param clientId
* @return * @return
*/ */
IPage<ImClientBlacklistQueryVo> getImClientBlacklistPageList(@Param("page") Page page, @Param("clientId") Long clientId); IPage<ImClientBlacklistQueryVo> getImClientBlacklistPageList(@Param("page") Page page, @Param("clientId") String clientId);
/** /**
* 根据ID获取查询对象 * 根据ID获取查询对象
......
package com.wecloud.im.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.wecloud.im.entity.ImClientDevice;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
/**
* @Author wenzhida
* @Date 2022/3/2 14:57
* @Description 客户端设备mapper
*/
@Repository
public interface ImClientDeviceMapper extends BaseMapper<ImClientDevice> {
/**
* 清除旧token
* @param appId
* @param deviceToken
* @return
*/
int removeOldToken(@Param("appId") Long appId, @Param("deviceToken") String deviceToken);
}
...@@ -32,10 +32,6 @@ public interface ImClientMapper extends BaseMapper<ImClient> { ...@@ -32,10 +32,6 @@ public interface ImClientMapper extends BaseMapper<ImClient> {
*/ */
IPage<ImClientQueryVo> getImClientPageList(@Param("page") Page page, @Param("param") ImClientPageParam imClientPageParam); IPage<ImClientQueryVo> getImClientPageList(@Param("page") Page page, @Param("param") ImClientPageParam imClientPageParam);
int removeOldToken(@Param("appId") Long appId, @Param("deviceToken") String deviceToken);
List<GetInfoListVo> getInfoList(@Param("appId") Long appId, @Param("conversationId") Long conversationId, @Param("clientIds") List<String> clientIds); List<GetInfoListVo> getInfoList(@Param("appId") Long appId, @Param("conversationId") Long conversationId, @Param("clientIds") List<String> clientIds);
List<ImClientSimpleDto> getSimpleClients(@Param("appId")Long appId, @Param("clientIds")List<String> clientIds); List<ImClientSimpleDto> getSimpleClients(@Param("appId")Long appId, @Param("clientIds")List<String> clientIds);
......
package com.wecloud.im.mq; package com.wecloud.im.mq;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.wecloud.im.entity.ImApplication; import com.wecloud.im.entity.ImApplication;
import com.wecloud.im.entity.ImClient; import com.wecloud.im.entity.ImClient;
import com.wecloud.im.entity.ImClientDevice;
import com.wecloud.im.service.ImClientDeviceService;
import com.wecloud.im.service.ImInboxService; import com.wecloud.im.service.ImInboxService;
import com.wecloud.im.ws.model.request.PushVO; import com.wecloud.im.ws.model.request.PushVO;
import com.wecloud.pushserver.client.model.constant.MqConstant; import com.wecloud.pushserver.client.model.dto.ApplicationDTO;
import com.wecloud.pushserver.client.model.dto.ImApplicationDTO; import com.wecloud.pushserver.client.model.dto.ClientDTO;
import com.wecloud.pushserver.client.model.dto.ImClientDTO; import com.wecloud.pushserver.client.model.dto.ClientDeviceDTO;
import com.wecloud.pushserver.client.model.dto.MessageDTO; import com.wecloud.pushserver.client.model.dto.MessageDTO;
import com.wecloud.pushserver.client.model.dto.PushDTO; import com.wecloud.pushserver.client.model.dto.PushDTO;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.rocketmq.client.producer.SendResult; import org.apache.rocketmq.client.producer.SendResult;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.List;
import static com.wecloud.im.ws.ImConstant.PUSH_BODY; import static com.wecloud.im.ws.ImConstant.PUSH_BODY;
import static com.wecloud.im.ws.ImConstant.PUSH_TITLE; import static com.wecloud.im.ws.ImConstant.PUSH_TITLE;
...@@ -34,8 +40,12 @@ public class MqSender { ...@@ -34,8 +40,12 @@ public class MqSender {
@Autowired @Autowired
private RocketMqProducerService rocketMqProducerService; private RocketMqProducerService rocketMqProducerService;
@Autowired
private ImClientDeviceService imClientDeviceService;
/** /**
* mq同步推送方法 * mq同步推送方法
*
* @param topic * @param topic
* @param tag * @param tag
* @param pushDTO * @param pushDTO
...@@ -50,6 +60,7 @@ public class MqSender { ...@@ -50,6 +60,7 @@ public class MqSender {
/** /**
* mq异步推送方法 * mq异步推送方法
*
* @param topic * @param topic
* @param tag * @param tag
* @param pushDTO * @param pushDTO
...@@ -62,6 +73,7 @@ public class MqSender { ...@@ -62,6 +73,7 @@ public class MqSender {
/** /**
* mq按顺序发送 * mq按顺序发送
*
* @param topic * @param topic
* @param tag * @param tag
* @param pushDTO * @param pushDTO
...@@ -89,23 +101,36 @@ public class MqSender { ...@@ -89,23 +101,36 @@ public class MqSender {
// 统计未读消息数量 // 统计未读消息数量
int badge = imInboxService.countMyNotReadCount(imClientReceiver.getId()); int badge = imInboxService.countMyNotReadCount(imClientReceiver.getId());
messageDTO.setBadge(badge); messageDTO.setBadge(badge);
ImClientDTO imClientDTO = new ImClientDTO(); ClientDTO clientDTO = new ClientDTO();
imClientDTO.setClientId(imClientReceiver.getClientId()); clientDTO.setClientId(imClientReceiver.getClientId());
imClientDTO.setValid(imClientReceiver.getValid()); List<ImClientDevice> clientDeviceList = imClientDeviceService.list(
imClientDTO.setDeviceType(imClientReceiver.getDeviceType()); new QueryWrapper<ImClientDevice>().lambda()
imClientDTO.setDeviceToken(imClientReceiver.getDeviceToken()); .eq(ImClientDevice::getFkClientId, imClientReceiver.getId()));
messageDTO.setImClientDTO(imClientDTO); if (CollectionUtils.isEmpty(clientDeviceList)) {
ImApplicationDTO imApplicationDTO = new ImApplicationDTO(); log.info("接收人信息 {} 查无推送设备", imClientReceiver.getId());
imApplicationDTO.setId(imApplication.getId()); return null;
imApplicationDTO.setAppKey(imApplication.getAppKey()); }
imApplicationDTO.setAppSecret(imApplication.getAppSecret()); List<ClientDeviceDTO> deviceDTOList = Lists.newArrayList();
imApplicationDTO.setAppName(imApplication.getAppName()); for (ImClientDevice imClientDevice : clientDeviceList) {
imApplicationDTO.setIosPushChannel(imApplication.getIosPushChannel()); ClientDeviceDTO clientDeviceDTO = new ClientDeviceDTO();
imApplicationDTO.setAndroidPushChannel(imApplication.getAndroidPushChannel()); clientDeviceDTO.setValid(imClientDevice.getValid());
imApplicationDTO.setUmengKey(imApplication.getUmengKey()); clientDeviceDTO.setDeviceType(imClientDevice.getDeviceType());
imApplicationDTO.setUmengSecret(imApplication.getUmengSecret()); clientDeviceDTO.setDeviceToken(imClientDevice.getDeviceToken());
imApplicationDTO.setFirebaseSecret(imApplication.getFirebaseSecret()); deviceDTOList.add(clientDeviceDTO);
messageDTO.setImApplicationDTO(imApplicationDTO); }
clientDTO.setDeviceDTOList(deviceDTOList);
messageDTO.setClientDTO(clientDTO);
ApplicationDTO applicationDTO = new ApplicationDTO();
applicationDTO.setId(imApplication.getId());
applicationDTO.setAppKey(imApplication.getAppKey());
applicationDTO.setAppSecret(imApplication.getAppSecret());
applicationDTO.setAppName(imApplication.getAppName());
applicationDTO.setIosPushChannel(imApplication.getIosPushChannel());
applicationDTO.setAndroidPushChannel(imApplication.getAndroidPushChannel());
applicationDTO.setUmengKey(imApplication.getUmengKey());
applicationDTO.setUmengSecret(imApplication.getUmengSecret());
applicationDTO.setFirebaseSecret(imApplication.getFirebaseSecret());
messageDTO.setApplicationDTO(applicationDTO);
pushDTO.setMessageDTOList(Lists.newArrayList(messageDTO)); pushDTO.setMessageDTOList(Lists.newArrayList(messageDTO));
return pushDTO; return pushDTO;
} }
......
...@@ -28,10 +28,17 @@ public class ImHistoryMessagePageParam extends BasePageOrderParam { ...@@ -28,10 +28,17 @@ public class ImHistoryMessagePageParam extends BasePageOrderParam {
/** /**
* 消息id最小值 * 消息id最小值
*/ */
@ApiModelProperty("消息id最小值")
private Long msgIdStart; private Long msgIdStart;
/** /**
* 消息id最大值 * 消息id最大值
*/ */
@ApiModelProperty("消息id最大值")
private Long msgIdEnd; private Long msgIdEnd;
/**
* 当前操作人client主键id
*/
private Long currentFkClientId;
} }
package com.wecloud.im.param;
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;
import javax.validation.constraints.NotNull;
/**
* @Author wenzhida
* @Date 2022/3/2 18:11
* @Description 登出操作入参
*/
@Data
@ApiModel(value = "登出操作入参")
public class LogoutParam extends BaseEntity {
private static final long serialVersionUID = -2718673661281424767L;
/**
* 设备类型
* @see com.wecloud.im.enums.DeviceTypeEnum
*/
@ApiModelProperty("设备类型 1:ios; 2:android; 3:web; 4:win; 5:mac")
@NotNull(message = "设备类型不能为空")
private Integer deviceType;
@ApiModelProperty("唯一设备id")
private String uniqueDeviceId;
}
...@@ -17,15 +17,22 @@ import lombok.experimental.Accessors; ...@@ -17,15 +17,22 @@ import lombok.experimental.Accessors;
@Accessors(chain = true) @Accessors(chain = true)
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@ApiModel(value = "添加或修改推送设备信息") @ApiModel(value = "添加或修改推送设备信息")
public class ImClientDeviceInfoAdd extends BaseEntity { public class ClientDeviceUpdateParam extends BaseEntity {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@ApiModelProperty("设备不想收到推送提醒, 1想, 0不想") @ApiModelProperty("设备不想收到推送提醒, 1想, 0不想")
private Integer valid; private Integer valid;
@ApiModelProperty("设备类型1:ios; 2:android; 3:web") /**
* 设备类型
* @see com.wecloud.im.enums.DeviceTypeEnum
*/
@ApiModelProperty("设备类型 1:ios; 2:android; 3:web; 4:win; 5:mac")
private Integer deviceType; private Integer deviceType;
@ApiModelProperty("设备推送token") @ApiModelProperty("设备推送token")
private String deviceToken; private String deviceToken;
@ApiModelProperty("唯一设备id")
private String uniqueDeviceId;
} }
package com.wecloud.im.service;
import com.wecloud.im.entity.ImClientDevice;
import io.geekidea.springbootplus.framework.common.service.BaseService;
/**
* @Author wenzhida
* @Date 2022/3/2 14:58
* @Description 客户端设备服务接口
*/
public interface ImClientDeviceService extends BaseService<ImClientDevice> {
/**
* 清除旧token
* @param appId
* @param deviceToken
* @return
*/
int removeOldToken(Long appId, String deviceToken);
}
...@@ -6,7 +6,8 @@ import com.wecloud.im.param.GetClientInfoParam; ...@@ -6,7 +6,8 @@ import com.wecloud.im.param.GetClientInfoParam;
import com.wecloud.im.param.ImClientPageParam; import com.wecloud.im.param.ImClientPageParam;
import com.wecloud.im.param.ImClientQueryVo; import com.wecloud.im.param.ImClientQueryVo;
import com.wecloud.im.param.ImClientSimpleDto; import com.wecloud.im.param.ImClientSimpleDto;
import com.wecloud.im.param.add.ImClientDeviceInfoAdd; import com.wecloud.im.param.LogoutParam;
import com.wecloud.im.param.add.ClientDeviceUpdateParam;
import com.wecloud.im.param.add.ImClientHeadPortraitAdd; import com.wecloud.im.param.add.ImClientHeadPortraitAdd;
import com.wecloud.im.param.add.ImClientHeadPortraitAndNicknameUpdate; import com.wecloud.im.param.add.ImClientHeadPortraitAndNicknameUpdate;
import com.wecloud.im.param.add.ImClientNicknameAdd; import com.wecloud.im.param.add.ImClientNicknameAdd;
...@@ -17,7 +18,6 @@ import com.wecloud.im.vo.MyInfoVo; ...@@ -17,7 +18,6 @@ import com.wecloud.im.vo.MyInfoVo;
import io.geekidea.springbootplus.framework.common.api.ApiResult; import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.common.service.BaseService; import io.geekidea.springbootplus.framework.common.service.BaseService;
import io.geekidea.springbootplus.framework.core.pagination.Paging; import io.geekidea.springbootplus.framework.core.pagination.Paging;
import org.springframework.web.bind.annotation.RequestBody;
import java.util.List; import java.util.List;
...@@ -86,9 +86,14 @@ public interface ImClientService extends BaseService<ImClient> { ...@@ -86,9 +86,14 @@ public interface ImClientService extends BaseService<ImClient> {
* @param imClientDevice * @param imClientDevice
* @return * @return
*/ */
boolean updateDeviceInfo(ImClientDeviceInfoAdd imClientDevice); boolean updateDeviceInfo(ClientDeviceUpdateParam imClientDevice);
boolean logout(); /**
* 登出操作
* @param param
* @return
*/
boolean logout(LogoutParam param);
/** /**
...@@ -110,15 +115,6 @@ public interface ImClientService extends BaseService<ImClient> { ...@@ -110,15 +115,6 @@ public interface ImClientService extends BaseService<ImClient> {
boolean deleteImClient(Long id) throws Exception; boolean deleteImClient(Long id) throws Exception;
/** /**
* 移除旧的设备token
*
* @param appId
* @param deviceToken
* @return
*/
int removeOldToken(Long appId, String deviceToken);
/**
* 获取分页对象 * 获取分页对象
* *
* @param imClientPageParam * @param imClientPageParam
...@@ -133,7 +129,7 @@ public interface ImClientService extends BaseService<ImClient> { ...@@ -133,7 +129,7 @@ public interface ImClientService extends BaseService<ImClient> {
* *
* @return * @return
*/ */
ImClient getCurentClient(); ImClient getCurrentClient();
ImClient getCacheImClient(Long applicationId, String clientId); ImClient getCacheImClient(Long applicationId, String clientId);
......
...@@ -74,11 +74,11 @@ public interface ImMessageService extends BaseService<ImMessage> { ...@@ -74,11 +74,11 @@ public interface ImMessageService extends BaseService<ImMessage> {
/** /**
* 查询某个会话历史消息分页列表 * 查询某个会话历史消息分页列表
* *
* @param imHistoryMessagePageParam * @param param
* @return * @return
* @throws Exception * @throws Exception
*/ */
Paging<OfflineMsgDto> getHistoryMsgConversationId(ImHistoryMessagePageParam imHistoryMessagePageParam); Paging<OfflineMsgDto> getHistoryMsgConversationId(ImHistoryMessagePageParam param);
/** /**
* 查询用户所有离线消息 * 查询用户所有离线消息
......
...@@ -52,7 +52,7 @@ public class ImClientBlacklistServiceImpl extends BaseServiceImpl<ImClientBlackl ...@@ -52,7 +52,7 @@ public class ImClientBlacklistServiceImpl extends BaseServiceImpl<ImClientBlackl
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public ApiResult<Boolean> addImClientBlacklist(ImClientBlacklistUpdate imClientBlacklistUpdate) throws Exception { public ApiResult<Boolean> addImClientBlacklist(ImClientBlacklistUpdate imClientBlacklistUpdate) throws Exception {
ImClient client = imClientService.getCurentClient(); ImClient client = imClientService.getCurrentClient();
if (client == null) { if (client == null) {
throw new BusinessException("当前用户登录信息失效"); throw new BusinessException("当前用户登录信息失效");
} }
...@@ -77,7 +77,7 @@ public class ImClientBlacklistServiceImpl extends BaseServiceImpl<ImClientBlackl ...@@ -77,7 +77,7 @@ public class ImClientBlacklistServiceImpl extends BaseServiceImpl<ImClientBlackl
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public ApiResult<Boolean> removeImClientBlacklist(ImClientBlacklistUpdate imClientBlacklistUpdate) throws Exception { public ApiResult<Boolean> removeImClientBlacklist(ImClientBlacklistUpdate imClientBlacklistUpdate) throws Exception {
// 操作者 // 操作者
ImClient client = imClientService.getCurentClient(); ImClient client = imClientService.getCurrentClient();
if (client == null) { if (client == null) {
throw new BusinessException("当前用户登录信息失效"); throw new BusinessException("当前用户登录信息失效");
} }
...@@ -100,9 +100,9 @@ public class ImClientBlacklistServiceImpl extends BaseServiceImpl<ImClientBlackl ...@@ -100,9 +100,9 @@ public class ImClientBlacklistServiceImpl extends BaseServiceImpl<ImClientBlackl
Page<ImClientBlacklistQueryVo> page = new PageInfo<>(imClientBlacklistPageParam); Page<ImClientBlacklistQueryVo> page = new PageInfo<>(imClientBlacklistPageParam);
ImClient client = imClientService.getCurentClient(); ImClient client = imClientService.getCurrentClient();
IPage<ImClientBlacklistQueryVo> imClientBlacklistPageList = imClientBlacklistMapper.getImClientBlacklistPageList(page, client.getId()); IPage<ImClientBlacklistQueryVo> imClientBlacklistPageList = imClientBlacklistMapper.getImClientBlacklistPageList(page, client.getClientId());
Paging<ImClientBlacklistQueryVo> imClientBlacklistQueryVoPaging = new Paging<>(imClientBlacklistPageList); Paging<ImClientBlacklistQueryVo> imClientBlacklistQueryVoPaging = new Paging<>(imClientBlacklistPageList);
......
package com.wecloud.im.service.impl;
import com.wecloud.im.entity.ImClientDevice;
import com.wecloud.im.mapper.ImClientDeviceMapper;
import com.wecloud.im.service.ImClientDeviceService;
import io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @Author wenzhida
* @Date 2022/3/2 15:00
* @Description 客户端设备服务接口实现
*/
@Slf4j
@Service
public class ImClientDeviceServiceImpl extends BaseServiceImpl<ImClientDeviceMapper, ImClientDevice> implements ImClientDeviceService {
@Autowired
private ImClientDeviceMapper imClientDeviceMapper;
@Override
public int removeOldToken(Long appId, String deviceToken) {
return imClientDeviceMapper.removeOldToken(appId, deviceToken);
}
}
package com.wecloud.im.service.impl; package com.wecloud.im.service.impl;
import cn.hutool.core.lang.Snowflake;
import cn.hutool.crypto.digest.MD5; import cn.hutool.crypto.digest.MD5;
import com.alibaba.nacos.api.exception.NacosException; import com.alibaba.nacos.api.exception.NacosException;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
...@@ -12,6 +11,7 @@ import com.wecloud.im.service.ImApplicationService; ...@@ -12,6 +11,7 @@ import com.wecloud.im.service.ImApplicationService;
import com.wecloud.im.service.ImClientLoginService; import com.wecloud.im.service.ImClientLoginService;
import com.wecloud.im.service.ImClientService; import com.wecloud.im.service.ImClientService;
import com.wecloud.im.vo.TokenVo; import com.wecloud.im.vo.TokenVo;
import com.wecloud.utils.SnowflakeUtil;
import io.geekidea.springbootplus.config.properties.JwtProperties; import io.geekidea.springbootplus.config.properties.JwtProperties;
import io.geekidea.springbootplus.framework.common.api.ApiCode; import io.geekidea.springbootplus.framework.common.api.ApiCode;
import io.geekidea.springbootplus.framework.common.api.ApiResult; import io.geekidea.springbootplus.framework.common.api.ApiResult;
...@@ -91,7 +91,7 @@ public class ImClientLoginServiceImpl implements ImClientLoginService { ...@@ -91,7 +91,7 @@ public class ImClientLoginServiceImpl implements ImClientLoginService {
if (imClient == null) { if (imClient == null) {
log.info("client不存在,先走注册流程"); log.info("client不存在,先走注册流程");
imClient = new ImClient(); imClient = new ImClient();
imClient.setId(new Snowflake(1L, 1L).nextId()); imClient.setId(SnowflakeUtil.getId());
imClient.setFkAppid(imApplication.getId()); imClient.setFkAppid(imApplication.getId());
imClient.setClientId(imTokenVerify.getClientId()); imClient.setClientId(imTokenVerify.getClientId());
imClientService.save(imClient); imClientService.save(imClient);
......
...@@ -84,11 +84,11 @@ public class ImConversationMembersServiceImpl extends BaseServiceImpl<ImConversa ...@@ -84,11 +84,11 @@ public class ImConversationMembersServiceImpl extends BaseServiceImpl<ImConversa
public ApiResult<Boolean> saveOrUpdateClientRemarkName(ImConvMemeClientRemarkNameParam imConvMemeClientRemarkNameParam) { public ApiResult<Boolean> saveOrUpdateClientRemarkName(ImConvMemeClientRemarkNameParam imConvMemeClientRemarkNameParam) {
// shiro线程中获取当前token // shiro线程中获取当前token
JwtToken curentJwtToken = JwtUtil.getCurentJwtToken(); JwtToken curentJwtToken = JwtUtil.getCurrentJwtToken();
// 根据appKey查询application // 根据appKey查询application
ImApplication imApplication = imApplicationService.getCacheAppByAppKey(curentJwtToken.getAppKey()); ImApplication imApplication = imApplicationService.getCacheAppByAppKey(curentJwtToken.getAppKey());
ImClient imClientSender = imClientService.getCurentClient(); ImClient imClientSender = imClientService.getCurrentClient();
// 查询该成员 // 查询该成员
ImConversationMembers imConversationMember = imConversationMembersService.getOne( ImConversationMembers imConversationMember = imConversationMembersService.getOne(
...@@ -138,11 +138,11 @@ public class ImConversationMembersServiceImpl extends BaseServiceImpl<ImConversa ...@@ -138,11 +138,11 @@ public class ImConversationMembersServiceImpl extends BaseServiceImpl<ImConversa
public ApiResult<Boolean> saveOrUpdateAttr(ImConversationMemAttrUpdate imConversationMemAttrUpdate) { public ApiResult<Boolean> saveOrUpdateAttr(ImConversationMemAttrUpdate imConversationMemAttrUpdate) {
// shiro线程中获取当前token // shiro线程中获取当前token
JwtToken curentJwtToken = JwtUtil.getCurentJwtToken(); JwtToken curentJwtToken = JwtUtil.getCurrentJwtToken();
// 根据appKey查询application // 根据appKey查询application
ImApplication imApplication = imApplicationService.getCacheAppByAppKey(curentJwtToken.getAppKey()); ImApplication imApplication = imApplicationService.getCacheAppByAppKey(curentJwtToken.getAppKey());
ImClient imClientSender = imClientService.getCurentClient(); ImClient imClientSender = imClientService.getCurrentClient();
// 查询该成员 // 查询该成员
ImConversationMembers imConversationMember = imConversationMembersService.getOne( ImConversationMembers imConversationMember = imConversationMembersService.getOne(
......
...@@ -95,7 +95,7 @@ public class ImInboxServiceImpl extends BaseServiceImpl<ImInboxMapper, ImInbox> ...@@ -95,7 +95,7 @@ public class ImInboxServiceImpl extends BaseServiceImpl<ImInboxMapper, ImInbox>
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public ApiResult<Boolean> updateImMsgReceived(ImMsgReceivedStatusUpdate imMsgReceivedUpdate) { public ApiResult<Boolean> updateImMsgReceived(ImMsgReceivedStatusUpdate imMsgReceivedUpdate) {
ImClient curentClient = imClientService.getCurentClient(); ImClient curentClient = imClientService.getCurrentClient();
// 修改已接收状态 // 修改已接收状态
Long aLong = imInboxMapper.updateImMsgReceivedByIds(curentClient.getId(), imMsgReceivedUpdate.getMsgIds()); Long aLong = imInboxMapper.updateImMsgReceivedByIds(curentClient.getId(), imMsgReceivedUpdate.getMsgIds());
...@@ -136,7 +136,7 @@ public class ImInboxServiceImpl extends BaseServiceImpl<ImInboxMapper, ImInbox> ...@@ -136,7 +136,7 @@ public class ImInboxServiceImpl extends BaseServiceImpl<ImInboxMapper, ImInbox>
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public ApiResult<Boolean> updateImMsgRead(MsgReadStatusUpdateParam msgReadStatusUpdateParam) { public ApiResult<Boolean> updateImMsgRead(MsgReadStatusUpdateParam msgReadStatusUpdateParam) {
ImClient curentClient = imClientService.getCurentClient(); ImClient curentClient = imClientService.getCurrentClient();
// 修改已读状态 // 修改已读状态
Long aLong = imInboxMapper.updateImMsgReadByIds(curentClient.getId(), msgReadStatusUpdateParam.getMsgIds()); Long aLong = imInboxMapper.updateImMsgReadByIds(curentClient.getId(), msgReadStatusUpdateParam.getMsgIds());
...@@ -155,7 +155,7 @@ public class ImInboxServiceImpl extends BaseServiceImpl<ImInboxMapper, ImInbox> ...@@ -155,7 +155,7 @@ public class ImInboxServiceImpl extends BaseServiceImpl<ImInboxMapper, ImInbox>
@Override @Override
public Boolean updateMsgReadStatusByConversation(MsgReadStatusUpdateParam msgReadStatusUpdateParam) { public Boolean updateMsgReadStatusByConversation(MsgReadStatusUpdateParam msgReadStatusUpdateParam) {
ImClient currentClient = imClientService.getCurentClient(); ImClient currentClient = imClientService.getCurrentClient();
// 获取该用户该会话所有未读消息 msgId 列表 // 获取该用户该会话所有未读消息 msgId 列表
List<ImInbox> imInboxList = this.list(new QueryWrapper<ImInbox>().lambda() List<ImInbox> imInboxList = this.list(new QueryWrapper<ImInbox>().lambda()
.eq(ImInbox::getFkConversationId, msgReadStatusUpdateParam.getConversationId()) .eq(ImInbox::getFkConversationId, msgReadStatusUpdateParam.getConversationId())
...@@ -219,6 +219,7 @@ public class ImInboxServiceImpl extends BaseServiceImpl<ImInboxMapper, ImInbox> ...@@ -219,6 +219,7 @@ public class ImInboxServiceImpl extends BaseServiceImpl<ImInboxMapper, ImInbox>
BeanUtils.copyProperties(imMessage, imMessageOnlineSend); BeanUtils.copyProperties(imMessage, imMessageOnlineSend);
imMessageOnlineSend.setType(msgTypeEnum.getUriCode()); imMessageOnlineSend.setType(msgTypeEnum.getUriCode());
imMessageOnlineSend.setMsgId(imMessage.getId()); imMessageOnlineSend.setMsgId(imMessage.getId());
imMessageOnlineSend.setCreateTime(new Date());
imMessageOnlineSend.setSender(curentClient.getClientId()); imMessageOnlineSend.setSender(curentClient.getClientId());
imMessageOnlineSend.setContent(contentMap); imMessageOnlineSend.setContent(contentMap);
imMessageOnlineSend.setConversationId(conversationMember.getFkConversationId()); imMessageOnlineSend.setConversationId(conversationMember.getFkConversationId());
......
...@@ -16,6 +16,7 @@ import com.wecloud.im.entity.ImMessage; ...@@ -16,6 +16,7 @@ import com.wecloud.im.entity.ImMessage;
import com.wecloud.im.entity.ImMessageOnlineSend; import com.wecloud.im.entity.ImMessageOnlineSend;
import com.wecloud.im.enums.ChatTypeEnum; import com.wecloud.im.enums.ChatTypeEnum;
import com.wecloud.im.mapper.ImMessageMapper; import com.wecloud.im.mapper.ImMessageMapper;
import com.wecloud.im.mq.MqSender;
import com.wecloud.im.param.ChatContentVo; import com.wecloud.im.param.ChatContentVo;
import com.wecloud.im.param.GetReadersParam; import com.wecloud.im.param.GetReadersParam;
import com.wecloud.im.param.ImClientSimpleDto; import com.wecloud.im.param.ImClientSimpleDto;
...@@ -40,8 +41,9 @@ import com.wecloud.im.ws.model.WsResponse; ...@@ -40,8 +41,9 @@ import com.wecloud.im.ws.model.WsResponse;
import com.wecloud.im.ws.model.request.PushVO; import com.wecloud.im.ws.model.request.PushVO;
import com.wecloud.im.ws.model.request.ReceiveDataVO; import com.wecloud.im.ws.model.request.ReceiveDataVO;
import com.wecloud.im.ws.model.request.ReceiveVO; import com.wecloud.im.ws.model.request.ReceiveVO;
import com.wecloud.im.ws.sender.AsyncPush;
import com.wecloud.im.ws.sender.ChannelSender; import com.wecloud.im.ws.sender.ChannelSender;
import com.wecloud.pushserver.client.model.constant.MqConstant;
import com.wecloud.pushserver.client.model.dto.PushDTO;
import com.wecloud.utils.JsonUtils; import com.wecloud.utils.JsonUtils;
import io.geekidea.springbootplus.framework.common.api.ApiCode; import io.geekidea.springbootplus.framework.common.api.ApiCode;
import io.geekidea.springbootplus.framework.common.api.ApiResult; import io.geekidea.springbootplus.framework.common.api.ApiResult;
...@@ -58,7 +60,6 @@ import org.springframework.transaction.annotation.Transactional; ...@@ -58,7 +60,6 @@ import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
...@@ -82,9 +83,6 @@ public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMes ...@@ -82,9 +83,6 @@ public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMes
private ImConversationService imConversationService; private ImConversationService imConversationService;
@Autowired @Autowired
private AsyncPush asyncPush;
@Autowired
private ImApplicationService imApplicationService; private ImApplicationService imApplicationService;
...@@ -97,6 +95,9 @@ public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMes ...@@ -97,6 +95,9 @@ public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMes
@Autowired @Autowired
private ThousandChatService thousandChatService; private ThousandChatService thousandChatService;
@Autowired
private MqSender mqSender;
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public ApiResult<Boolean> restApiImMessageSend(ImMsgSendToOnlineClient imMsgSendToOnlineClient, ImApplication imApplication) { public ApiResult<Boolean> restApiImMessageSend(ImMsgSendToOnlineClient imMsgSendToOnlineClient, ImApplication imApplication) {
...@@ -208,7 +209,7 @@ public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMes ...@@ -208,7 +209,7 @@ public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMes
imClientSender = imClientService.getCacheImClient(request.getSenderClientId()); imClientSender = imClientService.getCacheImClient(request.getSenderClientId());
imApplication = imApplicationService.getCacheById(imClientSender.getFkAppid()); imApplication = imApplicationService.getCacheById(imClientSender.getFkAppid());
} else { } else {
imClientSender = imClientService.getCurentClient(); imClientSender = imClientService.getCurrentClient();
// 查询imApplication // 查询imApplication
imApplication = imApplicationService.getCacheById(imClientSender.getFkAppid()); imApplication = imApplicationService.getCacheById(imClientSender.getFkAppid());
} }
...@@ -278,6 +279,7 @@ public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMes ...@@ -278,6 +279,7 @@ public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMes
BeanUtils.copyProperties(messageById, imMessageOnlineSend); BeanUtils.copyProperties(messageById, imMessageOnlineSend);
imMessageOnlineSend.setType(MsgTypeEnum.MSG_WITHDRAW.getUriCode()); imMessageOnlineSend.setType(MsgTypeEnum.MSG_WITHDRAW.getUriCode());
imMessageOnlineSend.setMsgId(messageById.getId()); imMessageOnlineSend.setMsgId(messageById.getId());
imMessageOnlineSend.setCreateTime(new Date());
imMessageOnlineSend.setSender(imClientSender.getClientId()); imMessageOnlineSend.setSender(imClientSender.getClientId());
Map<String, Object> contentMap = Maps.newHashMap(); Map<String, Object> contentMap = Maps.newHashMap();
contentMap.put("msgOwner", msgOwner.getClientId()); contentMap.put("msgOwner", msgOwner.getClientId());
...@@ -296,11 +298,11 @@ public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMes ...@@ -296,11 +298,11 @@ public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMes
responseModel.setReqId(null); responseModel.setReqId(null);
channelSender.sendMsg(responseModel, imClientReceiver.getId()); channelSender.sendMsg(responseModel, imClientReceiver.getId());
// 获取自定义推送字段
PushVO pushVO = imMsgRecall.getPush();
// 异步推送系统通知消息 // 异步推送系统通知消息
asyncPush.push(pushVO, imClientReceiver, imApplication); PushDTO pushDTO = mqSender.buildPushDto(imMsgRecall.getPush(), imClientReceiver, imApplication);
if (pushDTO != null) {
mqSender.orderSend(MqConstant.Topic.IM_ORDER_MSG_TOPIC, MqConstant.Tag.IM_ORDER_MSG_TAG, pushDTO);
}
} }
return Boolean.TRUE; return Boolean.TRUE;
...@@ -318,7 +320,7 @@ public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMes ...@@ -318,7 +320,7 @@ public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMes
imClientSender = imClientService.getCacheImClient(request.getSenderClientId()); imClientSender = imClientService.getCacheImClient(request.getSenderClientId());
imApplication = imApplicationService.getCacheById(imClientSender.getFkAppid()); imApplication = imApplicationService.getCacheById(imClientSender.getFkAppid());
} else { } else {
imClientSender = imClientService.getCurentClient(); imClientSender = imClientService.getCurrentClient();
// 查询imApplication // 查询imApplication
imApplication = imApplicationService.getCacheById(imClientSender.getFkAppid()); imApplication = imApplicationService.getCacheById(imClientSender.getFkAppid());
} }
...@@ -389,6 +391,7 @@ public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMes ...@@ -389,6 +391,7 @@ public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMes
BeanUtils.copyProperties(message, imMessageOnlineSend); BeanUtils.copyProperties(message, imMessageOnlineSend);
imMessageOnlineSend.setType(MsgTypeEnum.MSG_DELETE.getUriCode()); imMessageOnlineSend.setType(MsgTypeEnum.MSG_DELETE.getUriCode());
imMessageOnlineSend.setMsgId(message.getId()); imMessageOnlineSend.setMsgId(message.getId());
imMessageOnlineSend.setCreateTime(new Date());
imMessageOnlineSend.setSender(imClientSender.getClientId()); imMessageOnlineSend.setSender(imClientSender.getClientId());
Map<String, Object> contentMap = Maps.newHashMap(); Map<String, Object> contentMap = Maps.newHashMap();
contentMap.put("msgOwner", msgOwner.getClientId()); contentMap.put("msgOwner", msgOwner.getClientId());
...@@ -459,7 +462,7 @@ public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMes ...@@ -459,7 +462,7 @@ public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMes
if (request != null) { if (request != null) {
imClientSender = imClientService.getCacheImClient(request.getSenderClientId()); imClientSender = imClientService.getCacheImClient(request.getSenderClientId());
} else { } else {
imClientSender = imClientService.getCurentClient(); imClientSender = imClientService.getCurrentClient();
} }
if (imClientSender == null) { if (imClientSender == null) {
throw new BusinessException("查无发送用户信息"); throw new BusinessException("查无发送用户信息");
...@@ -484,10 +487,11 @@ public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMes ...@@ -484,10 +487,11 @@ public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMes
} }
@Override @Override
public Paging<OfflineMsgDto> getHistoryMsgConversationId(ImHistoryMessagePageParam imHistoryMessagePageParam) { public Paging<OfflineMsgDto> getHistoryMsgConversationId(ImHistoryMessagePageParam param) {
Page<ImMessage> page = new PageInfo<>(imHistoryMessagePageParam, OrderItem.desc(getLambdaColumn(ImMessage::getCreateTime))); Page<ImMessage> page = new PageInfo<>(param, OrderItem.desc(getLambdaColumn(ImMessage::getCreateTime)));
ImClient currentClient = imClientService.getCurrentClient();
IPage<OfflineMsgDto> iPage = imMessageMapper.getHistoryMsgConversationId(page, imHistoryMessagePageParam); param.setCurrentFkClientId(currentClient.getId());
IPage<OfflineMsgDto> iPage = imMessageMapper.getHistoryMsgConversationId(page, param);
return new Paging<>(iPage); return new Paging<>(iPage);
} }
...@@ -505,7 +509,7 @@ public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMes ...@@ -505,7 +509,7 @@ public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMes
// 返回数据 // 返回数据
List<ImMessageOfflineListVo> imMessageOfflineListVoList = new ArrayList<>(); List<ImMessageOfflineListVo> imMessageOfflineListVoList = new ArrayList<>();
ImClient client = imClientService.getCurentClient(); ImClient client = imClientService.getCurrentClient();
// 获取加入的所有会话 // 获取加入的所有会话
List<ImConversation> myImConversationList = imConversationService.getMyImConversationList(); List<ImConversation> myImConversationList = imConversationService.getMyImConversationList();
......
...@@ -9,6 +9,7 @@ import com.wecloud.im.entity.ImClient; ...@@ -9,6 +9,7 @@ import com.wecloud.im.entity.ImClient;
import com.wecloud.im.entity.ImConversationMembers; import com.wecloud.im.entity.ImConversationMembers;
import com.wecloud.im.entity.ImMessage; import com.wecloud.im.entity.ImMessage;
import com.wecloud.im.entity.ImMessageOnlineSend; import com.wecloud.im.entity.ImMessageOnlineSend;
import com.wecloud.im.mq.MqSender;
import com.wecloud.im.param.ChatContentVo; import com.wecloud.im.param.ChatContentVo;
import com.wecloud.im.param.ImClientSimpleDto; import com.wecloud.im.param.ImClientSimpleDto;
import com.wecloud.im.param.ImConversationQueryVo; import com.wecloud.im.param.ImConversationQueryVo;
...@@ -21,8 +22,9 @@ import com.wecloud.im.service.ImMessageService; ...@@ -21,8 +22,9 @@ import com.wecloud.im.service.ImMessageService;
import com.wecloud.im.thousandchat.cache.ThousandChatCacheManager; import com.wecloud.im.thousandchat.cache.ThousandChatCacheManager;
import com.wecloud.im.ws.enums.WsResponseCmdEnum; import com.wecloud.im.ws.enums.WsResponseCmdEnum;
import com.wecloud.im.ws.model.WsResponse; import com.wecloud.im.ws.model.WsResponse;
import com.wecloud.im.ws.sender.AsyncPush;
import com.wecloud.im.ws.sender.ChannelSender; import com.wecloud.im.ws.sender.ChannelSender;
import com.wecloud.pushserver.client.model.constant.MqConstant;
import com.wecloud.pushserver.client.model.dto.PushDTO;
import com.wecloud.utils.JsonUtils; import com.wecloud.utils.JsonUtils;
import com.wecloud.utils.SnowflakeUtil; import com.wecloud.utils.SnowflakeUtil;
import io.geekidea.springbootplus.framework.common.api.ApiCode; import io.geekidea.springbootplus.framework.common.api.ApiCode;
...@@ -54,8 +56,6 @@ public class ThousandChatAction { ...@@ -54,8 +56,6 @@ public class ThousandChatAction {
@Autowired @Autowired
private ImConversationService imConversationService; private ImConversationService imConversationService;
@Autowired @Autowired
private AsyncPush systemPush;
@Autowired
private ImConversationMembersService imConversationMembersService; private ImConversationMembersService imConversationMembersService;
@Autowired @Autowired
private ImMessageService imMessageService; private ImMessageService imMessageService;
...@@ -64,6 +64,9 @@ public class ThousandChatAction { ...@@ -64,6 +64,9 @@ public class ThousandChatAction {
@Autowired @Autowired
private ThousandChatCacheManager thousandChatCacheManager; private ThousandChatCacheManager thousandChatCacheManager;
@Autowired
private MqSender mqSender;
@ActionMapping("/thousand/send") @ActionMapping("/thousand/send")
public void sendMsg(ActionRequest request, ChatContentVo data, String reqId) { public void sendMsg(ActionRequest request, ChatContentVo data, String reqId) {
if (log.isDebugEnabled()) { if (log.isDebugEnabled()) {
...@@ -117,7 +120,10 @@ public class ThousandChatAction { ...@@ -117,7 +120,10 @@ public class ThousandChatAction {
continue; continue;
} }
// 异步推送系统通知消息 // 异步推送系统通知消息
systemPush.push(data.getPush(), imClientReceiver, imApplication); PushDTO pushDTO = mqSender.buildPushDto(data.getPush(), imClientReceiver, imApplication);
if (pushDTO != null) {
mqSender.orderSend(MqConstant.Topic.IM_ORDER_MSG_TOPIC, MqConstant.Tag.IM_ORDER_MSG_TAG, pushDTO);
}
} }
// 响应发送方消息id等信息 // 响应发送方消息id等信息
......
...@@ -11,8 +11,4 @@ import lombok.Data; ...@@ -11,8 +11,4 @@ import lombok.Data;
@Data @Data
public class ThousandOffineMsgDto extends OfflineMsgDto { public class ThousandOffineMsgDto extends OfflineMsgDto {
/**
* 会话id
*/
private Long conversationId;
} }
...@@ -65,7 +65,7 @@ public class ThousandChatService extends BaseServiceImpl<ImMsgReadLastestMapper, ...@@ -65,7 +65,7 @@ public class ThousandChatService extends BaseServiceImpl<ImMsgReadLastestMapper,
* @return * @return
*/ */
public ApiResult<Boolean> updateImMsgReceived(LastestReceivedMsg lastestReceivedMsg) { public ApiResult<Boolean> updateImMsgReceived(LastestReceivedMsg lastestReceivedMsg) {
ImClient curentClient = imClientService.getCurentClient(); ImClient curentClient = imClientService.getCurrentClient();
ImMessage lastestMsg = imMessageService.getById(lastestReceivedMsg.getLastestMsgId()); ImMessage lastestMsg = imMessageService.getById(lastestReceivedMsg.getLastestMsgId());
...@@ -105,7 +105,7 @@ public class ThousandChatService extends BaseServiceImpl<ImMsgReadLastestMapper, ...@@ -105,7 +105,7 @@ public class ThousandChatService extends BaseServiceImpl<ImMsgReadLastestMapper,
* @return * @return
*/ */
public ApiResult<Boolean> updateImMsgRead(Long lastestMsgId) { public ApiResult<Boolean> updateImMsgRead(Long lastestMsgId) {
ImClient curentClient = imClientService.getCurentClient(); ImClient curentClient = imClientService.getCurrentClient();
ImMessage lastestMsg = imMessageService.getById(lastestMsgId); ImMessage lastestMsg = imMessageService.getById(lastestMsgId);
...@@ -139,7 +139,7 @@ public class ThousandChatService extends BaseServiceImpl<ImMsgReadLastestMapper, ...@@ -139,7 +139,7 @@ public class ThousandChatService extends BaseServiceImpl<ImMsgReadLastestMapper,
return new ArrayList<>(); return new ArrayList<>();
} }
ImClient curentClient = imClientService.getCurentClient(); ImClient curentClient = imClientService.getCurrentClient();
List<ConversationLastestReadMsg> lastestReadMsgs = imMsgReadLastestMapper.findLastestReadMsgs(curentClient.getId()); List<ConversationLastestReadMsg> lastestReadMsgs = imMsgReadLastestMapper.findLastestReadMsgs(curentClient.getId());
Map<Long, ConversationLastestReadMsg> conversationMsgMap = lastestReadMsgs.stream().collect(Collectors.toMap(ConversationLastestReadMsg::getConversationId, v->v,(a,b)->a)); Map<Long, ConversationLastestReadMsg> conversationMsgMap = lastestReadMsgs.stream().collect(Collectors.toMap(ConversationLastestReadMsg::getConversationId, v->v,(a,b)->a));
......
...@@ -19,14 +19,19 @@ public class ConversationMemberVo implements Serializable { ...@@ -19,14 +19,19 @@ public class ConversationMemberVo implements Serializable {
@ApiModelProperty("会话中client的备注名") @ApiModelProperty("会话中client的备注名")
private String clientRemarkName; private String clientRemarkName;
@ApiModelProperty("头像") @ApiModelProperty("头像")
private String headPortrait; private String headPortrait;
@ApiModelProperty("主昵称") @ApiModelProperty("主昵称")
private String nickname; private String nickname;
@ApiModelProperty("clientId") @ApiModelProperty("clientId")
private String clientId; private String clientId;
@ApiModelProperty("client自己的自定义扩展属性") @ApiModelProperty("client自己的自定义扩展属性")
private String clientAttributes; private String clientAttributes;
@ApiModelProperty("会话成员列表的自定义扩展属性") @ApiModelProperty("会话成员列表的自定义扩展属性")
private String memberAttributes; private String memberAttributes;
......
...@@ -9,13 +9,20 @@ import java.io.Serializable; ...@@ -9,13 +9,20 @@ import java.io.Serializable;
import java.util.Date; import java.util.Date;
/** /**
* 离线消息内容实体 * @Author wenzhida
* @Date 2022/3/3 11:19
* @Description 离线消息内容实体
*/ */
@Data @Data
@Accessors(chain = true) @Accessors(chain = true)
@ApiModel(value = "OfflineMsgDto") @ApiModel(value = "OfflineMsgDto")
public class OfflineMsgDto implements Serializable { public class OfflineMsgDto implements Serializable {
private static final long serialVersionUID = -7073389493201687249L;
@ApiModelProperty("会话id")
private Long conversationId;
@ApiModelProperty("消息类型") @ApiModelProperty("消息类型")
private Integer type; private Integer type;
......
...@@ -46,12 +46,12 @@ public class ImConstant implements Serializable { ...@@ -46,12 +46,12 @@ public class ImConstant implements Serializable {
/** /**
* 您收到一条新消息 * 您收到一条新消息
*/ */
public static final String PUSH_TITLE = "You have received a new message"; public static final String PUSH_TITLE = "您收到一条新消息";
/** /**
* 点击查看 * 点击查看
*/ */
public static final String PUSH_BODY = "Click to view"; public static final String PUSH_BODY = "点击查看";
/** /**
* 会话id的key名 * 会话id的key名
......
...@@ -60,10 +60,10 @@ public class UserStateCacheManager extends UserStateListener { ...@@ -60,10 +60,10 @@ public class UserStateCacheManager extends UserStateListener {
public List<ClientChannelInfo> findOnlineInfosByClientId(Long clientId) { public List<ClientChannelInfo> findOnlineInfosByClientId(Long clientId) {
// 获取所有 CLIENTS的 <platform>:<ip> // 获取所有 CLIENTS的 <platform>:<ip>
Set<String> platformAndIs = redisUtils.getForSetMembers(getUserStateCacheKey(clientId)); Set<String> platformAndIps = redisUtils.getForSetMembers(getUserStateCacheKey(clientId));
ArrayList<ClientChannelInfo> clientChannelInfos = new ArrayList<>(); ArrayList<ClientChannelInfo> clientChannelInfos = new ArrayList<>();
for(String platformAndIp : platformAndIs) { for(String platformAndIp : platformAndIps) {
String[] split = platformAndIp.split(RedisUtils.SPLIT); String[] split = platformAndIp.split(RedisUtils.SPLIT);
ClientChannelInfo clientChannelInfo = new ClientChannelInfo(); ClientChannelInfo clientChannelInfo = new ClientChannelInfo();
clientChannelInfo.setPlatform(Integer.valueOf(split[0])); clientChannelInfo.setPlatform(Integer.valueOf(split[0]));
......
...@@ -29,6 +29,13 @@ public enum MsgTypeEnum { ...@@ -29,6 +29,13 @@ public enum MsgTypeEnum {
// 成为新群主 -1013 // 成为新群主 -1013
CONVERSATION_NEW_CREATOR(-1013), CONVERSATION_NEW_CREATOR(-1013),
// 群拓展字段变动事件 -1014
CONVERSATION_EXPAND_FIELD_CHANGE(-1014),
// 会话名称字段变动事件 -1015
CONVERSATION_NAME_CHANGE(-1015),
// 消息撤回 -1016 // 消息撤回 -1016
MSG_WITHDRAW(-1016), MSG_WITHDRAW(-1016),
......
package com.wecloud.im.ws.sender;
import cn.hutool.core.codec.Base64;
import com.turo.pushy.apns.DeliveryPriority;
import com.turo.pushy.apns.PushType;
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.PushVO;
import lombok.extern.slf4j.Slf4j;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import static com.wecloud.im.ws.ImConstant.PUSH_BODY;
import static com.wecloud.im.ws.ImConstant.PUSH_TITLE;
import static com.wecloud.im.ws.ImConstant.SUB_TITLE;
import static com.wecloud.im.ws.ImConstant.TITLE;
/**
* 异步系统推送
*/
@Component
@Slf4j
public class AsyncPush {
/**
* 谷歌推送地址
*/
private static final String API_URL_FCM = "https://fcm.googleapis.com/fcm/send";
// /**
// * 您收到一条新消息
// */
// private static final String PUSH_TITLE = "You have received a new message";
// /**
// * 点击查看
// */
// private static final String PUSH_BODY = "Click to view";
// private static final String TITLE = "title";
// private static final String SUB_TITLE = "subTitle";
@Autowired
private ImIosApnsService imIosApnsService;
@Autowired
private ImInboxService imInboxService;
/**
* 异步系统推送
*
* @param imClientReceiver
*/
@Async
public void push(PushVO pushVO, ImClient imClientReceiver, ImApplication imApplication) {
log.info("push: {}", imClientReceiver.getClientId());
if (pushVO == null) {
pushVO = new PushVO();
pushVO.setTitle(PUSH_TITLE);
pushVO.setSubTitle(PUSH_BODY);
}
// 校验参数
if (imClientReceiver.getValid() == null || imClientReceiver.getDeviceToken() == null || imClientReceiver.getDeviceType() == null) {
log.info("{} 应用未配置push,或client无DeviceToken {}", imApplication.getId(), imClientReceiver.getClientId());
return;
}
// 设备不想收到推送提醒, 1想, 0不想
if (imClientReceiver.getValid() == 0) {
return;
}
// 设备类型1:ios; 2:android
if (imClientReceiver.getDeviceType() == 1) {
ios(pushVO, imClientReceiver, imApplication);
} else {
android(pushVO, imClientReceiver, imApplication);
}
}
/**
* 异步系统推送
*
* @param imClientReceiver
*/
@Async
public void push(HashMap<String, String> pushMap, ImClient imClientReceiver, ImApplication imApplication) {
log.info("push:" + imClientReceiver.getClientId());
PushVO pushVO = new PushVO();
if (pushMap == null || pushMap.isEmpty()) {
pushVO.setTitle(PUSH_TITLE);
pushVO.setSubTitle(PUSH_BODY);
} else {
pushVO.setTitle(pushMap.get(TITLE));
pushVO.setSubTitle(pushMap.get(SUB_TITLE));
}
this.push(pushVO, imClientReceiver, imApplication);
}
private void android(PushVO pushVO, ImClient imClientReceiver, ImApplication imApplication) {
if (imApplication.getAndroidPushChannel() == null) {
return;
}
// 安卓推送通道,友盟:1;firebase:2; 信鸽3
if (imApplication.getAndroidPushChannel() == 1) {
log.info("友盟");
// 友盟推送
PushUtils pushUtils = new PushUtils(imApplication.getUmengKey(), imApplication.getUmengSecret());
// 安卓 单推
String deviceToken = imClientReceiver.getDeviceToken();
try {
pushUtils.sendIOSUnicast(deviceToken, pushVO.getTitle(), pushVO.getSubTitle(), PUSH_BODY);
} catch (Exception e) {
e.printStackTrace();
}
} else if (imApplication.getAndroidPushChannel() == 2) {
//firebase:2
log.info("android_firebase");
firebase(pushVO, imClientReceiver, imApplication);
} else if (imApplication.getAndroidPushChannel() == 3) {
// 信鸽3
log.info("信鸽3");
} else {
log.info("没有找到推送类型");
}
}
private void ios(PushVO pushVO, ImClient imClientReceiver, ImApplication imApplication) {
if (imApplication.getIosPushChannel() == null) {
return;
}
// ios推送通道,友盟:1;firebase:2; apns原生:3
if (imApplication.getIosPushChannel() == 1) {
log.info("友盟");
// 友盟推送
PushUtils pushUtils = new PushUtils(imApplication.getUmengKey(), imApplication.getUmengSecret());
// 安卓单推
String deviceToken = imClientReceiver.getDeviceToken();
String unicastText = "Android unicast text";
String unicastTicker = pushVO.getSubTitle();
try {
pushUtils.sendAndroidUnicast(deviceToken, unicastText, unicastTicker, pushVO.getTitle());
} catch (Exception e) {
e.printStackTrace();
}
} else if (imApplication.getIosPushChannel() == 2) {
//firebase:2
log.info("firebase");
firebase(pushVO, imClientReceiver, imApplication);
} else if (imApplication.getIosPushChannel() == 3) {
// apns原生:3
log.info("apns原生");
apnsPush(pushVO, imClientReceiver, imApplication);
} else {
log.info("没有找到推送类型");
}
}
public void firebase(PushVO pushVO, ImClient imClientReceiver, ImApplication imApplication) {
String jsonStr = null;
try {
URL url = new URL(API_URL_FCM);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setUseCaches(false);
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setConnectTimeout(10000);
conn.setRequestMethod("POST");
//不设置默认发送文本格式。设置就是json
conn.setRequestProperty("Content-Type", "application/json");
conn.setRequestProperty("Authorization", "key=" + imApplication.getFirebaseSecret());
JSONObject json = new JSONObject();
//推送到哪台客户端机器
json.put("to", imClientReceiver.getDeviceToken());
JSONObject info = new JSONObject();
info.put("title", pushVO.getTitle());
info.put("body", pushVO.getSubTitle());
//数据消息data 通知消息 notification
json.put("notification", info);
OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
jsonStr = json.toString();
wr.write(jsonStr);
wr.flush();
InputStream inputStream = conn.getInputStream();
InputStreamReader in = new InputStreamReader(inputStream);
BufferedReader reader = new BufferedReader(in);
String line = reader.readLine();
log.info(line);
wr.close();
reader.close();
} catch (Exception e) {
log.error("FCM push failure: " + jsonStr, e);
}
}
private void apnsPush(PushVO pushVO, ImClient imClientReceiver, ImApplication imApplication) {
// 查询apns证书
ImIosApns apns = imIosApnsService.getImIosApnsByAppId(imApplication.getId());
Map<String, Object> customProperty = new HashMap<String, Object>(1);
String deviceToken = imClientReceiver.getDeviceToken();
String alertTitle = pushVO.getTitle();
String alertBody = pushVO.getSubTitle();
// 统计未读消息数量
int badge = imInboxService.countMyNotReadCount(imClientReceiver.getId());
String topicBundleId = apns.getBundleId();
String certificatePassword = apns.getPwd();
boolean contentAvailable = false;
String sound = "default";
// 解码
byte[] decode = Base64.decode(apns.getApnsFileValue());
InputStream inputStream2 = new ByteArrayInputStream(decode);
// productFlag 环境,测试=Boolean.FALSE,正式=Boolean.TRUE
Boolean productFlag = Boolean.FALSE;
// 正式1,测试0
if (apns.getEnv() == 1) {
productFlag = Boolean.TRUE;
}
IosPush.push(certificatePassword, inputStream2, productFlag, deviceToken, alertTitle, alertBody,
contentAvailable, customProperty, badge
, DeliveryPriority.IMMEDIATE, PushType.ALERT, topicBundleId,
sound);
}
}
...@@ -78,7 +78,7 @@ public class RtcServiceImpl extends UserStateListener implements RtcService { ...@@ -78,7 +78,7 @@ public class RtcServiceImpl extends UserStateListener implements RtcService {
@Override @Override
public ApiResult<CreateRtcChannelResult> createAndCall(CreateRtcChannelParam createRtcChannelParam) throws JsonProcessingException { public ApiResult<CreateRtcChannelResult> createAndCall(CreateRtcChannelParam createRtcChannelParam) throws JsonProcessingException {
ImClient currentClient = imClientService.getCurentClient(); ImClient currentClient = imClientService.getCurrentClient();
Long rtcChannelId = SnowflakeUtil.getId(); Long rtcChannelId = SnowflakeUtil.getId();
// 判断发起方必须在线 // 判断发起方必须在线
boolean onlineStatus = userStateCacheManager.isOnline(currentClient.getId()); boolean onlineStatus = userStateCacheManager.isOnline(currentClient.getId());
...@@ -116,7 +116,7 @@ public class RtcServiceImpl extends UserStateListener implements RtcService { ...@@ -116,7 +116,7 @@ public class RtcServiceImpl extends UserStateListener implements RtcService {
@Override @Override
public ApiResult<Boolean> join(JoinRtcChannelParam joinRtcChannelParam) { public ApiResult<Boolean> join(JoinRtcChannelParam joinRtcChannelParam) {
ImClient client = imClientService.getCurentClient(); ImClient client = imClientService.getCurrentClient();
// 修改缓存 // 修改缓存
mangerRtcCacheService.join(client.getId(), joinRtcChannelParam.getChannelId()); mangerRtcCacheService.join(client.getId(), joinRtcChannelParam.getChannelId());
...@@ -142,7 +142,7 @@ public class RtcServiceImpl extends UserStateListener implements RtcService { ...@@ -142,7 +142,7 @@ public class RtcServiceImpl extends UserStateListener implements RtcService {
@Override @Override
public ApiResult<Boolean> reject(RejectRtcChannelParam rejectRtcChannelParam) { public ApiResult<Boolean> reject(RejectRtcChannelParam rejectRtcChannelParam) {
ImClient client = imClientService.getCurentClient(); ImClient client = imClientService.getCurrentClient();
// 修改缓存 // 修改缓存
mangerRtcCacheService.leave(client.getId(), rejectRtcChannelParam.getChannelId()); mangerRtcCacheService.leave(client.getId(), rejectRtcChannelParam.getChannelId());
//获取频道内所有client //获取频道内所有client
...@@ -172,7 +172,7 @@ public class RtcServiceImpl extends UserStateListener implements RtcService { ...@@ -172,7 +172,7 @@ public class RtcServiceImpl extends UserStateListener implements RtcService {
@Override @Override
public ApiResult<Boolean> leave(LeaveRtcChannelParam leaveRtcChannelParam) { public ApiResult<Boolean> leave(LeaveRtcChannelParam leaveRtcChannelParam) {
ImClient currentClient = imClientService.getCurentClient(); ImClient currentClient = imClientService.getCurrentClient();
this.leave(leaveRtcChannelParam, currentClient); this.leave(leaveRtcChannelParam, currentClient);
return ApiResult.ok(true); return ApiResult.ok(true);
...@@ -209,7 +209,7 @@ public class RtcServiceImpl extends UserStateListener implements RtcService { ...@@ -209,7 +209,7 @@ public class RtcServiceImpl extends UserStateListener implements RtcService {
@Override @Override
public ApiResult<Boolean> sdpForward(SdpForwardParam sdpForwardParam) { public ApiResult<Boolean> sdpForward(SdpForwardParam sdpForwardParam) {
ImClient client = imClientService.getCurentClient(); ImClient client = imClientService.getCurrentClient();
Long rtcChannelId = SnowflakeUtil.getId(); Long rtcChannelId = SnowflakeUtil.getId();
// 根据appKey查询appid // 根据appKey查询appid
...@@ -250,7 +250,7 @@ public class RtcServiceImpl extends UserStateListener implements RtcService { ...@@ -250,7 +250,7 @@ public class RtcServiceImpl extends UserStateListener implements RtcService {
@Override @Override
public ApiResult<Boolean> candidateForward(CandidateForwardParam candidateForwardParam) { public ApiResult<Boolean> candidateForward(CandidateForwardParam candidateForwardParam) {
ImClient client = imClientService.getCurentClient(); ImClient client = imClientService.getCurrentClient();
Long rtcChannelId = SnowflakeUtil.getId(); Long rtcChannelId = SnowflakeUtil.getId();
// 根据appKey查询appid // 根据appKey查询appid
......
package com.wecloud.utils; package com.wecloud.utils;
import cn.hutool.core.lang.Snowflake; import cn.hutool.core.lang.Snowflake;
import com.wecloud.im.ws.utils.RedisUtils; import org.apache.commons.lang3.RandomUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.SystemUtils;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct; import java.net.Inet4Address;
import java.net.UnknownHostException;
/** /**
* 雪花算法 获取id工具类 * 雪花算法 获取id工具类
...@@ -15,14 +17,11 @@ import javax.annotation.PostConstruct; ...@@ -15,14 +17,11 @@ import javax.annotation.PostConstruct;
@Component @Component
public class SnowflakeUtil { public class SnowflakeUtil {
private static SnowflakeUtil snowflakeUtil;
/** /**
* workerId, dataCenterId动态获取 * workerId, dataCenterId动态获取
* 12位序列号部分,支持同一毫秒内同一个节点可以生成4096个ID, 在目前一段不用做成动态获取服务器ID * 12位序列号部分,支持同一毫秒内同一个节点可以生成4096个ID, 在目前一段不用做成动态获取服务器ID
*/ */
private static volatile Snowflake SNOWFLAKE = null; private static volatile Snowflake SNOWFLAKE = null;
@Autowired
private RedisUtils redisUtils;
/** /**
* 多线程中加synchronized 保证不会获取重复id * 多线程中加synchronized 保证不会获取重复id
...@@ -34,12 +33,7 @@ public class SnowflakeUtil { ...@@ -34,12 +33,7 @@ public class SnowflakeUtil {
if (SNOWFLAKE == null) { if (SNOWFLAKE == null) {
synchronized (SnowflakeUtil.class) { synchronized (SnowflakeUtil.class) {
if (SNOWFLAKE == null) { if (SNOWFLAKE == null) {
// workerId通过redis获取 SNOWFLAKE = new Snowflake(SnowflakeUtil.getWorkId(), 1L);
long workerId = snowflakeUtil.redisUtils.incr("workerId", 1);
// redisUtils不需要用了,释放回收掉
snowflakeUtil.redisUtils = null;
SNOWFLAKE = new Snowflake(workerId, 1L);
} }
} }
} }
...@@ -47,11 +41,22 @@ public class SnowflakeUtil { ...@@ -47,11 +41,22 @@ public class SnowflakeUtil {
} }
/** /**
* 静态方法里调用spring注入的方法 * workId通过本机ip计算获得
* @return
*/ */
@PostConstruct private static Long getWorkId(){
public void init() { try {
snowflakeUtil = this; String hostAddress = Inet4Address.getLocalHost().getHostAddress();
snowflakeUtil.redisUtils = this.redisUtils; int[] ints = StringUtils.toCodePoints(hostAddress);
int sums = 0;
for(int b : ints){
sums += b;
}
return (long)(sums % 32);
} catch (UnknownHostException e) {
// 如果获取失败,则使用随机数备用
return RandomUtils.nextLong(0,31);
}
} }
} }
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.wecloud.im.mapper.ImClientDeviceMapper">
<update id="removeOldToken">
UPDATE im_client_device
SET device_token = NULL
WHERE device_token = #{deviceToken}
AND fk_appid = #{appId}
</update>
</mapper>
...@@ -5,14 +5,8 @@ ...@@ -5,14 +5,8 @@
<!-- 通用查询结果列 --> <!-- 通用查询结果列 -->
<sql id="Base_Column_List"> <sql id="Base_Column_List">
id id
, create_time, update_time, fk_appid, attributes,client_id,device_type,valid,device_token,head_portrait,nickname , create_time, update_time, fk_appid, attributes,client_id,head_portrait,nickname
</sql> </sql>
<update id="removeOldToken">
UPDATE im_client
SET device_token = NULL
WHERE device_token = #{deviceToken}
AND fk_appid = #{appId}
</update>
<select id="getImClientPageList" parameterType="com.wecloud.im.param.ImClientPageParam" <select id="getImClientPageList" parameterType="com.wecloud.im.param.ImClientPageParam"
resultType="com.wecloud.im.param.ImClientQueryVo"> resultType="com.wecloud.im.param.ImClientQueryVo">
...@@ -20,6 +14,7 @@ ...@@ -20,6 +14,7 @@
<include refid="Base_Column_List"/> <include refid="Base_Column_List"/>
from im_client from im_client
</select> </select>
<select id="getInfoList" resultType="com.wecloud.im.vo.GetInfoListVo"> <select id="getInfoList" resultType="com.wecloud.im.vo.GetInfoListVo">
SELECT SELECT
......
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
<select id="getApplyFriendPageList" resultType="com.wecloud.im.friend.param.ImFriendApplyDto"> <select id="getApplyFriendPageList" resultType="com.wecloud.im.friend.param.ImFriendApplyDto">
select select
friend.id, client.client_id as friendClientId, friend.friend_name, claimer.client_id as claimerClientId, friend.id, client.client_id as friendClientId, friend.friend_name as friendName, claimer.client_id as claimerClientId,
friend.reject_remark, friend.request_remark, friend.state, friend.create_time friend.reject_remark, friend.request_remark, friend.state, friend.create_time
from im_friend friend inner join im_client client on friend.client_id_friend = client.client_id from im_friend friend inner join im_client client on friend.client_id_friend = client.client_id
inner join im_client claimer on friend.client_id_claimer = claimer.client_id inner join im_client claimer on friend.client_id_claimer = claimer.client_id
......
...@@ -63,7 +63,8 @@ ...@@ -63,7 +63,8 @@
im_message.system_flag, im_message.system_flag,
im_message.`at`, im_message.`at`,
im_message.send_status, im_message.send_status,
im_message.`msg_type` AS 'type', im_message.fk_conversation_id, im_message.`msg_type` AS 'type',
im_message.fk_conversation_id as conversationId,
(SELECT COUNT(id) FROM im_inbox WHERE fk_msg_id = msgId AND read_msg_status = 0) AS not_read_count, (SELECT COUNT(id) FROM im_inbox WHERE fk_msg_id = msgId AND read_msg_status = 0) AS not_read_count,
(SELECT COUNT(id) (SELECT COUNT(id)
FROM im_inbox FROM im_inbox
...@@ -72,6 +73,7 @@ ...@@ -72,6 +73,7 @@
FROM `im_message` FROM `im_message`
INNER JOIN `im_client` ON `im_client`.id = `im_message`.sender INNER JOIN `im_client` ON `im_client`.id = `im_message`.sender
WHERE fk_conversation_id = #{param.conversationId} and im_message.is_delete = 1 and im_message.withdraw = 0 WHERE fk_conversation_id = #{param.conversationId} and im_message.is_delete = 1 and im_message.withdraw = 0
and (im_message.`event`=0 || (im_message.`event`=1 and sender != #{param.currentFkClientId} ))
<if test="param.msgIdStart != null"> <if test="param.msgIdStart != null">
AND im_message.id > #{param.msgIdStart} AND im_message.id > #{param.msgIdStart}
</if> </if>
......
-- 在feature-cluster 2021年12月22日之后,需要执行的的sql增量脚本 -- 在feature-cluster 2021年12月22日之后,需要执行的的sql增量脚本
...@@ -43,7 +43,7 @@ CREATE TABLE `im_friend` ...@@ -43,7 +43,7 @@ CREATE TABLE `im_friend`
`create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间', `create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间',
`update_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', `update_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`) USING BTREE, PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `friend_id`(`fk_client_id`,`fk_client_id_friend`) USING BTREE UNIQUE KEY `friend_id`(`client_id`,`client_id_friend`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='好友表'; ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='好友表';
CREATE TABLE `im_friend_recommend` CREATE TABLE `im_friend_recommend`
...@@ -56,7 +56,7 @@ CREATE TABLE `im_friend_recommend` ...@@ -56,7 +56,7 @@ CREATE TABLE `im_friend_recommend`
`create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间', `create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间',
`update_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', `update_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`) USING BTREE, PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `friend_id`(fk_client_id, fk_client_id_friend) USING BTREE UNIQUE KEY `friend_id`(client_id, client_id_friend) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='好友表'; ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='好友表';
...@@ -98,6 +98,27 @@ CREATE TABLE `im_user` ...@@ -98,6 +98,27 @@ CREATE TABLE `im_user`
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表'; ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
-- 20220302 by wenzhida
CREATE TABLE `im_client_device`
(
`id` bigint NOT NULL COMMENT '主键id',
`fk_appid` bigint DEFAULT NULL COMMENT '应用appid',
`fk_client_id` bigint NOT NULL COMMENT '客户端id',
`valid` int DEFAULT NULL COMMENT '设备不想收到推送提醒',
`device_type` int DEFAULT NULL COMMENT '设备类型1:ios; 2:android',
`device_token` varchar(300) DEFAULT NULL COMMENT '设备推送token',
`unique_device_id` varchar(50) DEFAULT NULL COMMENT '设备唯一id(由设备端生成)',
`create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间',
`update_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`) USING BTREE,
KEY `idx_fk_client_id` (`fk_client_id`) USING BTREE,
KEY `idx_device_token_appid` (`device_token`,`fk_appid`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='客户端设备表';
...@@ -59,7 +59,7 @@ public class JwtUtil { ...@@ -59,7 +59,7 @@ public class JwtUtil {
* *
* @return * @return
*/ */
public static JwtToken getCurentJwtToken() { public static JwtToken getCurrentJwtToken() {
JwtToken jwtToken = (JwtToken) SecurityUtils.getSubject().getPrincipal(); JwtToken jwtToken = (JwtToken) SecurityUtils.getSubject().getPrincipal();
return jwtToken; return jwtToken;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment