1. 参考文章:
2. 目前我的系统设计:(浏览器ajax请求获取最新未读消息数量或者获取消息接口写在全局拦截器里面,每一次请求页面返回消息)
存取消息内容,toAll 表示是私信还是系统通知
消息读取记录
用户个人消息读取状态,现在没有使用hasRead这个字段,读取的消息直接插入到t_inform_record表中了,如果使用这个字段就不需要t_inform_record表了,可以参考上面的博文
3. 处理未读已读消息(我的)
1. 未读消息
<sql id="getUnreadInformMessage">
SELECT i.*
FROM t_inform i, u_user_inform ui
WHERE (i.toAll=1 OR (i.toAll=0 AND ui.userid=? AND i.id= ui.informId))
AND ? NOT IN (SELECT irr1.userid FROM t_inform_read_record irr1 WHERE irr1.informId = i.id)
GROUP BY i.id
ORDER BY i.createTime DESC
</sql>
2. 所有消息,包含已读和未读
public List<Inform> getAllUserInform(String userId) {
String select = "SELECT i.*, IF(" + userId + " NOT IN (SELECT irr1.userid FROM t_inform_read_record irr1 WHERE irr1.informId = i.id), '未读', '已读') hasRead";
String expect = " FROM t_inform i, u_user_inform ui WHERE (i.toAll=1 OR (i.toAll=0 AND ui.userid=? AND i.id= ui.informId)) GROUP BY i.id order by i. createTime desc";
List<Inform> informList = dao.find(select + expect, userId);
return informList;
}
3. 设置消息已读
@Before({UserLoginInterceptor.class, TxReadCommitted.class})
public void setInformsHasRead() {
String userId = SessionKit.get(this).getUserId();
String[] informIds = getParaValues("informIds[]");
if (StringUtil.isEmpty(informIds)) {
renderJson(new Return(false, "参数错误!"));
return;
}
for (String aId : informIds) {
Record r = Db.findFirst("SELECT * FROM t_inform_read_record WHERE userid = ? AND informId = ?", userId, aId);
if (r == null) {
Db.save("t_inform_read_record", new Record()
.set("userid", userId)
.set("informId", aId)
.set("readTime", new Date()));
}
}
Inform.dao.clearAllCache();
renderJson(new Return(true, "操作成功!"));
}
4. 处理未读已读消息(参考上述博文做改进)
- 数据库设计
表名:Message
ID:编号;RecID:接收者编号;MessageID:站内信编号;Statue:站内信的查看状态
表名:MessageText
ID:编号;SendID:发送者编号;Message:站内信的内容;Type:信息类型;Group:用户组ID; PostDate:站内信发送时间
其中Status状态有未读、已读、删除
Type类型有Private(私信)、Public(公共消息)、Global(系统消息)
- 处理流程
Messgae表中RecId=自己ID 且Status=未读,显示为私信未读
Messgae表中RecId=自己ID 且Status=已读 且 Type=Private,显示为私信已读
Messgae表中未找到RecId=自己ID 且 MessageText中(Type=Public 和Group=自己所在组 )
的消息ID不包含在Messgae的MessageID中,显示为公共消息未读
Messgae表中找到RecId=自己ID 且 MessageText中(Type=Public ) 的消息ID包含在Messgae的MessageID中 ,显示为公共消息已读
Messgae表中未找到RecId=自己ID 且 MessageText中(Type=Global ) 的消息ID不包含在Messgae的MessageID中 ,显示为系统消息未读
Messgae表中找到RecId=自己ID 且 MessageText中(Type=Global ) 的消息ID包含在Messgae的MessageID中 ,显示为系统消息已读