Selaa lähdekoodia

聊天代码优化

fangqing 5 kuukautta sitten
vanhempi
sitoutus
cc16623c9b

+ 2 - 3
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java

@@ -96,18 +96,17 @@ public class SysProfileController extends BaseController {
         }
 
         //查询用户是否还有修改性别的次数
-        SysUser sysUsers = userMapper.selectOne(
+       /* SysUser sysUsers = userMapper.selectOne(
                 new QueryWrapper<SysUser>()
                         .select("sex", "is_sex") // 选择 sex 和 is_sex 字段
                         .eq("user_id", currentUser.getUserId())
-
         );
 
         if (sysUsers.getIsSex() && !currentUser.getSex().equals(sysUsers.getSex())) {
             return error("不允许修改用户'" + loginUser.getUsername() + "'性别");
         } else if (currentUser.getSex().equals(sysUsers.getSex())) {
             currentUser.setSex(null);
-        }
+        }*/
 
         if (userService.updateUserProfile(currentUser) > 0) {
             CommunityUserInfo communityUserInfo = communityUserInfoMapper.selectOne(new QueryWrapper<CommunityUserInfo>().eq("user_id", currentUser.getUserId()));

+ 0 - 3
ruoyi-generator/src/main/java/com/ruoyi/generator/controller/CommunityCommentController.java

@@ -268,7 +268,6 @@ public class CommunityCommentController extends BaseController {
             if (Objects.isNull(communityCommentReply)) {
                 return AjaxResult.error("未找到该回复!");
             }
-
             Long userId = SecurityUtils.getUserId();
             communityCommentReply.setDelete(true);
             communityCommentReply.setUpdateBy(userId);
@@ -278,8 +277,6 @@ public class CommunityCommentController extends BaseController {
             System.out.println(e.getMessage());
             throw new ProjectException();
         }
-
-
         return AjaxResult.success("删除回复成功!");
     }
 

+ 66 - 62
ruoyi-system/src/main/resources/mapper/system/CommunityChatMsgMapper.xml

@@ -4,68 +4,72 @@ 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" resultType="com.ruoyi.system.domain.vo.SysUserVo">
-        SELECT r.id                                                                  as id,
-               u.nick_name                                                           as nickName,
-               u.user_name                                                           as username,
-               u.avatar                                                              as avatar,
-               (SELECT u2.nick_name from sys_user u2 where u2.user_id = r.sender_id) as senderNickName,
-               r.receiver_is_read                                                    as receiverIsRead,
-               r.receiver_id                                                         as receiverId,
-               r.sender_is_read                                                      as senderIsRead,
-               r.sender_id                                                           as senderId,
-               CASE
-                   WHEN  r.message_type = 1 THEN '[图片]'
-                   WHEN  r.message_type = 2 THEN '[语音]'
-                   WHEN  r.message_type = 3 THEN '[定位]'
-                   WHEN  r.message_type = 4 THEN '[视频]'
-                   ELSE r.content
-                   END AS msg,
-               r.create_time                                                         AS msgTime,
-               COALESCE(
-                       (
-                           SELECT num
-                           FROM (
-                                    SELECT sender_id, COUNT(*) AS num
-                                    FROM community_chat_msg
-                                    WHERE receiver_id = #{userId} AND receiver_is_read = '0' AND type = #{type}
-                                    GROUP BY sender_id
-                                ) A
-                           WHERE A.sender_id = r.sender_id
-                       ),
-                       0
-                   ) AS unreads
-        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})
-                and type = #{type}
-                and (
-                          (
-                                      sender_id = #{userId} AND (
-                                  is_delete IS NULL OR is_delete !=  1
-                                  )
-                              )
-                          OR (
-                                      receiver_id = #{userId} AND (
-                                  receiver_is_delete IS NULL OR receiver_is_delete !=   1
-                                  )
-                              )
-                  )
-              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 and r.type = #{type}
-            )
-                 JOIN sys_user u ON
-            u.user_id = latest.chat_user_id
-        ORDER BY latest.latest_time DESC
+        WITH LatestMessages AS (
+            SELECT r.id                                                                  as id,
+                   u.nick_name                                                           as nickName,
+                   u.user_name                                                           as username,
+                   u.avatar                                                              as avatar,
+                   (SELECT u2.nick_name
+                    FROM sys_user u2
+                    WHERE u2.user_id = r.sender_id) as senderNickName,
+                   r.receiver_is_read                                                    as receiverIsRead,
+                   r.receiver_id                                                         as receiverId,
+                   r.sender_is_read                                                      as senderIsRead,
+                   r.sender_id                                                           as senderId,
+                   CASE
+                       WHEN r.message_type = 1 THEN '[图片]'
+                       WHEN r.message_type = 2 THEN '[语音]'
+                       WHEN r.message_type = 3 THEN '[定位]'
+                       WHEN r.message_type = 4 THEN '[视频]'
+                       ELSE r.content
+                       END AS msg,
+                   r.create_time                                                         AS msgTime,
+                   COALESCE(
+                           (
+                               SELECT num
+                               FROM (
+                                        SELECT sender_id, COUNT(*) AS num
+                                        FROM community_chat_msg
+                                        WHERE receiver_id = #{userId} AND receiver_is_read = '0' AND type = #{type}
+                                        GROUP BY sender_id
+                                    ) A
+                               WHERE A.sender_id = r.sender_id
+                           ),
+                           0
+                       ) AS unreads
+            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})
+                       AND type = #{type}
+                       AND (
+                             (sender_id = #{userId} AND (is_delete IS NULL OR is_delete != 1))
+                             OR (receiver_id = #{userId} AND (receiver_is_delete IS NULL OR receiver_is_delete != 1))
+                         )
+                     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 AND r.type = #{type}
+                    )
+                     JOIN sys_user u ON u.user_id = latest.chat_user_id
+        ),
+             RankedMessages AS (
+                 SELECT *,
+                        ROW_NUMBER() OVER (PARTITION BY username ORDER BY msgTime DESC) as rn
+                 FROM LatestMessages
+             )
+        SELECT *
+        FROM RankedMessages
+        WHERE rn = 1
+        ORDER BY msgTime DESC;
     </select>
     <select id="getChatMsgRecord" resultType="com.ruoyi.system.domain.CommunityChatMsg">
         SELECT