仿牛客网社区项目(十八)发送私信
发送私信
- 发送私信
- 采用异步的方式发送私信。
- 发送成功后刷新私信列表。
- 设置已读
- 访问私信详情时, 将显示的私信设置为已读状态。
还是以数据层业务层和表现层的顺序开发。
数据层#
首先在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条未读消息,点进去
点进去过后,未读标识就没有了。
分类:
仿牛客网社区项目
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署