私信列表
私信列表
-
查询当前用户的会话列表,每个会话只显示一条最新的私信
-
支持分页显示
1.首先根据数据库来添加一个会话的实体类(Message.java)、2.再根据功能需求定义需要的方法(MessageMapper)、3.编辑对应的 xml文件(message-mapper.xml)、4.设计业务层用于接收参数来实现功能(MessageService)、5.在表现层定义请求的路径,设计功能实现等(MessageController)、6.完成前端页面的调整
@Mapper
public interface MessageMapper {
//需要这么几个方法
//1.查询 当前用户的会话列表 的方法,针对每个会话只返回一条新的私信
List<Message> selectConversations(int userId, int offset, int limit);
//2.查询 当前用户的会话数量 的方法(用于分页)
int selectConversationCount(int userId);
//3.查询某个会话所包含的私信列表(用于开发详情页面时需要用到这个方法)
List<Message> selectLetters(String conversationId, int offset, int limit);
//4.查询某个会话所包含的私信数量
int selectLetterCount(String conversationId);
//5.查询未读消息私信数量
int selectLetterUnreadCount(int userId, String conversationId);
}
私信详情
- 查询某个会话所包含的私信
//3.查询某个会话所包含的私信列表(用于开发详情页面时需要用到这个方法)
public List<Message> findLetters(String conversationId, int offset, int limit) {
return messageMapper.selectLetters(conversationId, offset, limit);
}
//4.查询某个会话所包含的私信数量
public int findLetterCount(String conversationId) {
return messageMapper.selectLetterCount(conversationId);
}
//5.查询未读消息私信数量
public int findLetterUnreadCount(int userId, String conversationId) {
return messageMapper.selectLetterUnreadCount(userId, conversationId);
}
- 支持分页显示
//2.查询 当前用户的会话数量 的方法(用于分页)
public int findConversationCount(int userId) {
return messageMapper.selectConversationCount(userId);
}
发送私信
发送私信
- 采用异步的方式发送私信
// 新增一个消息
@RequestMapping(path = "/letter/send", method = RequestMethod.POST)
@ResponseBody
public String sendLetter(String toName, String content) {
//得到与我对话的目标
User target = userService.findUserByName(toName);
if (target == null) {
return CommunityUtil.getJSONString(1, "目标用户不存在!");
}
Message message = new Message();
message.setFromId(hostHolder.getUser().getId());
message.setToId(target.getId());
if (message.getFromId() < message.getToId()) {
message.setConversationId(message.getFromId() + "_" + message.getToId());
} else {
message.setConversationId(message.getToId() + "_" + message.getFromId());
}
message.setContent(content);
message.setCreateTime(new Date());
messageService.addMessage(message);
return CommunityUtil.getJSONString(0);
}
- 发送成功后刷新私信列表
//letter.js
function send_letter() {
$("#sendModal").modal("hide");
// 从页面上获取发送人和内容
var toName = $("#recipient-name").val();
var content = $("#message-text").val();
$.post(
CONTEXT_PATH + "/letter/send",
{"toName": toName, "content": content},
function (data) {
data = $.parseJson(data);
if (data.code == 0) {
$("#hintBody").text("发送成功!");
} else {
$("#hintBody").text(data.msg);
}
$("#hintModal").modal("show");
setTimeout(function () {
$("#hintModal").modal("hide");
location.reload();
}, 2000);
}
);
$("#hintModal").modal("show");
setTimeout(function () {
$("#hintModal").modal("hide");
location.reload();
}, 2000);
}
设置已读
- 访问私信详情时,将显示的私信设置为已读状态。
//MessageService
// 更改多个消息的状态(把未读的消息更改为已读) 的方法
// 在这里我可以套用方法,把用户注册状态修改完成!!!
public int readMessage(List<Integer> ids) {
return messageMapper.updateStatus(ids, 1);
}
//MessageController
//新增一个方法,作用为将未读的消息在读取之后改为已读
private List<Integer> getLetterIds(List<Message> letterList) {
List<Integer> 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;
}
// 这一部分为处理私信详情的代码块中
//将私信列表中未读的消息改成已读状态
List<Integer> ids = getLetterIds(letterList);
if (!ids.isEmpty()) {
messageService.readMessage(ids);
}
return "/site/letter-detail";