From 340b5b72485900fac1e140b1d5db04e1f22320d9 Mon Sep 17 00:00:00 2001 From: chc <1501738723@qq.com> Date: Tue, 22 Nov 2022 17:31:45 +0800 Subject: [PATCH] im --- .../im/config/CustomSpringConfigurator.java | 34 ++++ .../lili/im/config/WebSocketConfigurator.java | 24 +++ .../java/cn/lili/im/entity/ImMessage.java | 49 +++++ .../main/java/cn/lili/im/entity/ImTalk.java | 97 ++++++++++ .../main/java/cn/lili/im/entity/ImUser.java | 26 +++ .../im/entity/dto/MessageQueryParams.java | 49 +++++ .../im/entity/enums/MessageResultType.java | 28 +++ .../cn/lili/im/entity/enums/MessageType.java | 21 +++ .../lili/im/entity/enums/OperationType.java | 26 +++ .../java/cn/lili/im/entity/vo/ImTalkVO.java | 78 ++++++++ .../lili/im/entity/vo/MessageOperation.java | 48 +++++ .../java/cn/lili/im/entity/vo/MessageVO.java | 26 +++ .../cn/lili/im/entity/vo/ReadMessage.java | 17 ++ .../cn/lili/im/mapper/ImMessageMapper.java | 12 ++ .../java/cn/lili/im/mapper/ImTalkMapper.java | 12 ++ .../java/cn/lili/im/mapper/ImUserMapper.java | 13 ++ .../cn/lili/im/service/ImMessageService.java | 44 +++++ .../cn/lili/im/service/ImTalkService.java | 36 ++++ .../cn/lili/im/service/ImUserService.java | 21 +++ .../im/serviceimpl/ImMessageServiceImpl.java | 69 +++++++ .../im/serviceimpl/ImTalkServiceImpl.java | 92 +++++++++ .../im/serviceimpl/ImUserServiceImpl.java | 39 ++++ .../permission/service/AdminUserService.java | 8 + .../serviceimpl/AdminUserServiceImpl.java | 15 ++ .../cn/lili/mybatis/BaseTenantEntity.java | 24 +++ .../controller/im/ImManagerController.java | 175 ++++++++++++++++++ 26 files changed, 1083 insertions(+) create mode 100644 framework/src/main/java/cn/lili/im/config/CustomSpringConfigurator.java create mode 100644 framework/src/main/java/cn/lili/im/config/WebSocketConfigurator.java create mode 100644 framework/src/main/java/cn/lili/im/entity/ImMessage.java create mode 100644 framework/src/main/java/cn/lili/im/entity/ImTalk.java create mode 100644 framework/src/main/java/cn/lili/im/entity/ImUser.java create mode 100644 framework/src/main/java/cn/lili/im/entity/dto/MessageQueryParams.java create mode 100644 framework/src/main/java/cn/lili/im/entity/enums/MessageResultType.java create mode 100644 framework/src/main/java/cn/lili/im/entity/enums/MessageType.java create mode 100644 framework/src/main/java/cn/lili/im/entity/enums/OperationType.java create mode 100644 framework/src/main/java/cn/lili/im/entity/vo/ImTalkVO.java create mode 100644 framework/src/main/java/cn/lili/im/entity/vo/MessageOperation.java create mode 100644 framework/src/main/java/cn/lili/im/entity/vo/MessageVO.java create mode 100644 framework/src/main/java/cn/lili/im/entity/vo/ReadMessage.java create mode 100644 framework/src/main/java/cn/lili/im/mapper/ImMessageMapper.java create mode 100644 framework/src/main/java/cn/lili/im/mapper/ImTalkMapper.java create mode 100644 framework/src/main/java/cn/lili/im/mapper/ImUserMapper.java create mode 100644 framework/src/main/java/cn/lili/im/service/ImMessageService.java create mode 100644 framework/src/main/java/cn/lili/im/service/ImTalkService.java create mode 100644 framework/src/main/java/cn/lili/im/service/ImUserService.java create mode 100644 framework/src/main/java/cn/lili/im/serviceimpl/ImMessageServiceImpl.java create mode 100644 framework/src/main/java/cn/lili/im/serviceimpl/ImTalkServiceImpl.java create mode 100644 framework/src/main/java/cn/lili/im/serviceimpl/ImUserServiceImpl.java create mode 100644 framework/src/main/java/cn/lili/mybatis/BaseTenantEntity.java create mode 100644 manager-api/src/main/java/cn/lili/controller/im/ImManagerController.java diff --git a/framework/src/main/java/cn/lili/im/config/CustomSpringConfigurator.java b/framework/src/main/java/cn/lili/im/config/CustomSpringConfigurator.java new file mode 100644 index 00000000..a09cc961 --- /dev/null +++ b/framework/src/main/java/cn/lili/im/config/CustomSpringConfigurator.java @@ -0,0 +1,34 @@ +package cn.lili.im.config; + + +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.BeanFactory; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; + +import javax.websocket.server.ServerEndpointConfig; + +/** + * CustomSpringConfigurator + * + * @author Chopper + * @version v1.0 + * 2021-12-31 11:53 + */ +public class CustomSpringConfigurator extends ServerEndpointConfig.Configurator implements ApplicationContextAware { + + /** + * Spring application context. + */ + private static volatile BeanFactory context; + + @Override + public T getEndpointInstance(Class clazz) throws InstantiationException { + return context.getBean(clazz); + } + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + CustomSpringConfigurator.context = applicationContext; + } +} diff --git a/framework/src/main/java/cn/lili/im/config/WebSocketConfigurator.java b/framework/src/main/java/cn/lili/im/config/WebSocketConfigurator.java new file mode 100644 index 00000000..af42081e --- /dev/null +++ b/framework/src/main/java/cn/lili/im/config/WebSocketConfigurator.java @@ -0,0 +1,24 @@ +package cn.lili.im.config; + + +import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * WebSocketConfigurator + * + * @author Chopper + * @version v1.0 + * 2021-12-31 11:53 + */ +@ConditionalOnWebApplication +@Configuration +public class WebSocketConfigurator { + + @Bean + public CustomSpringConfigurator customSpringConfigurator() { + // This is just to get context + return new CustomSpringConfigurator(); + } +} diff --git a/framework/src/main/java/cn/lili/im/entity/ImMessage.java b/framework/src/main/java/cn/lili/im/entity/ImMessage.java new file mode 100644 index 00000000..ccc58d49 --- /dev/null +++ b/framework/src/main/java/cn/lili/im/entity/ImMessage.java @@ -0,0 +1,49 @@ +package cn.lili.im.entity; + +import cn.lili.im.entity.enums.MessageType; +import cn.lili.mybatis.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import lombok.Data; + +/** + * @author Chopper + */ +@Data +@TableName("li_im_message") +@ApiModel(value = "Im消息") +public class ImMessage extends BaseEntity { + + private static final long serialVersionUID = 1L; + + /** + * 发送者 + */ + private String fromUser; + + /** + * 接收者 + */ + private String toUser; + + /** + * 已阅 + */ + private Boolean isRead; + + /** + * 消息类型 + */ + private MessageType messageType; + + /** + * 聊天id + */ + private String talkId; + + /** + * 消息实体 + */ + private String text; + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/im/entity/ImTalk.java b/framework/src/main/java/cn/lili/im/entity/ImTalk.java new file mode 100644 index 00000000..9eb8502c --- /dev/null +++ b/framework/src/main/java/cn/lili/im/entity/ImTalk.java @@ -0,0 +1,97 @@ +package cn.lili.im.entity; + + +import cn.lili.common.utils.SnowFlake; +import cn.lili.mybatis.BaseTenantEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +/** + * @author Chopper + */ +@Data +@TableName("li_im_talk") +@ApiModel(value = "聊天") +public class ImTalk extends BaseTenantEntity { + + private static final long serialVersionUID = 1L; + + /** + * 用户1 id小的排在1 + */ + private String userId1; + /** + * 用户1 id大的排在2 + */ + private String userId2; + + /** + * 用户1置顶 + */ + private Boolean top1; + + /** + * 用户2置顶 + */ + private Boolean top2; + /** + * 用户1 不可见 + */ + private Boolean disable1; + + /** + * 用户2 不可见 + */ + private Boolean disable2; + /** + * 用户1名字 + */ + private String name1; + + /** + * 用户2名字 + */ + private String name2; + /** + * 用户1头像 + */ + private String face1; + + /** + * 用户2头像 + */ + private String face2; + + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "最后聊天时间", hidden = true) + private Date lastTalkTime; + + public ImTalk() { + + } + + public ImTalk(String userId1, String userId2, + String face1, String face2, + String name1, String name2 + ) { + this.userId1 = userId1; + this.userId2 = userId2; + this.top1 = false; + this.top2 = false; + this.disable1 = false; + this.disable2 = false; + this.setId(SnowFlake.getIdStr()); + this.lastTalkTime = new Date(); + this.face1 = face1; + this.face2 = face2; + this.name1 = name1; + this.name2 = name2; + } +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/im/entity/ImUser.java b/framework/src/main/java/cn/lili/im/entity/ImUser.java new file mode 100644 index 00000000..0be58571 --- /dev/null +++ b/framework/src/main/java/cn/lili/im/entity/ImUser.java @@ -0,0 +1,26 @@ +package cn.lili.im.entity; + + +import cn.lili.mybatis.BaseTenantEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import lombok.Data; + +/** + * @author Chopper + */ +@Data +@TableName("li_im_users") +@ApiModel(value = "Im消息") +public class ImUser extends BaseTenantEntity { + + private static final long serialVersionUID = 1L; + /** + * 头像 + */ + private String face; + /** + * 昵称 + */ + private String name; +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/im/entity/dto/MessageQueryParams.java b/framework/src/main/java/cn/lili/im/entity/dto/MessageQueryParams.java new file mode 100644 index 00000000..f10da119 --- /dev/null +++ b/framework/src/main/java/cn/lili/im/entity/dto/MessageQueryParams.java @@ -0,0 +1,49 @@ +package cn.lili.im.entity.dto; + +import cn.lili.common.enums.ResultCode; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.utils.StringUtils; +import cn.lili.im.entity.ImMessage; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.Data; + +/** + * MessageQueryParams + * + * @author Chopper + * @version v1.0 + * 2022-01-20 17:16 + */ +@Data +public class MessageQueryParams { + /** + * 聊天窗口 + */ + private String talkId; + /** + * 最后一个消息 + */ + private String lastMessageId; + /** + * 获取消息数量 + */ + private Integer num; + + public LambdaQueryWrapper initQueryWrapper() { + if (StringUtils.isEmpty(talkId)) { + throw new ServiceException(ResultCode.ERROR); + } + if (num == null || num > 50) { + num = 50; + } + + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(ImMessage::getTalkId, talkId); + if (StringUtils.isNotEmpty(lastMessageId)) { + lambdaQueryWrapper.lt(ImMessage::getId, lastMessageId); + } + lambdaQueryWrapper.orderByDesc(ImMessage::getId); + lambdaQueryWrapper.last("limit " + num); + return lambdaQueryWrapper; + } +} diff --git a/framework/src/main/java/cn/lili/im/entity/enums/MessageResultType.java b/framework/src/main/java/cn/lili/im/entity/enums/MessageResultType.java new file mode 100644 index 00000000..ed268da8 --- /dev/null +++ b/framework/src/main/java/cn/lili/im/entity/enums/MessageResultType.java @@ -0,0 +1,28 @@ +package cn.lili.im.entity.enums; + +/** + * 返回消息类型枚举 + * + * @author liushuai + */ +public enum MessageResultType { + /** + * 返回消息类型枚举 + *

+ * 好友列表 + * 增加好友 + * 消息 + * 阅读消息 + * 未读消息 + * 历史消息 + * 系统提示 + */ + FRIENDS, + ADD_FRIENDS, + MESSAGE, + READ_MESSAGE, + UN_READ, + HISTORY, + SYSTEM_TIPS + +} diff --git a/framework/src/main/java/cn/lili/im/entity/enums/MessageType.java b/framework/src/main/java/cn/lili/im/entity/enums/MessageType.java new file mode 100644 index 00000000..593afd78 --- /dev/null +++ b/framework/src/main/java/cn/lili/im/entity/enums/MessageType.java @@ -0,0 +1,21 @@ +package cn.lili.im.entity.enums; + +/** + * 消息类型 + * + * @author liushuai + */ +public enum MessageType { + /** + * 消息类型枚举 + *

+ * 普通消息 + * 图片 + * 语音 + * 视频 + */ + MESSAGE, + PICTURE, + VOICE, + VIDEO +} diff --git a/framework/src/main/java/cn/lili/im/entity/enums/OperationType.java b/framework/src/main/java/cn/lili/im/entity/enums/OperationType.java new file mode 100644 index 00000000..4c68971a --- /dev/null +++ b/framework/src/main/java/cn/lili/im/entity/enums/OperationType.java @@ -0,0 +1,26 @@ +package cn.lili.im.entity.enums; + +/** + * 操作类型枚举 + * + * @author liushuai + */ +public enum OperationType { + /** + * 消息类型枚举 + *

+ * 心跳检测 + * 发起聊天 + * 发起消息 + * 查询历史消息 + * 阅读消息 + * 查询未读消息 + */ + PING, + CREATE, + MESSAGE, + HISTORY, + READ, + UNREAD, + +} diff --git a/framework/src/main/java/cn/lili/im/entity/vo/ImTalkVO.java b/framework/src/main/java/cn/lili/im/entity/vo/ImTalkVO.java new file mode 100644 index 00000000..b3707452 --- /dev/null +++ b/framework/src/main/java/cn/lili/im/entity/vo/ImTalkVO.java @@ -0,0 +1,78 @@ +package cn.lili.im.entity.vo; + +import cn.lili.im.entity.ImTalk; +import cn.lili.mybatis.BaseTenantEntity; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +/** + * @author Chopper + */ +@Data +@ApiModel(value = "聊天") +public class ImTalkVO extends BaseTenantEntity { + + private static final long serialVersionUID = 1L; + + /** + * id + */ + private String id; + /** + * 用户 id + */ + private String userId; + + /** + * 置顶 + */ + private Boolean top; + + /** + * 用户 不可见 + */ + private Boolean disable; + + /** + * 用户名字 + */ + private String name; + + /** + * 用户头像 + */ + private String face; + + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "最后聊天时间", hidden = true) + private Date lastTalkTime; + + public ImTalkVO() { + + } + + public ImTalkVO(ImTalk imTalk, String currentUser) { + if (imTalk.getUserId2().equals(currentUser)) { + userId = imTalk.getUserId1(); + top = imTalk.getTop1(); + disable = imTalk.getDisable1(); + name = imTalk.getName1(); + face = imTalk.getFace1(); + } else { + userId = imTalk.getUserId2(); + top = imTalk.getTop2(); + disable = imTalk.getDisable2(); + name = imTalk.getName2(); + face = imTalk.getFace2(); + } + + lastTalkTime = imTalk.getLastTalkTime(); + id = imTalk.getId(); + } +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/im/entity/vo/MessageOperation.java b/framework/src/main/java/cn/lili/im/entity/vo/MessageOperation.java new file mode 100644 index 00000000..602e3b9b --- /dev/null +++ b/framework/src/main/java/cn/lili/im/entity/vo/MessageOperation.java @@ -0,0 +1,48 @@ +package cn.lili.im.entity.vo; + +import cn.lili.common.utils.StringUtils; +import cn.lili.im.entity.enums.MessageType; +import cn.lili.im.entity.enums.OperationType; +import lombok.Data; + +/** + * @author liushuai + */ +@Data +public class MessageOperation { + + /** + * 消息类型 + */ + private OperationType operationType; + /** + * 与某人聊天记录 + */ + private String to; + + /** + * 聊天id + */ + private String talkId; + + /** + * 消息类型 + */ + private MessageType messageType; + /** + * 消息内容 + */ + private String context; + + public void setOperationType(String operationType) { + if (!StringUtils.isEmpty(operationType)) { + this.operationType = OperationType.valueOf(operationType); + } + } + + public void setMessageType(String messageType) { + if (!StringUtils.isEmpty(messageType)) { + this.messageType = MessageType.valueOf(messageType); + } + } +} diff --git a/framework/src/main/java/cn/lili/im/entity/vo/MessageVO.java b/framework/src/main/java/cn/lili/im/entity/vo/MessageVO.java new file mode 100644 index 00000000..5c4b0222 --- /dev/null +++ b/framework/src/main/java/cn/lili/im/entity/vo/MessageVO.java @@ -0,0 +1,26 @@ +package cn.lili.im.entity.vo; + +import cn.lili.im.entity.enums.MessageResultType; +import lombok.AllArgsConstructor; +import lombok.Data; + +/** + * MessageVO + * + * @author Chopper + * @version v1.0 + * 2021-12-30 15:51 + */ +@Data +@AllArgsConstructor +public class MessageVO { + + /** + * 消息类型 + */ + private MessageResultType messageResultType; + /** + * 消息内容 + */ + private Object result; +} diff --git a/framework/src/main/java/cn/lili/im/entity/vo/ReadMessage.java b/framework/src/main/java/cn/lili/im/entity/vo/ReadMessage.java new file mode 100644 index 00000000..64b20f86 --- /dev/null +++ b/framework/src/main/java/cn/lili/im/entity/vo/ReadMessage.java @@ -0,0 +1,17 @@ +package cn.lili.im.entity.vo; + +import lombok.Data; + +import java.util.List; + +/** + * ReadMessage + * + * @author Chopper + * @version v1.0 + * 2021-12-31 11:13 + */ +@Data +public class ReadMessage { + private List readMessageList; +} diff --git a/framework/src/main/java/cn/lili/im/mapper/ImMessageMapper.java b/framework/src/main/java/cn/lili/im/mapper/ImMessageMapper.java new file mode 100644 index 00000000..4b3ac1a1 --- /dev/null +++ b/framework/src/main/java/cn/lili/im/mapper/ImMessageMapper.java @@ -0,0 +1,12 @@ +package cn.lili.im.mapper; + +import cn.lili.im.entity.ImMessage; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * Im消息 Dao层 + * @author Chopper + */ +public interface ImMessageMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/im/mapper/ImTalkMapper.java b/framework/src/main/java/cn/lili/im/mapper/ImTalkMapper.java new file mode 100644 index 00000000..4377dc59 --- /dev/null +++ b/framework/src/main/java/cn/lili/im/mapper/ImTalkMapper.java @@ -0,0 +1,12 @@ +package cn.lili.im.mapper; + +import cn.lili.im.entity.ImTalk; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * 聊天 Dao层 + * @author Chopper + */ +public interface ImTalkMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/im/mapper/ImUserMapper.java b/framework/src/main/java/cn/lili/im/mapper/ImUserMapper.java new file mode 100644 index 00000000..8cb2340b --- /dev/null +++ b/framework/src/main/java/cn/lili/im/mapper/ImUserMapper.java @@ -0,0 +1,13 @@ +package cn.lili.im.mapper; + +import cn.lili.im.entity.ImUser; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * Im消息 Dao层 + * + * @author Chopper + */ +public interface ImUserMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/im/service/ImMessageService.java b/framework/src/main/java/cn/lili/im/service/ImMessageService.java new file mode 100644 index 00000000..7b58c900 --- /dev/null +++ b/framework/src/main/java/cn/lili/im/service/ImMessageService.java @@ -0,0 +1,44 @@ +package cn.lili.im.service; + +import cn.lili.im.entity.ImMessage; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + * Im消息 业务层 + * + * @author Chopper + */ +public interface ImMessageService extends IService { + + /** + * 阅读消息 + * + * @param talkId + * @param accessToken + */ + void read(String talkId, String accessToken); + + /** + * 未读消息列表 + * + * @param accessToken + */ + List unReadMessages(String accessToken); + + /** + * 历史消息 + * + * @param accessToken + * @param to + */ + List historyMessage(String accessToken, String to); + + /** + * 是否有新消息 + * @param accessToken + * @return + */ + Boolean hasNewMessage(String accessToken); +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/im/service/ImTalkService.java b/framework/src/main/java/cn/lili/im/service/ImTalkService.java new file mode 100644 index 00000000..f9919cd6 --- /dev/null +++ b/framework/src/main/java/cn/lili/im/service/ImTalkService.java @@ -0,0 +1,36 @@ +package cn.lili.im.service; + +import cn.lili.im.entity.ImTalk; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * 聊天 业务层 + * + * @author Chopper + */ +public interface ImTalkService extends IService { + + /** + * 获取与某人的聊天框 + * + * @param userId1 + * @param userId2 + * @return + */ + ImTalk getTalkByUser(String userId1, String userId2); + + /** + * 置顶消息 + * + * @param id + * @param top + */ + void top(String id, Boolean top); + + /** + * 禁用(前端不做展示)聊天 + * + * @param id + */ + void disable(String id); +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/im/service/ImUserService.java b/framework/src/main/java/cn/lili/im/service/ImUserService.java new file mode 100644 index 00000000..e825f87b --- /dev/null +++ b/framework/src/main/java/cn/lili/im/service/ImUserService.java @@ -0,0 +1,21 @@ +package cn.lili.im.service; + +import cn.lili.im.entity.ImUser; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * Im消息 业务层 + * + * @author Chopper + */ +public interface ImUserService extends IService { + + /** + * 注册用户 + * + * @param accessToken + * @return + */ + ImUser register(String accessToken); + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/im/serviceimpl/ImMessageServiceImpl.java b/framework/src/main/java/cn/lili/im/serviceimpl/ImMessageServiceImpl.java new file mode 100644 index 00000000..6f2fa9a3 --- /dev/null +++ b/framework/src/main/java/cn/lili/im/serviceimpl/ImMessageServiceImpl.java @@ -0,0 +1,69 @@ +package cn.lili.im.serviceimpl; + +import cn.lili.common.security.context.UserContext; +import cn.lili.im.entity.ImMessage; +import cn.lili.im.mapper.ImMessageMapper; +import cn.lili.im.service.ImMessageService; +import cn.lili.im.service.ImTalkService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * Im消息 业务实现 + * + * @author Chopper + */ +@Service +@Transactional(rollbackFor = Exception.class) +@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +public class ImMessageServiceImpl extends ServiceImpl implements ImMessageService { + + @Autowired + private ImTalkService imTalkService; + + @Override + public void read(String talkId, String accessToken) { + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + String userId = UserContext.getAuthUser(accessToken).getId(); + updateWrapper.eq(ImMessage::getTalkId, talkId); + updateWrapper.eq(ImMessage::getToUser, userId); + updateWrapper.set(ImMessage::getIsRead, true); + this.update(updateWrapper); + } + + @Override + public List unReadMessages(String accessToken) { + String userId = UserContext.getAuthUser(accessToken).getId(); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(ImMessage::getToUser, userId); + queryWrapper.eq(ImMessage::getIsRead, false); + return this.list(queryWrapper); + } + + @Override + public List historyMessage(String accessToken, String to) { + String userId = UserContext.getAuthUser(accessToken).getId(); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.and(i -> i.eq(ImMessage::getToUser, userId).and(j -> j.eq(ImMessage::getFromUser, to))); + queryWrapper.or(i -> i.eq(ImMessage::getToUser, to).and(j -> j.eq(ImMessage::getFromUser, userId))); + queryWrapper.orderByDesc(ImMessage::getCreateTime); + return this.list(queryWrapper); + } + + @Override + public Boolean hasNewMessage(String accessToken) { + String userId = UserContext.getAuthUser(accessToken).getId(); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(ImMessage::getIsRead, false); + queryWrapper.eq(ImMessage::getToUser, userId); + return this.list(queryWrapper).size() > 0; + + } +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/im/serviceimpl/ImTalkServiceImpl.java b/framework/src/main/java/cn/lili/im/serviceimpl/ImTalkServiceImpl.java new file mode 100644 index 00000000..a2f4c28a --- /dev/null +++ b/framework/src/main/java/cn/lili/im/serviceimpl/ImTalkServiceImpl.java @@ -0,0 +1,92 @@ +package cn.lili.im.serviceimpl; + +import cn.lili.common.enums.ResultCode; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.security.context.UserContext; +import cn.lili.im.entity.ImTalk; +import cn.lili.im.entity.ImUser; +import cn.lili.im.mapper.ImTalkMapper; +import cn.lili.im.service.ImTalkService; +import cn.lili.im.service.ImUserService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * 聊天 业务实现 + * + * @author Chopper + */ +@Service +@Transactional(rollbackFor = Exception.class) +@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +public class ImTalkServiceImpl extends ServiceImpl implements ImTalkService { + + @Autowired + private ImUserService imUserService; + + @Override + public ImTalk getTalkByUser(String userId1, String userId2) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(ImTalk::getUserId2, userId2); + queryWrapper.eq(ImTalk::getUserId1, userId1); + ImTalk imTalk = this.getOne(queryWrapper); + ImUser imUser1 = imUserService.getById(userId1); + ImUser imUser2 = imUserService.getById(userId2); + + //如果没有聊天,则创建聊天 + if (imTalk == null) { + if (imUser1 == null || imUser2 == null) { + return null; + } + imTalk = new ImTalk(userId1, userId2, imUser1.getFace(), imUser2.getFace(), imUser1.getName(), imUser2.getName()); + this.save(imTalk); + } else { + imTalk = check(imTalk); + } + return imTalk; + } + + /** + * 发起聊天后,如果聊天不可见为true,则需要修正 + * + * @param imTalk + */ + private ImTalk check(ImTalk imTalk) { + if (imTalk.getDisable1() || imTalk.getDisable2()) { + imTalk.setDisable1(false); + imTalk.setDisable2(false); + this.updateById(imTalk); + + } + return imTalk; + } + + @Override + public void top(String id, Boolean top) { + ImTalk imTalk = this.getById(id); + if (imTalk.getUserId1().equals(UserContext.getCurrentUser().getId())) { + imTalk.setTop1(top); + } else if (imTalk.getUserId2().equals(UserContext.getCurrentUser().getId())) { + imTalk.setTop2(top); + } else { + throw new ServiceException(ResultCode.ERROR); + } + this.updateById(imTalk); + } + + @Override + public void disable(String id) { + ImTalk imTalk = this.getById(id); + if (imTalk.getUserId1().equals(UserContext.getCurrentUser().getId())) { + imTalk.setDisable1(true); + this.updateById(imTalk); + } else if (imTalk.getUserId2().equals(UserContext.getCurrentUser().getId())) { + imTalk.setDisable2(true); + this.updateById(imTalk); + } + } +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/im/serviceimpl/ImUserServiceImpl.java b/framework/src/main/java/cn/lili/im/serviceimpl/ImUserServiceImpl.java new file mode 100644 index 00000000..fe92173e --- /dev/null +++ b/framework/src/main/java/cn/lili/im/serviceimpl/ImUserServiceImpl.java @@ -0,0 +1,39 @@ +package cn.lili.im.serviceimpl; + +import cn.lili.common.security.AuthUser; +import cn.lili.common.security.context.UserContext; +import cn.lili.im.entity.ImUser; +import cn.lili.im.mapper.ImUserMapper; +import cn.lili.im.service.ImUserService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * Im消息 业务实现 + * + * @author Chopper + */ +@Service +@Transactional(rollbackFor = Exception.class) +@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +public class ImUserServiceImpl extends ServiceImpl implements ImUserService { + + @Override + public ImUser register(String accessToken) { + AuthUser authUser = UserContext.getAuthUser(accessToken); + ImUser imUser; + //如果用户存在 + imUser = this.getById(authUser.getId()); + if (imUser == null) { + imUser = new ImUser(); + imUser.setId(authUser.getId()); + imUser.setName(authUser.getNickName()); + this.save(imUser); + } + return imUser; + } + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/permission/service/AdminUserService.java b/framework/src/main/java/cn/lili/modules/permission/service/AdminUserService.java index 7257ca22..edc55c6e 100644 --- a/framework/src/main/java/cn/lili/modules/permission/service/AdminUserService.java +++ b/framework/src/main/java/cn/lili/modules/permission/service/AdminUserService.java @@ -1,6 +1,7 @@ package cn.lili.modules.permission.service; +import cn.lili.common.security.enums.UserEnums; import cn.lili.common.security.token.Token; import cn.lili.modules.permission.entity.dos.AdminUser; import cn.lili.modules.permission.entity.dto.AdminUserDTO; @@ -99,4 +100,11 @@ public interface AdminUserService extends IService { */ Token refreshToken(String refreshToken); + /** + * 登出 + * + * @param userEnums token角色类型 + */ + void logout(UserEnums userEnums); + } diff --git a/framework/src/main/java/cn/lili/modules/permission/serviceimpl/AdminUserServiceImpl.java b/framework/src/main/java/cn/lili/modules/permission/serviceimpl/AdminUserServiceImpl.java index 53ec3049..bc4f55d4 100644 --- a/framework/src/main/java/cn/lili/modules/permission/serviceimpl/AdminUserServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/permission/serviceimpl/AdminUserServiceImpl.java @@ -1,10 +1,13 @@ package cn.lili.modules.permission.serviceimpl; import cn.hutool.core.text.CharSequenceUtil; +import cn.lili.cache.Cache; +import cn.lili.cache.CachePrefix; import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; import cn.lili.common.security.AuthUser; import cn.lili.common.security.context.UserContext; +import cn.lili.common.security.enums.UserEnums; import cn.lili.common.security.token.Token; import cn.lili.common.utils.BeanUtil; import cn.lili.common.utils.StringUtils; @@ -53,6 +56,10 @@ public class AdminUserServiceImpl extends ServiceImpl