瀏覽代碼

新增获取聊天列表功能

fangzhen 8 月之前
父節點
當前提交
23683f74a7

+ 2 - 3
ruoyi-framework/src/main/java/com/ruoyi/framework/webSocket/WebSocketServer.java

@@ -146,14 +146,14 @@ public class WebSocketServer {
         Authentication authentication = (Authentication) session.getUserPrincipal();
         LOGGER.info("收到来自" + sid + "的信息:" + message);
         // 实时更新
-        this.refresh(sid, authentication,message);
+        this.refresh(sid, authentication, message);
         WebSocketUsers.sendMessageToUserByText(session, "成功发送一条消息");
     }
 
     /**
      * 刷新定时任务,发送信息
      */
-    private void refresh(String userId, Authentication authentication,String message) {
+    private void refresh(String userId, Authentication authentication, String message) {
 //        this.start(5000L, task -> {
 //            // 判断用户是否在线,不在线则不用处理,因为在内部无法关闭该定时任务,所以通过返回值在外部进行判断。
 //            if (WebSocketServer.isConn(userId)) {
@@ -293,7 +293,6 @@ public class WebSocketServer {
                     break;
 
             }
-            //存储历史消息
             chatMsgService.save(chatMsg);
         }
         return chatMsg;

+ 22 - 0
ruoyi-generator/src/main/java/com/ruoyi/generator/controller/CommunityChatMsgController.java

@@ -1,10 +1,12 @@
 package com.ruoyi.generator.controller;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.ruoyi.common.core.controller.BaseController;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.system.domain.CommunityChatMsg;
+import com.ruoyi.system.domain.vo.SysUserVo;
 import com.ruoyi.system.service.ICommunityChatMsgService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -14,6 +16,7 @@ import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * 聊天记录
@@ -42,6 +45,25 @@ public class CommunityChatMsgController extends BaseController {
                 .eq("sender_id", otherUserId)
                 .eq("receiver_id", userId)
                 .orderByDesc("create_time"));
+        //更新该消息标记为已读
+        List<Long> msgId = chatMsgList.stream()
+                .filter(item -> !item.isRead())
+                .map(CommunityChatMsg::getId)
+                .collect(Collectors.toList());
+        CommunityChatMsg chatMsg = new CommunityChatMsg();
+        chatMsg.setRead(true);
+        communityChatMsgService.update(chatMsg, new UpdateWrapper<CommunityChatMsg>().in("id", msgId));
         return AjaxResult.success(chatMsgList);
     }
+
+    /**
+     * 获取当前登录用户聊天记录
+     */
+    @ApiOperation("获取当前登录用户聊天列表")
+    @GetMapping("/list")
+    public AjaxResult chatList() {
+        Long userId = SecurityUtils.getUserId();
+        List<SysUserVo> sysUserChatVos = communityChatMsgService.getChatListWithLatestMessage(userId);
+        return AjaxResult.success(sysUserChatVos);
+    }
 }

+ 3 - 0
ruoyi-system/src/main/java/com/ruoyi/system/domain/CommunityChatMsg.java

@@ -3,6 +3,8 @@ package com.ruoyi.system.domain;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import lombok.Data;
 import org.hibernate.validator.constraints.Length;
 
@@ -24,6 +26,7 @@ public class CommunityChatMsg implements Serializable {
     */
     @NotNull(message="[唯一Id]不能为空")
     @TableId("id")
+    @JsonSerialize(using = ToStringSerializer.class)
     private Long id;
     /**
     * 内容

+ 25 - 0
ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/SysUserVo.java

@@ -0,0 +1,25 @@
+package com.ruoyi.system.domain.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class SysUserVo {
+    //用户id
+    private Long id;
+    //用户名
+    private String nickName;
+    //用户头像
+    private String avatar;
+    //最新消息发送者名称
+    private String senderNickName;
+    //是否已读
+    private boolean isRead;
+    //最新消息信息时间
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date msgTime;
+    //最新一条消息内容
+    private String msg;
+}

+ 10 - 0
ruoyi-system/src/main/java/com/ruoyi/system/mapper/CommunityChatMsgMapper.java

@@ -2,8 +2,18 @@ package com.ruoyi.system.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.ruoyi.system.domain.CommunityChatMsg;
+import com.ruoyi.system.domain.vo.SysUserVo;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 @Mapper
 public interface CommunityChatMsgMapper extends BaseMapper<CommunityChatMsg> {
+    /**
+     * 获取登录用户的聊天列表
+     * @param userId
+     * @return
+     */
+    List<SysUserVo> getChatListWithLatestMessage(@Param("userId") Long userId);
 }

+ 5 - 3
ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java

@@ -1,15 +1,17 @@
 package com.ruoyi.system.mapper;
 
-import java.util.List;
-import org.apache.ibatis.annotations.Param;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.ruoyi.common.core.domain.entity.SysUser;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * 用户表 数据层
  * 
  * @author ruoyi
  */
-public interface SysUserMapper
+public interface SysUserMapper extends BaseMapper<SysUser>
 {
     /**
      * 根据条件分页查询用户列表

+ 10 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/ICommunityChatMsgService.java

@@ -2,6 +2,16 @@ package com.ruoyi.system.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.system.domain.CommunityChatMsg;
+import com.ruoyi.system.domain.vo.SysUserVo;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 public interface ICommunityChatMsgService extends IService<CommunityChatMsg> {
+    /**
+     * 获取登录用户的聊天列表
+     * @param userId 用户id
+     * @return 用户聊天列表
+     */
+    List<SysUserVo> getChatListWithLatestMessage(@Param("userId") Long userId);
 }

+ 17 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/CommunityChatMsgServiceImpl.java

@@ -2,10 +2,27 @@ package com.ruoyi.system.service.impl;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.system.domain.CommunityChatMsg;
+import com.ruoyi.system.domain.vo.SysUserVo;
 import com.ruoyi.system.mapper.CommunityChatMsgMapper;
 import com.ruoyi.system.service.ICommunityChatMsgService;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.Resource;
+import java.util.List;
+
 @Service
 public class CommunityChatMsgServiceImpl extends ServiceImpl<CommunityChatMsgMapper, CommunityChatMsg> implements ICommunityChatMsgService {
+
+    @Resource
+    private CommunityChatMsgMapper communityChatMsgMapper;
+
+    /**
+     * 获取登录用户的聊天列表
+     * @param userId 用户id
+     * @return 用户聊天列表
+     */
+    @Override
+    public List<SysUserVo> getChatListWithLatestMessage(Long userId) {
+        return communityChatMsgMapper.getChatListWithLatestMessage(userId);
+    }
 }

+ 35 - 0
ruoyi-system/src/main/resources/mapper/system/CommunityChatMsgMapper.xml

@@ -0,0 +1,35 @@
+<?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.ruoyi.system.mapper.CommunityChatMsgMapper">
+	<select id="getChatListWithLatestMessage" parameterType="java.lang.Long" resultType="com.ruoyi.system.domain.vo.SysUserVo">
+        SELECT u.user_id                                                             AS id,
+               u.nick_name as nickName,
+               u.avatar as avatar,
+               (SELECT u2.nick_name from sys_user u2 where u2.user_id = r.sender_id) as senderNickName,
+               r.content                                                             AS msg,
+               r.create_time                                                         AS msgTime
+        FROM (SELECT CASE
+                         WHEN sender_id = #{userId} THEN receiver_id
+                         ELSE sender_id
+                         END          AS chat_user_id,
+                     MAX(create_time) AS latest_time
+              FROM community_chat_msg
+              WHERE sender_id = #{userId}
+                 OR receiver_id = #{userId}
+              GROUP BY chat_user_id) latest
+                 JOIN community_chat_msg r ON
+            (
+                (r.sender_id = #{userId}
+                     AND r.receiver_id = latest.chat_user_id
+                    OR
+                 r.sender_id = latest.chat_user_id
+                     AND r.receiver_id = #{userId})
+                    AND r.create_time = latest.latest_time
+                )
+                 JOIN sys_user u ON
+            u.user_id = latest.chat_user_id
+        ORDER BY latest.latest_time DESC
+    </select>
+</mapper>