diff --git a/src/assets/audio/im-message-tip.mp3 b/src/assets/audio/im-message-tip.mp3 new file mode 100644 index 000000000..5f317dcd4 Binary files /dev/null and b/src/assets/audio/im-message-tip.mp3 differ diff --git a/src/views/im/home/pages/conversation/components/ChatGroupMember.vue b/src/views/im/home/pages/conversation/components/ChatGroupMember.vue new file mode 100644 index 000000000..43a31b82f --- /dev/null +++ b/src/views/im/home/pages/conversation/components/ChatGroupMember.vue @@ -0,0 +1,87 @@ + + + + + + {{ member.showNickName }} + + + + + + + diff --git a/src/views/im/home/pages/conversation/components/ChatGroupSide.vue b/src/views/im/home/pages/conversation/components/ChatGroupSide.vue new file mode 100644 index 000000000..4e5426b44 --- /dev/null +++ b/src/views/im/home/pages/conversation/components/ChatGroupSide.vue @@ -0,0 +1,275 @@ + + + + + + + + + + + + + + + + + + + 邀请 + + + + + + + + 移除 + + + + + + + + + + + + + + + + + + + + + + + + + + + + 保存 + 编辑 + 退出群聊 + + + + + + + + + + + + + diff --git a/src/views/im/home/pages/conversation/components/ChatPanel.vue b/src/views/im/home/pages/conversation/components/ChatPanel.vue new file mode 100644 index 000000000..a07bf0c53 --- /dev/null +++ b/src/views/im/home/pages/conversation/components/ChatPanel.vue @@ -0,0 +1,42 @@ + + + + + + + + + 选择一个会话开始聊天 + + + + + + + diff --git a/src/views/im/home/pages/conversation/components/ChatPrivateSide.vue b/src/views/im/home/pages/conversation/components/ChatPrivateSide.vue new file mode 100644 index 000000000..f7456ca8b --- /dev/null +++ b/src/views/im/home/pages/conversation/components/ChatPrivateSide.vue @@ -0,0 +1,110 @@ + + + + + + + + + {{ friend.nickname }} + + + + + + + + + 消息免打扰 + + + + 置顶聊天 + + + + + + + + + + diff --git a/src/views/im/home/pages/conversation/components/message/MessageHistory.vue b/src/views/im/home/pages/conversation/components/message/MessageHistory.vue new file mode 100644 index 000000000..d4b97111f --- /dev/null +++ b/src/views/im/home/pages/conversation/components/message/MessageHistory.vue @@ -0,0 +1,162 @@ + + + + + + + + 共 {{ filtered.length }} 条{{ keyword ? '(过滤后)' : '' }} + + + + + + {{ msg.selfSend ? '我' : (msg.sendNickName || '对方') }} + {{ formatTime(msg.sendTime) }} + + {{ renderContent(msg) }} + + + {{ keyword ? '没有匹配的消息' : '暂无历史消息' }} + + + + + + + + + diff --git a/src/views/im/home/pages/conversation/components/message/MessageReadStatus.vue b/src/views/im/home/pages/conversation/components/message/MessageReadStatus.vue new file mode 100644 index 000000000..36f39d299 --- /dev/null +++ b/src/views/im/home/pages/conversation/components/message/MessageReadStatus.vue @@ -0,0 +1,125 @@ + + + + + + {{ label }} + + + + + + + + + + + 暂无已读 + + + + + + + + 全部已读 + + + + + + + + diff --git a/src/views/im/home/pages/friend/FriendPage.vue b/src/views/im/home/pages/friend/FriendPage.vue new file mode 100644 index 000000000..0befbe68b --- /dev/null +++ b/src/views/im/home/pages/friend/FriendPage.vue @@ -0,0 +1,22 @@ + + + + + + + + + + diff --git a/src/views/im/home/pages/friend/components/FriendItem.vue b/src/views/im/home/pages/friend/components/FriendItem.vue new file mode 100644 index 000000000..279302f7a --- /dev/null +++ b/src/views/im/home/pages/friend/components/FriendItem.vue @@ -0,0 +1,129 @@ + + + + + + {{ friend.nickName }} + + 💻 + 📱 + + + + + + + + + diff --git a/src/views/im/home/pages/group/GroupPage.vue b/src/views/im/home/pages/group/GroupPage.vue new file mode 100644 index 000000000..539f731a5 --- /dev/null +++ b/src/views/im/home/pages/group/GroupPage.vue @@ -0,0 +1,22 @@ + + + + + + + + + + diff --git a/src/views/im/home/pages/group/components/AddGroupMemberDialog.vue b/src/views/im/home/pages/group/components/AddGroupMemberDialog.vue new file mode 100644 index 000000000..f018bd7e2 --- /dev/null +++ b/src/views/im/home/pages/group/components/AddGroupMemberDialog.vue @@ -0,0 +1,192 @@ + + + + + + + + + + + + + (f.isCheck = v)" + /> + + + + + + + + + + 已勾选 {{ checkCount }} 位好友 + + + + + + + + 取 消 + 确 定 + + + + + + + diff --git a/src/views/im/home/pages/group/components/CreateGroupDialog.vue b/src/views/im/home/pages/group/components/CreateGroupDialog.vue new file mode 100644 index 000000000..9d9135ab2 --- /dev/null +++ b/src/views/im/home/pages/group/components/CreateGroupDialog.vue @@ -0,0 +1,174 @@ + + + + + + + + + + + + + + + + (f.isCheck = !!v)" + /> + + + + + + + + + + + 已勾选 {{ checkedFriends.length }} 位好友 + + + + + + + + + + 取 消 + 创 建 + + + + + diff --git a/src/views/im/home/pages/group/components/GroupItem.vue b/src/views/im/home/pages/group/components/GroupItem.vue new file mode 100644 index 000000000..be8ba9bb2 --- /dev/null +++ b/src/views/im/home/pages/group/components/GroupItem.vue @@ -0,0 +1,96 @@ + + + + + + {{ group.showGroupName || group.name }} + + {{ group.memberCount }} 位成员 + + + + + + + + + diff --git a/src/views/im/home/pages/group/components/GroupMemberGrid.vue b/src/views/im/home/pages/group/components/GroupMemberGrid.vue new file mode 100644 index 000000000..ed759a165 --- /dev/null +++ b/src/views/im/home/pages/group/components/GroupMemberGrid.vue @@ -0,0 +1,52 @@ + + + + + {{ member.showNickName }} + + + + + + + diff --git a/src/views/im/home/pages/group/components/GroupMemberItem.vue b/src/views/im/home/pages/group/components/GroupMemberItem.vue new file mode 100644 index 000000000..049078281 --- /dev/null +++ b/src/views/im/home/pages/group/components/GroupMemberItem.vue @@ -0,0 +1,87 @@ + + + + + + {{ member.showNickName }} + + + + + + + + diff --git a/src/views/im/home/pages/group/components/GroupMemberSelector.vue b/src/views/im/home/pages/group/components/GroupMemberSelector.vue new file mode 100644 index 000000000..02002d352 --- /dev/null +++ b/src/views/im/home/pages/group/components/GroupMemberSelector.vue @@ -0,0 +1,213 @@ + + + + + + + + + + + + + + + onCheckChange(item as GroupMemberFlag, val)" + /> + + + + + + + + + + + + 已勾选 {{ checkedMembers.length }} 位成员 + + + + + + + + + + 取 消 + 确 定 + + + + + + + diff --git a/src/views/im/manager/index.vue b/src/views/im/manager/index.vue new file mode 100644 index 000000000..e69de29bb diff --git a/src/views/im/utils/index.ts b/src/views/im/utils/index.ts new file mode 100644 index 000000000..e8d18a95c --- /dev/null +++ b/src/views/im/utils/index.ts @@ -0,0 +1,30 @@ +/** 生成客户端消息 ID(时间戳 + UUID) */ +export const generateClientMessageId = (): string => { + const timestamp = Date.now().toString() + const randomPart = 'xxxx-xxxx-4xxx-yxxx-xxxx'.replace(/[xy]/g, (c) => { + const r = (Math.random() * 16) | 0 + const v = c === 'x' ? r : (r & 0x3) | 0x8 + return v.toString(16) + }) + return `${timestamp}-${randomPart}` +} + +/** 生成存储 key(对齐 boxim key 命名 chats-{userId}) */ +export const buildMetaKey = (userId: string): string => { + return `chats-${userId}` +} + +/** 解析文本消息 content JSON */ +export const parseTextContent = (content: string): string => { + try { + const parsed = JSON.parse(content) + return parsed.content || '' + } catch { + return content + } +} + +/** 序列化文本消息 content JSON */ +export const serializeTextContent = (text: string): string => { + return JSON.stringify({ content: text }) +}