1. 程式人生 > 實用技巧 >網頁客服思路以及QQ截圖貼上到聊天框功能

網頁客服思路以及QQ截圖貼上到聊天框功能

功能:

1、客服需登入進入客服頁面。使用者無需登入,進入使用者頁面,直接獲取sessionId作為id值。

2、使用者進入頁面並且傳送訊息時,客服才會獲取到該使用者,並在左側列表顯示。

3、點選使用者名稱即可切換聊天物件,正在聊天的使用者,使用者名稱為選中狀態。

4、每條訊息的時間顯示在本條訊息上方(水平居中)。訊息時間間隔不足1分鐘,則此不顯示時間。

5、每次讀取的訊息均為最新訊息。

6、客服未與其正在聊天的使用者傳送新訊息時應有新訊息提示。

7、使用者關閉瀏覽器或長時間無迴應時,將使用者置為下線。

客服介面將清空與下線使用者的聊天視窗,且下線使用者不顯示在左側列表中。

8、使用者長時間無迴應置為下線後,重新整理可繼續線上與客服聊天。

9、傳送:1)輸入框未輸入訊息時,提示“傳送內容不能為空”。

2)未選擇使用者時,提示“請選擇使用者”。

資料庫表:

三張表:客服(user),使用者(customer),聊天記錄(cs_chat_record)。

客服表主要欄位:id,name,password,online,currentPeople;

使用者表主要欄位:id,name,online,headImg;

聊天記錄表主要欄位:id,userId,customerId,userContent,customerContent,time;

主要思路:

1、使用者進入頁面:檢視當前使用者有沒有正在被客服人員接待

①正在被接待:設定使用者為線上狀態(因為重新整理會有下線操作)。

②未被接待:獲取所有線上客服每個人正在接待的使用者人數,並給該使用者分配一個當前接待人數少的客服。

修改此客服正在接待的人數,將使用者新增到使用者表中(設定為線上狀態)。

將使用者和客服均存到session中。

2、客服進入頁面:常規驗證。

4、使用者和客服傳送訊息時,都先將資訊儲存到資料庫。

5、使用者和客服介面,都是一秒重新整理一次獲取最新訊息。

6、客服頁面:當前正在溝通的使用者列表,每秒獲取一次,將不線上的使用者在列表清除。

7、長時間無回覆的使用者置為下線,用到資料庫定時器。

8、使用者關閉瀏覽器置為下線,用到的是window.onbeforeunload方法。

9、新訊息提醒:儲存使用者訊息將使用者頭像設定成有紅點的,獲取訊息時將使用者頭像設定為無紅點的。

QQ截圖在網頁聊天中不能直接貼上,要實現像QQ微信一樣能直接貼上成圖片需要做一些操作
利用paste事件捕獲貼上事件,clipboardData獲取剪下板中的內容將檔案用filereader介面讀取出來

function paseImg()
  {
    var imgReader = function (item) {
        var blob = item.getAsFile(),
            reader = new FileReader();

        reader.onloadend = function (e) {

            //顯示影象
            var msg = "<img src='"+e.target.result+"' style='max-width:60%;max-height:250px;'/>";
            $('#textarea').append(msg);
        };

        reader.readAsDataURL(blob);
    };

    document.getElementById("textarea").addEventListener("paste",function(e){
      var clipboardData = e.clipboardData,
        i = 0,
        items, item, types;
        if (clipboardData) {
          items = clipboardData.items;

          if (!items) {
              return;
          }

          item = items[0];
          types = clipboardData.types || [];

          for (; i < types.length; i++) {
              if (types[i] === 'Files') {
                  item = items[i];
                  break;
              }
          }

          if (item && item.kind === 'file' && item.type.match(/^image\//i)) {
              imgReader(item);
          }
        }
    });
  }
  paseImg();