私信列表: (1)查询当前用户的会话列表,每个会话只显示一条最新的私信。 (2)支持分页显示。 私信详情: (1)查询某个会话所包含的私信。 (2)支持分页显示。 在entity包下新建Message类,在dao包下新建MessageMapper接口类,添加
//查询当前用户的会话列表,针对每个会话只返回一条最新的私信。 List<Message> selectConversations(int userId, int offset, int limit); //查询当前用户的会话数量。 int selectConversationCount(int userId); //查询某个会话所包含的私信列表 List<Message> selectLetters(String conversationId, int offset, int limit); //查询某个会话所包含的私信数量。 int selectLetterCount(String conversationId); //查询未读私信的数量 int selectLetterUnreadCount(int userId,String conversationId);在message-mapper.xml里,添加
<select id="selectConversations" resultType="Message"> select <include refid="selectFields"></include> from message where id in ( select max(id) from message where status != 2 and from_id != 1 and (from_id = #{userId} or to_id = #{userId}) group by conversation_id ) order by id desc limit #{offset}, #{limit} </select> <select id="selectConversationCount" resultType="int"> select count(m.maxid) from( select max(id) as maxid from message where status != 2 and from_id != 1 and (from_id = #{userId} or to_id = #{userId}) group by conversation_id ) as m </select> <select id="selectLetters" resultType="Message"> select<include refid="selectFields"></include> from message where status != 2 and from_id != 1 and conversation_id = #{conversationId} order by id desc limit #{offset},#{limit} </select> <select id="selectLetterCount" resultType="int"> select count(id) from message where status != 2 and from_id != 1 and conversation_id = #{conversationId} </select> <select id="selectLetterUnreadCount" resultType="int"> select count(id) from message where status = 0 and from_id != 1 and to_id = #{userId} <if test="conversationId!=null"> and conversation_id = #{conversationId} </if> </select>此时可以在MapperTests测试类里对MessageMapper里的方法进行测试
@Test public void testSelectLetters(){ List<Message> list = messageMapper.selectConversations(111,0,20); //offset为0表示查第一页,limit为20表示一页内显示的最大数目 for(Message message:list){ System.out.println(message); } int count = messageMapper.selectConversationCount(111); System.out.println(count); list = messageMapper.selectLetters("111_112",0,10); for(Message message:list){ System.out.println(message); } count = messageMapper.selectLetterCount("111_112"); System.out.println(count); count = messageMapper.selectLetterUnreadCount(131,"111_131"); System.out.println(count); }没有问题之后,在MesssageService类里,添加
public List<Message> findConversations(int userId,int offset, int limit){ return messageMapper.selectConversations(userId,offset,limit); } public int findConversationCount(int userId){ return messageMapper.selectConversationCount(userId); } public List<Message> findLetters(String conversationId, int offset, int limit){ return messageMapper.selectLetters(conversationId,offset,limit); } public int findLetterCount(String conversationId){ return messageMapper.selectLetterCount(conversationId); } public int findLetterUnreadCount(int userId, String conversationId){ return messageMapper.selectLetterUnreadCount(userId,conversationId); }在MessageController类里,添加
// 私信列表 @RequestMapping(path = "/letter/list",method = RequestMethod.GET) public String getLetterList(Model model, Page page){ User user =hostHolder.getUser(); //分页信息 page.setLimit(5); page.setPath("/letter/list"); page.setRows(messageService.findConversationCount(user.getId())); //会话列表 List<Message> conversationList = messageService.findConversations( user.getId(),page.getOffset(),page.getLimit()); List<Map<String,Object>> conversations = new ArrayList<>(); if(conversationList != null){ for(Message message:conversationList){ Map<String,Object> map = new HashMap<>(); map.put("conversation",message); map.put("letterCount",messageService.findLetterCount(message.getConversationId())); map.put("unreadCount",messageService.findLetterUnreadCount(user.getId(),message.getConversationId())); int targetId = user.getId() == message.getFromId()?message.getToId():message.getFromId(); map.put("target",userService.findUserById(targetId)); conversations.add(map); } } model.addAttribute("conversations",conversations); //查询未读消息数量 int letterUnreadCount = messageService.findLetterUnreadCount(user.getId(),null); model.addAttribute("letterUnreadCount",letterUnreadCount); int noticeUnreadCount = messageService.findNoticeUnreadCount(user.getId(),null); model.addAttribute("noticeUnreadCount",noticeUnreadCount); //后来添加的 return "/site/letter"; }在index.html里,把消息的链接改成对应的,在letter.html里,把会话列表相关内容该为对应的。
再完成私信列表的功能。在MessageController类里添加
public String getLetterDetail(@PathVariable("conversationId") String conversationId,Page page,Model model){ //分页信息 page.setLimit(5); page.setPath("/letter/detail/"+conversationId); page.setRows(messageService.findLetterCount(conversationId)); //私信列表 List<Message> letterList = messageService.findLetters(conversationId,page.getOffset(),page.getLimit()); List<Map<String,Object>> letters = new ArrayList<>(); if(letterList!=null){ for(Message message:letterList){ Map<String,Object> map = new HashMap<>(); map.put("letter",message); map.put("fromUser",userService.findUserById(message.getFromId())); letters.add(map); } } model.addAttribute("letters",letters); //私信目标 model.addAttribute("target",getLetterTarget(conversationId)); //设置已读 List<Integer> ids = getLetterIds(letterList); //获取未读消息 if(!ids.isEmpty()){ messageService.readMessage(ids); } return "/site/letter-detail"; } private User getLetterTarget(String conversationId){ String[] ids= conversationId.split("_"); int id0 = Integer.parseInt(ids[0]); int id1 = Integer.parseInt(ids[1]); if(hostHolder.getUser().getId() == id0){ return userService.findUserById(id1); }else{ return userService.findUserById(id0); } }在letter.html里,把私信列表的链接改成对应的,在letter-detail.html里,把私信列表相关内容该为对应的,并为返回按钮添加一个back方法的js脚本。