BBS论坛项目相关-6:私信模块
功能
私信列表:
查询当前用户的会话列表
每个会话只显示一条最新的私信
支持分页显示
私信详情:
查询每个会话所包含的私信
支持分页查询
会话表:id,from_id,to_id,conversation_id(将id小的放在前面,大的放在后面,设置这一项的目的是为了以后直接通过会话id进行查询筛选),content,status(0-未读,1-已读,2-),create_time
私信列表
私信列表只显示最新的一条会话:按照conversation_id分组,查询条件:from_id = #{userId} or to_id = #{userId},且状态合法,from_id不为1的消息中id最大的那条消息就是最新消息。
from_id为1表示是系统发的通知
<sql id="insertFields">
from_id, to_id, conversation_id, content, status, create_time
</sql>
<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>
controller层:查询会话列表
先获取当前用户的信息,可直接从ThreadLocal中获取,然后根据用户id查询会话数量得到一个list集合,同样使用一个List<Map<String, Object>> conversations在遍历list的过程中,装载每个会话自身的信息以及每个会话的私信数量和未读私信数量、会话对象的用户信息(可显示与之对话的用户头像)等。装载总未读会话数
@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