也谈群发 “站内信”的实现
“站内信”有两个基本功能。
一:点到点的消息传送。用户给用户发送站内信;管理员给用户发送站内信。
二:点到面的消息传送。管理员给用户(指定满足某一条 件的用户群)群发消息。
但是下面回复的时候,关于“已读”、“未读”、“删除”的问题没有很好的解决。
受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确定是否删除,如果状态是删除,则这个群发信息不再显示。
以上,是我对原作者群发“站内信”的实现的扩展。