@Mapper
public interface MessageMapper {
// 查询当前用户的会话列表,针对每个会话只返回一条最新的私信
List selectConversations(int userId, int offset, int limit);
// 查询当前用户的会话数量
int selectConversationCount(int userId);
// 查询某个会话所包含的私信列表
List selectLetters(String conversationId, int offset, int limit);
// 查询某个会话所包含的私信数量
int selectLetterCount(String conversationId);
// 查询未读私信的数量
int selectLetterUnreadCount(int userId, String conversationId);
}
message-mapper.xml
id
, from_id, to_id, conversation_id, content, status, create_time
from_id
, to_id, conversation_id, content, status, create_time
select
from message
where id in (
select max(id) from message
where status != 2
and from_id != 1
and (from_id = #{userId} or to_id = #{userId})
group by conversation_id
)
order by id desc
limit #{offset}, #{limit}
业务层
@Service
public class MessageService {
@Autowired
private MessageMapper messageMapper;
// 查询当前用户的会话列表,针对每个会话只返回一条最新的私信
public List findConversations(int userId, int offset, int limit) {
return messageMapper.selectConversations(userId, offset, limit);
}
// 查询当前用户的会话数量
public int findConversationCount(int userId) {
return messageMapper.selectConversationCount(userId);
}
// 查询某个会话所包含的私信列表
public List findLetters(String conversationId, int offset, int limit) {
return messageMapper.selectLetters(conversationId, offset, limit);
}
// 查询某个会话所包含的私信数量
public int findLetterCount(String conversationId) {
return messageMapper.selectLetterCount(conversationId);
}
// 查询未读私信的数量
public int findLetterUnreadCount(int userId, String conversationId) {
return messageMapper.selectLetterUnreadCount(userId, conversationId);
}
}
控制层
@Controller
public class MessageController {
@Autowired
private MessageService messageService;
@Autowired
private HostHolder hostHolder;
@Autowired
private UserService userService;
// 私信列表
@RequestMapping(path = "/letter/list", method = RequestMethod.GET)
public String getLetterList(Model model, Page page) {
User user = hostHolder.getUser();
// 设置分页信息
page.setLimit(5);
page.setPath("/letter/list");
page.setRows(messageService.findConversationCount(user.getId())); // 会话数量
// 会话列表
List conversationList = messageService.findConversations(user.getId(), page.getOffset(), page.getLimit());
List
发送私信
业务层
UserService.java
// 根据用户名查询用户信息
public User findUserByName(String username) {
return userMapper.selectByName(username);
}
MessageService.java
// 添加消息
public int addMessage(Message message) {
// 对消息的特殊字符进行转义
message.setContent(HtmlUtils.htmlEscape(message.getContent()));
// 对消息的敏感词进行过滤
message.setContent(sensitiveFilter.filter(message.getContent()));
return messageMapper.insertMessage(message);
}
// 将消息变成已读状态
public int readMessage(List ids) {
return messageMapper.updateStatus(ids, 1); // 1表示已读
}
控制层
MessageController.java
// 会话内容
@RequestMapping(path = "/letter/detail/{conversationId}", method = RequestMethod.GET)
public String getLetterDetail(@PathVariable("conversationId") String conversationId, Page page, Model model) {
// 设置分页信息
page.setLimit(5);
page.setPath("/letter/detail/" + conversationId);
page.setRows(messageService.findLetterCount(conversationId)); // 某个会话的私信数量
// 会话所包含的私信列表
List letterList = messageService.findLetters(conversationId, page.getOffset(), page.getLimit());
List> letters = new ArrayList<>();
if (letterList != null) {
for (Message message : letterList) {
Map map = new HashMap<>();
map.put("letter", message);
map.put("fromUser", userService.findUserById(message.getFromId()));
letters.add(map);
}
}
model.addAttribute("letters", letters);
// 查询私信目标
model.addAttribute("target", getLetterTarget(conversationId));
// 设置为已读
List ids = getLetterIds(letterList);
if (!ids.isEmpty()) {
messageService.readMessage(ids);
}
return "/site/letter-detail";
}
// 返回一个会话里面未读的消息id的集合
private List getLetterIds(List letterList) {
List ids = new ArrayList<>();
if (letterList != null) {
for (Message message : letterList) {
// 判断当前用户是不是接收者,并且消息处于未读状态
if (hostHolder.getUser().getId() == message.getToId() && message.getStatus() == 0) {
ids.add(message.getId());
}
}
}
return ids;
}