簡體   English   中英

向某些用戶顯示管理消息的最佳方法?

[英]Best way to show an admin message to certain users?

我正在用PHP / MySQL / jQuery構建一個社交網站。 用戶登錄到我的網站后,我想查詢數據庫並獲得管理員公告(如果存在)。 這將是一個向所有用戶顯示在頁面上的消息框,但是單擊X時將不再顯示它,直到管理員發布新的公告消息為止。 因此,如果您從不單擊X,並且數據庫中存在公告消息,它將始終在頁面上顯示此消息框,但是,如果您單擊cliX來關閉該框,那么您將返回頁面除非發布了新的管理員消息,否則不會存在。

我知道有幾種方法可以做到這一點,但我正在尋找最有效的方法。

我有一個主意,如果我在用戶表“ admin_message”上添加一個額外的mysql字段並將其標記為0,那么當我發布新的admin消息時,如果將admin message設置為1,則它將每個用戶的記錄更改為1 1然后在用戶頁面上顯示。 然后,當用戶單擊X隱藏框時,它將在此處更新用戶表行,並將值更改為0。

我的另一個想法是使用Cookie來檢查用戶是否選擇了隱藏消息,我認為這樣做會更快,但可能不那么理想,因為用戶可以使用不同的計算機登錄,並且如果顯示新消息,他們可能不能馬上看到它。

所以我只是想知道使用額外的數據庫字段是否是個壞主意? 如果我有1,000,000個用戶,則在發布新的管理員消息時,我將需要更新1,000,000行以確保每個人都可以看到該消息。 有沒有更好的辦法? 同樣,一旦用戶登錄到我的站點,我將使用一個會話來存儲他們看到或隱藏消息的值,而不是每次加載頁面時都查看數據庫。



更新

對不起,我認為我的帖子可能有點混亂或不清楚我的確切意思,因為大多數回復都針對一個消息系統,而這個消息系統與之無關。

請忘記留言詞,我將嘗試用另一個詞來解釋。 假設該網站上有1位管理員,這是唯一可以向用戶發布消息的管理員。 用戶只會看到1條消息,如果在網站的整個生命周期內發布了2352345234條消息,則沒有關系,他們只會看到1條消息,即最新消息。

現在,一些登錄並在頁面上看到此消息“ div”的用戶可能已經厭倦了查看它,因此他們將能夠隱藏它,使其不再顯示。

在該頁面上顯示此消息只需簡單的是或否。

但是,如果我決定需要發布新的管理員消息以供所有用戶查看,那么即使選擇隱藏而不顯示管理員消息的用戶仍會再次看到該消息,直到他們選擇不再看到該消息為止。

兩種簡單的解決方案如下:

良好:檢查用戶cookie,如果其中包含指示已顯示消息的標記,則不顯示消息,否則顯示消息。 當用戶關閉它時,更新cookie。 優點:絕對簡單。 缺點:用戶可能會兩次看到相同的消息,具體取決於他們是清除cookie還是從另一台計算機登錄。

更好:將標志存儲在數據庫中的某個位置(您現在可以將其存儲在admin用戶表中,然后向下將其分成另一個表)。 當用戶登錄時,1)將此標志保存到用戶的cookie或會話中; 2)更新數據庫; 3)確定是否需要顯示消息。 當用戶關閉消息時,更新cookie /會話和數據庫。 優點:用戶永遠不會兩次看到該消息。 缺點:由於需要維護數據庫中的標志,因此需要更多的參與。

實現細節:對於標志,您可以按照建議的方式使用消息ID,或者很有可能已經保留了用戶的上次登錄時間戳,並且可以使用該時間戳。

每個用戶都可以有一個last_message_seen ,因此您必須查詢該用戶的“新”消息(message_id> last_message_seen)。 如果[X]關閉(或超時),則您的JavaScript可以檢查新消息,依此類推...

另一個想法是讓最后一條消息在javascript環境中顯示為數字 ,但在這種情況下,刷新/放棄頁面時將重置(重新計算)該消息,如果該消息不在數據庫中,則用戶可能會錯過在最后一條消息之間插入的消息頁面加載和刷新。

或者... 它可以在Session中 ,所以您不會錯過任何一個。 登錄時,該號碼將重置為某個“正常”號碼,例如:最后一條消息或之后的消息(現在-1h),或其他...

我會使用想法#1。 我不會使用bool字段來檢查用戶是否已閱讀消息,而是使用datetime字段以及一些默認值。 如果字段==默認,則未讀。 讀取時,設置字段NOW()。

這樣,您就可以大致了解用戶閱讀郵件的速度。

編輯:

編輯之后,我仍然會使用相同的機制。 該消息需要一個字段來確定是否已讀取。 如果用戶單擊X(以關閉),請更新數據庫並將消息標記為已讀。

如果管理員發布新消息,則會彈出。

您還需要為消息創建日期,因為如果用戶沒有關閉上一條消息,並且管理員發布了一條新消息,則只能顯示最新消息。

EDIT2:對此評論進行回復:

即使用戶錯過了消息,也應僅顯示最新消息。 也許我誤會了,但這聽起來像是您說要基本上將一條消息標記為已讀100,000次,即100,000個用戶單擊了X,我認為它應該更多地顯示在用戶表上,而不是單獨顯示或不顯示消息框

在您的理論中有些東西是不合邏輯的。 您希望將“顯示/不顯示”保存為設置,但是無論如何都希望顯示該消息。 您如何知道何時否決用戶設置,何時不記住系統是否向用戶顯示消息? 即使您只想顯示一次,您也需要在數據庫中的一個字段(消息級別)上存儲系統是否向用戶顯示消息。

您正在為用戶保留登錄時間嗎? 像last_login日期時間一樣?

因此,獲取所有消息,其中date_created> = last_login。 顯示它們,然后將last_login時間更新為now()。

我建議有一個admin_message_queue表。 它具有消息正文,用戶ID和消息ID。 當您發布新的管理員消息時,它將為每個管理員用戶添加一條記錄到該表。 然后,當他們登錄時,您只需選擇所有admin_message_queue行,其中用戶ID =登錄的用戶。

要擺脫該消息,您只需使關閉按鈕觸發對服務器上采用消息ID的方法的AJAX回調。 該方法將從admin_message_queue中刪除,其中消息ID =張貼的消息ID,而用戶ID =會話中的用戶ID。 這樣,用戶就無法刪除其他人的消息。

以這種方式執行此操作可以使您不必保留已查看郵件的行數。 為什么要切換一下才能為某人隱藏呢? 您最終將保留大量不再使用的數據。

問題更新后更新:對不起,我以為您試圖向管理員顯示消息。 您也可以保持相同的邏輯,以便向所有用戶顯示最新消息。 只需擁有一個帶有用戶ID和消息文本的表。 每當您發布消息時,它都會遍歷並覆蓋所有仍然有記錄的人(尚未隱藏消息的人)的消息文本,並為其他人添加行。 當他們隱藏消息時,刪除該用戶的行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM