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中 ,显示为系统消息已读
  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,下面是一个简单的Java站内设计思路: 1. 数据库设计 首先需要设计一个数据库用于存储站内信的信息,可以考虑以下几个: - 用户:用于存储系统用户的基本信息,包括用户ID、用户名、密码、邮箱等信息。 - 消息:用于存储站内信的基本信息,包括消息ID、发送者ID、接收者ID、消息标题、消息内容、发送时间、是否已读等信息。 - 消息附件:如果您想让用户可以附加文件,请设计一个消息附件,用于存储附件的信息,包括附件ID、消息ID、附件名称、附件类型、附件大小、上传时间等信息。 2. 后台实现 在后台实现中,需要考虑以下几个方面: - 用户登陆:用户需要先登陆系统才能使用站内信功能,因此需要设计一个登陆页面和相关的登陆逻辑。 - 发送消息:用户可以通过站内信发送消息给其他用户,因此需要设计一个发送消息页面和相关的发送逻辑。 - 查看消息:用户可以查看自己收到的消息,因此需要设计一个消息页面和相关的查询逻辑,同时还需要支持分页查询。 - 删除消息:用户可以删除自己收到的消息,因此需要设计一个删除消息的逻辑。 - 附件上传和下载:如果您设计消息附件,那么还需要支持附件的上传和下载功能。 3. 前端实现 在前端实现中,需要考虑以下几个方面: - 用户登陆页面:设计一个用户登陆页面,可以根据实际需求添加验证码等功能。 - 发送消息页面:设计一个发送消息页面,包括消息标题、消息内容、接收者等信息。 - 消息页面:设计一个消息页面,用于显示用户收到的消息,同时还需要支持分页查询。 - 消息详情页面:设计一个消息详情页面,用于显示消息的详细信息,包括消息标题、消息内容、发送者、发送时间等信息。 - 附件上传和下载功能:如果您设计消息附件,那么还需要设计一个附件上传和下载功能。 以上是一个简单的Java站内设计思路,具体实现可能会根据实际需求有所不同。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值