整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          網頁聊天客服是如何制作的-使用WebSocket技術

          網頁聊天客服是如何制作的?使用WebSocket技術!

          為上篇文章被頭條檢測為廣告嫌疑,可能是有其他網站的地址和下載鏈接。頭條系統已經不再給我推薦,所以本次再寫一次,這次不打廣告,也不放鏈接了。

          大家看看華為商城的客服系統,有沒有想過到底是如何制作出來的。你和客服MM的一問一答到底是如何實現的?學過ajax的朋友肯定知道,可以使用輪詢方式,隔一秒到服務器里面去查詢是否有聊天信息的到來,如果有,就取出來。這樣肯定是可以的。但是這樣做服務器壓力實在太大。如果有很多人在聊天呢?服務器可能受不了,所以,我們今天來使用WebSocket技術。該技術的特別之處在于,與HTTP協議最大的不同是,HTTP協議需要請求一次,響應一次。而WebSocket使用的是協議是,一次握手,時時通訊。意思就是,第一次采用http協議握手完成之后,后面的鏈接就一直會保持,服務器也可以向客戶端發送信息。而不再是單向的通訊方式了。


          華為客服系統

          當然,制作這個客服聊天系統確實不容易,但是如果我們只想做個簡單的網頁聊天那還是沒有問題的。

          接下來,我給大家貼出一些關鍵代碼,給大家演示如何開發出一個網頁聊天系統。

          必備技能:

          html,css,javaScript,java,javaWeb,tomcat服務器,數據庫mysql。

          1 首頁,必須寫一個登陸頁面,如果沒有登錄功能,那么網頁對方就不知道你的身份了。大部分情況都是需要登錄的。當然如果不登錄,也是可以的,系統可以給你指定一個稱呼,目前大多數客服系統都是 有登錄的。


          登錄代碼


          登錄界面

          登錄使用的是jquery的ajax向servlet發送請求,servlet調用數據庫dao查詢是否存在賬號。這個步驟如果不會的話,那需要將javaScript和javaWeb學習一遍。

          2 寫一個聊天的界面,這個界面代碼較多,但是大家可以去各種素材網站找模板,不用自己寫的,copy就行了。


          登錄后的界面


          webSocket代碼

          后臺,我們采用的是java代碼。這里因為是入門,我們沒有采用spring框架,而是采用了最基本的webSocket包。這兩個包可以在tomcat文件夾下面的lib文件夾找到。


          使用的包

          前后臺通訊方式采用的是json方式。所以引入了Gson包。

          數據庫使用了兩個表:


          非常簡單的表,mysql可以直接使用


          后臺部分代碼

          主要使用的是@ServerEndpoint注解,以及@OnOpen@OnMessage注解。

          @ServerEndpoint注解表示ws的路徑。

          @OnOpen表示連接時觸發該方法

          @OnMessage 表示服務器收到消息時觸發


          聊天時可以發送圖片和表情

          發送圖片文件采用的方式還是http方式。

          將發送人和接收人和文件使用FormData封裝起來,然后使用ajax保存到服務器中。然后再將服務器保存的地址發給對方。

          聊天系統沒有加密。只是簡單的制作。有興趣的可以私聊我,可以發源代碼給你,因為平臺限制,不能在文章發鏈接,見諒了。

          04頁面是什么,有什么作用?

          404頁面的目的是:告訴瀏覽者其所請求的頁面不存在或鏈接錯誤,同時引導用戶使用網站其他頁面而不是關閉窗口離開。

          現在大部分開源系統都會為大家考慮到404頁面的跳轉引導,比如:z-blog/wordpress,都是很不錯的開源系統(注意不要用最原始的開源系統,而是采用帶有模板的系統)。菜鳥后院網站本身也是wordpress的開源程序,然后我們用robin模板。(花299元擁有和菜鳥后院一樣的網站,包括域名和1G阿里巴巴云空間)

          頁面應該達到什么樣的效果才能滿足SEO的要求?

          搜索引擎使用 http 狀態碼來識別網頁的狀態。當搜索引擎獲得不正確的鏈接時,網站應該返回一個狀態代碼404,告訴搜索引擎放棄索引該鏈接。如果返回一個200或302狀態代碼,搜索引擎會對鏈接進行索引,導致許多不同的鏈接指向相同的頁面內容。結果,搜索引擎對這個網站的信任度大大降低。很多網站存在這個問題,那就是404頁面返回的是200或302狀態碼而不是404狀態碼。

          正確建立404頁面的方法是:(僅適合Apache服務器)

          • 在.htaccess 文件中加入代碼: ErrorDocument 404 /Error.html
          • 建立一個簡單的html404頁面命名 Error.html
          • 把 Error.html放置在網站根目錄
          • 如果碰到困難,參考本站:錯誤網頁
          • 注意:不要將404錯誤直接,跳轉到網站首頁,這將導致首頁不被收錄,正確的做法是在404頁面加上一個返回首頁的鏈接,讓用戶判斷,并選擇是否返回首頁,或者返回其他頁面,這也是用戶體驗的一種表現,搜索引擎對于這種做法比較友好。
          • /Error.html 前面不要帶主域名,否則返回的狀態碼是302或200狀態碼。

          現在我們購買的虛擬主機一般提供有404頁面的制作方法,流程:

          1、做一個簡單的404頁面,命名如:404.html;

          2、通過ftp把這個404頁面上傳到網站根目錄;

          3、進入虛擬主機管理后臺,找到404頁面提交的入口,添加以上404頁面的地址,如:www.cnbackyard.com/404.html(一般空間服務商都有帶著種功能,也可以直接找他們技術客服完成這步操作)

          4、輸入一個錯誤的鏈接進行訪問測試,隨便輸入,比如:www.cnbackyard.com/123.html,如果正確返回到404.html頁面,則算正確;

          5、使用站長工具(http://tool.chinaz.com/pagestatus),輸入任意一個錯誤網址,檢查返回值是否為404。如果返回值是200,代表該主機商設置有誤,可以與其技術反饋。

          以上操作方法對于一個seo初學者來說,還是有點復雜,同學們可以關注燃燈教育直播課程,參加我們的培訓,理解起來會更透徹一點。

          服系統

          ME: 我想要創建一個客服系統,支持客服賬號的增刪改查、登錄賬號、在線文本回復用戶的問題、支持用戶匿名在線提問、支持推送問題給GPT3.5獲得反饋后答復用戶。請將其分解成多個子任務或步驟。

          GPT4:
          你想要創建的客服系統是一個比較復雜的功能,你可能需要以下幾個子任務或步驟來實現它:

          1. 設計一個客服賬號管理的模塊,它可以實現客服賬號的增刪改查、登錄賬號等功能,例如你可以使用數據庫或文件來存儲客服賬號的信息,如用戶名、密碼、權限等,并提供相應的接口或界面來操作它們。
          2. 設計一個用戶提問的模塊,它可以實現用戶匿名在線提問的功能,例如你可以使用網頁或移動端的表單來收集用戶的問題,并將其存儲到數據庫或文件中,以便后續處理。
          3. 設計一個文本回復的模塊,它可以實現在線文本回復用戶的問題的功能,例如你可以使用 WebSocket 或 HTTP 協議來建立客服和用戶之間的通信,并根據用戶的問題和客服的回復來更新數據庫或文件中的狀態。
          4. 設計一個 GPT-3.5 接入的模塊,它可以實現推送問題給 GPT-3.5 獲得反饋后答復用戶的功能,例如你可以使用 GPT-3.5 的 API 來發送用戶的問題,并接收 GPT-3.5 的回復,然后根據一定的規則和邏輯來判斷是否直接答復用戶或轉交給客服。
          5. 設計一個系統監控和評估的模塊,它可以實現對客服系統的運行狀況和效果進行監控和評估的功能,例如你可以使用日志或指標來記錄和分析客服系統的性能、質量、滿意度等,并提供相應的報告或可視化界面來展示它們。

          一、步驟1的格式是一個描述客服賬號管理模塊的功能的句子,我可以將其轉換成以下的格式:

          • 創建一個 PHP 文件,命名為 customer_service.php;
          • 在 PHP 文件中,引入 MYSQL 數據庫的連接信息,如主機名、用戶名、密碼、數據庫名等;
          • 在 PHP 文件中,定義一個類,命名為 CustomerService,用于封裝客服賬號管理的相關方法;
          • 在 CustomerService 類中,定義一個構造函數,用于初始化數據庫連接對象;
          • 在 CustomerService 類中,定義一個 add_account 方法,用于增加一個客服賬號,接收用戶名、密碼、權限等參數,并將其插入到數據庫中的 customer_service 表中;
          • 在 CustomerService 類中,定義一個 delete_account 方法,用于刪除一個客服賬號,接收用戶名參數,并將其從數據庫中的 customer_service 表中刪除;
          • 在 CustomerService 類中,定義一個 update_account 方法,用于修改一個客服賬號,接收用戶名、密碼、權限等參數,并將其更新到數據庫中的 customer_service 表中;
          • 在 CustomerService 類中,定義一個 query_account 方法,用于查詢一個客服賬號,接收用戶名參數,并從數據庫中的 customer_service 表中查詢其相關信息;
          • 在 CustomerService 類中,定義一個 login_account 方法,用于登錄一個客服賬號,接收用戶名、密碼參數,并從數據庫中的 customer_service 表中驗證其正確性;
          • 在 PHP 文件的末尾,創建一個 CustomerService 的實例對象,并根據用戶的請求調用相應的方法。

          以下是步驟1可運行的 PHP 代碼范例,但是請注意,這只是一個簡單的示例,你可能需要根據你的實際需求和環境進行修改和優化。

          <?php
          // 引入 MYSQL 數據庫的連接信息
          $host="localhost"; // 主機名
          $user="root"; // 用戶名
          $password="123456"; // 密碼
          $dbname="customer_service_db"; // 數據庫名
          
          // 定義一個類,命名為 CustomerService,用于封裝客服賬號管理的相關方法
          class CustomerService {
              // 定義一個屬性,用于存儲數據庫連接對象
              private $conn;
          
              // 定義一個構造函數,用于初始化數據庫連接對象
              public function __construct() {
                  // 創建一個 MYSQLI 類的實例對象,傳入連接信息
                  $this->conn=new mysqli($host, $user, $password, $dbname);
                  // 檢查連接是否成功,如果失敗,拋出異常
                  if ($this->conn->connect_error) {
                      throw new Exception("Connection failed: " . $this->conn->connect_error);
                  }
              }
          
              // 定義一個 add_account 方法,用于增加一個客服賬號,接收用戶名、密碼、權限等參數,并將其插入到數據庫中的 customer_service 表中
              public function add_account($username, $password, $role) {
                  // 準備一條 SQL 語句,用于插入數據到 customer_service 表中
                  $sql="INSERT INTO customer_service (username, password, role) VALUES (?, ?, ?)";
                  // 使用預處理語句來防止 SQL 注入攻擊
                  $stmt=$this->conn->prepare($sql);
                  // 綁定參數到預處理語句中,使用 sss 表示三個參數都是字符串類型
                  $stmt->bind_param("sss", $username, $password, $role);
                  // 執行預處理語句,并檢查是否成功,如果失敗,拋出異常
                  if (!$stmt->execute()) {
                      throw new Exception("Insert failed: " . $stmt->error);
                  }
                  // 關閉預處理語句
                  $stmt->close();
              }
          
              // 定義一個 delete_account 方法,用于刪除一個客服賬號,接收用戶名參數,并將其從數據庫中的 customer_service 表中刪除
              public function delete_account($username) {
                  // 準備一條 SQL 語句,用于刪除 customer_service 表中的數據
                  $sql="DELETE FROM customer_service WHERE username=?";
                  // 使用預處理語句來防止 SQL 注入攻擊
                  $stmt=$this->conn->prepare($sql);
                  // 綁定參數到預處理語句中,使用 s 表示參數是字符串類型
                  $stmt->bind_param("s", $username);
                  // 執行預處理語句,并檢查是否成功,如果失敗,拋出異常
                  if (!$stmt->execute()) {
                      throw new Exception("Delete failed: " . $stmt->error);
                  }
                  // 關閉預處理語句
                  $stmt->close();
              }
          
              // 定義一個 update_account 方法,用于修改一個客服賬號,接收用戶名、密碼、權限等參數,并將其更新到數據庫中的 customer_service 表中
              public function update_account($username, $password, $role) {
                  // 準備一條 SQL 語句,用于更新 customer_service 表中的數據
                  $sql="UPDATE customer_service SET password=?, role=? WHERE username=?";
                  // 使用預處理語句來防止 SQL 注入攻擊
                  $stmt=$this->conn->prepare($sql);
                  // 綁定參數到預處理語句中,使用 sss 表示三個參數都是字符串類型
                  $stmt->bind_param("sss", $password, $role, $username);
                  // 執行預處理語句,并檢查是否成功,如果失敗,拋出異常
                  if (!$stmt->execute()) {
                      throw new Exception("Update failed: " . $stmt->error);
                  }
                  // 關閉預處理語句
                  $stmt->close();
              }
          
              // 定義一個 query_account 方法,用于查詢一個客服賬號,接收用戶名參數,并從數據庫中的 customer_service 表中查詢其相關信息
              public function query_account($username) {
                  // 準備一條 SQL 語句,用于查詢 customer_service 表中的數據
                  $sql="SELECT * FROM customer_service WHERE username=?";
                  // 使用預處理語句來防止 SQL 注入攻擊
                  $stmt=$this->conn->prepare($sql);
                  // 綁定參數到預處理語句中,使用 s 表示參數是字符串類型
                  $stmt->bind_param("s", $username);
                  // 執行預處理語句,并檢查是否成功,如果失敗,拋出異常
                  if (!$stmt->execute()) {
                      throw new Exception("Query failed: " . $stmt->error);
                  }
                  // 獲取查詢結果,并存儲到一個關聯數組中
                  $result=$stmt->get_result();
                  $row=$result->fetch_assoc();
                  // 關閉預處理語句和結果集
                  $stmt->close();
                  $result->close();
                  // 返回查詢結果的關聯數組
                  return $row;
              }
          
              // 定義一個 login_account 方法,用于登錄一個客服賬號,接收用戶名、密碼參數,并從數據庫中的 customer_service 表中驗證其正確性
              public function login_account($username, $password) {
                  // 調用 query_account 方法,根據用戶名查詢客服賬號的信息
                  $row=$this->query_account($username);
                  // 如果查詢結果為空,說明用戶名不存在,返回 false
                  if ($row==null) {
                      return false;
                  }
                  // 如果查詢結果不為空,比較密碼是否匹配,如果匹配,返回 true,否則返回 false
                  if ($row["password"]==$password) {
                      return true;
                  } else {
                      return false;
                  }
              }
          }
          
          // 在 PHP 文件的末尾,創建一個 CustomerService 的實例對象,并根據用戶的請求調用相應的方法
          $cs=new CustomerService();
          // 根據用戶的請求類型,執行不同的操作
          switch ($_REQUEST["type"]) {
              case "add":
                  // 如果用戶請求增加一個客服賬號,獲取用戶名、密碼、權限等參數,并調用 add_account 方法
                  $username=$_REQUEST["username"];
                  $password=$_REQUEST["password"];
                  $role=$_REQUEST["role"];
                  try {
                      $cs->add_account($username, $password, $role);
                      echo "Add account successfully.";
                  } catch (Exception $e) {
                      echo "Add account failed: " . $e->getMessage();
                  }
                  break;
              case "delete":  
                  // 如果用戶請求刪除一個客服賬號,獲取用戶名參數,并調用 delete_account 方法
                  $username=$_REQUEST["username"];
                  try {
                      $cs->delete_account($username);
                      echo "Delete account successfully.";
                  } catch (Exception $e) {
                      echo "Delete account failed: " . $e->getMessage();
                  }
                  break;
              case "update":
                  // 如果用戶請求修改一個客服賬號,獲取用戶名、密碼、權限等參數,并調用 update_account 方法
                  $username=$_REQUEST["username"];
                  $password=$_REQUEST["password"];
                  $role=$_REQUEST["role"];
                  try {
                      $cs->update_account($username, $password, $role);
                      echo "Update account successfully.";
                  } catch (Exception $e) {
                      echo "Update account failed: " . $e->getMessage();
                  }
                  break;
              case "query":
                  // 如果用戶請求查詢一個客服賬號,獲取用戶名參數,并調用 query_account 方法
                  $username=$_REQUEST["username"];
                  try {
                      $row=$cs->query_account($username);
                      if ($row==null) {
                          echo "Query account failed: username not found.";
                      } else {
                          echo "Query account successfully: ";
                          print_r($row);
                      }
                  } catch (Exception $e) {
                      echo "Query account failed: " . $e->getMessage();
                  }
                  break;
              case "login":
                  // 如果用戶請求登錄一個客服賬號,獲取用戶名、密碼參數,并調用 login_account 方法
                  $username=$_REQUEST["username"];
                  $password=$_REQUEST["password"];
                  try {
                      $result=$cs->login_account($username, $password);
                      if ($result) {
                          echo "Login account successfully.";
                      } else {
                          echo "Login account failed: username or password incorrect.";
                      }
                  } catch (Exception $e) {
                      echo "Login account failed: " . $e->getMessage();
                  }
                  break;
              default:
              好的,我繼續講下去。
                  // 如果用戶請求的類型不在以上范圍內,返回一個錯誤信息
                  echo "Invalid request type.";
                  break;
          }
          ?>
          

          二、步驟2的格式是一個描述用戶提問模塊的功能的句子,我可以將其轉換成以下的格式:

          • 創建一個 HTML 文件,命名為 ask_question.html;
          • 在 HTML 文件中,添加一個表單元素,用于收集用戶的問題,并設置其 action 屬性為 submit_question.php,method 屬性為 post;
          • 在表單元素中,添加一個文本域元素,用于輸入用戶的問題,并設置其 name 屬性為 question;
          • 在表單元素中,添加一個提交按鈕元素,用于提交用戶的問題,并設置其 value 屬性為 Submit;
          • 創建一個 PHP 文件,命名為 submit_question.php;
          • 在 PHP 文件中,引入 MYSQL 數據庫的連接信息,如主機名、用戶名、密碼、數據庫名等;
          • 在 PHP 文件中,獲取表單元素提交的 question 參數,并對其進行過濾和驗證;
          • 在 PHP 文件中,將 question 參數插入到數據庫中的 user_question 表中,并生成一個唯一的 question_id;
          • 在 PHP 文件中,返回一個成功或失敗的信息,并顯示 question_id。

          以下是步驟2可運行的 PHP 代碼范例,但是請注意,這只是一個簡單的示例,你可能需要根據你的實際需求和環境進行修改和優化。

          
          <html>
          
              
          
          
              <h1>Ask Question</h1>
              <form>
                  <p>Please enter your question:</p>
                  <textarea name=""question"" rows=""10"" cols=""50""></textarea>
                  <br  />
                  <input type=""submit"" value=""Submit""  />
              </form>
          
          </html>
          
          <?php
          // submit_question.php
          // 引入 MYSQL 數據庫的連接信息
          $host="localhost"; // 主機名
          $user="root"; // 用戶名
          $password="123456"; // 密碼
          $dbname="customer_service_db"; // 數據庫名
          
          // 創建一個 MYSQLI 類的實例對象,傳入連接信息
          $conn=new mysqli($host, $user, $password, $dbname);
          // 檢查連接是否成功,如果失敗,拋出異常
          if ($conn->connect_error) {
              die("Connection failed: " . $conn->connect_error);
          }
          
          // 獲取表單元素提交的 question 參數,并對其進行過濾和驗證
          $question=$_POST["question"];
          // 如果 question 參數為空或過長,返回一個錯誤信息
          if (empty($question) || strlen($question) > 1000) {
              die("Invalid question: please enter a valid question.");
          }
          // 使用 mysqli_real_escape_string 函數來防止 SQL 注入攻擊
          $question=mysqli_real_escape_string($conn, $question);
          
          // 將 question 參數插入到數據庫中的 user_question 表中,并生成一個唯一的 question_id
          $sql="INSERT INTO user_question (question) VALUES ('$question')";
          // 執行 SQL 語句,并檢查是否成功,如果失敗,拋出異常
          if (!$conn->query($sql)) {
              die("Insert failed: " . $conn->error);
          }
          // 獲取插入數據后生成的 question_id
          $question_id=$conn->insert_id;
          
          // 關閉數據庫連接
          $conn->close();
          
          // 返回一個成功的信息,并顯示 question_id
          echo "Submit question successfully. Your question id is: " . $question_id;
          ?>
          

          三、步驟3的格式是一個描述文本回復模塊的功能的句子,我可以將其轉換成以下的格式:

          • 創建一個 HTML 文件,命名為 answer_question.html;
          • 在 HTML 文件中,添加一個表單元素,用于輸入客服的用戶名、密碼和問題編號,并設置其 action 屬性為 login_answer.php,method 屬性為 post;
          • 在表單元素中,添加一個文本框元素,用于輸入客服的用戶名,并設置其 name 屬性為 username;
          • 在表單元素中,添加一個密碼框元素,用于輸入客服的密碼,并設置其 name 屬性為 password;
          • 在表單元素中,添加一個文本框元素,用于輸入問題編號,并設置其 name 屬性為 question_id;
          • 在表單元素中,添加一個提交按鈕元素,用于提交客服的信息,并設置其 value 屬性為 Login;
          • 創建一個 PHP 文件,命名為 login_answer.php;
          • 在 PHP 文件中,引入 MYSQL 數據庫的連接信息,如主機名、用戶名、密碼、數據庫名等;
          • 在 PHP 文件中,獲取表單元素提交的 username、password 和 question_id 參數,并對其進行過濾和驗證;
          • 在 PHP 文件中,調用 CustomerService 類的 login_account 方法,根據 username 和 password 參數驗證客服的身份;
          • 在 PHP 文件中,如果驗證成功,跳轉到 reply_question.php 頁面,并傳遞 question_id 參數;如果驗證失敗,返回一個錯誤信息;
          • 創建一個 PHP 文件,命名為 reply_question.php;
          • 在 PHP 文件中,引入 MYSQL 數據庫的連接信息,如主機名、用戶名、密碼、數據庫名等;
          • 在 PHP 文件中,獲取 question_id 參數,并對其進行過濾和驗證;
          • 在 PHP 文件中,從數據庫中的 user_question 表中查詢 question_id 對應的問題,并顯示在頁面上;
          • 在 PHP 文件中,添加一個表單元素,用于輸入客服的回復,并設置其 action 屬性為 submit_answer.php,method 屬性為 post;
          • 在表單元素中,添加一個文本域元素,用于輸入客服的回復,并設置其 name 屬性為 answer;
          • 在表單元素中,添加一個隱藏域元素,用于傳遞 question_id 參數,并設置其 name 屬性為 question_id 和 value 屬性為 question_id 的值;
          • 在表單元素中,添加一個提交按鈕元素,用于提交客服的回復,并設置其 value 屬性為 Submit;
          • 創建一個 PHP 文件,命名為 submit_answer.php;
          • 在 PHP 文件中,引入 MYSQL 數據庫的連接信息,如主機名、用戶名、密碼、數據庫名等;
          • 在 PHP 文件中,獲取表單元素提交的 answer 和 question_id 參數,并對其進行過濾和驗證;
          • 在 PHP 文件中,將 answer 參數插入到數據庫中的 customer_answer 表中,并更新 user_question 表中 question_id 對應的狀態為已回復;
          • 在 PHP 文件中,返回一個成功或失敗的信息。

          以下是步驟3可運行的 PHP 代碼范例,但是請注意,這只是一個簡單的示例,你可能需要根據你的實際需求和環境進行修改和優化。

          
          <html>  
          
          
              <h1>Answer Question</h1>
              <form>
                  <p>Please enter your username:</p>
                  <input type=""text"" name=""username""  />
                  <br  />
                  <p>Please enter your password:</p>
                  <input type=""password"" name=""password""  />
                  <br  />
                  <p>Please enter the question id:</p>
                  <input type=""text"" name=""question_id""  />
                  <br  />
                  <input type=""submit"" value=""Login""  />
              </form>
          
          </html>
          
          <?php
          // login_answer.php
          // 引入 MYSQL 數據庫的連接信息
          $host="localhost"; // 主機名
          $user="root"; // 用戶名
          $password="123456"; // 密碼
          $dbname="customer_service_db"; // 數據庫名
          
          // 創建一個 MYSQLI 類的實例對象,傳入連接信息
          $conn=new mysqli($host, $user, $password, $dbname);
          // 檢查連接是否成功,如果失敗,拋出異常
          if ($conn->connect_error) {
              die("Connection failed: " . $conn->connect_error);
          }
          
          // 獲取表單元素提交的 username、password 和 question_id 參數,并對其進行過濾和驗證
          $username=$_POST["username"];
          $password=$_POST["password"];
          $question_id=$_POST["question_id"];
          // 如果 username、password 或 question_id 參數為空或過長,返回一個錯誤信息
          if (empty($username) || strlen($username) > 20) {
              die("Invalid username: please enter a valid username.");
          }
          if (empty($password) || strlen($password) > 20) {
              die("Invalid password: please enter a valid password.");
          }
          if (empty($question_id) || strlen($question_id) > 10) {
              die("Invalid question id: please enter a valid question id.");
          }
          // 使用 mysqli_real_escape_string 函數來防止 SQL 注入攻擊
          $username=mysqli_real_escape_string($conn, $username);
          $password=mysqli_real_escape_string($conn, $password);
          $question_id=mysqli_real_escape_string($conn, $question_id);
          
          // 調用 CustomerService 類的 login_account 方法,根據 username 和 password 參數驗證客服的身份
          require_once "customer_service.php";
          $cs=new CustomerService();
          $result=$cs->login_account($username, $password);
          // 如果驗證成功,跳轉到 reply_question.php 頁面,并傳遞 question_id 參數;如果驗證失敗,返回一個錯誤信息
          if ($result) {
              header("Location: reply_question.php?question_id=$question_id");
          } else {
              die("Login failed: username or password incorrect.");
          }
          
          // 關閉數據庫連接
          $conn->close();
          ?>
          
          <?php
          // reply_question.php
          // 引入 MYSQL 數據庫的連接信息
          $host="localhost"; // 主機名
          $user="root"; // 用戶名
          $password="123456"; // 密碼
          $dbname="customer_service_db"; // 數據庫名
          
          // 創建一個 MYSQLI 類的實例對象,傳入連接信息
          $conn=new mysqli($host, $user, $password, $dbname);
          // 檢查連接是否成功,如果失敗,拋出異常
          if ($conn->connect_error) {
              die("Connection failed: " . $conn->connect_error);
          }
          
          // 獲取 question_id 參數,并對其進行過濾和驗證
          $question_id=$_GET["question_id"];
          // 如果 question_id 參數為空或過長,返回一個錯誤信息
          if (empty($question_id) || strlen($question_id) > 10) {
              die("Invalid question id: please enter a valid question id.");
          }
          // 使用 mysqli_real_escape_string 函數來防止 SQL 注入攻擊
          $question_id=mysqli_real_escape_string($conn, $question_id);
          
          // 從數據庫中的 user_question 表中查詢 question_id 對應的問題,并顯示在頁面上
          $sql="SELECT * FROM user_question WHERE question_id='$question_id'";
          // 執行 SQL 語句,并檢查是否成功,如果失敗,拋出異常
          $result=$conn->query($sql);
          if (!$result) {
              die("Query failed: " . $conn->error);
          }
          // 獲取查詢結果,并存儲到一個關聯數組中
          $row=$result->fetch_assoc();
          // 關閉結果集
          $result->close();
          // 如果查詢結果為空,說明問題不存在,返回一個錯誤信息;如果查詢結果不為空,顯示問題內容
          if ($row==null) {
              die("Question not found: please enter a valid question id.");
          } else {
              echo "<h1>Question</h1>";
              echo "<p>" . $row["question"] . "</p>";
          }
          
          // 添加一個表單元素,用于輸入客服的回復,并設置其 action 屬性為 submit_answer.php,method 屬性為 post;
          echo "<h1>Answer</h1>";
          echo "<form>";
          echo "<p>Please enter your answer:</p>:";
          echo "<textarea name="'answer'" rows="'10'" cols="'50'"></textarea>";
          echo "<br  />";
          // 添加一個隱藏域元素,用于傳遞 question_id 參數,并設置其 name 屬性為 question_id 和 value 屬性為 question_id 的值;
          echo "<input type="'hidden'" name="'question_id'" value="'$question_id'"  />";
          // 添加一個提交按鈕元素,用于提交客服的回復,并設置其 value 屬性為 Submit;
          echo "<input type="'submit'" value="'Submit'"  />";
          echo "</form>";
          
          // 關閉數據庫連接
          $conn->close();
          ?>
          
          <?php
          // submit_answer.php
          // 引入 MYSQL 數據庫的連接信息
          $host="localhost"; // 主機名
          $user="root"; // 用戶名
          $password="123456"; // 密碼
          $dbname="customer_service_db"; // 數據庫名
          
          // 創建一個 MYSQLI 類的實例對象,傳入連接信息
          $conn=new mysqli($host, $user, $password, $dbname);
          // 檢查連接是否成功,如果失敗,拋出異常
          if ($conn->connect_error) {
              die("Connection failed: " . $conn->connect_error);
          }
          
          // 獲取表單元素提交的 answer 和 question_id 參數,并對其進行過濾和驗證
          $answer=$_POST["answer"];
          $question_id=$_POST["question_id"];
          // 如果 answer 或 question_id 參數為空或過長,返回一個錯誤信息
          if (empty($answer) || strlen($answer) > 1000) {
              die("Invalid answer: please enter a valid answer.");
          }
          if (empty($question_id) || strlen($question_id) > 10) {
              die("Invalid question id: please enter a valid question id.");
          }
          // 使用 mysqli_real_escape_string 函數來防止 SQL 注入攻擊
          $answer=mysqli_real_escape_string($conn, $answer);
          $question_id=mysqli_real_escape_string($conn, $question_id);
          
          // 將 answer 參數插入到數據庫中的 customer_answer 表中,并更新 user_question 表中 question_id 對應的狀態為已回復
          $sql1="INSERT INTO customer_answer (question_id, answer) VALUES ('$question_id', '$answer')";
          $sql2="UPDATE user_question SET status='answered' WHERE question_id='$question_id'";
          // 執行 SQL 語句,并檢查是否成功,如果失敗,拋出異常
          if (!$conn->query($sql1)) {
              die("Insert failed: " . $conn->error);
          }
          if (!$conn->query($sql2)) {
              die("Update failed: " . $conn->error);
          }
          
          // 關閉數據庫連接
          $conn->close();
          
          // 返回一個成功的信息
          echo "Submit answer successfully.";
          ?>
          

          四、步驟4的格式是一個描述 GPT-3.5 接入模塊的功能的句子,我可以將其轉換成以下的格式:

          • 創建一個 PHP 文件,命名為 gpt35_answer.php;
          • 在 PHP 文件中,引入 GPT-3.5 的 API 信息,如 API key、endpoint 等;
          • 在 PHP 文件中,定義一個函數,命名為 gpt35_answer,用于接收用戶的問題,并發送給 GPT-3.5 獲得回復;
          • 在 gpt35_answer 函數中,使用 curl 或其他庫來構建一個 HTTP 請求,設置其 header 為 API key,設置其 body 為用戶的問題;
          • 在 gpt35_answer 函數中,發送 HTTP 請求到 GPT-3.5 的 endpoint,并接收返回的 JSON 數據;
          • 在 gpt35_answer 函數中,解析 JSON 數據,并獲取其中的回復內容;
          • 在 gpt35_answer 函數中,返回回復內容;
          • 在 PHP 文件中,獲取 question_id 參數,并對其進行過濾和驗證;
          • 在 PHP 文件中,從數據庫中的 user_question 表中查詢 question_id 對應的問題,并調用 gpt35_answer 函數傳入問題參數;
          • 在 PHP 文件中,將 gpt35_answer 函數返回的回復內容插入到數據庫中的 gpt35_answer 表中,并更新 user_question 表中 question_id 對應的狀態為已回復;
          • 在 PHP 文件中,返回一個成功或失敗的信息。

          以下是步驟4可運行的 PHP 代碼范例,但是請注意,這只是一個簡單的示例,你可能需要根據你的實際需求和環境進行修改和優化。

          <?php
          // gpt35_answer.php
          // 引入 GPT-3.5 的 API 信息
          $api_key="sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; // API key
          $endpoint="https://api.openai.com/v1/engines/gpt35/completions"; // endpoint
          
          // 定義一個函數,命名為 gpt35_answer,用于接收用戶的問題,并發送給 GPT-3.5 獲得回復
          function gpt35_answer($question) {
              // 使用 curl 來構建一個 HTTP 請求
              $ch=curl_init();
              // 設置請求的 header 為 API key
              curl_setopt($ch, CURLOPT_HTTPHEADER, array(
                  "Authorization: Bearer $api_key"
              ));
              // 設置請求的 body 為用戶的問題
              curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode(array(
                  "prompt"=> $question,
                  "max_tokens"=> 100,
                  "temperature"=> 0.9,
                  "stop"=> "\n"
              )));
              // 設置請求的 URL 為 endpoint
              curl_setopt($ch, CURLOPT_URL, $endpoint);
              // 設置請求的方法為 POST
              curl_setopt($ch, CURLOPT_POST, true);
              // 設置返回結果不直接輸出
              curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
              // 發送 HTTP 請求,并接收返回的 JSON 數據
              $response=curl_exec($ch);
              // 關閉 curl 連接
              curl_close($ch);
              // 解析 JSON 數據,并獲取其中的回復內容
              $data=json_decode($response, true);
              $answer=$data["choices"][0]["text"];
              // 返回回復內容
              return $answer;
          }
          
          // 引入 MYSQL 數據庫的連接信息
          $host="localhost"; // 主機名
          $user="root"; // 用戶名
          $password="123456"; // 密碼
          $dbname="customer_service_db"; // 數據庫名
          
          // 創建一個 MYSQLI 類的實例對象,傳入連接信息
          $conn=new mysqli($host, $user, $password, $dbname);
          // 檢查連接是否成功,如果失敗,拋出異常
          if ($conn->connect_error) {
              die("Connection failed: " . $conn->connect_error);
          }
          
          // 獲取 question_id 參數,并對其進行過濾和驗證
          $question_id=$_GET["question_id"];
          // 如果 question_id 參數為空或過長,返回一個錯誤信息
          if (empty($question_id) || strlen($question_id) > 10) {
              die("Invalid question id: please enter a valid question id.");
          }
          // 使用 mysqli_real_escape_string 函數來防止 SQL 注入攻擊
          $question_id=mysqli_real_escape_string($conn, $question_id);
          
          // 從數據庫中的 user_question 表中查詢 question_id 對應的問題,并調用 gpt35_answer 函數傳入問題參數
          $sql="SELECT * FROM user_question WHERE question_id='$question_id'";
          // 執行 SQL 語句,并檢查是否成功,如果失敗,拋出異常
          $result=$conn->query($sql);
          if (!$result) {
              die("Query failed: " . $conn->error);
          }
          // 獲取查詢結果,并存儲到一個關聯數組中
          $row=$result->fetch_assoc();
          // 關閉結果集
          $result->close();
          // 如果查詢結果為空,說明問題不存在,返回一個錯誤信息;如果查詢結果不為空,獲取問題內容,并調用 gpt35_answer 函數
          if ($row==null) {
              die("Question not found: please enter a valid question id.");
          } else {
              $question=$row["question"];
              $answer=gpt35_answer($question);
          }
          
          // 將 gpt35_answer 函數返回的回復內容插入到數據庫中的 gpt35_answer 表中,并更新 user_question 表中 question_id 對應的狀態為已回復
          $sql1="INSERT INTO gpt35_answer (question_id, answer) VALUES ('$question_id', '$answer')";
          $sql2="UPDATE user_question SET status='answered' WHERE question_id='$question_id'";
          // 執行 SQL 語句,并檢查是否成功,如果失敗,拋出異常
          if (!$conn->query($sql1)) {
              die("Insert failed: " . $conn->error);
          }
          if (!$conn->query($sql2)) {
              die("Update failed: " . $conn->error);
          }
          
          // 關閉數據庫連接
          $conn->close();
          
          // 返回一個成功的信息
          echo "GPT-3.5 answer successfully.";
          ?>
          

          五、步驟5的格式是一個描述系統監控和評估模塊的功能的句子,我可以將其轉換成以下的格式:

          • 創建一個 HTML 文件,命名為 monitor_system.html;
          • 在 HTML 文件中,添加一個表單元素,用于輸入管理員的用戶名、密碼,并設置其 action 屬性為 login_monitor.php,method 屬性為 post;
          • 在表單元素中,添加一個文本框元素,用于輸入管理員的用戶名,并設置其 name 屬性為 username;
          • 在表單元素中,添加一個密碼框元素,用于輸入管理員的密碼,并設置其 name 屬性為 password;
          • 在表單元素中,添加一個提交按鈕元素,用于提交管理員的信息,并設置其 value 屬性為 Login;
          • 創建一個 PHP 文件,命名為 login_monitor.php;
          • 在 PHP 文件中,引入 MYSQL 數據庫的連接信息,如主機名、用戶名、密碼、數據庫名等;
          • 在 PHP 文件中,獲取表單元素提交的 username 和 password 參數,并對其進行過濾和驗證;
          • 在 PHP 文件中,根據 username 和 password 參數驗證管理員的身份;
          • 在 PHP 文件中,如果驗證成功,跳轉到 report_system.php 頁面;如果驗證失敗,返回一個錯誤信息;
          • 創建一個 PHP 文件,命名為 report_system.php;
          • 在 PHP 文件中,引入 MYSQL 數據庫的連接信息,如主機名、用戶名、密碼、數據庫名等;
          • 在 PHP 文件中,從數據庫中的 user_question、customer_answer 和 gpt35_answer 表中查詢相關的數據,并計算出一些指標和統計信息,如問題總數、已回復問題數、未回復問題數、客服回復率、GPT-3.5 回復率、平均回復時間等;
          • 在 PHP 文件中,將指標和統計信息以及相關的圖表或可視化界面顯示在頁面上。

          以下是步驟5可運行的 PHP 代碼范例,但是請注意,這只是一個簡單的示例,你可能需要根據你的實際需求和環境進行修改和優化。

          
          <html>
          
              
          
          
              <h1>Monitor System</h1>
              <form>
                  <p>Please enter your username:</p>
                  <input type=""text"" name=""username""  />
                  <br  />
                  <p>Please enter your password:</p>
                  <input type=""password"" name=""password""  />
                  <br  />
                  <input type=""submit"" value=""Login""  />
              </form>
          
          </html>
          
          <?php
          // login_monitor.php
          // 引入 MYSQL 數據庫的連接信息
          $host="localhost"; // 主機名
          $user="root"; // 用戶名
          $password="123456"; // 密碼
          $dbname="customer_service_db"; // 數據庫名
          
          // 創建一個 MYSQLI 類的實例對象,傳入連接信息
          $conn=new mysqli($host, $user, $password, $dbname);
          // 檢查連接是否成功,如果失敗,拋出異常
          if ($conn->connect_error) {
              die("Connection failed: " . $conn->connect_error);
          }
          
          // 獲取表單元素提交的 username 和 password 參數,并對其進行過濾和驗證
          $username=$_POST["username"];
          $password=$_POST["password"];
          // 如果 username 或 password 參數為空或過長,返回一個錯誤信息
          if (empty($username) || strlen($username) > 20) {
              die("Invalid username: please enter a valid username.");
          }
          if (empty($password) || strlen($password) > 20) {
              die("Invalid password: please enter a valid password.");
          }
          // 使用 mysqli_real_escape_string 函數來防止 SQL 注入攻擊
          $username=mysqli_real_escape_string($conn, $username);
          $password=mysqli_real_escape_string($conn, $password);
          
          // 根據 username 和 password 參數驗證管理員的身份
          $sql="SELECT * FROM admin WHERE username='$username' AND password='$password'";
          // 執行 SQL 語句
          $result=$conn->query($sql);
          // 獲取查詢結果,并存儲到一個關聯數組中
          $row=$result->fetch_assoc();
          // 關閉結果集
          $result->close();
          // 如果查詢結果為空,說明用戶名或密碼錯誤,返回一個錯誤信息;如果查詢結果不為空,跳轉到 report_system.php 頁面
          if ($row==null) {
              die("Login failed: username or password incorrect.");
          } else {
              header("Location: report_system.php");
          }
          
          // 關閉數據庫連接
          $conn->close();
          ?>
          
          <?php
          // report_system.php
          // 引入 MYSQL 數據庫的連接信息
          $host="localhost"; // 主機名
          $user="root"; // 用戶名
          $password="123456"; // 密碼
          $dbname="customer_service_db"; // 數據庫名
          
          // 創建一個 MYSQLI 類的實例對象,傳入連接信息
          $conn=new mysqli($host, $user, $password, $dbname);
          // 檢查連接是否成功,如果失敗,拋出異常
          if ($conn->connect_error) {
              die("Connection failed: " . $conn->connect_error);
          }
          
          // 從數據庫中的 user_question、customer_answer 和 gpt35_answer 表中查詢相關的數據,并計算出一些指標和統計信息,如問題總數、已回復問題數、未回復問題數、客服回復率、GPT-3.5 回復率、平均回復時間等
          $sql1="SELECT COUNT(*) AS total FROM user_question";
          $sql2="SELECT COUNT(*) AS answered FROM user_question WHERE status='answered'";
          $sql3="SELECT COUNT(*) AS unanswered FROM user_question WHERE status='unanswered'";
          $sql4="SELECT COUNT(*) AS customer FROM customer_answer";
          $sql5="SELECT COUNT(*) AS gpt35 FROM gpt35_answer";
          $sql6="SELECT AVG(TIMESTAMPDIFF(SECOND, user_question.create_time, customer_answer.create_time)) AS customer_time FROM user_question INNER JOIN customer_answer ON user_question.question_id=customer_answer.question_id";
          $sql7="SELECT AVG(TIMESTAMPDIFF(SECOND, user_question.create_time, gpt35_answer.create_time)) AS gpt35_time FROM user_question INNER JOIN gpt35_answer ON user_question.question_id=gpt35_answer.question_id";
          // 執行 SQL 語句,并獲取查詢結果,并存儲到一個關聯數組中
          $result1=$conn->query($sql1);
          $row1=$result1->fetch_assoc();
          $result1->close();
          $result2=$conn->query($sql2);
          $row2=$result2->fetch_assoc();
          $result2->close();
          $result3=$conn->query($sql3);
          $row3=$result3->fetch_assoc();
          $result3->close();
          $result4=$conn->query($sql4);
          $row4=$result4->fetch_assoc();
          $result4->close();
          $result5=$conn->query($sql5);
          $row5=$result5->fetch_assoc();
          $result5->close();
          $result6=$conn->query($sql6);
          $row6=$result6->fetch_assoc();
          $result6->close();
          $result7=$conn->query($sql7);
          $row7=$result7->fetch_assoc();
          $result7->close();
          
          // 關閉數據庫連接
          $conn->close();
          
          // 將指標和統計信息以及相關的圖表或可視化界面顯示在頁面上
          echo "<h1>Report System</h1>";
          echo "<p>Question total: " . $row1["total"] . "</p>";
          echo "<p>Question answered: " . $row2["answered"] . "</p>";
          echo "<p>Question unanswered: " . $row3["unanswered"] . "</p>";
          echo "<p>Customer answer rate: " . round($row4["customer"] / $row1["total"] * 100, 2) . "%</p>";
          echo "<p>GPT-3.5 answer rate: " . round($row5["gpt35"] / $row1["total"] * 100, 2) . "%</p>";
          echo "<p>Average customer answer time: " . round($row6["customer_time"], 2) . " seconds</p>";
          echo "<p>Average GPT-3.5 answer time: " . round($row7["gpt35_time"], 2) . " seconds</p>";
          // 這里可以添加一些圖表或可視化界面,如餅圖、柱狀圖、折線圖等,用于展示指標和統計信息的分布和趨勢,這里暫時省略
          ?>
          

          以上就是客服系統的編碼示例,僅供參考。


          主站蜘蛛池模板: 视频在线观看一区| 久久久老熟女一区二区三区| 国产伦精品一区二区三区视频猫咪 | 精品视频午夜一区二区| 亚洲一区二区电影| 无码精品前田一区二区| 亚洲一区二区三区久久久久| 久久一区不卡中文字幕| 久久久久人妻一区精品| 亚洲A∨精品一区二区三区| 正在播放国产一区| 丰满爆乳无码一区二区三区| 中文字幕一区日韩精品| 亚洲福利视频一区二区三区| 亚洲线精品一区二区三区影音先锋 | 秋霞鲁丝片一区二区三区| 无码一区18禁3D| 亚洲熟女综合色一区二区三区| 久久一区不卡中文字幕| 亚洲国产美国国产综合一区二区| 中文字幕在线观看一区二区| 亚洲熟女乱综合一区二区| 精品中文字幕一区二区三区四区| 精品国产高清自在线一区二区三区 | 亚洲A∨无码一区二区三区| 国产成人AV一区二区三区无码| 亚洲综合av永久无码精品一区二区| 国产一区二区三区在线影院| 好湿好大硬得深一点动态图91精品福利一区二区 | 精品香蕉一区二区三区| 曰韩人妻无码一区二区三区综合部 | 白丝爆浆18禁一区二区三区| 国产在线视频一区二区三区| 八戒久久精品一区二区三区| 亚洲av高清在线观看一区二区| 中文字幕一区二区三区免费视频| 综合久久一区二区三区| 亚洲AV综合色区无码一区| 一区二区三区影院| 综合久久久久久中文字幕亚洲国产国产综合一区首| 色婷婷亚洲一区二区三区|