From ab2b29f2673c44a69ec7bcc7cd17ad8a6836dec1 Mon Sep 17 00:00:00 2001 From: kuaifan Date: Thu, 2 Jan 2025 14:23:23 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E7=BE=A4=E8=81=8A=E6=80=BB=E4=BA=BA?= =?UTF-8?q?=E6=95=B0=E6=8E=92=E9=99=A4=E6=9C=BA=E5=99=A8=E4=BA=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Models/WebSocketDialog.php | 38 ++++++++++---- .../manage/components/ChatInput/index.vue | 4 +- .../manage/components/DialogGroupInfo.vue | 49 +++++++++++++++---- .../pages/manage/components/DialogWrapper.vue | 2 +- .../pages/components/dialog-group-info.scss | 10 ++++ 5 files changed, 83 insertions(+), 20 deletions(-) diff --git a/app/Models/WebSocketDialog.php b/app/Models/WebSocketDialog.php index 1d31b16a1..2e31d70b0 100644 --- a/app/Models/WebSocketDialog.php +++ b/app/Models/WebSocketDialog.php @@ -265,7 +265,9 @@ class WebSocketDialog extends AbstractModel // 未读消息 $data = array_merge($data, self::generateUnread($data['id'], $userid)); // 对话人数 - $data['people'] = $data['people'] ?? WebSocketDialogUser::whereDialogId($data['id'])->count(); + if (!isset($data['people'])) { + $data = array_merge($data, self::generatePeople($data['id'])); + } // 有待办 $data['todo_num'] = $data['todo_num'] ?? WebSocketDialogMsgTodo::whereDialogId($data['id'])->whereUserid($userid)->whereDoneAt(null)->count(); // 最后消息 @@ -401,6 +403,26 @@ class WebSocketDialog extends AbstractModel return $data; } + /** + * 获取对话人数 + * @param $dialogId + * @return array + */ + public static function generatePeople($dialogId) + { + $counts = WebSocketDialogUser::whereDialogId($dialogId) + ->groupBy('bot') + ->selectRaw('bot, COUNT(*) as count') + ->pluck('count', 'bot'); + $userCount = $counts->get(0, 0); // 非机器人数量 + $botCount = $counts->get(1, 0); // 机器人数量 + return [ + 'people' => $userCount + $botCount, + 'people_user' => $userCount, + 'people_bot' => $botCount, + ]; + } + /** * 加入聊天室 * @param int|array $userid 加入的会员ID或会员ID组 @@ -436,10 +458,9 @@ class WebSocketDialog extends AbstractModel } } }); - $this->pushMsg("groupUpdate", [ - 'id' => $this->id, - 'people' => WebSocketDialogUser::whereDialogId($this->id)->count() - ]); + $data = WebSocketDialog::generatePeople($this->id); + $data['id'] = $this->id; + $this->pushMsg("groupUpdate", $data); return true; } @@ -496,10 +517,9 @@ class WebSocketDialog extends AbstractModel }); }); // - $this->pushMsg("groupUpdate", [ - 'id' => $this->id, - 'people' => WebSocketDialogUser::whereDialogId($this->id)->count() - ]); + $data = WebSocketDialog::generatePeople($this->id); + $data['id'] = $this->id; + $this->pushMsg("groupUpdate", $data); } /** diff --git a/resources/assets/js/pages/manage/components/ChatInput/index.vue b/resources/assets/js/pages/manage/components/ChatInput/index.vue index 37e49b3c9..e42b6f63b 100755 --- a/resources/assets/js/pages/manage/components/ChatInput/index.vue +++ b/resources/assets/js/pages/manage/components/ChatInput/index.vue @@ -1623,7 +1623,9 @@ export default { if (this.cacheDialogs.find(({id}) => id == this.dialogId)) { this.$store.dispatch("saveDialog", { id: this.dialogId, - people: data.length + people: data.length, + people_user: data.filter(item => !item.bot).length, + people_bot: data.filter(item => item.bot).length, }) } if (data.length > 0) { diff --git a/resources/assets/js/pages/manage/components/DialogGroupInfo.vue b/resources/assets/js/pages/manage/components/DialogGroupInfo.vue index a10eea4cf..e52adb6cb 100644 --- a/resources/assets/js/pages/manage/components/DialogGroupInfo.vue +++ b/resources/assets/js/pages/manage/components/DialogGroupInfo.vue @@ -18,15 +18,35 @@
@@ -103,7 +123,7 @@ export default { return '未知' }, - userList() { + allList() { const {dialogUser, searchKey, cacheUserBasic, dialogData} = this; const list = dialogUser.map(item => { const userBasic = cacheUserBasic.find(basic => basic.userid == item.userid) @@ -126,7 +146,16 @@ export default { } return $A.dayjs(a.created_at) - $A.dayjs(b.created_at); }) - } + }, + + botList({allList}) { + return allList.filter(item => item.bot) + }, + + + userList({allList}) { + return allList.filter(item => !item.bot) + }, }, watch: { @@ -173,7 +202,9 @@ export default { this.dialogUser = data; this.$store.dispatch("saveDialog", { id: this.dialogId, - people: data.length + people: data.length, + people_user: data.filter(item => !item.bot).length, + people_bot: data.filter(item => item.bot).length, }); }).catch(({msg}) => { $A.modalError(msg); diff --git a/resources/assets/js/pages/manage/components/DialogWrapper.vue b/resources/assets/js/pages/manage/components/DialogWrapper.vue index 2257f81db..56ce957d7 100644 --- a/resources/assets/js/pages/manage/components/DialogWrapper.vue +++ b/resources/assets/js/pages/manage/components/DialogWrapper.vue @@ -999,7 +999,7 @@ export default { }, peopleNum() { - return this.dialogData.type === 'group' ? $A.runNum(this.dialogData.people) : 0; + return this.dialogData.type === 'group' ? $A.runNum(this.dialogData.people_user) : 0; }, pasteTitle() { diff --git a/resources/assets/sass/pages/components/dialog-group-info.scss b/resources/assets/sass/pages/components/dialog-group-info.scss index 6b6b9a264..514c5685e 100644 --- a/resources/assets/sass/pages/components/dialog-group-info.scss +++ b/resources/assets/sass/pages/components/dialog-group-info.scss @@ -85,6 +85,16 @@ } } + &.label { + &:hover { + background-color: transparent; + } + + color: #999; + font-size: 13px; + height: auto; + } + .common-avatar { width: 0; flex: 1;