From 767b835118d3b86d49ce34a87d59aa449226f2ce Mon Sep 17 00:00:00 2001 From: digua Date: Mon, 12 Jan 2026 23:05:17 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BE=A7=E8=BE=B9=E6=A0=8F=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E6=98=BE=E7=A4=BA=E5=A4=B4=E5=83=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- electron/main/worker/query/basic.ts | 47 +++++++++++++++++++++++++++++ src/components/common/Sidebar.vue | 36 +++++++++++++++++----- src/types/base.ts | 1 + 3 files changed, 77 insertions(+), 7 deletions(-) diff --git a/electron/main/worker/query/basic.ts b/electron/main/worker/query/basic.ts index 8d87a2b..ad07aae 100644 --- a/electron/main/worker/query/basic.ts +++ b/electron/main/worker/query/basic.ts @@ -323,6 +323,46 @@ interface DbMeta { group_avatar: string | null } +/** + * 获取私聊对方成员的头像 + * 逻辑参考 private-chat/index.vue 的 otherMemberAvatar + */ +function getPrivateChatMemberAvatar( + db: Database.Database, + sessionName: string, + ownerId: string | null +): string | null { + // 获取所有非系统消息成员(按消息数排序) + const members = db + .prepare( + `SELECT + m.platform_id as platformId, + COALESCE(m.group_nickname, m.account_name, m.platform_id) as name, + m.avatar + FROM member m + WHERE COALESCE(m.account_name, '') != '系统消息' + ORDER BY (SELECT COUNT(*) FROM message WHERE sender_id = m.id) DESC` + ) + .all() as Array<{ platformId: string; name: string; avatar: string | null }> + + if (members.length === 0) return null + + // 1. 优先排除 ownerId,找到另一成员的头像 + if (ownerId) { + const other = members.find((m) => m.platformId !== ownerId) + if (other?.avatar) return other.avatar + } + + // 2. 尝试匹配会话名称(私聊名称通常是对方昵称) + const sameName = members.find((m) => m.name === sessionName) + if (sameName?.avatar) return sameName.avatar + + // 3. 如果只有两个成员且有 ownerId,取另一个(即使没有头像也返回 null) + // 如果没有 ownerId,返回第一个有头像的成员 + const firstWithAvatar = members.find((m) => m.avatar) + return firstWithAvatar?.avatar || null +} + /** * 获取所有会话列表 */ @@ -366,6 +406,12 @@ export function getAllSessions(): any[] { .get() as { count: number } ).count + // 私聊:获取对方成员头像 + let memberAvatar: string | null = null + if (meta.type === 'private') { + memberAvatar = getPrivateChatMemberAvatar(db, meta.name, meta.owner_id) + } + sessions.push({ id: sessionId, name: meta.name, @@ -378,6 +424,7 @@ export function getAllSessions(): any[] { groupId: meta.group_id || null, groupAvatar: meta.group_avatar || null, ownerId: meta.owner_id || null, + memberAvatar, // 私聊对方头像 }) } diff --git a/src/components/common/Sidebar.vue b/src/components/common/Sidebar.vue index 2c681c2..2b8b3a0 100644 --- a/src/components/common/Sidebar.vue +++ b/src/components/common/Sidebar.vue @@ -158,6 +158,14 @@ function getSessionAvatarText(session: AnalysisSession): string { return name.length <= 2 ? name : name.slice(0, 2) } } + +// 获取会话头像 URL(群聊用 groupAvatar,私聊用 memberAvatar) +function getSessionAvatar(session: AnalysisSession): string | null { + if (isPrivateChat(session)) { + return session.memberAvatar || null + } + return session.groupAvatar || null +}