jQuery+ThinkPHP+Ajax實現即時消息提醒功能


心血來潮想為自己的小項目做一個提醒系統,譬如私信,評論等消息都能及時傳遞過來。由於道行尚淺,網上那些長輪詢對於我略微復雜,於是覺得還是自己寫一寫試試比較好。

我的思路是,單獨在數據庫中建一個提醒表,表主要由接收者的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();">

 

小結:由於缺乏實戰經驗,筆主深知這些代碼在性能、安全和其他方面都跟工業級別的代碼相差十萬八千里,但這也是我開通這個博客以目的:作為一個初學者,希望這個博客能記錄我一步一步成為一名優秀工程師的軌跡。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM