為上篇文章被頭條檢測為廣告嫌疑,可能是有其他網站的地址和下載鏈接。頭條系統已經不再給我推薦,所以本次再寫一次,這次不打廣告,也不放鏈接了。
大家看看華為商城的客服系統,有沒有想過到底是如何制作出來的。你和客服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保存到服務器中。然后再將服務器保存的地址發給對方。
聊天系統沒有加密。只是簡單的制作。有興趣的可以私聊我,可以發源代碼給你,因為平臺限制,不能在文章發鏈接,見諒了。
404頁面的目的是:告訴瀏覽者其所請求的頁面不存在或鏈接錯誤,同時引導用戶使用網站其他頁面而不是關閉窗口離開。
現在大部分開源系統都會為大家考慮到404頁面的跳轉引導,比如:z-blog/wordpress,都是很不錯的開源系統(注意不要用最原始的開源系統,而是采用帶有模板的系統)。菜鳥后院網站本身也是wordpress的開源程序,然后我們用robin模板。(花299元擁有和菜鳥后院一樣的網站,包括域名和1G阿里巴巴云空間)
搜索引擎使用 http 狀態碼來識別網頁的狀態。當搜索引擎獲得不正確的鏈接時,網站應該返回一個狀態代碼404,告訴搜索引擎放棄索引該鏈接。如果返回一個200或302狀態代碼,搜索引擎會對鏈接進行索引,導致許多不同的鏈接指向相同的頁面內容。結果,搜索引擎對這個網站的信任度大大降低。很多網站存在這個問題,那就是404頁面返回的是200或302狀態碼而不是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可運行的 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可運行的 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的格式是一個描述文本回復模塊的功能的句子,我可以將其轉換成以下的格式:
以下是步驟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可運行的 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可運行的 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>";
// 這里可以添加一些圖表或可視化界面,如餅圖、柱狀圖、折線圖等,用于展示指標和統計信息的分布和趨勢,這里暫時省略
?>
以上就是客服系統的編碼示例,僅供參考。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。