也谈群发 “站内信”的实现

 

今天在博客园看到这篇文章“群发 “站内信”的实现”,(http://www.cnblogs.com/grenet/archive/2010/03/08/1680655.html)

我以前也做过类似的项目,但是当时才入行,做的一塌糊涂。

好在做的项目没出问题前,就下线了。

 

原作者在分析站内信的时候 ,已经很具体了;(可以先查看该篇文章分析,这里不详述)

“站内信”有两个基本功能。

一:点到点的消息传送。用户给用户发送站内信;管理员给用户发送站内信。

二:点到面的消息传送。管理员给用户(指定满足某一条 件的用户群)群发消息。

但是下面回复的时候,关于“已读”、“未读”、“删除”的问题没有很好的解决。

受23楼回复的启发(http://www.cnblogs.com/grenet/archive/2010/03/08/1680655.html#1775980)

我在这里扩展一下,可能存在错误,也可能不是最好的解决办法。

 

设计思想:这里发信息的时候不再考虑是管理员发信还是普通用户发信,而只考虑是不是群发信息,(接受人超过一个的视为群发信息)

      因为不管是谁发的,只要登录用户没有删除,那么都要在收件箱中保存。

      所以就分开设计点对点的信息和群发信息。      

 

数据库具体设计如下:

Message表:用于记录发信人的信息

  Id:编号;

  SendId:发信人Id;

  RecId:接受人Id;

  MessageId:信息Id;

  ReadTime:阅读时间;

  Statue:状态:是否已读;

MessageText表:用于记录发信内容

  Id:编号;

  Title:信息标题;

  Content:信息内容;

  CreateTime:发信时间;

GlobalMessage表:用于记录群发信息的收信人

  Id:编号;

  RecId:收信人(如果是站内所有用户则为0); 

ReadMessage表:用于记录用户对群发信息的操作

  Id:编号;

  GlobalId:群信息Id;

  UserId:读信息人;

  ReadTime:阅读时间;

  Statue :状态:删除;


  点对点的发信,在MessageText插入站内信的主体内容,在Message表记录发信人和接受人信息;

  群发信息,在MessageText插入站内信的主体内容,在Message表记录发信人和信息Id(收信人Id设置为0),而在GlobalMessage表记录所有收信人(如果收信人是全部用户,则RecId=0);

  那么,用户在登录以后,首先查询Message中有没有RecId=登录用户Id的记录;

  再在Global中查看有没有RecId=0并且RecId=登录用户Id的记录。

 

对于点对点的信息,可以设置Message表Statue来确定是否已读,登录用户也可以可以直接删除这条信息;

对于群发信息,首先读取ReadMessage表,如果存在登录用户Id则用户已经读取,然后查看Statue确定是否删除,如果状态是删除,则这个群发信息不再显示。

 

以上,是我对原作者群发“站内信”的实现的扩展。再次感谢23楼朋友的提法,也欢迎各位提出自己的建议,大家互相借鉴,共同进步。 

 

多谢5楼的提醒:

补充:对GlobalMessage表进行了修改,发信人不论群发或单发全部记录在Message表中,而信的内容记录在MessageText表。

(这个可能还存在错误或不是最好的解决方案)

 

 

 

posted @ 2010-04-08 14:01  zhwily  阅读(3166)  评论(28编辑  收藏  举报