From 27c4a247d395402140c2f457caca2427fd3b9e2d Mon Sep 17 00:00:00 2001 From: merlin Date: Wed, 17 Dec 2025 18:03:16 +0800 Subject: [PATCH] reafactor: group basic function refactor complete --- src/api/group.ts | 93 ++++++++++ src/functions/groupHistoryMessage.js | 2 +- src/router/index.js | 2 +- src/store/group_message.ts | 76 ++++++++ src/views/home/default.vue | 3 +- src/views/home/group.vue | 233 +++++++++---------------- src/views/room/{room.vue => index.vue} | 0 src/websocket/onlineSocket.js | 11 +- src/websocket/voiceSocket.js | 2 +- 9 files changed, 267 insertions(+), 155 deletions(-) create mode 100644 src/api/group.ts create mode 100644 src/store/group_message.ts rename src/views/room/{room.vue => index.vue} (100%) diff --git a/src/api/group.ts b/src/api/group.ts new file mode 100644 index 0000000..90cbc3c --- /dev/null +++ b/src/api/group.ts @@ -0,0 +1,93 @@ +import axios from "axios"; +import { userInfoStore } from "@/store/user"; + + +const userinfo = userInfoStore(); + + +export const getGroups = async ()=> { + const response = await axios.get('/api/group/get',{ + headers:{ + 'Authorization' : `Bearer ${userinfo.token}` + } + }); + if(response.data.code === "200"){ + return response.data.data; + } else { + throw new Error(response.data.message); + } +} + + +export const createGroup = async (group_name: string) => { + const response = await axios.post('/api/group/create',{ + g_name: group_name + } + ,{ + headers:{ + 'Authorization' : `Bearer ${userinfo.token}` + } + }); + if(response.data.code === "200"){ + return true; + } else { + throw new Error(response.data.message); + } +} + +export const searchGroups = async (group_name: string) => { + const response = await axios.post('/api/group/search',{ + g_name: group_name + },{ + headers:{ + 'Authorization' : `Bearer ${userinfo.token}` + } + }) + if(response.data.code === "200"){ + return response.data.data.records; + }else{ + throw new Error(response.data.message); + } + +} + +export const joinGroup = async (group_id: number) => { + const response = await axios.get('/api/group/join/'+group_id,{ + headers:{ + 'Authorization' : `Bearer ${userinfo.token}` + }}) + if(response.data.code === "200"){ + return true; + }else{ + throw new Error(response.data.message); + } +} + +export const leaveGroup = async (group_id: number) => { + const response = await axios.get('/api/group/leave/'+group_id,{ + headers:{ + 'Authorization' : `Bearer ${userinfo.token}` + }}) + if(response.data.code === "200"){ + return true; + }else{ + throw new Error(response.data.message); + } +} + +export const getGroupMembers = async (group_id: number) => { + const response = await axios.get('/api/group/member/'+group_id,{ + headers:{ + 'Authorization' : `Bearer ${userinfo.token}` + }, + params:{ + currentPage: 1, + pageSize: 50 + } + }) + if(response.data.code === "200"){ + return response.data.data; + }else{ + throw new Error(response.data.message); + } +} \ No newline at end of file diff --git a/src/functions/groupHistoryMessage.js b/src/functions/groupHistoryMessage.js index 9cbf97a..ff86954 100644 --- a/src/functions/groupHistoryMessage.js +++ b/src/functions/groupHistoryMessage.js @@ -5,7 +5,7 @@ const STORE_NAME = 'groupHistoryMessages'; // 打开数据库 const getDB = async () => { - return openDB(DB_NAME, 3, { + return openDB(DB_NAME, 4, { upgrade(db) { if (!db.objectStoreNames.contains(STORE_NAME)) { db.createObjectStore(STORE_NAME); // 使用 userId 作为 key diff --git a/src/router/index.js b/src/router/index.js index dd368df..3bbe662 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -79,7 +79,7 @@ const router = createRouter({ { path: '/room', name: 'room', - component: () => import('../views/room/room.vue'), + component: () => import('../views/room/index.vue'), } diff --git a/src/store/group_message.ts b/src/store/group_message.ts new file mode 100644 index 0000000..c92718d --- /dev/null +++ b/src/store/group_message.ts @@ -0,0 +1,76 @@ +import { defineStore } from "pinia"; +import { + saveGroupMessages, + loadGroupMessages, + deleteGroupMessages, +} from "@/functions/groupHistoryMessage"; + +interface Group_Message{ + cmd: string; + from: number; + to: number; + group: number; + content: string; + time: string; +} + +export const groupMessageStore = defineStore("groupMessageStore", { + state: () => ({ + g_id: "", + historymessages: [], + messages: [], + corresponding: [], + }), + actions: { + async recieveMessage(u_id: number, message: Group_Message) { + const key = `${u_id}-${message.group}` + if(this.g_id !== '' && this.g_id === message.group) this.messages.push(message); + await saveGroupMessages(key, [message]); + }, + reset(){ + this.g_id = ""; + this.historymessages = []; + this.messages = []; + this.corresponding = []; + }, + addMessage(message: Group_Message) { + this.messages.push(message); + }, + clearMessages() { + this.messages = []; + }, + + async initMessages() { + this.historymessages = [...this.historymessages, ...this.messages]; + this.messages = []; + }, + + async getHistoryMessages(u_id:number, g_id: number) { + this.g_id = g_id; + const key = `${u_id}-${g_id}`; + try { + this.historymessages = await loadGroupMessages(key); + // 确保历史消息是数组类型 + if (!Array.isArray(this.historymessages)) { + console.error("历史消息数据无效:", this.historymessages); + this.historymessages = []; // 如果数据无效,设置为空数组 + } + } catch (error) { + console.log("加载历史消息时出错" + error); + } + }, + async saveMessagesHistory(u_id: number, g_id: number) { + // const key = `${u_id}-${g_id}`; + // const messages = toRaw(this.messages); + this.messages = []; + this.historymessages = []; + // await saveGroupMessages(key, messages); + }, + async deleteMessagesHistory(u_id: number, g_id: number) { + const key = `${u_id}-${g_id}`; + this.historymessages = []; + this.messages = []; + await deleteGroupMessages(key, []); + }, + }, +}); \ No newline at end of file diff --git a/src/views/home/default.vue b/src/views/home/default.vue index 346d474..b5e702e 100644 --- a/src/views/home/default.vue +++ b/src/views/home/default.vue @@ -1,11 +1,12 @@ diff --git a/src/views/room/room.vue b/src/views/room/index.vue similarity index 100% rename from src/views/room/room.vue rename to src/views/room/index.vue diff --git a/src/websocket/onlineSocket.js b/src/websocket/onlineSocket.js index d18df7a..a36eaaf 100644 --- a/src/websocket/onlineSocket.js +++ b/src/websocket/onlineSocket.js @@ -1,15 +1,16 @@ import { ref } from "vue"; -import { userInfoStore } from "@/store/store"; +import { userInfoStore } from "@/store/user"; import { messageStore } from "@/store/message"; import { ElMessage } from "element-plus"; import { messageSignStore } from "@/store/message_sign"; +import { groupMessageStore } from "@/store/group_message"; // userinfo 实例 const userinfo = userInfoStore(); // message 实例 const message = messageStore(); // groupMessage 实例 -// const groupMessage = groupMessageStore(); +const groupMessage = groupMessageStore(); // messageSignStoregn 实例 // const messageSign = messageSignStore(); @@ -85,6 +86,7 @@ export const connectWebSocket = () => { switch(cmd){ case "MESSAGE": message.addMessage(MessageData); + // TODO:需要使用u_name或者u_id进行消息标记 // messageSign.setMessageSign(true); // ElMessage.info("您有一条新的消息"); break; @@ -92,6 +94,11 @@ export const connectWebSocket = () => { messageSign.setMessageSign(true); ElMessage.info("您有一条新的邀请消息"); break; + case "GROUP_MESSAGE": + groupMessage.recieveMessage(userinfo.user.id, MessageData); + + // TODO: 需要使用groupId进行消息标记 + break; } }catch(error){ console.error("解析 JSON 失败:", error); diff --git a/src/websocket/voiceSocket.js b/src/websocket/voiceSocket.js index b4e32ba..9277808 100644 --- a/src/websocket/voiceSocket.js +++ b/src/websocket/voiceSocket.js @@ -1,5 +1,5 @@ import { ref } from "vue"; -import { userInfoStore } from "@/store/store"; +import { userInfoStore } from "@/store/user"; import { onCallStore } from "@/store/VoiceTarget"; import { ElMessage } from "element-plus";