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("当前登录用户未找到");
} }
......
package com.wecloud.im.user.service; package com.wecloud.im.externalaccess.service;
import cn.hutool.core.lang.Snowflake; import cn.hutool.core.lang.Snowflake;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.wecloud.im.constant.NumberConstant;
import com.wecloud.im.constant.RedisKeyPrefixConstant;
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.enums.FriendStateEnum; import com.wecloud.im.enums.FriendStateEnum;
import com.wecloud.im.enums.RelationEnum; import com.wecloud.im.enums.RelationEnum;
import com.wecloud.im.enums.VerifySceneEnum; import com.wecloud.im.enums.VerifySceneEnum;
import com.wecloud.im.externalaccess.entity.User;
import com.wecloud.im.externalaccess.mapper.UserMapper;
import com.wecloud.im.externalaccess.param.ChangePhoneParam;
import com.wecloud.im.externalaccess.param.CheckPhoneParam;
import com.wecloud.im.externalaccess.param.FindUserParam;
import com.wecloud.im.externalaccess.param.GetUserParam;
import com.wecloud.im.externalaccess.param.LoginSuccessDto;
import com.wecloud.im.externalaccess.param.ModifyHeadPortraitParam;
import com.wecloud.im.externalaccess.param.ModifyLandouParam;
import com.wecloud.im.externalaccess.param.ModifyNicknameParam;
import com.wecloud.im.externalaccess.param.ModifySexParam;
import com.wecloud.im.externalaccess.param.ResetPasswordParam;
import com.wecloud.im.externalaccess.param.UserBaseDto;
import com.wecloud.im.externalaccess.param.UserLoginParam;
import com.wecloud.im.externalaccess.param.UserRegisterParam;
import com.wecloud.im.friend.entity.ImFriend; import com.wecloud.im.friend.entity.ImFriend;
import com.wecloud.im.friend.service.ImFriendService; import com.wecloud.im.friend.service.ImFriendService;
import com.wecloud.im.param.add.ImClientHeadPortraitAdd; import com.wecloud.im.param.add.ImClientHeadPortraitAdd;
import com.wecloud.im.param.add.ImClientNicknameUpdate; import com.wecloud.im.param.add.ImClientNicknameUpdate;
import com.wecloud.im.service.ImApplicationService; import com.wecloud.im.service.ImApplicationService;
import com.wecloud.im.service.ImClientBlacklistService; import com.wecloud.im.service.ImClientBlacklistService;
import com.wecloud.im.service.ImClientDeviceService;
import com.wecloud.im.service.ImClientService; import com.wecloud.im.service.ImClientService;
import com.wecloud.im.user.constant.RedisKeyPrefixConstant;
import com.wecloud.im.user.entity.User;
import com.wecloud.im.user.mapper.UserMapper;
import com.wecloud.im.user.param.ChangePhoneParam;
import com.wecloud.im.user.param.CheckPhoneParam;
import com.wecloud.im.user.param.FindUserParam;
import com.wecloud.im.user.param.GetUserParam;
import com.wecloud.im.user.param.LoginSuccessDto;
import com.wecloud.im.user.param.ModifyHeadPortraitParam;
import com.wecloud.im.user.param.ModifyLandouParam;
import com.wecloud.im.user.param.ModifyNicknameParam;
import com.wecloud.im.user.param.ModifySexParam;
import com.wecloud.im.user.param.ResetPasswordParam;
import com.wecloud.im.user.param.UserBaseDto;
import com.wecloud.im.user.param.UserLoginParam;
import com.wecloud.im.user.param.UserRegisterParam;
import com.wecloud.im.ws.utils.RedisUtils; import com.wecloud.im.ws.utils.RedisUtils;
import com.wecloud.utils.AesUtil; import com.wecloud.utils.AesUtil;
import com.wecloud.utils.RandomUtil; import com.wecloud.utils.RandomUtil;
...@@ -62,6 +65,9 @@ public class UserService extends BaseServiceImpl<UserMapper, User> { ...@@ -62,6 +65,9 @@ public class UserService extends BaseServiceImpl<UserMapper, User> {
private ImClientService imClientService; private ImClientService imClientService;
@Autowired @Autowired
private ImClientDeviceService imClientDeviceService;
@Autowired
private ImFriendService imFriendService; private ImFriendService imFriendService;
@Autowired @Autowired
...@@ -70,19 +76,21 @@ public class UserService extends BaseServiceImpl<UserMapper, User> { ...@@ -70,19 +76,21 @@ public class UserService extends BaseServiceImpl<UserMapper, User> {
/** /**
* 校验手机号码是否可使用 * 校验手机号码是否可使用
*
* @param param * @param param
*/ */
public Boolean checkPhone(CheckPhoneParam param) { public Boolean checkPhone(CheckPhoneParam param) {
User userExist = this.getOne(new QueryWrapper<User>().lambda() User userExist = this.getOne(new QueryWrapper<User>().lambda()
.eq(User::getPhone, param.getPhone())); .eq(User::getPhone, param.getPhone()));
if (userExist != null) { if (userExist != null) {
return Boolean.FALSE; throw new BusinessException("该手机号已被注册");
} }
return Boolean.TRUE; return Boolean.TRUE;
} }
/** /**
* 注册用户 * 注册用户
*
* @param param * @param param
*/ */
public String registerUser(UserRegisterParam param) { public String registerUser(UserRegisterParam param) {
...@@ -95,6 +103,7 @@ public class UserService extends BaseServiceImpl<UserMapper, User> { ...@@ -95,6 +103,7 @@ public class UserService extends BaseServiceImpl<UserMapper, User> {
} }
User user = new User(); User user = new User();
user.setId(SnowflakeUtil.getId()); user.setId(SnowflakeUtil.getId());
user.setNickname("蓝豆-" + RandomUtil.generateRandomStr(6));
user.setIdNumber(this.getLandouNo()); user.setIdNumber(this.getLandouNo());
user.setPhone(param.getPhone()); user.setPhone(param.getPhone());
user.setPassword(AesUtil.encrypt(param.getPassword())); user.setPassword(AesUtil.encrypt(param.getPassword()));
...@@ -106,6 +115,7 @@ public class UserService extends BaseServiceImpl<UserMapper, User> { ...@@ -106,6 +115,7 @@ public class UserService extends BaseServiceImpl<UserMapper, User> {
/** /**
* 用户登录 * 用户登录
*
* @param param * @param param
*/ */
public LoginSuccessDto loginUser(UserLoginParam param) { public LoginSuccessDto loginUser(UserLoginParam param) {
...@@ -129,16 +139,21 @@ public class UserService extends BaseServiceImpl<UserMapper, User> { ...@@ -129,16 +139,21 @@ public class UserService extends BaseServiceImpl<UserMapper, User> {
.eq(ImClient::getClientId, user.getId())); .eq(ImClient::getClientId, user.getId()));
if (imClient == null) { if (imClient == null) {
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(user.getId().toString()); imClient.setClientId(user.getId().toString());
imClient.setHeadPortrait(user.getHeadPortrait()); imClient.setHeadPortrait(user.getHeadPortrait());
imClient.setNickname(user.getNickname()); imClient.setNickname(user.getNickname());
imClient.setPlatform(param.getPlatform());
imClientService.save(imClient); imClientService.save(imClient);
} else { ImClientDevice imClientDevice = new ImClientDevice();
imClient.setPlatform(param.getPlatform()); imClientDevice.setId(SnowflakeUtil.getId());
imClientService.updateById(imClient); imClientDevice.setFkAppid(imApplication.getId());
imClientDevice.setFkClientId(imClient.getId());
imClientDevice.setValid(1);
imClientDevice.setDeviceType(param.getDeviceType());
imClientDevice.setCreateTime(new Date());
imClientDevice.setUpdateTime(new Date());
imClientDeviceService.save(imClientDevice);
} }
LoginSuccessDto loginSuccessDto = new LoginSuccessDto(); LoginSuccessDto loginSuccessDto = new LoginSuccessDto();
...@@ -149,6 +164,7 @@ public class UserService extends BaseServiceImpl<UserMapper, User> { ...@@ -149,6 +164,7 @@ public class UserService extends BaseServiceImpl<UserMapper, User> {
/** /**
* 重置密码 * 重置密码
*
* @param param * @param param
*/ */
public void resetPassword(ResetPasswordParam param) { public void resetPassword(ResetPasswordParam param) {
...@@ -165,6 +181,7 @@ public class UserService extends BaseServiceImpl<UserMapper, User> { ...@@ -165,6 +181,7 @@ public class UserService extends BaseServiceImpl<UserMapper, User> {
/** /**
* 更换手机号码 * 更换手机号码
*
* @param param * @param param
*/ */
public void changePhone(ChangePhoneParam param) { public void changePhone(ChangePhoneParam param) {
...@@ -192,7 +209,7 @@ public class UserService extends BaseServiceImpl<UserMapper, User> { ...@@ -192,7 +209,7 @@ public class UserService extends BaseServiceImpl<UserMapper, User> {
* 查找本人信息 * 查找本人信息
*/ */
public UserBaseDto myInfo() { public UserBaseDto myInfo() {
ImClient currentClient = imClientService.getCurentClient(); ImClient currentClient = imClientService.getCurrentClient();
User user = this.getOne(new QueryWrapper<User>().lambda() User user = this.getOne(new QueryWrapper<User>().lambda()
.eq(User::getId, currentClient.getClientId())); .eq(User::getId, currentClient.getClientId()));
if (user == null) { if (user == null) {
...@@ -206,6 +223,7 @@ public class UserService extends BaseServiceImpl<UserMapper, User> { ...@@ -206,6 +223,7 @@ public class UserService extends BaseServiceImpl<UserMapper, User> {
/** /**
* 查找用户 * 查找用户
*
* @param param * @param param
*/ */
public UserBaseDto findUser(FindUserParam param) { public UserBaseDto findUser(FindUserParam param) {
...@@ -222,7 +240,7 @@ public class UserService extends BaseServiceImpl<UserMapper, User> { ...@@ -222,7 +240,7 @@ public class UserService extends BaseServiceImpl<UserMapper, User> {
userBaseDto.setRelation(RelationEnum.STRANGER.getCode()); userBaseDto.setRelation(RelationEnum.STRANGER.getCode());
// 查询该好友与自己关系: 陌生人、好友、被拉黑名单 // 查询该好友与自己关系: 陌生人、好友、被拉黑名单
ImClient currentClient = imClientService.getCurentClient(); ImClient currentClient = imClientService.getCurrentClient();
ImFriend imFriend = imFriendService.getByKey(currentClient.getClientId(), user.getId().toString()); ImFriend imFriend = imFriendService.getByKey(currentClient.getClientId(), user.getId().toString());
if (imFriend != null && FriendStateEnum.CONFORM.getCode().equals(imFriend.getState())) { if (imFriend != null && FriendStateEnum.CONFORM.getCode().equals(imFriend.getState())) {
userBaseDto.setRelation(RelationEnum.FRIEND.getCode()); userBaseDto.setRelation(RelationEnum.FRIEND.getCode());
...@@ -237,6 +255,7 @@ public class UserService extends BaseServiceImpl<UserMapper, User> { ...@@ -237,6 +255,7 @@ public class UserService extends BaseServiceImpl<UserMapper, User> {
/** /**
* 查找用户 * 查找用户
*
* @param param * @param param
*/ */
public UserBaseDto getUserByUserId(GetUserParam param) { public UserBaseDto getUserByUserId(GetUserParam param) {
...@@ -250,7 +269,7 @@ public class UserService extends BaseServiceImpl<UserMapper, User> { ...@@ -250,7 +269,7 @@ public class UserService extends BaseServiceImpl<UserMapper, User> {
userBaseDto.setUserId(user.getId().toString()); userBaseDto.setUserId(user.getId().toString());
userBaseDto.setRelation(RelationEnum.STRANGER.getCode()); userBaseDto.setRelation(RelationEnum.STRANGER.getCode());
// 查询该好友与自己关系: 陌生人、好友、被拉黑名单 // 查询该好友与自己关系: 陌生人、好友、被拉黑名单
ImClient currentClient = imClientService.getCurentClient(); ImClient currentClient = imClientService.getCurrentClient();
ImFriend imFriend = imFriendService.getByKey(currentClient.getClientId(), user.getId().toString()); ImFriend imFriend = imFriendService.getByKey(currentClient.getClientId(), user.getId().toString());
if (imFriend != null && FriendStateEnum.CONFORM.getCode().equals(imFriend.getState())) { if (imFriend != null && FriendStateEnum.CONFORM.getCode().equals(imFriend.getState())) {
userBaseDto.setRelation(RelationEnum.FRIEND.getCode()); userBaseDto.setRelation(RelationEnum.FRIEND.getCode());
...@@ -264,6 +283,7 @@ public class UserService extends BaseServiceImpl<UserMapper, User> { ...@@ -264,6 +283,7 @@ public class UserService extends BaseServiceImpl<UserMapper, User> {
/** /**
* 修改头像 * 修改头像
*
* @param param * @param param
*/ */
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
...@@ -281,6 +301,7 @@ public class UserService extends BaseServiceImpl<UserMapper, User> { ...@@ -281,6 +301,7 @@ public class UserService extends BaseServiceImpl<UserMapper, User> {
/** /**
* 修改昵称 * 修改昵称
*
* @param param * @param param
*/ */
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
...@@ -289,6 +310,9 @@ public class UserService extends BaseServiceImpl<UserMapper, User> { ...@@ -289,6 +310,9 @@ public class UserService extends BaseServiceImpl<UserMapper, User> {
if (user == null) { if (user == null) {
throw new BusinessException("查无用户"); throw new BusinessException("查无用户");
} }
if (param.getNickname().length() > NumberConstant.NUM_30) {
throw new BusinessException("昵称长度需小于30位");
}
user.setNickname(param.getNickname()); user.setNickname(param.getNickname());
this.updateById(user); this.updateById(user);
ImClientNicknameUpdate imClientNicknameUpdate = new ImClientNicknameUpdate(); ImClientNicknameUpdate imClientNicknameUpdate = new ImClientNicknameUpdate();
...@@ -298,6 +322,7 @@ public class UserService extends BaseServiceImpl<UserMapper, User> { ...@@ -298,6 +322,7 @@ public class UserService extends BaseServiceImpl<UserMapper, User> {
/** /**
* 修改昵称 * 修改昵称
*
* @param param * @param param
*/ */
public void modifyLandouNo(ModifyLandouParam param) { public void modifyLandouNo(ModifyLandouParam param) {
...@@ -309,12 +334,16 @@ public class UserService extends BaseServiceImpl<UserMapper, User> { ...@@ -309,12 +334,16 @@ public class UserService extends BaseServiceImpl<UserMapper, User> {
if (userByLando != null) { if (userByLando != null) {
throw new BusinessException("该蓝豆号已被使用,请更换"); throw new BusinessException("该蓝豆号已被使用,请更换");
} }
if (param.getLandouNo().length() > NumberConstant.NUM_32) {
throw new BusinessException("蓝豆号输入长度需小于32位");
}
user.setIdNumber(param.getLandouNo()); user.setIdNumber(param.getLandouNo());
this.updateById(user); this.updateById(user);
} }
/** /**
* 修改性别 * 修改性别
*
* @param param * @param param
*/ */
public void modifySex(ModifySexParam param) { public void modifySex(ModifySexParam param) {
...@@ -328,16 +357,18 @@ public class UserService extends BaseServiceImpl<UserMapper, User> { ...@@ -328,16 +357,18 @@ public class UserService extends BaseServiceImpl<UserMapper, User> {
/** /**
* 根据蓝豆号获取用户 * 根据蓝豆号获取用户
*
* @param landouNo * @param landouNo
* @return * @return
*/ */
public User getByLandouNo (String landouNo) { public User getByLandouNo(String landouNo) {
return this.getOne(new QueryWrapper<User>().lambda() return this.getOne(new QueryWrapper<User>().lambda()
.eq(User::getIdNumber, landouNo)); .eq(User::getIdNumber, landouNo));
} }
/** /**
* 校验短信验证码 * 校验短信验证码
*
* @param verifyCode * @param verifyCode
* @param redisKey * @param redisKey
*/ */
...@@ -351,9 +382,10 @@ public class UserService extends BaseServiceImpl<UserMapper, User> { ...@@ -351,9 +382,10 @@ public class UserService extends BaseServiceImpl<UserMapper, User> {
/** /**
* 获取可使用蓝豆号 * 获取可使用蓝豆号
*
* @return * @return
*/ */
private String getLandouNo () { private String getLandouNo() {
String landouNo; String landouNo;
do { do {
landouNo = RandomUtil.generateRandomStr(8); landouNo = RandomUtil.generateRandomStr(8);
......
...@@ -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);
......
...@@ -8,7 +8,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; ...@@ -8,7 +8,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
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.ImClientBlacklist; import com.wecloud.im.entity.ImClientDevice;
import com.wecloud.im.enums.FriendStateEnum; import com.wecloud.im.enums.FriendStateEnum;
import com.wecloud.im.enums.RelationEnum; import com.wecloud.im.enums.RelationEnum;
import com.wecloud.im.friend.entity.ImFriend; import com.wecloud.im.friend.entity.ImFriend;
...@@ -19,17 +19,20 @@ import com.wecloud.im.param.GetClientInfoParam; ...@@ -19,17 +19,20 @@ 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;
import com.wecloud.im.param.add.ImClientNicknameUpdate; import com.wecloud.im.param.add.ImClientNicknameUpdate;
import com.wecloud.im.service.ImApplicationService; import com.wecloud.im.service.ImApplicationService;
import com.wecloud.im.service.ImClientBlacklistService; import com.wecloud.im.service.ImClientBlacklistService;
import com.wecloud.im.service.ImClientDeviceService;
import com.wecloud.im.service.ImClientService; import com.wecloud.im.service.ImClientService;
import com.wecloud.im.vo.ClientInfoVo; import com.wecloud.im.vo.ClientInfoVo;
import com.wecloud.im.vo.GetInfoListVo; import com.wecloud.im.vo.GetInfoListVo;
import com.wecloud.im.vo.MyInfoVo; import com.wecloud.im.vo.MyInfoVo;
import com.wecloud.utils.SnowflakeUtil;
import io.geekidea.springbootplus.framework.common.api.ApiResult; import io.geekidea.springbootplus.framework.common.api.ApiResult;
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;
...@@ -47,7 +50,7 @@ import org.springframework.cache.annotation.Cacheable; ...@@ -47,7 +50,7 @@ import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource; import java.util.Date;
import java.util.List; import java.util.List;
/** /**
...@@ -73,10 +76,13 @@ public class ImClientServiceImpl extends BaseServiceImpl<ImClientMapper, ImClien ...@@ -73,10 +76,13 @@ public class ImClientServiceImpl extends BaseServiceImpl<ImClientMapper, ImClien
@Autowired @Autowired
private ImClientBlacklistService imClientBlacklistService; private ImClientBlacklistService imClientBlacklistService;
@Autowired
private ImClientDeviceService imClientDeviceService;
@Override @Override
public MyInfoVo getMyInfo() { public MyInfoVo getMyInfo() {
ImClient currentClient = this.getCurentClient(); ImClient currentClient = this.getCurrentClient();
if (currentClient == null) { if (currentClient == null) {
throw new BusinessException("当前用户登录信息失效"); throw new BusinessException("当前用户登录信息失效");
} }
...@@ -88,7 +94,7 @@ public class ImClientServiceImpl extends BaseServiceImpl<ImClientMapper, ImClien ...@@ -88,7 +94,7 @@ public class ImClientServiceImpl extends BaseServiceImpl<ImClientMapper, ImClien
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public boolean updateHeadPortrait(ImClientHeadPortraitAdd imClientHeadPortraitAdd) { public boolean updateHeadPortrait(ImClientHeadPortraitAdd imClientHeadPortraitAdd) {
ImClient curentClient = getCurentClient(); ImClient curentClient = getCurrentClient();
curentClient.setHeadPortrait(imClientHeadPortraitAdd.getHeadPortrait()); curentClient.setHeadPortrait(imClientHeadPortraitAdd.getHeadPortrait());
imClientMapper.updateById(curentClient); imClientMapper.updateById(curentClient);
...@@ -100,7 +106,7 @@ public class ImClientServiceImpl extends BaseServiceImpl<ImClientMapper, ImClien ...@@ -100,7 +106,7 @@ public class ImClientServiceImpl extends BaseServiceImpl<ImClientMapper, ImClien
@Override @Override
public boolean updateNickname(ImClientNicknameUpdate imClientNicknameUpdate) { public boolean updateNickname(ImClientNicknameUpdate imClientNicknameUpdate) {
ImClient curentClient = getCurentClient(); ImClient curentClient = getCurrentClient();
curentClient.setNickname(imClientNicknameUpdate.getNickname()); curentClient.setNickname(imClientNicknameUpdate.getNickname());
imClientMapper.updateById(curentClient); imClientMapper.updateById(curentClient);
...@@ -112,7 +118,7 @@ public class ImClientServiceImpl extends BaseServiceImpl<ImClientMapper, ImClien ...@@ -112,7 +118,7 @@ public class ImClientServiceImpl extends BaseServiceImpl<ImClientMapper, ImClien
@Override @Override
public boolean updateHeadAndNickname(ImClientHeadPortraitAndNicknameUpdate imClientHeadPortraitAndNicknameUpdate) { public boolean updateHeadAndNickname(ImClientHeadPortraitAndNicknameUpdate imClientHeadPortraitAndNicknameUpdate) {
ImClient curentClient = getCurentClient(); ImClient curentClient = getCurrentClient();
curentClient.setHeadPortrait(imClientHeadPortraitAndNicknameUpdate.getHeadPortrait()); curentClient.setHeadPortrait(imClientHeadPortraitAndNicknameUpdate.getHeadPortrait());
curentClient.setNickname(imClientHeadPortraitAndNicknameUpdate.getNickname()); curentClient.setNickname(imClientHeadPortraitAndNicknameUpdate.getNickname());
imClientMapper.updateById(curentClient); imClientMapper.updateById(curentClient);
...@@ -125,7 +131,7 @@ public class ImClientServiceImpl extends BaseServiceImpl<ImClientMapper, ImClien ...@@ -125,7 +131,7 @@ public class ImClientServiceImpl extends BaseServiceImpl<ImClientMapper, ImClien
@Override @Override
public ApiResult<List<GetInfoListVo>> getInfoList(GetClientInfoParam getClientInfoParam) throws Exception { public ApiResult<List<GetInfoListVo>> getInfoList(GetClientInfoParam getClientInfoParam) throws Exception {
ImClient curentClient = getCurentClient(); ImClient curentClient = getCurrentClient();
if (getClientInfoParam.getClientIds() == null || getClientInfoParam.getClientIds().isEmpty()) { if (getClientInfoParam.getClientIds() == null || getClientInfoParam.getClientIds().isEmpty()) {
throw new BusinessException("getClientInfoParam.getClientIds() == null"); throw new BusinessException("getClientInfoParam.getClientIds() == null");
...@@ -154,7 +160,7 @@ public class ImClientServiceImpl extends BaseServiceImpl<ImClientMapper, ImClien ...@@ -154,7 +160,7 @@ public class ImClientServiceImpl extends BaseServiceImpl<ImClientMapper, ImClien
@Override @Override
public ClientInfoVo getClientInfo(ClientInfoParam param) { public ClientInfoVo getClientInfo(ClientInfoParam param) {
ImClient currentClient = this.getCurentClient(); ImClient currentClient = this.getCurrentClient();
if (currentClient == null) { if (currentClient == null) {
throw new BusinessException("当前用户登录信息失效"); throw new BusinessException("当前用户登录信息失效");
} }
...@@ -186,13 +192,7 @@ public class ImClientServiceImpl extends BaseServiceImpl<ImClientMapper, ImClien ...@@ -186,13 +192,7 @@ public class ImClientServiceImpl extends BaseServiceImpl<ImClientMapper, ImClien
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public boolean updateNickname(ImClientNicknameAdd imClientNicknameAdd) throws Exception { public boolean updateNickname(ImClientNicknameAdd imClientNicknameAdd) throws Exception {
ImClient curentClient = getCurentClient(); ImClient curentClient = getCurrentClient();
// shiro线程中获取当前token
JwtToken curentJwtToken = JwtUtil.getCurentJwtToken();
// 根据appKey查询appid
// ImApplication imApplication = imApplicationService.getOneByAppKey(curentJwtToken.getAppKey());
curentClient.setNickname(imClientNicknameAdd.getNickname()); curentClient.setNickname(imClientNicknameAdd.getNickname());
imClientMapper.updateById(curentClient); imClientMapper.updateById(curentClient);
...@@ -211,52 +211,48 @@ public class ImClientServiceImpl extends BaseServiceImpl<ImClientMapper, ImClien ...@@ -211,52 +211,48 @@ public class ImClientServiceImpl extends BaseServiceImpl<ImClientMapper, ImClien
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public boolean updateDeviceInfo(ImClientDeviceInfoAdd imClientDevice) { public boolean updateDeviceInfo(ClientDeviceUpdateParam param) {
ImClient currentClient = getCurrentClient();
// shiro线程中获取当前token
JwtToken curentJwtToken = JwtUtil.getCurentJwtToken();
// 根据appKey查询appid
ImApplication imApplication = imApplicationService.getCacheAppByAppKey(curentJwtToken.getAppKey());
// 清除旧client的redis缓存 ImClientDevice clientDevice = imClientDeviceService.getOne(new QueryWrapper<ImClientDevice>().lambda()
ImClient imClient = this.getOne(new QueryWrapper<ImClient>().lambda() .eq(ImClientDevice::getFkAppid, currentClient.getFkAppid())
.eq(ImClient::getFkAppid, imApplication.getId()) .eq(ImClientDevice::getDeviceToken, param.getDeviceToken()));
.eq(ImClient::getDeviceToken, imClientDevice.getDeviceToken())); if (clientDevice != null) {
if (imClient != null) {
deleteCacheImClient(imClient.getFkAppid(), imClient.getClientId());
// client登陆的时候 判断数据库内是否已经存在这个设备token,如果存在就清空旧的 // client登陆的时候 判断数据库内是否已经存在这个设备token,如果存在就清空旧的
this.removeOldToken(imApplication.getId(), curentJwtToken.getToken()); JwtToken currentJwtToken = JwtUtil.getCurrentJwtToken();
imClientDeviceService.removeOldToken(currentClient.getId(), currentJwtToken.getToken());
} }
ImClientDevice clientDeviceToUpdate = imClientDeviceService.getOne(new QueryWrapper<ImClientDevice>().lambda()
ImClient client = getCurentClient(); .eq(ImClientDevice::getFkAppid, currentClient.getFkAppid())
ImClient clientNew = new ImClient(); .eq(ImClientDevice::getFkClientId, currentClient.getId())
BeanUtils.copyProperties(imClientDevice, clientNew); .eq(ImClientDevice::getDeviceType, param.getDeviceType())
clientNew.setId(client.getId()); );
if (clientDeviceToUpdate == null) {
// 清除新client的redis缓存 ImClientDevice imClientDevice = new ImClientDevice();
deleteCacheImClient(client.getFkAppid(), client.getClientId()); imClientDevice.setId(SnowflakeUtil.getId());
imClientDevice.setFkAppid(currentClient.getFkAppid());
// 修改 imClientDevice.setFkClientId(currentClient.getId());
return this.updateImClient(clientNew); imClientDevice.setValid(1);
imClientDevice.setDeviceType(param.getDeviceType());
imClientDevice.setCreateTime(new Date());
imClientDevice.setUpdateTime(new Date());
imClientDeviceService.save(imClientDevice);
} else {
clientDeviceToUpdate.setDeviceToken(param.getDeviceToken());
imClientDeviceService.updateById(clientDeviceToUpdate);
}
return true;
} }
@Override @Override
public boolean logout() { public boolean logout(LogoutParam param) {
ImClient currentClient = getCurrentClient();
ImClient curentClient = getCurentClient();
// 清除设备token // 清除设备token
boolean update = this.update(new UpdateWrapper<ImClient>().lambda() return imClientDeviceService.update(new UpdateWrapper<ImClientDevice>().lambda()
.eq(ImClient::getFkAppid, curentClient.getFkAppid()) .eq(ImClientDevice::getFkAppid, currentClient.getFkAppid())
.eq(ImClient::getId, curentClient.getId()) .eq(ImClientDevice::getFkClientId, currentClient.getId())
.set(ImClient::getDeviceToken, null) .eq(ImClientDevice::getDeviceType, param.getDeviceType())
); .set(ImClientDevice::getDeviceToken, null));
if (update) {
// 清除新client的redis缓存
deleteCacheImClient(curentClient.getFkAppid(), curentClient.getClientId());
}
return update;
} }
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
...@@ -270,13 +266,6 @@ public class ImClientServiceImpl extends BaseServiceImpl<ImClientMapper, ImClien ...@@ -270,13 +266,6 @@ public class ImClientServiceImpl extends BaseServiceImpl<ImClientMapper, ImClien
return super.removeById(id); return super.removeById(id);
} }
@Transactional(rollbackFor = Exception.class)
@Override
public int removeOldToken(Long appId, String deviceToken) {
return imClientMapper.removeOldToken(appId, deviceToken);
}
@Override @Override
public Paging<ImClientQueryVo> getImClientPageList(ImClientPageParam imClientPageParam) throws Exception { public Paging<ImClientQueryVo> getImClientPageList(ImClientPageParam imClientPageParam) throws Exception {
Page<ImClientQueryVo> page = new PageInfo<>(imClientPageParam, OrderItem.desc(getLambdaColumn(ImClient::getCreateTime))); Page<ImClientQueryVo> page = new PageInfo<>(imClientPageParam, OrderItem.desc(getLambdaColumn(ImClient::getCreateTime)));
...@@ -285,10 +274,10 @@ public class ImClientServiceImpl extends BaseServiceImpl<ImClientMapper, ImClien ...@@ -285,10 +274,10 @@ public class ImClientServiceImpl extends BaseServiceImpl<ImClientMapper, ImClien
} }
@Override @Override
public ImClient getCurentClient() { public ImClient getCurrentClient() {
// 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());
return getCacheImClient(imApplication.getId(), curentJwtToken.getClientId()); return getCacheImClient(imApplication.getId(), curentJwtToken.getClientId());
......
...@@ -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(
......
...@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; ...@@ -6,6 +6,7 @@ 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.google.common.collect.Lists;
import com.google.common.collect.Maps;
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.ImConversation; import com.wecloud.im.entity.ImConversation;
...@@ -14,7 +15,6 @@ import com.wecloud.im.entity.ImMessage; ...@@ -14,7 +15,6 @@ 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.enums.GroupRoleEnum; import com.wecloud.im.enums.GroupRoleEnum;
import com.wecloud.im.enums.MutedEnum;
import com.wecloud.im.mapper.ImConversationMapper; import com.wecloud.im.mapper.ImConversationMapper;
import com.wecloud.im.param.ImClientSimpleDto; import com.wecloud.im.param.ImClientSimpleDto;
import com.wecloud.im.param.ListConversationMembersParam; import com.wecloud.im.param.ListConversationMembersParam;
...@@ -59,7 +59,6 @@ import org.apache.commons.collections4.CollectionUtils; ...@@ -59,7 +59,6 @@ import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig; import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
...@@ -111,7 +110,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -111,7 +110,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public ApiResult<ImConversationCreateVo> createImConversation(ImConversationCreate imConversationCreate) { public ApiResult<ImConversationCreateVo> createImConversation(ImConversationCreate imConversationCreate) {
ImClient createClient = imClientService.getCurentClient(); ImClient createClient = imClientService.getCurrentClient();
if (CollectionUtils.isEmpty(imConversationCreate.getClientIds())) { if (CollectionUtils.isEmpty(imConversationCreate.getClientIds())) {
log.info("未找到群成员信息"); log.info("未找到群成员信息");
return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null); return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null);
...@@ -133,7 +132,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -133,7 +132,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
} }
// 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());
...@@ -179,7 +178,6 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -179,7 +178,6 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
return ApiResult.ok(imConversationCreateVo); return ApiResult.ok(imConversationCreateVo);
} }
} }
} }
// 会话id // 会话id
...@@ -221,17 +219,37 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -221,17 +219,37 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
ImClient client2 = imClientService.getOne(new QueryWrapper<ImClient>().lambda() ImClient client2 = imClientService.getOne(new QueryWrapper<ImClient>().lambda()
.eq(ImClient::getFkAppid, createClient.getFkAppid()) .eq(ImClient::getFkAppid, createClient.getFkAppid())
.eq(ImClient::getClientId, id)); .eq(ImClient::getClientId, id));
Long imConversationMembersId2 = SnowflakeUtil.getId();
ImConversationMembers imConversationMembers2 = new ImConversationMembers(); ImConversationMembers imConversationMembers2 = new ImConversationMembers();
imConversationMembers2.setId(imConversationMembersId2); imConversationMembers2.setId(SnowflakeUtil.getId());
imConversationMembers2.setCreateTime(new Date()); imConversationMembers2.setCreateTime(new Date());
imConversationMembers2.setFkAppid(createClient.getFkAppid()); imConversationMembers2.setFkAppid(createClient.getFkAppid());
imConversationMembers2.setFkConversationId(imConversationId); imConversationMembers2.setFkConversationId(imConversationId);
imConversationMembers2.setFkClientId(client2.getId()); imConversationMembers2.setFkClientId(client2.getId());
imConversationMembers2.setRole(GroupRoleEnum.NORMAL.getCode()); imConversationMembers2.setRole(GroupRoleEnum.NORMAL.getCode());
imConversationMembersService.save(imConversationMembers2); imConversationMembersService.save(imConversationMembers2);
if (imConversationCreate.getClientIds().size() > 1) {
// 给被拉入群的成员下发事件消息 -- 单聊则不下发
ImMessage imMessage = new ImMessage();
Map<String, Object> content = Maps.newHashMap();
content.put("operator", createClient.getClientId()); //操作的client ID
content.put("passivityOperator", client2.getClientId()); //被操作的client ID
imMessage.setContent(JsonUtils.encodeJson(content));
// 保存消息至消息表
imMessage.setId(SnowflakeUtil.getId());
imMessage.setMsgType(MsgTypeEnum.CLIENT_JOIN_NEW_CONVERSATION.getUriCode());
imMessage.setCreateTime(new Date());
imMessage.setFkAppid(imApplication.getId());
imMessage.setSender(createClient.getId());
imMessage.setWithdraw(false);
imMessage.setEvent(true);
imMessage.setSystemFlag(false);
imMessage.setSendStatus(2);
imMessage.setFkConversationId(imConversation.getId());
imMessageService.save(imMessage);
sendEventMsgToMember(imApplication, client2.getId(), imMessage, createClient);
}
} }
ImConversationCreateVo imConversationCreateVo = new ImConversationCreateVo(); ImConversationCreateVo imConversationCreateVo = new ImConversationCreateVo();
imConversationCreateVo.setId(imConversationId); imConversationCreateVo.setId(imConversationId);
...@@ -243,11 +261,11 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -243,11 +261,11 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
public ApiResult<Boolean> addClientToConversation(ImClientToConversation imClientToConversation) { public ApiResult<Boolean> addClientToConversation(ImClientToConversation imClientToConversation) {
// 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();
// 查询该会话所有成员 // 查询该会话所有成员
List<ImConversationMembers> membersList = imConversationMembersService.list( List<ImConversationMembers> membersList = imConversationMembersService.list(
...@@ -323,10 +341,10 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -323,10 +341,10 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
// 遍历发送给已在群内的成员 // 遍历发送给已在群内的成员
for (ImConversationMembers conversationMember : membersList) { for (ImConversationMembers conversationMember : membersList) {
sendEventMsgToMember(imApplication, conversationMember.getFkClientId(), imMessage, imClientSender, clientToConversation); sendEventMsgToMember(imApplication, conversationMember.getFkClientId(), imMessage, imClientSender);
} }
// 发送给刚被拉入群的成员 // 发送给刚被拉入群的成员
sendEventMsgToMember(imApplication, clientToConversation.getId(), imMessage, imClientSender, clientToConversation); sendEventMsgToMember(imApplication, clientToConversation.getId(), imMessage, imClientSender);
} }
// 将群成员数量减 // 将群成员数量减
...@@ -342,7 +360,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -342,7 +360,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
} }
private void sendEventMsgToMember(ImApplication imApplication, Long conversationMemberClientId, ImMessage imMessage, private void sendEventMsgToMember(ImApplication imApplication, Long conversationMemberClientId, ImMessage imMessage,
ImClient clientSender, ImClient clientToConversation) { ImClient clientSender) {
// 查询接收方 // 查询接收方
ImClient imClientReceiver = imClientService.getOne(new QueryWrapper<ImClient>().lambda() ImClient imClientReceiver = imClientService.getOne(new QueryWrapper<ImClient>().lambda()
.eq(ImClient::getFkAppid, imApplication.getId()) .eq(ImClient::getFkAppid, imApplication.getId())
...@@ -354,6 +372,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -354,6 +372,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
ImMessageOnlineSend imMessageOnlineSend = new ImMessageOnlineSend(); ImMessageOnlineSend imMessageOnlineSend = new ImMessageOnlineSend();
imMessageOnlineSend.setMsgId(imMessage.getId()); imMessageOnlineSend.setMsgId(imMessage.getId());
imMessageOnlineSend.setCreateTime(new Date());
imMessageOnlineSend.setType(imMessage.getMsgType()); imMessageOnlineSend.setType(imMessage.getMsgType());
imMessageOnlineSend.setSender(clientSender.getClientId()); imMessageOnlineSend.setSender(clientSender.getClientId());
imMessageOnlineSend.setContent(JsonUtils.decodeJson2Map(imMessage.getContent())); imMessageOnlineSend.setContent(JsonUtils.decodeJson2Map(imMessage.getContent()));
...@@ -377,11 +396,11 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -377,11 +396,11 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
public ApiResult<Boolean> delClientToConversation(ImClientToConversation imClientToConversation) throws Exception { public ApiResult<Boolean> delClientToConversation(ImClientToConversation imClientToConversation) throws Exception {
// 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 conversationMember = imConversationMembersService.getOne( ImConversationMembers conversationMember = imConversationMembersService.getOne(
...@@ -464,6 +483,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -464,6 +483,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
ImMessageOnlineSend imMessageOnlineSend = new ImMessageOnlineSend(); ImMessageOnlineSend imMessageOnlineSend = new ImMessageOnlineSend();
imMessageOnlineSend.setMsgId(messageId); imMessageOnlineSend.setMsgId(messageId);
imMessageOnlineSend.setCreateTime(new Date());
imMessageOnlineSend.setType(imMessage.getMsgType()); imMessageOnlineSend.setType(imMessage.getMsgType());
imMessageOnlineSend.setSender(imClientSender.getClientId()); imMessageOnlineSend.setSender(imClientSender.getClientId());
imMessageOnlineSend.setContent(content); imMessageOnlineSend.setContent(content);
...@@ -493,17 +513,11 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -493,17 +513,11 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public ApiResult<Boolean> leaveConversation(ImClientLeaveConversation imClientToConversation) throws Exception { public ApiResult<Boolean> leaveConversation(ImClientLeaveConversation imClientToConversation) throws Exception {
ImClient currentClient = imClientService.getCurrentClient();
// shiro线程中获取当前token ImConversation imConversation = imConversationService.getById(imClientToConversation.getConversationId());
JwtToken curentJwtToken = JwtUtil.getCurentJwtToken(); if (imConversation == null) {
// 根据appKey查询application throw new BusinessException("查无会话消息");
ImApplication imApplication = imApplicationService.getCacheAppByAppKey(curentJwtToken.getAppKey());
ImClient imClientSender = imClientService.getCurentClient();
ImConversation imConversationById = imConversationService.getById(imClientToConversation.getConversationId());
if (imConversationById == null) {
throw new BusinessException("查无应用消息");
} }
// 查询该会话所有成员 // 查询该会话所有成员
...@@ -511,7 +525,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -511,7 +525,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
new QueryWrapper<ImConversationMembers>().lambda() new QueryWrapper<ImConversationMembers>().lambda()
.eq(ImConversationMembers::getFkConversationId, imClientToConversation.getConversationId()) .eq(ImConversationMembers::getFkConversationId, imClientToConversation.getConversationId())
.orderByAsc(ImConversationMembers::getCreateTime) .orderByAsc(ImConversationMembers::getCreateTime)
.notIn(ImConversationMembers::getFkClientId, imClientSender.getId()) .notIn(ImConversationMembers::getFkClientId, currentClient.getId())
); );
if (membersList.isEmpty()) { if (membersList.isEmpty()) {
...@@ -521,9 +535,9 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -521,9 +535,9 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
// 判断用户是否在该会话 // 判断用户是否在该会话
ImConversationMembers members = imConversationMembersService.getOne(new QueryWrapper<ImConversationMembers>().lambda() ImConversationMembers members = imConversationMembersService.getOne(new QueryWrapper<ImConversationMembers>().lambda()
.eq(ImConversationMembers::getFkAppid, imApplication.getId()) .eq(ImConversationMembers::getFkAppid, currentClient.getFkAppid())
.eq(ImConversationMembers::getFkConversationId, imClientToConversation.getConversationId()) .eq(ImConversationMembers::getFkConversationId, imClientToConversation.getConversationId())
.eq(ImConversationMembers::getFkClientId, imClientSender.getId()) .eq(ImConversationMembers::getFkClientId, currentClient.getId())
); );
// 将client从会话移除 // 将client从会话移除
...@@ -533,7 +547,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -533,7 +547,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
} }
// 将群成员数量减1 // 将群成员数量减1
imConversationMapper.addMemberCount(imApplication.getId(), imClientToConversation.getConversationId(), -1); imConversationMapper.addMemberCount(currentClient.getFkAppid(), imClientToConversation.getConversationId(), -1);
// ws 退出事件通知给群内其他人 ---------- // ws 退出事件通知给群内其他人 ----------
...@@ -546,8 +560,8 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -546,8 +560,8 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
imMessage.setId(messageId); imMessage.setId(messageId);
imMessage.setMsgType(MsgTypeEnum.LEAVE_CONVERSATION.getUriCode()); imMessage.setMsgType(MsgTypeEnum.LEAVE_CONVERSATION.getUriCode());
imMessage.setCreateTime(new Date()); imMessage.setCreateTime(new Date());
imMessage.setFkAppid(imApplication.getId()); imMessage.setFkAppid(currentClient.getFkAppid());
imMessage.setSender(imClientSender.getId()); imMessage.setSender(currentClient.getId());
imMessage.setWithdraw(false); imMessage.setWithdraw(false);
imMessage.setEvent(true); imMessage.setEvent(true);
imMessage.setSystemFlag(false); imMessage.setSystemFlag(false);
...@@ -563,7 +577,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -563,7 +577,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
// 查询接收方 // 查询接收方
ImClient imClientReceiver = imClientService.getOne(new QueryWrapper<ImClient>().lambda() ImClient imClientReceiver = imClientService.getOne(new QueryWrapper<ImClient>().lambda()
.eq(ImClient::getFkAppid, imApplication.getId()) .eq(ImClient::getFkAppid, currentClient.getFkAppid())
.eq(ImClient::getId, conversationMembers.getFkClientId())); .eq(ImClient::getId, conversationMembers.getFkClientId()));
if (imClientReceiver == null) { if (imClientReceiver == null) {
continue; continue;
...@@ -573,8 +587,9 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -573,8 +587,9 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
ImMessageOnlineSend imMessageOnlineSend = new ImMessageOnlineSend(); ImMessageOnlineSend imMessageOnlineSend = new ImMessageOnlineSend();
imMessageOnlineSend.setMsgId(messageId); imMessageOnlineSend.setMsgId(messageId);
imMessageOnlineSend.setCreateTime(new Date());
imMessageOnlineSend.setType(MsgTypeEnum.LEAVE_CONVERSATION.getUriCode()); imMessageOnlineSend.setType(MsgTypeEnum.LEAVE_CONVERSATION.getUriCode());
imMessageOnlineSend.setSender(imClientSender.getClientId()); imMessageOnlineSend.setSender(currentClient.getClientId());
imMessageOnlineSend.setConversationId(conversationMembers.getFkConversationId()); imMessageOnlineSend.setConversationId(conversationMembers.getFkConversationId());
imMessageOnlineSend.setWithdraw(Boolean.FALSE); imMessageOnlineSend.setWithdraw(Boolean.FALSE);
imMessageOnlineSend.setEvent(Boolean.TRUE); imMessageOnlineSend.setEvent(Boolean.TRUE);
...@@ -611,10 +626,10 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -611,10 +626,10 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public Boolean transferOwner(TransferOwnerParam param) { public Boolean transferOwner(TransferOwnerParam param) {
// 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 currentMember = imConversationMembersService.getOne( ImConversationMembers currentMember = imConversationMembersService.getOne(
...@@ -647,7 +662,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -647,7 +662,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
*/ */
@Override @Override
public Boolean setAdmins(SetAdminsParam param) { public Boolean setAdmins(SetAdminsParam param) {
ImClient currentClient = imClientService.getCurentClient(); ImClient currentClient = imClientService.getCurrentClient();
// 判断操作人是否为群主 // 判断操作人是否为群主
ImConversationMembers currentMember = imConversationMembersService.getOne( ImConversationMembers currentMember = imConversationMembersService.getOne(
new QueryWrapper<ImConversationMembers>().lambda() new QueryWrapper<ImConversationMembers>().lambda()
...@@ -675,7 +690,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -675,7 +690,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
*/ */
@Override @Override
public Boolean mutedGroup(MutedGroupParam param) { public Boolean mutedGroup(MutedGroupParam param) {
ImClient currentClient = imClientService.getCurentClient(); ImClient currentClient = imClientService.getCurrentClient();
if (!imConversationService.isBelongToRole(currentClient.getClientId(), param.getConversationId(), if (!imConversationService.isBelongToRole(currentClient.getClientId(), param.getConversationId(),
Lists.newArrayList(GroupRoleEnum.OWNER.getCode(), GroupRoleEnum.ADMIN.getCode()))) { Lists.newArrayList(GroupRoleEnum.OWNER.getCode(), GroupRoleEnum.ADMIN.getCode()))) {
// 当前操作人不属于群主或管理人员 // 当前操作人不属于群主或管理人员
...@@ -692,7 +707,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -692,7 +707,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
@Override @Override
public Boolean mutedGroupMember(MutedGroupParam param) { public Boolean mutedGroupMember(MutedGroupParam param) {
ImClient currentClient = imClientService.getCurentClient(); ImClient currentClient = imClientService.getCurrentClient();
if (!imConversationService.isBelongToRole(currentClient.getClientId(), param.getConversationId(), if (!imConversationService.isBelongToRole(currentClient.getClientId(), param.getConversationId(),
Lists.newArrayList(GroupRoleEnum.OWNER.getCode(), GroupRoleEnum.ADMIN.getCode()))) { Lists.newArrayList(GroupRoleEnum.OWNER.getCode(), GroupRoleEnum.ADMIN.getCode()))) {
// 当前操作人不属于群主或管理人员 // 当前操作人不属于群主或管理人员
...@@ -744,11 +759,11 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -744,11 +759,11 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
public ApiResult<Boolean> saveOrUpdateName(ImConversationNameUpdate imConversationNameUpdate) throws Exception { public ApiResult<Boolean> saveOrUpdateName(ImConversationNameUpdate imConversationNameUpdate) throws Exception {
// 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();
ImConversation imConversationById = imConversationService.getById(imConversationNameUpdate.getConversationId()); ImConversation imConversationById = imConversationService.getById(imConversationNameUpdate.getConversationId());
...@@ -777,10 +792,8 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -777,10 +792,8 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
// 内容 // 内容
HashMap<String, String> content = new HashMap<>(); HashMap<String, String> content = new HashMap<>();
content.put("type", "-1015");
content.put("name", imConversationById.getName()); content.put("name", imConversationById.getName());
// 遍历发送 // 遍历发送
for (ImConversationMembers conversationMembers : membersList) { for (ImConversationMembers conversationMembers : membersList) {
...@@ -797,6 +810,8 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -797,6 +810,8 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
// imMessageOnlineSend.setMsgId(null); // imMessageOnlineSend.setMsgId(null);
// imMessageOnlineSend.setSender(imClientSender.getClientId()); // imMessageOnlineSend.setSender(imClientSender.getClientId());
imMessageOnlineSend.setType(MsgTypeEnum.CONVERSATION_NAME_CHANGE.getUriCode());
imMessageOnlineSend.setCreateTime(new Date());
imMessageOnlineSend.setContent(content); imMessageOnlineSend.setContent(content);
imMessageOnlineSend.setConversationId(conversationMembers.getFkConversationId()); imMessageOnlineSend.setConversationId(conversationMembers.getFkConversationId());
// imMessageOnlineSend.setWithdraw(Boolean.FALSE); // imMessageOnlineSend.setWithdraw(Boolean.FALSE);
...@@ -827,11 +842,11 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -827,11 +842,11 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
public ApiResult<Boolean> saveOrUpdateAttr(ImConversationAttrUpdate imConversationAttrUpdate) throws Exception { public ApiResult<Boolean> saveOrUpdateAttr(ImConversationAttrUpdate imConversationAttrUpdate) throws Exception {
// 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();
ImConversation imConversationById = imConversationService.getById(imConversationAttrUpdate.getConversationId()); ImConversation imConversationById = imConversationService.getById(imConversationAttrUpdate.getConversationId());
// 判断是否为群主 // 判断是否为群主
...@@ -862,7 +877,6 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -862,7 +877,6 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
// 内容 // 内容
HashMap<String, String> content = new HashMap<>(); HashMap<String, String> content = new HashMap<>();
content.put("type", "-1014");
content.put("attributes", imConversationById.getAttributes()); content.put("attributes", imConversationById.getAttributes());
...@@ -882,7 +896,9 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -882,7 +896,9 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
// imMessageOnlineSend.setMsgId(null); // imMessageOnlineSend.setMsgId(null);
// imMessageOnlineSend.setSender(imClientSender.getClientId()); // imMessageOnlineSend.setSender(imClientSender.getClientId());
imMessageOnlineSend.setType(MsgTypeEnum.CONVERSATION_EXPAND_FIELD_CHANGE.getUriCode());
imMessageOnlineSend.setContent(content); imMessageOnlineSend.setContent(content);
imMessageOnlineSend.setCreateTime(new Date());
imMessageOnlineSend.setConversationId(conversationMembers.getFkConversationId()); imMessageOnlineSend.setConversationId(conversationMembers.getFkConversationId());
// imMessageOnlineSend.setWithdraw(Boolean.FALSE); // imMessageOnlineSend.setWithdraw(Boolean.FALSE);
imMessageOnlineSend.setEvent(Boolean.TRUE); imMessageOnlineSend.setEvent(Boolean.TRUE);
...@@ -923,7 +939,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -923,7 +939,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@Override @Override
public boolean updateDisplayConversation(ImConversationDisplayUpdate imConversationDisplayUpdate) { public boolean updateDisplayConversation(ImConversationDisplayUpdate imConversationDisplayUpdate) {
ImClient curentClient = imClientService.getCurentClient(); ImClient curentClient = imClientService.getCurrentClient();
for (Long id : imConversationDisplayUpdate.getConversationIds()) { for (Long id : imConversationDisplayUpdate.getConversationIds()) {
// 修改为删除隐藏状态 // 修改为删除隐藏状态
boolean update = imConversationMembersService.update(new UpdateWrapper<ImConversationMembers>() boolean update = imConversationMembersService.update(new UpdateWrapper<ImConversationMembers>()
...@@ -957,7 +973,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -957,7 +973,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
@Override @Override
public List<ConversationVo> getMyImConversationListAndMsgCount() throws Exception { public List<ConversationVo> getMyImConversationListAndMsgCount() throws Exception {
ImClient currentClient = imClientService.getCurentClient(); ImClient currentClient = imClientService.getCurrentClient();
// 查询用户加入的所有会话 与每个会话的未读条数 成员 // 查询用户加入的所有会话 与每个会话的未读条数 成员
List<ConversationVo> myImConversationListAndMsgCount = imConversationMapper.getMyImConversationListAndMsgCount(currentClient.getId(), null); List<ConversationVo> myImConversationListAndMsgCount = imConversationMapper.getMyImConversationListAndMsgCount(currentClient.getId(), null);
...@@ -983,7 +999,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -983,7 +999,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
@Override @Override
public ConversationVo infoImConversationAndMsgCount(ImConversationQueryParam param) throws Exception { public ConversationVo infoImConversationAndMsgCount(ImConversationQueryParam param) throws Exception {
ImClient client = imClientService.getCurentClient(); ImClient client = imClientService.getCurrentClient();
// 查询用户加入的所有会话 与每个会话的未读条数 成员 // 查询用户加入的所有会话 与每个会话的未读条数 成员
List<ConversationVo> conversationList = imConversationMapper.getMyImConversationListAndMsgCount(client.getId(), param.getId()); List<ConversationVo> conversationList = imConversationMapper.getMyImConversationListAndMsgCount(client.getId(), param.getId());
if (CollectionUtils.isEmpty(conversationList)) { if (CollectionUtils.isEmpty(conversationList)) {
...@@ -1001,7 +1017,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -1001,7 +1017,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
@Override @Override
public List<ImConversation> getMyImConversationList() throws Exception { public List<ImConversation> getMyImConversationList() throws Exception {
ImClient client = imClientService.getCurentClient(); ImClient client = imClientService.getCurrentClient();
return imConversationMapper.getMyImConversationList(client.getId()); return imConversationMapper.getMyImConversationList(client.getId());
} }
......
...@@ -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