大概情況是這樣的:
當(dāng)A登陸以后,可以發(fā)消息給B,如下圖,選擇B的工號(hào)
發(fā)送以后,B登陸,可以在部門消息那里會(huì)顯示一個(gè)小紅點(diǎn),提示有消息
我的思路是這樣的:當(dāng)A按下發(fā)送以后,就向存放消息的數(shù)據(jù)庫(kù)里寫一條記錄,并把消息的狀態(tài)碼設(shè)置成未讀,接收人是B,當(dāng)B登陸以后,因?yàn)闋顟B(tài)碼是未讀,就會(huì)顯示提示信息??墒沁@個(gè)提示怎么實(shí)現(xiàn)?
這是我消息的數(shù)據(jù)庫(kù):
如果我一次發(fā)同樣的消息給多個(gè)人,是不是應(yīng)該寫多條記錄?向數(shù)據(jù)庫(kù)寫消息要循環(huán)?
還有一個(gè)問(wèn)題是:如果我的消息中包含圖片,圖片是不是要放在一個(gè)文件夾里?
希望能給點(diǎn)意見,謝謝!
閉關(guān)修行中......
你確定只是在用戶登錄時(shí)看到消息就可以了是吧。如果是,那接著往下看。
在你的表里,message_id應(yīng)該是這個(gè)表的主鍵,每個(gè)消息都對(duì)應(yīng)著一個(gè)message_id。當(dāng)某用戶登錄時(shí),就查詢這個(gè)message表里的receive_id和message_status,即查詢登錄的用戶中未讀消息的個(gè)數(shù),若個(gè)數(shù)>0,表示有未讀消息,登錄成功跳轉(zhuǎn)時(shí),有一個(gè)mes_status的字段也同時(shí)傳過(guò)去。比如跳轉(zhuǎn)到首頁(yè)(index),index中再判斷mes_status的值,給用戶以提示。
其實(shí)你的message表里的主鍵是message_id,跟發(fā)送給幾個(gè)人沒(méi)什么關(guān)系,當(dāng)他登錄時(shí),只查詢這個(gè)用戶自己作為接收方,收到的消息的個(gè)數(shù)。比如數(shù)據(jù)表里有這樣的一些數(shù)據(jù):
message_id | send_id | message_date | message_title | message_content | receive_id | message_status |
1 | 111 | 2015-06-25 13:00:00 | hello | hello world | 222 | 1 |
2 | 111 | 2015-06-25 14:00:00 | may | 中國(guó),你好 | 333 | 1 |
3 | 444 | 2015-06-26 11:00:00 | wenzi | wenzi | 222 | 1 |
4 | 666 | 2015-06-26 16:00:00 | hello | hello world | 222 | 1 |
用戶111
可以給多個(gè)用戶222
, 333
發(fā)送消息,并不沖突;用戶也能接收多個(gè)其他用戶的消息,比如222
。當(dāng)用戶(userid=='222')登錄時(shí),就查詢(receive_id==userid)的消息即可。
你的推斷是對(duì)的,首先應(yīng)該把用戶上傳的圖片放到一個(gè)文件件中,然后返回給用戶一個(gè)圖片鏈接,用戶把這個(gè)圖片鏈接插入到消息中。
這個(gè)要用到推送。
說(shuō)實(shí)話。PHP不適合做推送。要用到ajax輪詢。這樣的話效率不高,還容易出問(wèn)題。
這里已經(jīng)有很不錯(cuò)的解決方案了。
http://segmentfault.com/q/1010000000589829/a-1020000000591493
發(fā)送消息 都可以直接寫db 附件當(dāng)然是得有個(gè)靜態(tài)文件服務(wù)器進(jìn)行上傳生成url 也方便以后的擴(kuò)展;
至于推送到瀏覽器,客戶端 就必須用長(zhǎng)連接(推薦),websocket(推薦)或者ajax輪詢方式去實(shí)現(xiàn). 監(jiān)聽狀態(tài)變化接口
消息接收方的字段可以存儲(chǔ) 1,2,3,4 這樣發(fā)送多人就不需要寫入多條數(shù)據(jù)了
登錄時(shí)候去查詢消息推送表是否有未讀消息
如果需要在線 提示就需要做前端ajax輪詢咯
實(shí)時(shí)性要求不高的話,前端可以每5分鐘AJAX輪詢一次消息表。
如果要插入多條記錄的話,建議開啟事務(wù),循環(huán)插入,提交事務(wù),能加快插入速度。
不想插入多條記錄的話,可以像 @飯盒 說(shuō)的那樣,消息接收方的字段receive_id保存接收人的ID序列(1,2,3,4),消息狀態(tài)字段message_status保存未閱讀消息的接收人ID序列(2,3),message_status初始值為(1,2,3,4),已查看消息的用戶ID則從其中刪除??梢杂肕ySQL內(nèi)部函數(shù)FIND_IN_SET(返回找到的位置,從1開始)進(jìn)行查詢,比如:
$user_id = 2;
$sql = <<<heredoc
SELECT * FROM `message`
WHERE FIND_IN_SET('{$user_id}', `message_status`)
AND FIND_IN_SET('{$user_id}', `receive_id`);
heredoc;
數(shù)據(jù)量比較大的話,F(xiàn)IND_IN_SET可能會(huì)存在性能問(wèn)題,建議定時(shí)清理message表過(guò)期的消息。