首頁  >  文章  >  後端開發  >  php怎麼實現站內私訊功能

php怎麼實現站內私訊功能

藏色散人
藏色散人原創
2021-09-10 10:28:593229瀏覽

php實作站內私訊功能的方法:1、讀取POST請求的request body;2、呼叫子模組,插入傳送給全站或所屬使用者群組的站內信;3、取得未讀站內信數量;4、檢查messageId是不是屬於目前使用者;5、實現批次刪除即可。

php怎麼實現站內私訊功能

本文操作環境:windows7系統、PHP7.1版,DELL G3電腦

php怎麼實現站內私訊功能?

PHP實作站內信設計想法與方案

#一、背景

目前使用維運平台的當使用者進行溝通時,更多的是依賴微信和郵件通知,而維運平台作為一個整體的產品,也需要能夠進行內部溝通的一種服務- 站內信。

 

 

站內信的設計基調

站內信的設計基調取決於使用者如何使用站內信:

  • 使用者不會守著維運平台這個頁面,等待訊息通知,查看訊息內容,然後跳到要操作的頁面。 

  1. 也就是說站內信不是第一個入口,站內信的即時性意義不大。

  2. 同許多社群網站不同(Facebook,知乎,微博等),使用者會守在社群網站的主頁面,不斷刷新新內容,同時檢視新訊息(主要是個人私訊、別人的回覆等,也絕不是為了檢查系統通知訊息)

  • #用戶會根據郵件通知,決定是否要進入維運平台進行操作

  • 如果郵件特別多,例如同時有多個工單需要使用者處理,使用者也會在工單平台提供的「我的待辦」頁面進行所有工作。

  • 如果郵件被誤刪了,沒有郵件連結直接進入要操作的模組 

  1. 那麼或是透過索取連結/單號的方式,前往指定頁面

  2. 或直接在相關模組進行搜尋

     

     

 

上面的描述都意味著使用者基本上不會使用站內信,那麼在什麼樣的場合會使用站內信呢?

  • 不發送郵件,只寄站內信的訊息通知,例如全站通知、編輯操作、Comment操作等

  • 當具體模組沒有詳細的操作記錄時,可以透過查看站內信的發生時間

 

目前只有產品訊息通知,訊息展示也沒有進行歸類聚合,以後增加全站通知、mention、like、comment等類型的站內信時,就需要考慮按類型進行訊息聚合了。

 

二、需求描述

  1. #站內信通常需要解決兩個需求:

  • 用戶對用戶的站內信,管理員對用戶的站內信:即一對一發送

  • 管理員對多用戶、用戶群組、全站的站內信:即一對多發送

(還有一種是使用者對產品的站內信,例如對某個模組的回饋、疑問之類的)

 

我們目前的需求是:

1管理員對多用戶發送站內信 

對用戶真實性不做校驗

對標題長度、內容長度進行限制(分別是45個位元組、150個位元組,對應中文字元15個、50個)

對收件人的拼音長度進行限制(最長50個位元組)

 【推薦學習:《PHP視訊教學》】

2 用戶可檢視自己的站內信 

#「全部、已讀、未讀」過濾

依訊息來源分類:工單平台、資源管理、自動裝置、漏洞平台、故障平台。 。 。

 

3 使用者可以刪除、批次刪除站內信

# 使用者可以已閱、批次已閱、全部標記為已讀站內信

# 5 運維平台頁面頂端的訊息圖示 

  • 展示未讀訊息數,超過99顯示99

  • 滑鼠放上去,會有下拉框,展示最近10條未讀訊息(展示“時間”,“消息來源”,“標題”)

  • 下拉框的底部有兩個按鈕:“更多”,載入更多未讀訊息;“查看全部”,跳到站內信列表頁面(最好另開一個視窗)

  • 點擊下拉框裡的未讀訊息,透過彈出框顯示詳情;然後在未讀清單裡刪除該記錄,在資料庫裡標記為已讀,訊息圖示的未讀訊息數量減一

 

6管理員頁面: 

更新使用者

刪除訊息

統計資料

增加module

##增加站內信類型

傳送全站訊息

四、系統流程

傳送站內信

  1. 讀取POST請求的request body

  2. 校驗長度

  3. 插入資料庫

  4. 返回

取得站內信清單

  1. 呼叫子模組,插入傳送給全站或我所屬使用者群組的站內信

  2. 根據查詢條件,傳回資料庫資料

 

取得未讀站內信數量

  1. 呼叫子模組,插入傳送給全站或我所屬使用者群組的站內信

  2. #返回數量

 

批次已閱

  1. 檢查messageId是不是屬於目前使用者

  2. #inbox_message表裡把read 置為1,修改update_time

 

全部已閱

update inbox_message set “read”=1, “update_time”=now where “receiver_name”=currentUser() and “read” = 0

批次刪除

  1. 檢查messageId是不是屬於目前使用者

  2. #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;

#六、API設計

傳送站內信:POST /v1/message

request body Content-Type: application/json

{
    "title": "工单审批",
    "content": "XXX提交了变更申请,请审批",
    "to": "sunzhongyuan,shenli,wangya",
    "module_name": "工单平台",
    "link": "xxx"
}

response

{
    "code": 200,
    "data": 32,
    "msg": "OK"
}

取得站內信清單:GET /v1/message User-Id: xxx

#
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"
}

已閱、批次已閱站內信:PUT /v1/read_messages/:messageIds

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狀態

 

阿里雲的圖示行為是:

  1. 刷新頁面的時候才會要求一次未讀訊息數,之後不再定時刷新(當然也可能是刷新時間間隔比較長,沒發現;又或者採用了socket 的方式,建立了一個長鏈接)

  2. hover圖標,即顯示未讀訊息的下拉框

  3. 點選圖標,進入站內信管理頁面,預設是「未讀取訊息」

 

4點選未讀訊息,新開一個Tab,展示該訊息的詳情(detail頁面),原Tab內容不變,即沒有未讀取減一,也沒從下拉框裡刪除剛點擊的訊息

5 最多展示5個訊息,只要不刷新頁面,就一直是這5條

#6 沒有滾動更多的功能,只有查看更多,點擊進入站內信管理頁面,預設是「未讀訊息」 

  • 和點選圖示的差異是:點選圖示直接目前頁面跳到站內信管理頁面,點選「看更多」會新建一個Tab

7 多了一個「訊息接受管理」的按鈕,目前頁面跳到站內信件管理頁面,但預設為「基本接收管理」 

 

 

隱藏瀏覽器進度條

每10秒的獲取未讀訊息數接口,會觸發瀏覽器展示進度條,導致分散用戶注意力,要把這個進度條隱藏掉。 

其他重新整理頁面的行為不受影響。

以上是php怎麼實現站內私訊功能的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn