From b7a90e2fc241945faab31b92ed065444ab6d5ad8 Mon Sep 17 00:00:00 2001 From: liqi Date: Mon, 8 Dec 2025 13:43:54 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9C=8B=E5=8F=8B=E5=9C=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/websocket/index.ts | 6 +- src/components/chat/GroupInfoPanel.vue | 78 ++- src/components/common/VideoPlayer.vue | 591 ++++++++++++++++++ src/components/moment/MomentCard.vue | 11 +- src/components/moment/MomentPanel.vue | 174 +++++- src/components/moment/MomentPublisherDark.vue | 19 +- src/views/contact/README.md | 3 + 7 files changed, 831 insertions(+), 51 deletions(-) create mode 100644 src/components/common/VideoPlayer.vue diff --git a/src/api/websocket/index.ts b/src/api/websocket/index.ts index 720ec03..0cef432 100644 --- a/src/api/websocket/index.ts +++ b/src/api/websocket/index.ts @@ -124,7 +124,7 @@ class WebSocketManager { onMessage(handler: MessageHandler) { // 防止重复注册 if (!this.messageHandlers.includes(handler)) { - this.messageHandlers.push(handler) + this.messageHandlers.push(handler) } } @@ -144,7 +144,7 @@ class WebSocketManager { onSignal(handler: SignalHandler) { // 防止重复注册 if (!this.signalHandlers.includes(handler)) { - this.signalHandlers.push(handler) + this.signalHandlers.push(handler) } } @@ -164,7 +164,7 @@ class WebSocketManager { onMomentNotification(handler: MomentNotifHandler) { // 防止重复注册 if (!this.momentNotifHandlers.includes(handler)) { - this.momentNotifHandlers.push(handler) + this.momentNotifHandlers.push(handler) } } diff --git a/src/components/chat/GroupInfoPanel.vue b/src/components/chat/GroupInfoPanel.vue index c1b90ed..a8f1792 100644 --- a/src/components/chat/GroupInfoPanel.vue +++ b/src/components/chat/GroupInfoPanel.vue @@ -130,6 +130,19 @@
+ +
+ +
+ + {{ member.nickname || member.user?.name || '未知' }} @@ -186,6 +199,31 @@ + +
+
+
+ +
+

移除成员

+

+ 确定要将 {{ removingMember.nickname || removingMember.user?.name || '该成员' }} 移出群聊吗? +

+
+ + +
+
+
+ @@ -221,14 +259,29 @@ const showEditModal = ref(false) const showQuitConfirm = ref(false) const showDissolveConfirm = ref(false) const showCallModal = ref(false) +const removingMember = ref(null) +const removing = ref(false) const editForm = ref({ name: '', avatar: '' }) // Computed -const isOwner = computed(() => groupInfo.value && authStore.user && members.value.find(m => m.user_id === authStore.user?.id)?.role === 2) -const isAdmin = computed(() => groupInfo.value && authStore.user && members.value.find(m => m.user_id === authStore.user?.id)?.role === 1) +const currentUserRole = computed(() => members.value.find(m => m.user_id === authStore.user?.id)?.role ?? 0) +const isOwner = computed(() => currentUserRole.value === 2) +const isAdmin = computed(() => currentUserRole.value === 1) const canInvite = computed(() => isOwner.value || isAdmin.value) const canEdit = computed(() => isOwner.value) +const canRemove = computed(() => isOwner.value || isAdmin.value) + +// 判断是否可以移除某个成员 +function canRemoveMember(member: GroupMember): boolean { + // 不能移除自己 + if (member.user_id === authStore.user?.id) return false + // 群主可以移除任何人 + if (isOwner.value) return true + // 管理员只能移除普通成员(role=0) + if (isAdmin.value && member.role === 0) return true + return false +} // 转换群成员为 Contact 格式,供 GroupCallModal 使用 const callCandidates = computed(() => { @@ -337,6 +390,27 @@ async function handleDissolve() { function handleMemberClick(member: GroupMember) { /* 可以添加查看成员资料逻辑 */ } +// 移除成员相关 +function showRemoveConfirm(member: GroupMember) { + removingMember.value = member +} + +async function handleRemoveMember() { + if (!removingMember.value) return + removing.value = true + try { + await groupApi.removeGroupMember(props.roomId, removingMember.value.user_id) + toastStore.success('已移除该成员') + removingMember.value = null + loadGroupInfo() + emit('updated') + } catch (e) { + toastStore.error('移除失败') + } finally { + removing.value = false + } +} + watch(() => props.show, (val) => { if (val) loadGroupInfo() }) diff --git a/src/components/common/VideoPlayer.vue b/src/components/common/VideoPlayer.vue new file mode 100644 index 0000000..c838573 --- /dev/null +++ b/src/components/common/VideoPlayer.vue @@ -0,0 +1,591 @@ + + + + + diff --git a/src/components/moment/MomentCard.vue b/src/components/moment/MomentCard.vue index 86afa46..062645f 100644 --- a/src/components/moment/MomentCard.vue +++ b/src/components/moment/MomentCard.vue @@ -79,14 +79,8 @@ -
- +
+
@@ -183,6 +177,7 @@