仿牛客网社区项目(十八)发送私信
发送私信
- 发送私信
- 采用异步的方式发送私信。
- 发送成功后刷新私信列表。
- 设置已读
- 访问私信详情时, 将显示的私信设置为已读状态。
还是以数据层业务层和表现层的顺序开发。
数据层
首先在MessageMapper里新增两个方法,一个新增消息,一个修改消息状态的方法。
//新增消息
int insertMessage(Message message);
//修改状态
int updateStatus(List<Integer> ids,int status);
12345
然后在message_mapper.xml里面实现这两个方法。
<sql id="insertFields">
from_id,to_id,conversation_id,content,status,create_time
</sql>
<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>
业务层
业务层很简单,主要就是过滤一个html标签和敏感词
//更改未读已读消息
public int readMessage(List<Integer> ids) {
return messageMapper.updateStatus(ids, 1);
}
public int addMessage(Message message) {
message.setContent(HtmlUtils.htmlEscape(message.getContent()));
message.setContent(sensitiveFilter.filter(message.getContent()));
return messageMapper.insert(message);
}
表现层
首先是发送私信方法。这里我们需要补充一个方法,用户发送私信的时候肯定只知道用户名,所以在userService里新增一个用户名查找的方法。
public User findUserByName(String username){
return this.baseMapper.selectOne(new QueryWrapper<User>().eq("username", username));
}
接收前端传来的用户名和内容,创建message对象,补充相关内容,拼接conversationId的时候把小的拼在前面。
@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);
}
然后实现把未读消息改成已读。
在之前写的加载消息列表的方法里补充一下。首先写一个方法获取所有未读消息的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;
}
1234567891011
然后在getLetterDetail方法里加上
//设置已读
List<Integer> ids =getLetterIds(letterList);
if (!ids.isEmpty()){
messageService.readMessage(ids);
}
运行看一下效果,我用aaa账号发送给langsam账号几条消息。
切换到langsam账号,可以看到3条未读消息,点进去
点进去过后,未读标识就没有了。

浙公网安备 33010602011771号