完成会话列表查询

This commit is contained in:
KilLze
2026-01-07 02:58:44 +08:00
parent 5e1f3b7e8a
commit f6769c8c69
12 changed files with 121 additions and 115 deletions

View File

@@ -7,6 +7,7 @@ import com.bao.dating.context.UserContext;
import com.bao.dating.pojo.dto.ChatCursorPageDTO; import com.bao.dating.pojo.dto.ChatCursorPageDTO;
import com.bao.dating.pojo.dto.ChatHistoryQueryDTO; import com.bao.dating.pojo.dto.ChatHistoryQueryDTO;
import com.bao.dating.pojo.vo.ChatRecordsVO; import com.bao.dating.pojo.vo.ChatRecordsVO;
import com.bao.dating.pojo.vo.ChatSessionsVO;
import com.bao.dating.service.ChatService; import com.bao.dating.service.ChatService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -46,5 +47,14 @@ public class ChatController {
return Result.success(ResultCode.SUCCESS, "获取聊天记录成功", history); return Result.success(ResultCode.SUCCESS, "获取聊天记录成功", history);
} }
/**
* 获取会话列表
* @return 会话列表
*/
@GetMapping("/sessions")
public Result<List<ChatSessionsVO>> getSessionList() {
Long currentUserId = UserContext.getUserId();
List<ChatSessionsVO> list = chatService.getSessionList(currentUserId);
return Result.success(ResultCode.SUCCESS, "获取会话列表成功", list);
}
} }

View File

@@ -4,12 +4,11 @@ import com.bao.dating.anno.Log;
import com.bao.dating.common.Result; import com.bao.dating.common.Result;
import com.bao.dating.common.ResultCode; import com.bao.dating.common.ResultCode;
import com.bao.dating.context.UserContext; import com.bao.dating.context.UserContext;
import com.bao.dating.pojo.dto.UserInfoUpdateDTO; import com.bao.dating.pojo.dto.UserInfoDTO;
import com.bao.dating.pojo.dto.UserLoginDTO; import com.bao.dating.pojo.dto.UserLoginDTO;
import com.bao.dating.pojo.vo.UserInfoVO; import com.bao.dating.pojo.vo.UserInfoVO;
import com.bao.dating.pojo.vo.UserLoginVO; import com.bao.dating.pojo.vo.UserLoginVO;
import com.bao.dating.service.UserService; import com.bao.dating.service.UserService;
import io.jsonwebtoken.Jwt;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
@@ -91,7 +90,7 @@ public class UserController {
*/ */
@Log @Log
@PostMapping("/info/update") @PostMapping("/info/update")
public Result<UserInfoVO> userInfoUpdate(@RequestBody UserInfoUpdateDTO userInfoUpdateDTO) { public Result<UserInfoVO> userInfoUpdate(@RequestBody UserInfoDTO userInfoUpdateDTO) {
Long userId = UserContext.getUserId(); Long userId = UserContext.getUserId();
userInfoUpdateDTO.setUserId(userId); userInfoUpdateDTO.setUserId(userId);
UserInfoVO userInfoVO =userService.updateUserInfo(userInfoUpdateDTO); UserInfoVO userInfoVO =userService.updateUserInfo(userInfoUpdateDTO);

View File

@@ -6,35 +6,24 @@ import com.bao.dating.pojo.entity.ChatSessions;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import java.util.List;
@Mapper @Mapper
public interface ChatSessionsMapper { public interface ChatSessionsMapper {
/**
* 如果发送方不存在会话则创建
* @param chatSessions 会话
* @return 影响行数
*/
int insertIfNotExistsForSender(ChatSessions chatSessions);
/** /**
* 如果接收方不存在会话则创建 * 如果发送方存在会话则更新,不存在则创建
* @param chatSessions 会话 * @param chatSessions 会话
* @return 影响行数 * @return 影响行数
*/ */
int insertIfNotExistsForReceiver(ChatSessions chatSessions); int upsertSessionForSender(ChatSessions chatSessions);
/** /**
* 更新发送方的会话信息 * 如果接收方存在会话则更新,不存在则创建
* @param chatSessions 会话 * @param chatSessions 会话
* @return 影响行数 * @return 影响行数
*/ */
int updateSessionForSender(ChatSessions chatSessions); int upsertSessionForReceiver(ChatSessions chatSessions);
/**
* 更新接收方的会话信息
* @param chatSessions 会话
* @return 影响行数
*/
int updateSessionForReceiver(ChatSessions chatSessions);
/** /**
* 清空会话的未读数 * 清空会话的未读数
@@ -46,4 +35,11 @@ public interface ChatSessionsMapper {
@Param("userId") Long userId, @Param("userId") Long userId,
@Param("targetUserId") Long targetUserId @Param("targetUserId") Long targetUserId
); );
/**
* 查询当前用户的会话列表
* @param userId 当前用户ID
* @return 会话列表
*/
List<ChatSessions> selectSessionsByUserId(@Param("userId") Long userId);
} }

View File

@@ -1,6 +1,6 @@
package com.bao.dating.mapper; package com.bao.dating.mapper;
import com.bao.dating.pojo.dto.UserInfoUpdateDTO; import com.bao.dating.pojo.dto.UserInfoDTO;
import com.bao.dating.pojo.entity.User; import com.bao.dating.pojo.entity.User;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
@@ -31,6 +31,6 @@ public interface UserMapper {
* 更新用户信息 * 更新用户信息
* @param userInfoUpdateDTO 用户信息更新参数 * @param userInfoUpdateDTO 用户信息更新参数
*/ */
void updateUserInfoByUserId(UserInfoUpdateDTO userInfoUpdateDTO); void updateUserInfoByUserId(UserInfoDTO userInfoUpdateDTO);
} }

View File

@@ -8,11 +8,11 @@ import java.time.LocalDateTime;
import java.util.List; import java.util.List;
/** /**
* 用户信息更新数据传输对象 * 用户信息数据传输对象
* @author KilLze * @author KilLze
*/ */
@Data @Data
public class UserInfoUpdateDTO implements Serializable { public class UserInfoDTO implements Serializable {
private Long userId; private Long userId;
private String userName; private String userName;
private String nickname; private String nickname;

View File

@@ -1,13 +0,0 @@
package com.bao.dating.pojo.dto;
import lombok.Data;
/**
* 用户昵称数据传输对象
* @author KilLze
*/
@Data
public class UserNicknameDTO {
private Long userId;
private String nickname;
}

View File

@@ -13,20 +13,18 @@ public class ChatSessionsVO {
/** 会话ID */ /** 会话ID */
private Long sessionId; private Long sessionId;
/** 当前用户ID */
private Long userId;
/** 对方用户ID */ /** 对方用户ID */
private Long targetUserId; private Long targetUserId;
/** 会话名称 */ /** 会话名称 */
private String sessionName; private String sessionName;
/** 对方用户头像 */
private String avatarUrl;
/** 最后一条消息内容 */ /** 最后一条消息内容 */
private String lastMessageContent; private String lastMessageContent;
/** 最后一条消息时间 */ /** 最后一条消息时间 */
private LocalDateTime lastMessageTime; private LocalDateTime lastMessageTime;
/** 未读消息数量 */ /** 未读消息数量 */
private Integer unreadCount; private Integer unreadCount;
/** 会话状态 */
private Integer sessionStatus;
/** 置顶状态 */ /** 置顶状态 */
private Integer topStatus; private Integer topStatus;
/** 免打扰状态 */ /** 免打扰状态 */

View File

@@ -4,6 +4,7 @@ import com.bao.dating.common.result.PageResult;
import com.bao.dating.pojo.dto.ChatHistoryQueryDTO; import com.bao.dating.pojo.dto.ChatHistoryQueryDTO;
import com.bao.dating.pojo.dto.ChatRecordSendDTO; import com.bao.dating.pojo.dto.ChatRecordSendDTO;
import com.bao.dating.pojo.vo.ChatRecordsVO; import com.bao.dating.pojo.vo.ChatRecordsVO;
import com.bao.dating.pojo.vo.ChatSessionsVO;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.List; import java.util.List;
@@ -35,4 +36,11 @@ public interface ChatService {
* @param targetUserId 目标用户ID * @param targetUserId 目标用户ID
*/ */
void markChatMessagesAsRead(Long currentUserId, Long targetUserId); void markChatMessagesAsRead(Long currentUserId, Long targetUserId);
/**
* 获取会话列表
* @param currentUserId 当前用户ID
* @return 会话列表
*/
List<ChatSessionsVO> getSessionList(Long currentUserId);
} }

View File

@@ -1,8 +1,7 @@
package com.bao.dating.service; package com.bao.dating.service;
import com.bao.dating.pojo.dto.UserInfoUpdateDTO; import com.bao.dating.pojo.dto.UserInfoDTO;
import com.bao.dating.pojo.dto.UserLoginDTO; import com.bao.dating.pojo.dto.UserLoginDTO;
import com.bao.dating.pojo.dto.UserNicknameDTO;
import com.bao.dating.pojo.vo.UserInfoVO; import com.bao.dating.pojo.vo.UserInfoVO;
import com.bao.dating.pojo.vo.UserLoginVO; import com.bao.dating.pojo.vo.UserLoginVO;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
@@ -52,12 +51,12 @@ public interface UserService {
* @param userInfoUpdateDTO 用户信息 * @param userInfoUpdateDTO 用户信息
* @return 更新后的用户信息 * @return 更新后的用户信息
*/ */
UserInfoVO updateUserInfo(UserInfoUpdateDTO userInfoUpdateDTO); UserInfoVO updateUserInfo(UserInfoDTO userInfoUpdateDTO);
/** /**
* 根据用户ID查询用户昵称 * 根据用户ID查询用户信息
* @param userId 用户ID * @param userId 用户ID
* @return 用户 * @return 用户
*/ */
UserNicknameDTO getUserNicknameById(Long userId); UserInfoDTO getUserInfoById(Long userId);
} }

View File

@@ -1,19 +1,17 @@
package com.bao.dating.service.impl; package com.bao.dating.service.impl;
import com.bao.dating.common.result.PageResult;
import com.bao.dating.mapper.ChatRecordsMapper; import com.bao.dating.mapper.ChatRecordsMapper;
import com.bao.dating.mapper.ChatSessionsMapper; import com.bao.dating.mapper.ChatSessionsMapper;
import com.bao.dating.pojo.dto.ChatHistoryQueryDTO; import com.bao.dating.pojo.dto.ChatHistoryQueryDTO;
import com.bao.dating.pojo.dto.ChatMarkReadDTO; import com.bao.dating.pojo.dto.ChatMarkReadDTO;
import com.bao.dating.pojo.dto.ChatRecordSendDTO; import com.bao.dating.pojo.dto.ChatRecordSendDTO;
import com.bao.dating.pojo.dto.UserNicknameDTO; import com.bao.dating.pojo.dto.UserInfoDTO;
import com.bao.dating.pojo.entity.ChatRecords; import com.bao.dating.pojo.entity.ChatRecords;
import com.bao.dating.pojo.entity.ChatSessions; import com.bao.dating.pojo.entity.ChatSessions;
import com.bao.dating.pojo.vo.ChatRecordsVO; import com.bao.dating.pojo.vo.ChatRecordsVO;
import com.bao.dating.pojo.vo.ChatSessionsVO;
import com.bao.dating.service.ChatService; import com.bao.dating.service.ChatService;
import com.bao.dating.service.UserService; import com.bao.dating.service.UserService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -63,13 +61,13 @@ public class ChatServiceImpl implements ChatService {
// 插入消息记录 // 插入消息记录
chatRecordsMapper.insert(record); chatRecordsMapper.insert(record);
// 创建接收方会话 // 创建发送方会话
ChatSessions sessions = new ChatSessions(); ChatSessions sessions = new ChatSessions();
sessions.setUserId(senderUserId); sessions.setUserId(senderUserId);
sessions.setTargetUserId(dto.getReceiverUserId()); sessions.setTargetUserId(dto.getReceiverUserId());
// 获取接收方昵称作为发送方会话名称 // 获取接收方昵称作为发送方会话名称
try { try {
UserNicknameDTO receiverNicknameInfo = userService.getUserNicknameById(dto.getReceiverUserId()); UserInfoDTO receiverNicknameInfo = userService.getUserInfoById(dto.getReceiverUserId());
if (receiverNicknameInfo != null && receiverNicknameInfo.getNickname() != null) { if (receiverNicknameInfo != null && receiverNicknameInfo.getNickname() != null) {
sessions.setSessionName(receiverNicknameInfo.getNickname()); sessions.setSessionName(receiverNicknameInfo.getNickname());
} else { } else {
@@ -84,14 +82,13 @@ public class ChatServiceImpl implements ChatService {
sessions.setLastMessageContent(record.getMessageContent()); sessions.setLastMessageContent(record.getMessageContent());
sessions.setLastMessageTime(record.getSendTime()); sessions.setLastMessageTime(record.getSendTime());
chatSessionsMapper.insertIfNotExistsForSender(sessions); chatSessionsMapper.upsertSessionForSender(sessions);
chatSessionsMapper.updateSessionForSender(sessions);
// 创建接收方会话 // 创建接收方会话
sessions.setUserId(dto.getReceiverUserId()); sessions.setUserId(dto.getReceiverUserId());
sessions.setTargetUserId(senderUserId); sessions.setTargetUserId(senderUserId);
try { try {
UserNicknameDTO senderNicknameInfo = userService.getUserNicknameById(senderUserId); UserInfoDTO senderNicknameInfo = userService.getUserInfoById(senderUserId);
if (senderNicknameInfo != null && senderNicknameInfo.getNickname() != null) { if (senderNicknameInfo != null && senderNicknameInfo.getNickname() != null) {
sessions.setSessionName(senderNicknameInfo.getNickname()); sessions.setSessionName(senderNicknameInfo.getNickname());
} else { } else {
@@ -103,8 +100,8 @@ public class ChatServiceImpl implements ChatService {
sessions.setSessionName("用户" + senderUserId); sessions.setSessionName("用户" + senderUserId);
} }
chatSessionsMapper.insertIfNotExistsForReceiver(sessions); chatSessionsMapper.upsertSessionForReceiver(sessions);
chatSessionsMapper.updateSessionForReceiver(sessions);
@@ -158,4 +155,28 @@ public class ChatServiceImpl implements ChatService {
); );
} }
/**
* 获取会话列表
* @return 会话列表
*/
@Override
public List<ChatSessionsVO> getSessionList(Long currentUserId) {
List<ChatSessions> sessions = chatSessionsMapper.selectSessionsByUserId(currentUserId);
return sessions.stream().map(session -> {
ChatSessionsVO vo = new ChatSessionsVO();
BeanUtils.copyProperties(session, vo);
UserInfoDTO targetUser = userService.getUserInfoById(session.getTargetUserId());
if (targetUser != null){
vo.setSessionName(targetUser.getNickname());
vo.setAvatarUrl(targetUser.getAvatarUrl());
}else {
vo.setSessionName("用户" + session.getTargetUserId());
vo.setAvatarUrl(null);
}
return vo;
}).collect(Collectors.toList());
}
} }

View File

@@ -5,12 +5,10 @@ import com.bao.dating.common.aliyun.GreenImageScan;
import com.bao.dating.common.aliyun.GreenTextScan; import com.bao.dating.common.aliyun.GreenTextScan;
import com.bao.dating.common.result.AliOssResult; import com.bao.dating.common.result.AliOssResult;
import com.bao.dating.common.result.GreenAuditResult; import com.bao.dating.common.result.GreenAuditResult;
import com.bao.dating.config.RedisConfig;
import com.bao.dating.context.UserContext; import com.bao.dating.context.UserContext;
import com.bao.dating.mapper.UserMapper; import com.bao.dating.mapper.UserMapper;
import com.bao.dating.pojo.dto.UserInfoUpdateDTO; import com.bao.dating.pojo.dto.UserInfoDTO;
import com.bao.dating.pojo.dto.UserLoginDTO; import com.bao.dating.pojo.dto.UserLoginDTO;
import com.bao.dating.pojo.dto.UserNicknameDTO;
import com.bao.dating.pojo.entity.User; import com.bao.dating.pojo.entity.User;
import com.bao.dating.pojo.vo.UserInfoVO; import com.bao.dating.pojo.vo.UserInfoVO;
import com.bao.dating.pojo.vo.UserLoginVO; import com.bao.dating.pojo.vo.UserLoginVO;
@@ -232,7 +230,7 @@ public class UserServiceImpl implements UserService {
* @param userInfoUpdateDTO 用户信息更新参数 * @param userInfoUpdateDTO 用户信息更新参数
*/ */
@Override @Override
public UserInfoVO updateUserInfo(UserInfoUpdateDTO userInfoUpdateDTO) { public UserInfoVO updateUserInfo(UserInfoDTO userInfoUpdateDTO) {
Long userId = userInfoUpdateDTO.getUserId(); Long userId = userInfoUpdateDTO.getUserId();
User user = userMapper.selectByUserId(userId); User user = userMapper.selectByUserId(userId);
if (user == null) { if (user == null) {
@@ -314,19 +312,19 @@ public class UserServiceImpl implements UserService {
} }
/** /**
* 根据用户ID获取用户昵称 * 根据用户ID获取用户昵称和头像
* *
* @param userId 用户ID * @param userId 用户ID
* @return 用户昵称 * @return 用户昵称
*/ */
@Override @Override
public UserNicknameDTO getUserNicknameById(Long userId) { public UserInfoDTO getUserInfoById(Long userId) {
// 查询数据库获取昵称 // 查询数据库获取昵称
User user = userMapper.selectByUserId(userId); User user = userMapper.selectByUserId(userId);
if (user == null) { if (user == null) {
throw new RuntimeException("没有此用户"); throw new RuntimeException("没有此用户");
} }
UserNicknameDTO dto = new UserNicknameDTO(); UserInfoDTO dto = new UserInfoDTO();
dto.setUserId(user.getUserId()); dto.setUserId(user.getUserId());
dto.setNickname(user.getNickname()); dto.setNickname(user.getNickname());
return dto; return dto;

View File

@@ -3,61 +3,41 @@
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bao.dating.mapper.ChatSessionsMapper"> <mapper namespace="com.bao.dating.mapper.ChatSessionsMapper">
<!-- 如果发送方不存在会话则创建 --> <!-- 插入或更新发送方会话 -->
<insert id="insertIfNotExistsForSender" parameterType="com.bao.dating.pojo.entity.ChatSessions"> <insert id="upsertSessionForSender" parameterType="com.bao.dating.pojo.entity.ChatSessions">
INSERT INTO chat_sessions INSERT INTO chat_sessions
(user_id, target_user_id, session_name, last_message_id, last_message_content, last_message_time, (user_id, target_user_id, session_name, last_message_id, last_message_content, last_message_time,
unread_count, session_status, top_status, mute_status, created_at, updated_at) unread_count, session_status, top_status, mute_status, created_at, updated_at)
SELECT VALUES
(
#{userId}, #{targetUserId}, #{sessionName}, #{lastMessageId}, #{lastMessageContent}, #{lastMessageTime}, #{userId}, #{targetUserId}, #{sessionName}, #{lastMessageId}, #{lastMessageContent}, #{lastMessageTime},
0, 1, 0, 0, NOW(), NOW() 0, 1, 0, 0, NOW(), NOW()
FROM DUAL
WHERE NOT EXISTS (
SELECT 1 FROM chat_sessions
WHERE user_id = #{userId} AND target_user_id = #{targetUserId}
);
</insert>
<!-- 如果接收方不存在会话则创建 -->
<insert id="insertIfNotExistsForReceiver" parameterType="com.bao.dating.pojo.entity.ChatSessions">
INSERT INTO chat_sessions
(user_id, target_user_id, session_name, last_message_id, last_message_content, last_message_time,
unread_count, session_status, top_status, mute_status, created_at, updated_at)
SELECT
#{userId}, #{targetUserId}, #{sessionName}, #{lastMessageId}, #{lastMessageContent}, #{lastMessageTime},
0, 1, 0, 0, NOW(), NOW()
FROM DUAL
WHERE NOT EXISTS (
SELECT 1 FROM chat_sessions
WHERE user_id = #{userId} AND target_user_id = #{targetUserId}
) )
ON DUPLICATE KEY UPDATE
last_message_id = VALUES(last_message_id),
last_message_content = VALUES(last_message_content),
last_message_time = VALUES(last_message_time),
unread_count = 0,
updated_at = NOW();
</insert> </insert>
<!-- 更新发送方的会话信息 --> <!-- 插入或更新接收方会话 -->
<update id="updateSessionForSender" parameterType="com.bao.dating.pojo.entity.ChatSessions"> <insert id="upsertSessionForReceiver" parameterType="com.bao.dating.pojo.entity.ChatSessions">
UPDATE chat_sessions INSERT INTO chat_sessions
SET (user_id, target_user_id, session_name, last_message_id, last_message_content, last_message_time,
last_message_id = #{lastMessageId}, unread_count, session_status, top_status, mute_status, created_at, updated_at)
last_message_content = #{lastMessageContent}, VALUES
last_message_time = #{lastMessageTime}, (
unread_count = 0, #{userId}, #{targetUserId}, #{sessionName}, #{lastMessageId}, #{lastMessageContent}, #{lastMessageTime},
updated_at = NOW() 1, 1, 0, 0, NOW(), NOW()
WHERE user_id = #{userId} )
AND target_user_id = #{targetUserId}; ON DUPLICATE KEY UPDATE
</update> last_message_id = VALUES(last_message_id),
last_message_content = VALUES(last_message_content),
<!-- 更新接收方的会话信息 --> last_message_time = VALUES(last_message_time),
<update id="updateSessionForReceiver" parameterType="com.bao.dating.pojo.entity.ChatSessions">
UPDATE chat_sessions
SET
last_message_id = #{lastMessageId},
last_message_content = #{lastMessageContent},
last_message_time = #{lastMessageTime},
unread_count = unread_count + 1, unread_count = unread_count + 1,
updated_at = NOW() updated_at = NOW();
WHERE user_id = #{userId} </insert>
AND target_user_id = #{targetUserId}
</update>
<!-- 清空未读消息数 --> <!-- 清空未读消息数 -->
<update id="clearUnreadCount"> <update id="clearUnreadCount">
@@ -70,4 +50,14 @@
AND target_user_id = #{targetUserId} AND target_user_id = #{targetUserId}
AND session_status = 1 AND session_status = 1
</update> </update>
<!-- 查询会话列表 -->
<select id="selectSessionsByUserId" resultType="com.bao.dating.pojo.entity.ChatSessions">
SELECT session_id, target_user_id, session_name, last_message_content,
last_message_time, unread_count, top_status, mute_status
FROM chat_sessions
WHERE user_id = #{userId}
AND session_status = 1
ORDER BY top_status DESC, last_message_time DESC
</select>
</mapper> </mapper>