社区网站项目3.8 发送私信

    技术2022-07-11  126

      发送私信: (1)采用异步的方式发送私信。 (2)发送成功后刷新私信列表。   设置已读: (1)访问私信详情时,将显示的私信设置为已读状态。   在MessageMapper接口类里,添加

    //新增消息 int insertMessage(Message message); //修改消息的状态 int updateStatus(List<Integer> ids,int status);

      在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>

      在业务层MessageService类里,添加

    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); }

      在MessageController类里,添加

    @RequestMapping(path="/letter/send",method = RequestMethod.POST) @ResponseBody public String sendLetter(String toName, String content){ // Integer.valueOf("abc"); //造一个异步请求错误 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); //如果没有报错,则返回0表示发送消息成功 }

      因为MessageController类sendLetter方法里需要用到findUserByName,所以在UserService类里补充一个方法

    public User findUserByName(String username){ return userMapper.selectByName(username); }

      因为UserMapper里已经有这个方法了所以不用写数据访问层。

      在letter.html底下找到letter.js,在letter.js里,通过#sendBtn触发send_letter()函数,来调用CONTEXT_PATH + "/letter/send"方法。   在letter.detail.html里,对发给哪个人做动态处理。

    th:value="${target.username}"

      接下来设置已读动作,在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; }

      并且在getNoticeDetail方法里,在return “/site/notice-detail”;前加上

    //设置已读 List<Integer> ids = getLetterIds(noticeList); if(!ids.isEmpty()){ messageService.readMessage(ids); }
    Processed: 0.011, SQL: 9