仿牛客网社区项目(十八)发送私信

发送私信

  • 发送私信
    • 采用异步的方式发送私信。
    • 发送成功后刷新私信列表。
  • 设置已读
    • 访问私信详情时, 将显示的私信设置为已读状态。

还是以数据层业务层和表现层的顺序开发。

数据层#

首先在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账号几条消息。

img

切换到langsam账号,可以看到3条未读消息,点进去

img

点进去过后,未读标识就没有了。

img

posted @   卷皇  阅读(343)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
点击右上角即可分享
微信分享提示
主题色彩