java web 站内信 设计

1. 参考文章:

两年后,再议“站内信”的实现

2. 目前我的系统设计:(浏览器ajax请求获取最新未读消息数量或者获取消息接口写在全局拦截器里面,每一次请求页面返回消息)

  1. 存取消息内容,toAll 表示是私信还是系统通知


    消息内容表

  2. 消息读取记录


    消息读取记录

  3. 用户个人消息读取状态,现在没有使用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. 处理未读已读消息(参考上述博文做改进)

  1. 数据库设计
    表名:Message

    ID:编号;RecID:接收者编号;MessageID:站内信编号;Statue:站内信的查看状态

    表名:MessageText

    ID:编号;SendID:发送者编号;Message:站内信的内容;Type:信息类型;Group:用户组ID;  PostDate:站内信发送时间

    其中Status状态有未读、已读、删除

            Type类型有Private(私信)、Public(公共消息)、Global(系统消息)
  1. 处理流程
Messgae表中RecId=自己ID 且Status=未读,显示为私信未读

Messgae表中RecId=自己ID 且Status=已读 且 Type=Private,显示为私信已读

Messgae表中未找到RecId=自己ID 且 MessageText中(Type=PublicGroup=自己所在组 )
的消息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中 ,显示为系统消息已读

猜你喜欢

转载自blog.csdn.net/qq_25385555/article/details/81513190
今日推荐