From dfe4c8a0407701ca453c85f2c0de354000685e47 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Thu, 18 Jun 2026 16:09:40 -0700 Subject: [PATCH] =?UTF-8?q?feat(im)=EF=BC=9A=E5=88=9D=E5=A7=8B=E5=8C=96=20?= =?UTF-8?q?ele=20=E7=9A=84=20im=20=E8=BF=81=E7=A7=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/views/im/home/store/friendStore.ts | 3 + .../src/views/im/home/store/messageStore.ts | 19 +- .../im/manager/message/content-preview.vue | 4 +- .../statistics/components/trend-chart.vue | 7 +- apps/web-antd/src/views/im/utils/auth.ts | 2 +- apps/web-antd/src/views/im/utils/group.ts | 12 +- apps/web-antd/src/views/im/utils/pull.ts | 3 + apps/web-ele/package.json | 1 + .../src/api/im/channel/material/index.ts | 24 + .../src/api/im/conversation/read/index.ts | 25 + apps/web-ele/src/api/im/face/pack/index.ts | 26 + .../web-ele/src/api/im/face/useritem/index.ts | 38 + apps/web-ele/src/api/im/friend/index.ts | 78 ++ .../src/api/im/friend/request/index.ts | 84 ++ apps/web-ele/src/api/im/group/index.ts | 146 ++ apps/web-ele/src/api/im/group/member/index.ts | 78 ++ .../web-ele/src/api/im/group/request/index.ts | 90 ++ .../src/api/im/manager/channel/index.ts | 56 + .../api/im/manager/channel/material/index.ts | 68 + .../api/im/manager/channel/message/index.ts | 48 + .../src/api/im/manager/face/item/index.ts | 63 + .../src/api/im/manager/face/pack/index.ts | 55 + .../src/api/im/manager/face/useritem/index.ts | 33 + .../src/api/im/manager/friend/index.ts | 32 + .../api/im/manager/friend/request/index.ts | 30 + .../web-ele/src/api/im/manager/group/index.ts | 87 ++ .../src/api/im/manager/group/request/index.ts | 33 + .../src/api/im/manager/message/group/index.ts | 40 + .../api/im/manager/message/private/index.ts | 38 + apps/web-ele/src/api/im/manager/rtc/index.ts | 53 + .../src/api/im/manager/sensitiveword/index.ts | 60 + .../src/api/im/manager/statistics/index.ts | 88 ++ .../src/api/im/message/channel/index.ts | 34 + .../web-ele/src/api/im/message/group/index.ts | 92 ++ .../src/api/im/message/private/index.ts | 89 ++ apps/web-ele/src/api/im/rtc/index.ts | 105 ++ apps/web-ele/src/api/system/user/index.ts | 31 + .../src/assets/audio/im/message-tip.mp3 | Bin 0 -> 13059 bytes .../src/components/dict-tag/dict-tag.vue | 73 +- apps/web-ele/src/layouts/basic.vue | 20 +- apps/web-ele/src/router/routes/modules/im.ts | 43 + .../im/home/components/card/card-bubble.vue | 68 + .../home/components/card/card-line-label.vue | 29 + .../views/im/home/components/card/index.ts | 2 + .../views/im/home/components/context-menu.vue | 99 ++ .../components/friend/friend-add-dialog.vue | 289 ++++ .../im/home/components/friend/friend-item.vue | 79 ++ .../views/im/home/components/friend/index.ts | 2 + .../group/group-admin-set-dialog.vue | 122 ++ .../im/home/components/group/group-avatar.vue | 131 ++ .../components/group/group-create-dialog.vue | 144 ++ .../home/components/group/group-info-card.vue | 116 ++ .../im/home/components/group/group-info.vue | 154 +++ .../im/home/components/group/group-item.vue | 43 + .../group/group-member-add-dialog.vue | 167 +++ .../components/group/group-member-grid.vue | 50 + .../components/group/group-member-item.vue | 84 ++ .../group/group-member-remove-dialog.vue | 105 ++ .../im/home/components/group/group-member.vue | 64 + .../group/group-mute-member-dialog.vue | 97 ++ .../group/group-owner-transfer-dialog.vue | 126 ++ .../group/group-request-list-dialog.vue | 377 +++++ .../views/im/home/components/group/index.ts | 15 + .../src/views/im/home/components/index.ts | 4 + .../im/home/components/paged-scroller.vue | 109 ++ .../picker/conversation-picker-panel.vue | 370 +++++ .../components/picker/friend-picker-panel.vue | 245 ++++ .../picker/group-member-picker-panel.vue | 242 ++++ .../views/im/home/components/picker/index.ts | 3 + .../home/components/picker/picker-dialog.scss | 13 + .../im/home/components/resizable-aside.vue | 111 ++ .../src/views/im/home/components/rtc/index.ts | 8 + .../components/rtc/rtc-call-container.vue | 488 +++++++ .../home/components/rtc/rtc-call-incoming.vue | 112 ++ .../home/components/rtc/rtc-call-inviting.vue | 129 ++ .../rtc/rtc-call-member-picker-dialog.vue | 109 ++ .../rtc/rtc-call-participant-tile.vue | 110 ++ .../home/components/rtc/rtc-call-running.vue | 291 ++++ .../components/rtc/rtc-group-call-banner.vue | 176 +++ .../src/views/im/home/components/tool-bar.vue | 123 ++ .../views/im/home/components/user/index.ts | 5 + .../components/user/recommend-card-dialog.vue | 322 +++++ .../im/home/components/user/user-avatar.vue | 134 ++ .../home/components/user/user-info-card.vue | 121 ++ .../im/home/components/user/user-info.vue | 449 ++++++ .../im/home/composables/useFriendBuckets.ts | 99 ++ .../home/composables/useGroupCallMembers.ts | 53 + .../im/home/composables/useLiveKitRoom.ts | 331 +++++ .../home/composables/useMediaStreamElement.ts | 27 + .../im/home/composables/useMediaUploader.ts | 408 ++++++ .../home/composables/useMessageMultiSelect.ts | 48 + .../im/home/composables/useMessagePuller.ts | 455 ++++++ .../im/home/composables/useMessageSender.ts | 311 +++++ .../im/home/composables/useMuteOverlay.ts | 102 ++ .../im/home/composables/useSelectedItems.ts | 75 + .../im/home/composables/useVoicePlayer.ts | 82 ++ apps/web-ele/src/views/im/home/index.vue | 290 ++++ .../im/home/pages/contact/friend-list.vue | 73 + .../pages/contact/friend-request-detail.vue | 229 ++++ .../pages/contact/friend-request-list.vue | 138 ++ .../im/home/pages/contact/group-detail.vue | 26 + .../im/home/pages/contact/group-list.vue | 65 + .../src/views/im/home/pages/contact/index.vue | 309 +++++ .../conversation/conversation-group-side.vue | 837 ++++++++++++ .../conversation/conversation-item.vue | 314 +++++ .../conversation-private-side.vue | 279 ++++ .../components/conversation/index.ts | 3 + .../pages/conversation/components/index.ts | 3 + .../components/input/face-picker.vue | 353 +++++ .../conversation/components/input/index.ts | 5 + .../components/input/mention-picker.vue | 207 +++ .../components/input/message-input.vue | 1217 +++++++++++++++++ .../input/message-multi-select-bar.vue | 153 +++ .../components/input/voice-recorder.vue | 340 +++++ .../components/message/forward/index.ts | 2 + .../components/message/forward/keys.ts | 24 + .../forward/message-forward-dialog.vue | 446 ++++++ .../forward/message-merge-detail-dialog.vue | 129 ++ .../message/group-pinned-message.vue | 207 +++ .../message/group-request-pending.vue | 88 ++ .../conversation/components/message/index.ts | 10 + .../components/message/material-bubble.vue | 170 +++ .../components/message/message-bubble.vue | 414 ++++++ .../components/message/message-history.vue | 806 +++++++++++ .../components/message/message-item.vue | 1055 ++++++++++++++ .../components/message/message-panel.vue | 813 +++++++++++ .../message/message-read-status.vue | 169 +++ .../components/message/reply-preview.vue | 234 ++++ .../components/message/tip-segments.vue | 54 + .../im/home/pages/conversation/index.vue | 281 ++++ .../src/views/im/home/store/channelStore.ts | 108 ++ .../views/im/home/store/conversationStore.ts | 885 ++++++++++++ .../src/views/im/home/store/faceStore.ts | 151 ++ .../src/views/im/home/store/friendStore.ts | 849 ++++++++++++ .../views/im/home/store/groupRequestStore.ts | 242 ++++ .../src/views/im/home/store/groupStore.ts | 974 +++++++++++++ .../src/views/im/home/store/messageStore.ts | 926 +++++++++++++ .../src/views/im/home/store/rtcStore.ts | 404 ++++++ .../src/views/im/home/store/uiStore.ts | 155 +++ .../src/views/im/home/store/websocketStore.ts | 1173 ++++++++++++++++ apps/web-ele/src/views/im/home/types/index.ts | 306 +++++ .../manager/channel/list/components/index.ts | 1 + .../channel/list/components/select.vue | 66 + .../src/views/im/manager/channel/list/data.ts | 156 +++ .../views/im/manager/channel/list/index.vue | 129 ++ .../im/manager/channel/list/modules/form.vue | 82 ++ .../channel/material/components/index.ts | 1 + .../channel/material/components/select.vue | 71 + .../views/im/manager/channel/material/data.ts | 234 ++++ .../im/manager/channel/material/index.vue | 137 ++ .../manager/channel/material/modules/form.vue | 87 ++ .../im/manager/channel/message/index.vue | 131 ++ .../channel/message/modules/send-form.vue | 100 ++ .../src/views/im/manager/face/pack/data.ts | 373 +++++ .../src/views/im/manager/face/pack/index.vue | 195 +++ .../im/manager/face/pack/modules/form.vue | 83 ++ .../manager/face/pack/modules/item-drawer.vue | 214 +++ .../manager/face/pack/modules/item-form.vue | 119 ++ .../views/im/manager/face/userItem/index.vue | 105 ++ .../src/views/im/manager/friend/data.ts | 264 ++++ .../src/views/im/manager/friend/index.vue | 84 ++ .../views/im/manager/friend/request/index.vue | 60 + .../im/manager/group/components/index.ts | 2 + .../group/components/select-dialog.vue | 271 ++++ .../im/manager/group/components/select.vue | 129 ++ .../src/views/im/manager/group/data.ts | 255 ++++ .../src/views/im/manager/group/index.vue | 169 +++ .../im/manager/group/modules/ban-form.vue | 66 + .../views/im/manager/group/modules/detail.vue | 136 ++ .../views/im/manager/group/request/index.vue | 75 + .../im/manager/message/content-preview.vue | 254 ++++ .../src/views/im/manager/message/data.ts | 254 ++++ .../views/im/manager/message/group/index.vue | 110 ++ .../manager/message/group/modules/detail.vue | 92 ++ .../src/views/im/manager/message/index.ts | 1 + .../im/manager/message/private/index.vue | 101 ++ .../message/private/modules/detail.vue | 75 + apps/web-ele/src/views/im/manager/rtc/data.ts | 144 ++ .../src/views/im/manager/rtc/index.vue | 98 ++ .../views/im/manager/rtc/modules/detail.vue | 114 ++ .../views/im/manager/sensitiveword/data.ts | 119 ++ .../views/im/manager/sensitiveword/index.vue | 172 +++ .../im/manager/sensitiveword/modules/form.vue | 83 ++ .../components/distribution-chart.vue | 119 ++ .../im/manager/statistics/components/index.ts | 3 + .../statistics/components/overview-cards.vue | 105 ++ .../statistics/components/trend-chart.vue | 144 ++ .../src/views/im/manager/statistics/index.vue | 45 + .../src/views/im/manager/utils/format.ts | 55 + apps/web-ele/src/views/im/utils/auth.ts | 14 + apps/web-ele/src/views/im/utils/channel.ts | 18 + apps/web-ele/src/views/im/utils/config.ts | 133 ++ apps/web-ele/src/views/im/utils/constants.ts | 296 ++++ .../src/views/im/utils/conversation.ts | 177 +++ apps/web-ele/src/views/im/utils/db.ts | 537 ++++++++ apps/web-ele/src/views/im/utils/emoji.ts | 21 + apps/web-ele/src/views/im/utils/group.ts | 289 ++++ apps/web-ele/src/views/im/utils/image.ts | 57 + apps/web-ele/src/views/im/utils/message.ts | 1033 ++++++++++++++ apps/web-ele/src/views/im/utils/pull.ts | 155 +++ apps/web-ele/src/views/im/utils/time.ts | 128 ++ apps/web-ele/src/views/im/utils/user.ts | 367 +++++ .../views/system/user/components/select.vue | 115 +- 203 files changed, 34993 insertions(+), 85 deletions(-) create mode 100644 apps/web-ele/src/api/im/channel/material/index.ts create mode 100644 apps/web-ele/src/api/im/conversation/read/index.ts create mode 100644 apps/web-ele/src/api/im/face/pack/index.ts create mode 100644 apps/web-ele/src/api/im/face/useritem/index.ts create mode 100644 apps/web-ele/src/api/im/friend/index.ts create mode 100644 apps/web-ele/src/api/im/friend/request/index.ts create mode 100644 apps/web-ele/src/api/im/group/index.ts create mode 100644 apps/web-ele/src/api/im/group/member/index.ts create mode 100644 apps/web-ele/src/api/im/group/request/index.ts create mode 100644 apps/web-ele/src/api/im/manager/channel/index.ts create mode 100644 apps/web-ele/src/api/im/manager/channel/material/index.ts create mode 100644 apps/web-ele/src/api/im/manager/channel/message/index.ts create mode 100644 apps/web-ele/src/api/im/manager/face/item/index.ts create mode 100644 apps/web-ele/src/api/im/manager/face/pack/index.ts create mode 100644 apps/web-ele/src/api/im/manager/face/useritem/index.ts create mode 100644 apps/web-ele/src/api/im/manager/friend/index.ts create mode 100644 apps/web-ele/src/api/im/manager/friend/request/index.ts create mode 100644 apps/web-ele/src/api/im/manager/group/index.ts create mode 100644 apps/web-ele/src/api/im/manager/group/request/index.ts create mode 100644 apps/web-ele/src/api/im/manager/message/group/index.ts create mode 100644 apps/web-ele/src/api/im/manager/message/private/index.ts create mode 100644 apps/web-ele/src/api/im/manager/rtc/index.ts create mode 100644 apps/web-ele/src/api/im/manager/sensitiveword/index.ts create mode 100644 apps/web-ele/src/api/im/manager/statistics/index.ts create mode 100644 apps/web-ele/src/api/im/message/channel/index.ts create mode 100644 apps/web-ele/src/api/im/message/group/index.ts create mode 100644 apps/web-ele/src/api/im/message/private/index.ts create mode 100644 apps/web-ele/src/api/im/rtc/index.ts create mode 100644 apps/web-ele/src/assets/audio/im/message-tip.mp3 create mode 100644 apps/web-ele/src/router/routes/modules/im.ts create mode 100644 apps/web-ele/src/views/im/home/components/card/card-bubble.vue create mode 100644 apps/web-ele/src/views/im/home/components/card/card-line-label.vue create mode 100644 apps/web-ele/src/views/im/home/components/card/index.ts create mode 100644 apps/web-ele/src/views/im/home/components/context-menu.vue create mode 100644 apps/web-ele/src/views/im/home/components/friend/friend-add-dialog.vue create mode 100644 apps/web-ele/src/views/im/home/components/friend/friend-item.vue create mode 100644 apps/web-ele/src/views/im/home/components/friend/index.ts create mode 100644 apps/web-ele/src/views/im/home/components/group/group-admin-set-dialog.vue create mode 100644 apps/web-ele/src/views/im/home/components/group/group-avatar.vue create mode 100644 apps/web-ele/src/views/im/home/components/group/group-create-dialog.vue create mode 100644 apps/web-ele/src/views/im/home/components/group/group-info-card.vue create mode 100644 apps/web-ele/src/views/im/home/components/group/group-info.vue create mode 100644 apps/web-ele/src/views/im/home/components/group/group-item.vue create mode 100644 apps/web-ele/src/views/im/home/components/group/group-member-add-dialog.vue create mode 100644 apps/web-ele/src/views/im/home/components/group/group-member-grid.vue create mode 100644 apps/web-ele/src/views/im/home/components/group/group-member-item.vue create mode 100644 apps/web-ele/src/views/im/home/components/group/group-member-remove-dialog.vue create mode 100644 apps/web-ele/src/views/im/home/components/group/group-member.vue create mode 100644 apps/web-ele/src/views/im/home/components/group/group-mute-member-dialog.vue create mode 100644 apps/web-ele/src/views/im/home/components/group/group-owner-transfer-dialog.vue create mode 100644 apps/web-ele/src/views/im/home/components/group/group-request-list-dialog.vue create mode 100644 apps/web-ele/src/views/im/home/components/group/index.ts create mode 100644 apps/web-ele/src/views/im/home/components/index.ts create mode 100644 apps/web-ele/src/views/im/home/components/paged-scroller.vue create mode 100644 apps/web-ele/src/views/im/home/components/picker/conversation-picker-panel.vue create mode 100644 apps/web-ele/src/views/im/home/components/picker/friend-picker-panel.vue create mode 100644 apps/web-ele/src/views/im/home/components/picker/group-member-picker-panel.vue create mode 100644 apps/web-ele/src/views/im/home/components/picker/index.ts create mode 100644 apps/web-ele/src/views/im/home/components/picker/picker-dialog.scss create mode 100644 apps/web-ele/src/views/im/home/components/resizable-aside.vue create mode 100644 apps/web-ele/src/views/im/home/components/rtc/index.ts create mode 100644 apps/web-ele/src/views/im/home/components/rtc/rtc-call-container.vue create mode 100644 apps/web-ele/src/views/im/home/components/rtc/rtc-call-incoming.vue create mode 100644 apps/web-ele/src/views/im/home/components/rtc/rtc-call-inviting.vue create mode 100644 apps/web-ele/src/views/im/home/components/rtc/rtc-call-member-picker-dialog.vue create mode 100644 apps/web-ele/src/views/im/home/components/rtc/rtc-call-participant-tile.vue create mode 100644 apps/web-ele/src/views/im/home/components/rtc/rtc-call-running.vue create mode 100644 apps/web-ele/src/views/im/home/components/rtc/rtc-group-call-banner.vue create mode 100644 apps/web-ele/src/views/im/home/components/tool-bar.vue create mode 100644 apps/web-ele/src/views/im/home/components/user/index.ts create mode 100644 apps/web-ele/src/views/im/home/components/user/recommend-card-dialog.vue create mode 100644 apps/web-ele/src/views/im/home/components/user/user-avatar.vue create mode 100644 apps/web-ele/src/views/im/home/components/user/user-info-card.vue create mode 100644 apps/web-ele/src/views/im/home/components/user/user-info.vue create mode 100644 apps/web-ele/src/views/im/home/composables/useFriendBuckets.ts create mode 100644 apps/web-ele/src/views/im/home/composables/useGroupCallMembers.ts create mode 100644 apps/web-ele/src/views/im/home/composables/useLiveKitRoom.ts create mode 100644 apps/web-ele/src/views/im/home/composables/useMediaStreamElement.ts create mode 100644 apps/web-ele/src/views/im/home/composables/useMediaUploader.ts create mode 100644 apps/web-ele/src/views/im/home/composables/useMessageMultiSelect.ts create mode 100644 apps/web-ele/src/views/im/home/composables/useMessagePuller.ts create mode 100644 apps/web-ele/src/views/im/home/composables/useMessageSender.ts create mode 100644 apps/web-ele/src/views/im/home/composables/useMuteOverlay.ts create mode 100644 apps/web-ele/src/views/im/home/composables/useSelectedItems.ts create mode 100644 apps/web-ele/src/views/im/home/composables/useVoicePlayer.ts create mode 100644 apps/web-ele/src/views/im/home/index.vue create mode 100644 apps/web-ele/src/views/im/home/pages/contact/friend-list.vue create mode 100644 apps/web-ele/src/views/im/home/pages/contact/friend-request-detail.vue create mode 100644 apps/web-ele/src/views/im/home/pages/contact/friend-request-list.vue create mode 100644 apps/web-ele/src/views/im/home/pages/contact/group-detail.vue create mode 100644 apps/web-ele/src/views/im/home/pages/contact/group-list.vue create mode 100644 apps/web-ele/src/views/im/home/pages/contact/index.vue create mode 100644 apps/web-ele/src/views/im/home/pages/conversation/components/conversation/conversation-group-side.vue create mode 100644 apps/web-ele/src/views/im/home/pages/conversation/components/conversation/conversation-item.vue create mode 100644 apps/web-ele/src/views/im/home/pages/conversation/components/conversation/conversation-private-side.vue create mode 100644 apps/web-ele/src/views/im/home/pages/conversation/components/conversation/index.ts create mode 100644 apps/web-ele/src/views/im/home/pages/conversation/components/index.ts create mode 100644 apps/web-ele/src/views/im/home/pages/conversation/components/input/face-picker.vue create mode 100644 apps/web-ele/src/views/im/home/pages/conversation/components/input/index.ts create mode 100644 apps/web-ele/src/views/im/home/pages/conversation/components/input/mention-picker.vue create mode 100644 apps/web-ele/src/views/im/home/pages/conversation/components/input/message-input.vue create mode 100644 apps/web-ele/src/views/im/home/pages/conversation/components/input/message-multi-select-bar.vue create mode 100644 apps/web-ele/src/views/im/home/pages/conversation/components/input/voice-recorder.vue create mode 100644 apps/web-ele/src/views/im/home/pages/conversation/components/message/forward/index.ts create mode 100644 apps/web-ele/src/views/im/home/pages/conversation/components/message/forward/keys.ts create mode 100644 apps/web-ele/src/views/im/home/pages/conversation/components/message/forward/message-forward-dialog.vue create mode 100644 apps/web-ele/src/views/im/home/pages/conversation/components/message/forward/message-merge-detail-dialog.vue create mode 100644 apps/web-ele/src/views/im/home/pages/conversation/components/message/group-pinned-message.vue create mode 100644 apps/web-ele/src/views/im/home/pages/conversation/components/message/group-request-pending.vue create mode 100644 apps/web-ele/src/views/im/home/pages/conversation/components/message/index.ts create mode 100644 apps/web-ele/src/views/im/home/pages/conversation/components/message/material-bubble.vue create mode 100644 apps/web-ele/src/views/im/home/pages/conversation/components/message/message-bubble.vue create mode 100644 apps/web-ele/src/views/im/home/pages/conversation/components/message/message-history.vue create mode 100644 apps/web-ele/src/views/im/home/pages/conversation/components/message/message-item.vue create mode 100644 apps/web-ele/src/views/im/home/pages/conversation/components/message/message-panel.vue create mode 100644 apps/web-ele/src/views/im/home/pages/conversation/components/message/message-read-status.vue create mode 100644 apps/web-ele/src/views/im/home/pages/conversation/components/message/reply-preview.vue create mode 100644 apps/web-ele/src/views/im/home/pages/conversation/components/message/tip-segments.vue create mode 100644 apps/web-ele/src/views/im/home/pages/conversation/index.vue create mode 100644 apps/web-ele/src/views/im/home/store/channelStore.ts create mode 100644 apps/web-ele/src/views/im/home/store/conversationStore.ts create mode 100644 apps/web-ele/src/views/im/home/store/faceStore.ts create mode 100644 apps/web-ele/src/views/im/home/store/friendStore.ts create mode 100644 apps/web-ele/src/views/im/home/store/groupRequestStore.ts create mode 100644 apps/web-ele/src/views/im/home/store/groupStore.ts create mode 100644 apps/web-ele/src/views/im/home/store/messageStore.ts create mode 100644 apps/web-ele/src/views/im/home/store/rtcStore.ts create mode 100644 apps/web-ele/src/views/im/home/store/uiStore.ts create mode 100644 apps/web-ele/src/views/im/home/store/websocketStore.ts create mode 100644 apps/web-ele/src/views/im/home/types/index.ts create mode 100644 apps/web-ele/src/views/im/manager/channel/list/components/index.ts create mode 100644 apps/web-ele/src/views/im/manager/channel/list/components/select.vue create mode 100644 apps/web-ele/src/views/im/manager/channel/list/data.ts create mode 100644 apps/web-ele/src/views/im/manager/channel/list/index.vue create mode 100644 apps/web-ele/src/views/im/manager/channel/list/modules/form.vue create mode 100644 apps/web-ele/src/views/im/manager/channel/material/components/index.ts create mode 100644 apps/web-ele/src/views/im/manager/channel/material/components/select.vue create mode 100644 apps/web-ele/src/views/im/manager/channel/material/data.ts create mode 100644 apps/web-ele/src/views/im/manager/channel/material/index.vue create mode 100644 apps/web-ele/src/views/im/manager/channel/material/modules/form.vue create mode 100644 apps/web-ele/src/views/im/manager/channel/message/index.vue create mode 100644 apps/web-ele/src/views/im/manager/channel/message/modules/send-form.vue create mode 100644 apps/web-ele/src/views/im/manager/face/pack/data.ts create mode 100644 apps/web-ele/src/views/im/manager/face/pack/index.vue create mode 100644 apps/web-ele/src/views/im/manager/face/pack/modules/form.vue create mode 100644 apps/web-ele/src/views/im/manager/face/pack/modules/item-drawer.vue create mode 100644 apps/web-ele/src/views/im/manager/face/pack/modules/item-form.vue create mode 100644 apps/web-ele/src/views/im/manager/face/userItem/index.vue create mode 100644 apps/web-ele/src/views/im/manager/friend/data.ts create mode 100644 apps/web-ele/src/views/im/manager/friend/index.vue create mode 100644 apps/web-ele/src/views/im/manager/friend/request/index.vue create mode 100644 apps/web-ele/src/views/im/manager/group/components/index.ts create mode 100644 apps/web-ele/src/views/im/manager/group/components/select-dialog.vue create mode 100644 apps/web-ele/src/views/im/manager/group/components/select.vue create mode 100644 apps/web-ele/src/views/im/manager/group/data.ts create mode 100644 apps/web-ele/src/views/im/manager/group/index.vue create mode 100644 apps/web-ele/src/views/im/manager/group/modules/ban-form.vue create mode 100644 apps/web-ele/src/views/im/manager/group/modules/detail.vue create mode 100644 apps/web-ele/src/views/im/manager/group/request/index.vue create mode 100644 apps/web-ele/src/views/im/manager/message/content-preview.vue create mode 100644 apps/web-ele/src/views/im/manager/message/data.ts create mode 100644 apps/web-ele/src/views/im/manager/message/group/index.vue create mode 100644 apps/web-ele/src/views/im/manager/message/group/modules/detail.vue create mode 100644 apps/web-ele/src/views/im/manager/message/index.ts create mode 100644 apps/web-ele/src/views/im/manager/message/private/index.vue create mode 100644 apps/web-ele/src/views/im/manager/message/private/modules/detail.vue create mode 100644 apps/web-ele/src/views/im/manager/rtc/data.ts create mode 100644 apps/web-ele/src/views/im/manager/rtc/index.vue create mode 100644 apps/web-ele/src/views/im/manager/rtc/modules/detail.vue create mode 100644 apps/web-ele/src/views/im/manager/sensitiveword/data.ts create mode 100644 apps/web-ele/src/views/im/manager/sensitiveword/index.vue create mode 100644 apps/web-ele/src/views/im/manager/sensitiveword/modules/form.vue create mode 100644 apps/web-ele/src/views/im/manager/statistics/components/distribution-chart.vue create mode 100644 apps/web-ele/src/views/im/manager/statistics/components/index.ts create mode 100644 apps/web-ele/src/views/im/manager/statistics/components/overview-cards.vue create mode 100644 apps/web-ele/src/views/im/manager/statistics/components/trend-chart.vue create mode 100644 apps/web-ele/src/views/im/manager/statistics/index.vue create mode 100644 apps/web-ele/src/views/im/manager/utils/format.ts create mode 100644 apps/web-ele/src/views/im/utils/auth.ts create mode 100644 apps/web-ele/src/views/im/utils/channel.ts create mode 100644 apps/web-ele/src/views/im/utils/config.ts create mode 100644 apps/web-ele/src/views/im/utils/constants.ts create mode 100644 apps/web-ele/src/views/im/utils/conversation.ts create mode 100644 apps/web-ele/src/views/im/utils/db.ts create mode 100644 apps/web-ele/src/views/im/utils/emoji.ts create mode 100644 apps/web-ele/src/views/im/utils/group.ts create mode 100644 apps/web-ele/src/views/im/utils/image.ts create mode 100644 apps/web-ele/src/views/im/utils/message.ts create mode 100644 apps/web-ele/src/views/im/utils/pull.ts create mode 100644 apps/web-ele/src/views/im/utils/time.ts create mode 100644 apps/web-ele/src/views/im/utils/user.ts diff --git a/apps/web-antd/src/views/im/home/store/friendStore.ts b/apps/web-antd/src/views/im/home/store/friendStore.ts index 9a193ab56..bf959b836 100644 --- a/apps/web-antd/src/views/im/home/store/friendStore.ts +++ b/apps/web-antd/src/views/im/home/store/friendStore.ts @@ -670,6 +670,9 @@ export const useFriendStore = defineStore('imFriendStore', { const existingIndex = this.friendRequests.findIndex((item) => item.id === payload.requestId) if (existingIndex !== -1) { const existing = this.friendRequests.splice(existingIndex, 1)[0] + if (!existing) { + return + } const next = { ...existing, fromUserId: payload.operatorUserId, diff --git a/apps/web-antd/src/views/im/home/store/messageStore.ts b/apps/web-antd/src/views/im/home/store/messageStore.ts index 87bfcd511..f372780f1 100644 --- a/apps/web-antd/src/views/im/home/store/messageStore.ts +++ b/apps/web-antd/src/views/im/home/store/messageStore.ts @@ -488,13 +488,17 @@ export const useMessageStore = defineStore('imMessageStore', { const messages = this.getMessageList(conversationInfo.type, conversationInfo.targetId) const existingIndex = messages.findIndex((existing) => isSameMessage(existing, message)) if (existingIndex !== -1) { + const existing = messages[existingIndex] + if (!existing) { + continue + } // 1.3 已存在消息合并服务端状态 - applyServerMessageUpdate(messages[existingIndex], message) + applyServerMessageUpdate(existing, message) if (existingIndex === messages.length - 1) { recomputeConversationLast(conversation, messages) syncConversationAtFlags(conversation, message) } - addChanged(conversation, messages[existingIndex], { + addChanged(conversation, existing, { mergeClientRecord: hasServerClientMessageId }) continue @@ -580,14 +584,18 @@ export const useMessageStore = defineStore('imMessageStore', { const existingIndex = messages.findIndex((item) => isSameMessage(item, message)) // 3. 已存在消息走覆盖更新 if (existingIndex !== -1) { - applyServerMessageUpdate(messages[existingIndex], message) + const existing = messages[existingIndex] + if (!existing) { + return Promise.resolve() + } + applyServerMessageUpdate(existing, message) if (existingIndex === messages.length - 1) { recomputeConversationLast(conversation, messages) syncConversationAtFlags(conversation, message) } return getDb() .transaction(['messages', 'conversations', 'settings'], 'readwrite', async (tx) => { - await this.saveMessageRecord(messages[existingIndex], conversationInfo.type, tx, { + await this.saveMessageRecord(existing, conversationInfo.type, tx, { mergeClientRecord: hasIncomingClientMessageId }) await conversationStore.saveConversationRecord(conversation, tx) @@ -876,6 +884,9 @@ export const useMessageStore = defineStore('imMessageStore', { } // 2. 从内存移除消息 const [removed] = messages.splice(index, 1) + if (!removed) { + return + } revokeBlobUrlsInContent(removed.content) if (index === messages.length) { recomputeConversationLast(conversation, messages) diff --git a/apps/web-antd/src/views/im/manager/message/content-preview.vue b/apps/web-antd/src/views/im/manager/message/content-preview.vue index 94a114a63..5a59ce528 100644 --- a/apps/web-antd/src/views/im/manager/message/content-preview.vue +++ b/apps/web-antd/src/views/im/manager/message/content-preview.vue @@ -38,8 +38,8 @@ const props = defineProps<{ type?: number; }>(); -const payload = computed | undefined>(() => - parseMessage>(props.content || ''), +const payload = computed>(() => + parseMessage>(props.content ?? ''), ); const textContent = computed(() => payload.value?.content || ''); diff --git a/apps/web-antd/src/views/im/manager/statistics/components/trend-chart.vue b/apps/web-antd/src/views/im/manager/statistics/components/trend-chart.vue index de5cc2501..33ddc401a 100644 --- a/apps/web-antd/src/views/im/manager/statistics/components/trend-chart.vue +++ b/apps/web-antd/src/views/im/manager/statistics/components/trend-chart.vue @@ -1,5 +1,5 @@ diff --git a/apps/web-ele/src/layouts/basic.vue b/apps/web-ele/src/layouts/basic.vue index 5cdcec8a3..1a322ef23 100644 --- a/apps/web-ele/src/layouts/basic.vue +++ b/apps/web-ele/src/layouts/basic.vue @@ -13,6 +13,7 @@ import { AntdProfileOutlined, BookOpenText, CircleHelp, + IconifyIcon, SvgGithubIcon, } from '@vben/icons'; import { @@ -27,7 +28,7 @@ import { preferences, usePreferences } from '@vben/preferences'; import { useAccessStore, useUserStore } from '@vben/stores'; import { formatDateTime, openWindow } from '@vben/utils'; -import { ElMessage } from 'element-plus'; +import { ElMessage, ElTooltip } from 'element-plus'; import { getUnreadNotifyMessageCount, @@ -156,6 +157,12 @@ function handleNotificationOpen(open: boolean) { handleNotificationGetUnreadCount(); } +/** 打开 IM 聊天 */ +function handleOpenImHome() { + const { href } = router.resolve({ name: 'ImHome' }); + window.open(href, '_blank'); +} + // 租户列表 const tenants = ref([]); const tenantEnable = computed( @@ -276,6 +283,17 @@ watch( /> +