1. 大体思路
①发送私信
- 采用异步的方式发送私信;
- 发送成功后,刷新私信列表。
②设置已读
- 访问私信详情时,将显示的私信设置为已读状态。
2. 数据层
①在 MessageMapper 中添加:
//添加私信
int insertMessage(Message message);
//将私信设置为已读(修改消息的状态)
int updateStatus(List<Integer> ids, int status);
②在message-mapper.xml 中添加:
<insert id="insertMessage" parameterType="Message" keyProperty="id">
insert into message(<include refid="insertFields"></include>)
values (#{fromId},#{toId},#{conversationId},#{content},#{status},#{createTime})
</insert>
<update id="updateStatus">
update message set status = #{status}
where id in
<foreach collection="ids" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</update>
3. 服务层
添加两个方法:
//添加私信
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<Integer> ids){
return messageMapper.updateStatus(ids,1);
}
4. 视图层
在 MessageController 中添加方法:
//发送私信
@RequestMapping(path = "/letter/send", method = RequestMethod.POST)
@ResponseBody
public String sendLettter(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);
}
//获取未读消息的id
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;
}