php實作站內私訊功能的方法:1、讀取POST請求的request body;2、呼叫子模組,插入傳送給全站或所屬使用者群組的站內信;3、取得未讀站內信數量;4、檢查messageId是不是屬於目前使用者;5、實現批次刪除即可。
本文操作環境:windows7系統、PHP7.1版,DELL G3電腦
php怎麼實現站內私訊功能?
PHP實作站內信設計想法與方案
#一、背景
目前使用維運平台的當使用者進行溝通時,更多的是依賴微信和郵件通知,而維運平台作為一個整體的產品,也需要能夠進行內部溝通的一種服務- 站內信。
站內信的設計基調
站內信的設計基調取決於使用者如何使用站內信:
使用者不會守著維運平台這個頁面,等待訊息通知,查看訊息內容,然後跳到要操作的頁面。
也就是說站內信不是第一個入口,站內信的即時性意義不大。
同許多社群網站不同(Facebook,知乎,微博等),使用者會守在社群網站的主頁面,不斷刷新新內容,同時檢視新訊息(主要是個人私訊、別人的回覆等,也絕不是為了檢查系統通知訊息)
#用戶會根據郵件通知,決定是否要進入維運平台進行操作
如果郵件特別多,例如同時有多個工單需要使用者處理,使用者也會在工單平台提供的「我的待辦」頁面進行所有工作。
如果郵件被誤刪了,沒有郵件連結直接進入要操作的模組
那麼或是透過索取連結/單號的方式,前往指定頁面
或直接在相關模組進行搜尋
上面的描述都意味著使用者基本上不會使用站內信,那麼在什麼樣的場合會使用站內信呢?
不發送郵件,只寄站內信的訊息通知,例如全站通知、編輯操作、Comment操作等
當具體模組沒有詳細的操作記錄時,可以透過查看站內信的發生時間
目前只有產品訊息通知,訊息展示也沒有進行歸類聚合,以後增加全站通知、mention、like、comment等類型的站內信時,就需要考慮按類型進行訊息聚合了。
二、需求描述
#站內信通常需要解決兩個需求:
用戶對用戶的站內信,管理員對用戶的站內信:即一對一發送
管理員對多用戶、用戶群組、全站的站內信:即一對多發送
(還有一種是使用者對產品的站內信,例如對某個模組的回饋、疑問之類的)
我們目前的需求是:
1管理員對多用戶發送站內信
對用戶真實性不做校驗
對標題長度、內容長度進行限制(分別是45個位元組、150個位元組,對應中文字元15個、50個)
對收件人的拼音長度進行限制(最長50個位元組)
【推薦學習:《PHP視訊教學》】
2 用戶可檢視自己的站內信
#「全部、已讀、未讀」過濾
依訊息來源分類:工單平台、資源管理、自動裝置、漏洞平台、故障平台。 。 。
3 使用者可以刪除、批次刪除站內信
# 使用者可以已閱、批次已閱、全部標記為已讀站內信
# 5 運維平台頁面頂端的訊息圖示
展示未讀訊息數,超過99顯示99
滑鼠放上去,會有下拉框,展示最近10條未讀訊息(展示“時間”,“消息來源”,“標題”)
下拉框的底部有兩個按鈕:“更多”,載入更多未讀訊息;“查看全部”,跳到站內信列表頁面(最好另開一個視窗)
點擊下拉框裡的未讀訊息,透過彈出框顯示詳情;然後在未讀清單裡刪除該記錄,在資料庫裡標記為已讀,訊息圖示的未讀訊息數量減一
6管理員頁面:
更新使用者
刪除訊息
統計資料
增加module
##增加站內信類型傳送全站訊息四、系統流程
傳送站內信根據查詢條件,傳回資料庫資料
取得未讀站內信數量
呼叫子模組,插入傳送給全站或我所屬使用者群組的站內信
#返回數量
批次已閱
檢查messageId是不是屬於目前使用者
#inbox_message表裡把read 置為1,修改update_time
全部已閱
update inbox_message set “read”=1, “update_time”=now where “receiver_name”=currentUser() and “read” = 0
檢查messageId是不是屬於目前使用者
#inbox_message表裡把deleted 置為1,修改update_time
update inbox_message set “deleted”=1, “update_time”=now where “receiver_name”=currentUser() and “deleted” = 0
CREATE TABLE `inbox_message_text` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `title` varchar(128) NOT NULL DEFAULT '', `content` longtext NOT NULL, `create_time` datetime NOT NULL, `update_time` datetime NOT NULL, `send_type` tinyint(4) NOT NULL DEFAULT '0', `creator_name` varchar(255) NOT NULL DEFAULT '', `deleted` tinyint(4) NOT NULL DEFAULT '0', `module_id` bigint(20) NOT NULL, `link` varchar(255) NOT NULL DEFAULT '', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
站內信本身除了消息來源(module_name),還有一個緯度的描述,叫訊息類型(message_type),例如安全訊息、活動訊息、服務訊息等,每一大類別裡,又可以分割子類,例如活動訊息-優惠活動
訊息來源和訊息類型可以是正交關係,即工單平台也可以有活動訊息;訊息來源也可以是訊息類型的一種,稱為「產品訊息」
CREATE TABLE `inbox_message` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `message_text_id` bigint(20) NOT NULL, `receiver_name` varchar(255) NOT NULL DEFAULT '', `read` tinyint(4) NOT NULL DEFAULT '0', `deleted` tinyint(4) NOT NULL DEFAULT '0', `create_time` datetime NOT NULL, `update_time` datetime NOT NULL, PRIMARY KEY (`id`), KEY `inbox_message_receiver_name_deleted_read_id` (`receiver_name`,`deleted`,`read`,`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `inbox_module` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `code` varchar(128) NOT NULL DEFAULT '', `name` varchar(128) NOT NULL DEFAULT '', `create_time` datetime NOT NULL, `update_time` datetime NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `code` (`code`), UNIQUE KEY `name` (`name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
request body Content-Type: application/json
{ "title": "工单审批", "content": "XXX提交了变更申请,请审批", "to": "sunzhongyuan,shenli,wangya", "module_name": "工单平台", "link": "xxx" }
response
{ "code": 200, "data": 32, "msg": "OK" }
http://127.0.0.1:10085/v1/message?query=message_text_id.module_id.name:xxx&limit=1
{ "code": 200, "data": { "data": [ { "id": 1, "message_text": { "id": 1, "title": "title 2", "content": "content 2", "create_time": "2018-01-12 11:13:48", "update_time": "2018-01-12 11:13:48", "send_type": 1, "creator_name": "sysadmin", "deleted": 0, "link": "xxx", "Messages": null, "module": { "id": 4, "code": "secure", "name": "xxx", "create_time": "2018-01-11 15:38:01", "update_time": "2018-01-11 15:38:01", "MessageTexts": null } }, "receiver_name": "xxx", "read": 0, "deleted": 0, "create_time": "2018-01-12 11:13:48", "update_time": "2018-01-12 11:13:48" } ], "total": 2 }, "msg": "OK" }
response
{ "code": 200, "data": "OK", "msg": "OK" }
完整已閱PUT:/v1/read_all_messages
response 同上
刪除、批次刪除站內信:PUT /v1/delete_messages/:messageIds
response 同上
#全部刪除站內信:PUT /v1/delete_all_messages
response 同上
取得訊息來源清單:GET /v1/module
response
{ "code": 200, "data": [ { "id": 1, "code": "worksheet", "name": "工单平台", "create_time": "2018-01-11 15:21:38", "update_time": "2018-01-11 15:21:38", "MessageTexts": null }, { "id": 2, "code": "cmdb", "name": "资源管理", "create_time": "2018-01-11 15:22:28", "update_time": "2018-01-11 15:22:28", "MessageTexts": null }, ... ], "msg": "OK" }
#七、測試注意點
1 傳送站內信
#純介面
收件使用者以逗號分割,真實性不做校驗
收件使用者有長度校驗,50個位元組
title content 有長度校驗,分別是45,150個位元組
module_name 是一個列表,必須從這裡選一個
2 其他介面都可以透過前端頁面測試
八、最佳化
未讀取清單可以加上粗體顯示,已讀取則是普通字體
對站內信進行分類,打上不同緯度的標籤,方便過濾、搜尋、屏蔽
用戶可以設定允許接收的站內信的消息來源
管理員可以對全站訊息、全站人員、全站的訊息屬性進行增刪改查,例如撤銷某個站內信,讓所有人都看不見
管理員可以統計站內信的發送數量、各產品的使用情況、訊息被讀取的比例、訊息被讀取的時間、訊息被讀取的方式(點開或批次操作),等
九、關鍵功能點設計
右上角的圖標行為
1 點擊圖標,展示最近的N條未讀訊息
展示下拉方塊
即時取得最近N條未讀訊息
N可以是5~10,具體數值取決於下拉框的高度限制
當未讀取不足N時,下拉框能自適應高度
如果沒有未讀訊息,展示」暫無新訊息」
停止每10秒的取得未讀取訊息數量介面
2 下拉框裡,展示消息來源、時間(相對現在的時間:10分鐘前)、title
向下滑動下拉框,展示更多未讀訊息(只取得id小於已顯示訊息清單裡的最小id,也就是不取得點選圖示後新來的訊息)
#
3 點選下拉方塊裡的某一個訊息
下拉方塊不消失
仍停止每10秒的取得未讀取訊息數介面
未讀訊息數減1
未讀訊息清單刪除目前訊息(slice)
展示彈出方塊
4 彈出框顯示訊息的來源、時間(絕對時間)、title、content
5 關閉彈出方塊或點選外圍:
#彈出框消失
下拉框不消失
#可以繼續點選某一個未讀訊息
#
6 再次點選下拉方塊與圖示的外圍
#下拉方塊消失
已清空已有的未讀訊息清單
恢復每10秒的取得未讀取訊息數介面
7 再次點選圖標,重新回到#1狀態
阿里雲的圖示行為是:
刷新頁面的時候才會要求一次未讀訊息數,之後不再定時刷新(當然也可能是刷新時間間隔比較長,沒發現;又或者採用了socket 的方式,建立了一個長鏈接)
hover圖標,即顯示未讀訊息的下拉框
點選圖標,進入站內信管理頁面,預設是「未讀取訊息」
#
4點選未讀訊息,新開一個Tab,展示該訊息的詳情(detail頁面),原Tab內容不變,即沒有未讀取減一,也沒從下拉框裡刪除剛點擊的訊息
5 最多展示5個訊息,只要不刷新頁面,就一直是這5條
#6 沒有滾動更多的功能,只有查看更多,點擊進入站內信管理頁面,預設是「未讀訊息」
和點選圖示的差異是:點選圖示直接目前頁面跳到站內信管理頁面,點選「看更多」會新建一個Tab
7 多了一個「訊息接受管理」的按鈕,目前頁面跳到站內信件管理頁面,但預設為「基本接收管理」
隱藏瀏覽器進度條
每10秒的獲取未讀訊息數接口,會觸發瀏覽器展示進度條,導致分散用戶注意力,要把這個進度條隱藏掉。
其他重新整理頁面的行為不受影響。
以上是php怎麼實現站內私訊功能的詳細內容。更多資訊請關注PHP中文網其他相關文章!