使用到的東西都會列在下方
## 使用套件cdn
sockjs:
https://github.com/sockjs/sockjs-client
stompjs:
https://github.com/stomp-js/stompjs
# github :
https://github.com/Phoenix-0921/chatroom
後端
https://github.com/Phoenix-0921/chatroomup
前端
## 聊天頁面
https://codepen.io/Varo/pen/YPmwpQ
內含html,css
https://freefrontend.com/css-chats/
chat UI 2.0
# 發想
我現在想做一個匿名聊天室
我按下配對後會發送一個隨機ID到後端去做匹配
等到下一個按下配對的人後
他會取得我的隨機ID
然後創建一個table 把我們的ID,聊天內容,時間戳記加到資料庫
當其中有一個人按下離開的時候會刪除這個table
我會用vue+css 來解決前端, 用java 來寫後端 mysql 來製作資料庫
### GPT 給我的回應
使用者介面:首先,你需要設計一個使用者介面,讓使用者可以進入聊天室、輸入訊息並查看其他使用者的訊息。你可以使用 HTML、CSS 和 JavaScript 來建立網頁介面。
前端程式碼:使用 JavaScript 或者其他前端框架,你需要處理使用者的輸入、顯示訊息,並與後端進行通訊。
後端程式碼:你需要建立一個後端伺服器,來處理使用者之間的通訊。你可以使用 Node.js、Python 等程式語言來建立伺服器。
資料庫:為了儲存使用者的訊息、連線資訊等,你需要選擇一個資料庫系統,例如 MySQL、MongoDB 等。
隨機匿名配對:這是整個專案的核心功能。當使用者進入聊天室時,你需要將他們隨機匿名地配對起來,讓他們可以開始聊天。
聊天功能:建立使用者之間的即時聊天功能,讓配對的兩個使用者可以互相傳送訊息。
匿名性:確保聊天室中的使用者能夠保持匿名,不要顯示真實的名稱或資訊。
安全性:考慮到使用者的安全,你需要實施一些機制,例如過濾不當的言語、防止濫用等。
部署:最後,你需要將你的網站部署到一個適合的伺服器上,讓其他使用者可以訪問你的隨機匿名聊天室。
## 套件
我裝了幾個套件
```
$ yarn add axios
$ yarn add stompjs
$ yarn add sockjs-client
```
遇到了問題
需要在後端設定跨域
`setAllowedOrigins(http://localhost:5173)`
不可使用(*)全域設定上限須在更改測試
## 想法
我會需要利用資料庫做配對方式
1. 第一個人點下連接
會發送CookieID和WebsocketID到後端資料庫等待連接
第二個人點下連接會先去資料庫做配對
2. 若有人在等待連接則取得WebsocketID連接後刪除表格
並寫入下一個資料表
將雙方CookieID,訊息內容,WebsockID留下做紀錄
除非點開斷開連接,不然下次重開網頁,也會去抓資料庫把內容還原
PS.這個功能好像要先做才去做連接不然會連不回去
3. 若斷開連接後會把此筆資料刪除以防資料庫資料過多
## GPT回應
感謝進一步說明你的需求!根據你的描述,確實需要使用資料庫來處理使用者之間的配對和連接,並保留聊天記錄。下面是我們可以進行的修改和建議:
資料庫設計:根據你的需求,建議建立兩個資料表,一個用於存儲使用者的 WebSocket ID 和 Cookie ID 的配對,另一個用於存儲聊天記錄。
```sql=
CREATE TABLE user_connections (
id INT AUTO_INCREMENT PRIMARY KEY,
cookie_id VARCHAR(255) NOT NULL,
websocket_id VARCHAR(255) NOT NULL
);
CREATE TABLE chat_records (
id INT AUTO_INCREMENT PRIMARY KEY,
sender_cookie_id VARCHAR(255) NOT NULL,
receiver_cookie_id VARCHAR(255) NOT NULL,
content TEXT NOT NULL,
timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
```
RandomChatRoomService 修改:修改 matchUsers 方法,新增方法用於處理斷開連接並刪除配對資料。
```java=
public void matchUsers(String cookieID, String webSocketID) {
// 將使用者的 WebSocket ID 和 Cookie ID 關聯存入資料庫的 user_connections 表
addUserConnection(cookieID, webSocketID);
// 查詢資料庫,尋找與目前使用者不同且未被匹配的使用者
String matchedWebSocketID = getMatchedWebSocketID(cookieID);
if (matchedWebSocketID != null) {
// 找到匹配的使用者,建立連接,並刪除配對資料
addUserConnection(matchedWebSocketID, webSocketID);
removeMatchedUser(matchedWebSocketID);
removeMatchedUser(cookieID);
// 在這裡執行將用戶進行匿名聊天的相關邏輯
System.out.println("用戶 " + cookieID + " 和用戶 " + matchedWebSocketID + " 成功匹配,可以進行匿名聊天!");
} else {
System.out.println("目前找不到足夠的用戶進行配對,請稍後再試。");
}
}
private void addUserConnection(String cookieID, String webSocketID) {
// 在這裡執行將 cookieID 和 webSocketID 儲存到 user_connections 資料表的邏輯
}
private String getMatchedWebSocketID(String cookieID) {
// 在這裡執行查詢 user_connections 資料表的邏輯,找到匹配的使用者的 WebSocket ID
return null;
}
private void removeMatchedUser(String cookieID) {
// 在這裡執行刪除 user_connections 資料表中特定 cookieID 的資料的邏輯
}
```
CharRoomController 修改:在 WebSocket 連接斷開時,將聊天記錄寫入資料庫。
```=java
@MessageMapping("/messageControl")
@SendTo("/topic/getResponse")
@CrossOrigin(value = "*") // 允許跨域請求
public ServerResponseModel said(ChatClientModel request) throws InterruptedException {
Thread.sleep(3000);
String responseMessage = request.getMessage();
saveChatRecord(request.getSenderCookieID(), request.getReceiverCookieID(), responseMessage);
return new ServerResponseModel(responseMessage);
}
private void saveChatRecord(String senderCookieID, String receiverCookieID, String content) {
// 在這裡執行將聊天記錄儲存到 chat_records 資料表的邏輯
}
```
RandomChatRoomController 修改:新增一個方法處理斷開連接。
```java=
// 新增一個 API 來處理斷開連接,並刪除使用者連接資料
@PostMapping("/chat/disconnect")
@CrossOrigin(value = "*")
public ResponseEntity<String> disconnectUser(@RequestParam String cookieID) {
randomChatRoomService.removeMatchedUser(cookieID);
return ResponseEntity.ok("已斷開連接,資料已刪除。");
}
```
前端程式碼修改:新增一個 API 來處理斷開連接的請求,並在用戶主動斷開連接時調用此 API。
```javascript=
// 在 RandomChatRoomService 中新增一個方法
disconnect() {
axios.post("http://localhost:8080/chat/disconnect", { cookieID: this.cookieID })
.then(response => {
console.log(response.data);
})
.catch(error => {
console.error(error);
});
}
```
然後在前端的 Vue 組件中,調用 disconnect 方法,例如在點選斷開連接的按鈕時。
這樣修改後,使用者點選連接後,將 Cookie ID 和 WebSocket ID 傳送到後端進行配對,匹配成功後會建立一對一連接,並將聊天記錄寫入資料庫。當使用者主動點選斷開連接時,後端會刪除該使用者的連接資料,以防資料庫資料過多。
希望這些修改能夠幫助你實現所需的功能!如果你有任何進一步的問題,請隨時向我詢問。祝你順利完成專案!