多種消息提醒系統的設計模式、實現方案(附功能截圖+表結構)

個人網站須要增長3種消息提醒系統。須要實現的功能以下:
在這裏插入圖片描述前端

1.評論提醒。

實現功能

他人回覆本身後,右上角自動提醒「未閱讀的新消息」的數量。
點擊後,清空新消息的提示。web

思路

這個是最簡單的。在數據庫查詢:數據庫

select count(id) from 評論表 where 貼子做者 = $當前用戶UID and 是否被閱讀 = 1 and 是否被刪除 = 1

前端判斷,後端返回的json數據是否>0,若大於則顯示具體數量。
而後,給消息提示綁定一個方法。點擊後AJAX:json

UPDATE comment SET 是否被閱讀 = 2 where 貼子做者 = $當前用戶UID;

而後,前端把消息清空。後端

2.系統消息。

實現功能

系統消息與「評論」相似。只不過增長了一點。 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。
用戶刷新頁面時,查詢兩個結果的和。顯示在前端便可。
如何清空消息就不寫了。

3.受權消息

實現功能

數據中心(後臺)實現以下。
在這裏插入圖片描述
受權消息分2大類:

  1. 當前用戶是做者。他人向本身申請受權。
  2. 當前用戶申請了他人的受權,被贊成/被拒絕。

數據庫設計

數據庫字段以下:

申請人UID,申請人是否閱讀「做者回復的結果」,申請的貼子ID,申請時間,申請內容,
做者UID,做者是否閱讀「這條申請」,申請回復結果(1等待做者回復,2做者贊成/3做者拒絕),回覆時間,回覆內容。
是否被申請人取消申請,是否被申請人刪除...

思路

受權消息須要注意2點:

  1. 一條消息對應2個UID(申請人,做者)。
  2. 新受權發起時,做者獲得提醒。做者回復後(agree/disagree),申請人獲得提醒。

當前用戶做爲「做者身份」獲得的提醒數:

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。用戶評論時、發送系統消息時,檢測用戶是否在線。再具體操做就能夠了。

說明

本文用於:

  1. 整理思路
  2. 但願做爲其餘人的參考
  3. 歡迎大佬給出優化建議
相關文章
相關標籤/搜索