個人網站須要增長3種消息提醒系統。須要實現的功能以下:
前端
他人回覆本身後,右上角自動提醒「未閱讀的新消息」的數量。
點擊後,清空新消息的提示。web
這個是最簡單的。在數據庫查詢:數據庫
select count(id) from 評論表 where 貼子做者 = $當前用戶UID and 是否被閱讀 = 1 and 是否被刪除 = 1
前端判斷,後端返回的json數據是否>0,若大於則顯示具體數量。
而後,給消息提示綁定一個方法。點擊後AJAX:json
UPDATE comment SET 是否被閱讀 = 2 where 貼子做者 = $當前用戶UID;
而後,前端把消息清空。後端
系統消息與「評論」相似。只不過增長了一點。 websocket
用戶收到的消息分2種。
一種是管理員發送給全體成員的消息。(如活動通知)
socket
另外一種是針對某個用戶的通知。(舉報反饋、登陸異地提醒)
數據庫設計
數據庫字段以下:優化
id(自增主鍵),發送時間,消息標題,消息內容,receive_uid消息接收對象(0是給全體人的消息,其餘是針對某個用戶UID),had_read(用戶是否閱讀過這條消息),評論是否被刪除
全體消息有2種解決方案。
1.是給遍歷用戶,給每一個用戶發消息。這種方法在設計、實現上很簡單,相似上面的評論。但消耗資源比較大(看你用戶多很少)。
2.是發送給0,也就是說發送公共消息。每一個人均可以接收,卻只須要發送一條消息。
(p.s:也能夠延伸一下數據庫字段,發送給某個用戶組)
但也有缺點。若用戶是在你「發送全體消息」以後,註冊的帳號。查詢消息表時,也會加載歷史消息。
不過這很容易解決。加載消息時判斷「用戶註冊的時間戳」>「發送消息的時間戳」就能夠。 網站
下面我根據方法2實現一下:
首先,判斷特定用戶的消息是否被閱讀。(同上)
select count(id) from 系統消息表 where 接收消息的UID = $當前用戶UID and 是否被閱讀 = 1 and 是否被刪除 = 1
而後,給用戶表新增字段。new_system_msg_count(新消息的數量)。
每次發送全體消息,給全體成員的new_system_msg_count字段+1。
用戶刷新頁面時,查詢兩個結果的和。顯示在前端便可。
如何清空消息就不寫了。
數據中心(後臺)實現以下。
受權消息分2大類:
數據庫字段以下:
申請人UID,申請人是否閱讀「做者回復的結果」,申請的貼子ID,申請時間,申請內容,
做者UID,做者是否閱讀「這條申請」,申請回復結果(1等待做者回復,2做者贊成/3做者拒絕),回覆時間,回覆內容。
是否被申請人取消申請,是否被申請人刪除...
受權消息須要注意2點:
當前用戶做爲「做者身份」獲得的提醒數:
select count(id) from comment where 做者UID = $當前用戶UID and 做者是否閱讀 = 1 and 是否被申請者取消 = 2 and 申請回復結果 = 1(等待做者回復)
加上,當前用戶做爲「申請人身份」獲得的提醒數:
select count(id) from comment where 申請人UID = $當前用戶UID and 申請人是否閱讀 = 1 and 是否被申請者取消 = 2 and (申請回復結果 = 2贊成 or 申請回復結果 = 3拒絕)
前端顯示2者的和便可。
清空消息就省略了。
我這種實現方式,是在「用戶刷新頁面時」。
在初始化方法裏請求AJAX,因此不能實時提醒消息。
想實現的話能夠用websocket。用戶評論時、發送系統消息時,檢測用戶是否在線。再具體操做就能夠了。
本文用於: