心血來潮想為自己的小項目做一個提醒系統,譬如私信,評論等消息都能及時傳遞過來。由於道行尚淺,網上那些長輪詢對於我略微復雜,於是覺得還是自己寫一寫試試比較好。
我的思路是,單獨在數據庫中建一個提醒表,表主要由接收者的id和消息類型兩個字段組成
/* 前台提醒表 */ CREATE TABLE IF NOT EXISTS notification( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, -- 主鍵自增 mid INT NOT NULL DEFAULT 0, -- 用戶id type INT NOT NULL DEFAULT 0 -- 0:私信 1:帖子評論 2:商品售出 3:商品評論 4:小組申請已發送 5:小組創建成功 6:小組新成員加入 7:小組舊成員退出 8:活動邀請 )ENGINE=MyISAM DEFAULT CHARSET=UTF8;
然後在前台頁面中寫一個遞歸函數,用來請求Ajax。
function require() { var url = "{U('Group/checkNotify')}"; $.get(url,null,function(data) { // 如果獲得的數據不為空,則顯示提醒 if ($.trim(data) != '') { // 這裡寫提醒的方式 alert('haha'); } }); // 每三秒請求一次 setTimeout('require()',3000); }
在後台查詢三秒前到當前時刻數據庫中是否有數據插入,如果有,則返回所需要的信息
public function checkNotify() { // 實例化自定義的模型類 $Notify = D("Notification"); // 獲取當前用戶的id $mid = $_SESSION['member']['id']; // 由於Ajax三秒鐘才執行一次,所以新數據的插入時間要晚於查詢的的請求時間(當前時間)三秒鐘 $time = time() - 3; // 准備查詢條件 $where = "mid = $mid and created>$time"; // 查找數據庫中是否有新數據插入 $bool = $Notify->where($where)->find(); // 如果查詢結果非空,則輸出結果集第零條數據的type參數,即提醒類型,然後再從數據庫對應表中獲取提醒內容 //本測試默認3秒中內只有一條消息,如果想更加精確,也可以縮短請求時間 if ($bool != null) { //測試數據 echo $bool[0]['type']; }; }
當然,要讓文檔載入完畢後就執行該函數
<body onload="javascript:return require();">
以上所述是小編給大家介紹的jQuery+ThinkPHP+Ajax實現即時消息提醒功能實例代碼,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對網站的支持!