发送私信: (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); }