Commit Graph

5177 Commits (82d065c270aa85896097d03912edafbc83f221c4)

Author SHA1 Message Date
YunaiV 82d065c270 feat(im): 初始化消息转发 v0.2:第二次优化部分代码(一些工具类等) 2026-05-07 20:34:09 +08:00
YunaiV cf01143632 feat(im): 初始化消息转发 v0.1:第一次评审 2026-05-07 19:47:27 +08:00
YunaiV 9bcdc92806 feat(im): 初始化群名片 v0.2:第二次评审(需求各种进群的小问题) 2026-05-07 19:07:37 +08:00
YunaiV f5936a6e7f feat(im): 初始化群名片 v0.2:第二次评审(需求各种进群的小问题) 2026-05-07 18:01:43 +08:00
YunaiV d175fe86be feat(im): 初始化群名片 v0.2:第二次评审(需求各种进群的小问题) 2026-05-07 17:28:16 +08:00
YunaiV ce66a507ef feat(im): 初始化群名片 v0.2:第二次评审(需求各种进群的小问题) 2026-05-07 17:25:03 +08:00
YunaiV 65d5aacac9 feat(im): 初始化群名片 v0.1:第一次评审 2026-05-07 13:07:56 +08:00
YunaiV 808ad575fc feat(im): 初始化群申请 v0.5:第六把 review(性能 / 健壮性 / 简洁度收口)
后端
- createInviteRequestList N+1 → 3 SQL:批量 select IN + update IN + insertBatch;20 人邀请从 40 RTT 降到 3 RTT
- service 不再出现 mybatis:复用记录的 update(null, wrapper) 下沉到 Im{Group,Friend}RequestMapper.update*Reset helper
- inviteGroupMember 入参去重切 hutool:CollUtil.subtractToList(CollUtil.distinct(...), activeMemberUserIds)
- 删除 dead 字段 inviterUserId(GroupRequestApprovedNotification / GroupRequestRejectedNotification):前端不再消费

前端
- 1505 / 1506 通知改静默:同意走群事件 1509 / 1510 渲染系统提示,拒绝不再打扰
- 修竞态:addByRequestId 校验 handleResult === UNHANDLED,避免 1503 在途时被 1505 / 1506 抢先后又把已处理记录塞回未处理列表
- 修复 dialog 复用记录刷新:watch key 含 inviterUserId / applyContent,同 id 不同内容也触发 refetch;actingId 期间跳过避免本端动作多余 RTT
- 修复 willGoApproval 误报:group.ownerUserId 兜底群主;members 未到位时保守按非审批处理
- unhandledCountMap memoized getter:O(N) 扫一次缓存到 Map,ConversationItem 直读 Map 消除 O(N×M) 重复 filter
2026-05-07 08:13:27 +08:00
YunaiV cb26df3ca1 feat(im): 初始化群申请 v0.4:第五把 review(多轮 finding 修复 + 通知静默化)
- 邀请路径写 addSource=INVITE;群主 / 管理员邀请绕过审批;inviteGroupMember 入参去重
- getGroupRequest 越权校验加成员有效状态判断;新增 list-by-group 接口
- 申请列表按 update_time 倒序,update(null, wrapper) 路径手动刷 updateTime
- addByRequestId 不再 skip 同 id,复用记录刷新并置顶
- GroupRequestListDialog 单群模式订阅 store 增量同步;GroupMemberAddDialog 审批分支文案区分
- ConversationItem 增加 [X 条进群申请] 红字前缀;MessagePanel 顶部胶囊横幅
- 1505 / 1506 通知改静默:同意走群事件渲染系统提示,拒绝不再打扰;清掉 dead inviterUserId 字段
2026-05-07 00:51:48 +08:00
YunaiV b2ba42049b feat(im): 初始化群申请 v0.3:第四把 review(优化界面,进一步对齐微信界面)【之前提交错了】 2026-05-06 23:57:54 +08:00
YunaiV f746aebe08 feat(im): 初始化群申请 v0.3:第四把 review(优化界面,进一步对齐微信界面) 2026-05-06 23:57:03 +08:00
YunaiV 0eca952c6a feat(im): 初始化表情包 v0.3:第四把 review(增加表情管理的界面) 2026-05-06 23:00:08 +08:00
YunaiV a98e32554c feat(im): 初始化表情包 v0.2:第三把 review 2026-05-06 21:08:46 +08:00
YunaiV 2f513f7b8f feat(im): 初始化群申请 v0.2:第三把 review 2026-05-06 20:51:45 +08:00
YunaiV 8eebfd4744 feat(im): 初始化表情包 v0.1:第二把 review 2026-05-06 20:50:55 +08:00
YunaiV 1ed5dc7e6a feat(im): 初始化表情包 v0.0:第一把 review 2026-05-06 19:42:19 +08:00
YunaiV 8fc5273a88 feat(im): 初始化群申请 v0.1:第二把 review 2026-05-06 18:52:30 +08:00
YunaiV 3be0daf115 feat(im): 初始化群申请 v0.0:第一把 review 2026-05-06 14:53:47 +08:00
YunaiV 4868d69ed8 feat(im): 优化名片消息类型 v0.4:增加转发成功失败的提示 2026-05-06 12:18:31 +08:00
YunaiV 1ac0650984 ♻️ refactor(im):注释对齐 + patchMessage 复用 applyServerMessageUpdate
- recomputeConversationLast / videoCoverUrl / showSendingLoading 三处 JSDoc 跟实现对齐:
  原描述还停留在旧设计(lastSendTime 不重算 / 占位 coverUrl 用 blob / 「外层 loading 多余」),
  这轮一并改成当前事实,避免后续维护被误导
- patchMessage 删手写 revoke + Object.assign,改调 applyServerMessageUpdate,
  与 ackMessage / insertMessage(existingIndex) 共用一份服务端字段合并语义;
  「值未变早返回」保留在 patchMessage 顶部
- 抽 BLOB_URL_PREFIX 常量替代散落在 utils/message.ts 与 useMediaUploader.ts 的 3 处 'blob:' 字面量
2026-05-06 10:38:43 +08:00
YunaiV 30d695d702 🐛 fix(im):codex 评审修复发送中状态边角
- recomputeConversationLast 空 messages 时一并清 lastSendTime,
  避免刷新后被 drop 的媒体占位让空会话仍按旧时间排在列表前面
- 视频占位 coverUrl 不再赋 blob URL:<video poster> 期待图片资源,
  传 video blob 在部分浏览器会退化成黑底,cover 等 probe 出真实 URL 后由 commit 阶段一起 patch
- useMediaUploader 暴露 requireMediaHandler typed accessor,
  消除 video 链路 mediaTypeHandlers[VIDEO]! 非空断言
- MessageItem 把外层 loading 的 (!isUploading || isVoice) 抽成 showSendingLoading computed
2026-05-06 10:18:49 +08:00
YunaiV 459eaa5428 ♻️ refactor(im): 优化消息存储逻辑,减少不必要的处理
改进消息存储时的处理逻辑,通过提前检查是否存在 _localFile 来优化性能,避免不必要的全量映射操作。
2026-05-06 08:50:13 +08:00
YunaiV 59aab8ecdc feat(im): 优化名片消息类型 v0.3:增加表情选择 2026-05-06 08:47:18 +08:00
YunaiV b17f7a57e5 feat(im): 优化发送中的能力 v0.2:简化各种 kind、复用各种逻辑 2026-05-06 08:46:33 +08:00
YunaiV 957a63f8f4 feat(im): 优化名片消息类型 v0.2:优化转发弹窗的界面样式 2026-05-06 08:33:03 +08:00
YunaiV c15d75ba91 feat(im): 优化发送中的能力 v0.1:各种清理时的边界 2026-05-06 08:22:41 +08:00
YunaiV 3836467481 feat(im): 优化名片消息类型 v0.1:补充缺失的名片展示 2026-05-06 08:21:52 +08:00
YunaiV f3de29f95f feat(im): 增加名片消息类型 2026-05-06 08:00:36 +08:00
YunaiV 8f2eddea4a feat(im): 增加发送中的能力,针对图片、文件、视频等 2026-05-06 08:00:23 +08:00
YunaiV f8cc9d14d9 feat(im): 优化下禁言弹窗的样式 2026-05-05 22:51:26 +08:00
YunaiV 5bd99c53c2 🐛 fix(im):codex 评审修复 FRIEND_ADD / FRIEND_DELETE 接收方 peer 与 clear 气泡
- FRIEND_ADD 接收方 peer 改按帧 sender / receiver 反推:becomeFriends 单条入库后双方收到同一份 payload,payload.friendUserId 固定是 toUserId,本端真正的对端要看自己是 sender 还是 receiver;新增 websocketStore.computeFriendPeerId 算好后传给 friendStore.applyFriendAdd/DeleteNotification
- FRIEND_DELETE clear=true 跳过气泡插入:clear 语义是清会话本身,气泡分支按 isFriendDeleteWithClear 校验,避免在已清会话里写虚拟消息

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-05 22:32:04 +08:00
YunaiV c653c2fa2b feat(im): 增强消息处理逻辑,支持好友通知与撤回消息 2026-05-05 22:15:48 +08:00
YunaiV 4e181564b8 feat(im): 清理一些 TODO 的修复 2026-05-05 22:04:45 +08:00
YunaiV a9f54fdee1 feat(im): 重构普通消息类型,和 openim 的消息编号对齐 2026-05-05 21:56:05 +08:00
YunaiV 055d4bab27 feat(im): 联动好友 / 群通知重构,抽 useMuteOverlay 统一禁言拦截与媒体上传公共骨架 2026-05-05 21:33:27 +08:00
YunaiV e48316231c feat(im): 增加好友申请的管理界面 2026-05-05 19:36:29 +08:00
YunaiV 390b66aee8 feat(im): 群禁言/封禁 UI 交互 + 群主解散群聊
一、群禁言交互
- MessageItem 右键菜单新增「禁言/解除禁言/移除」(权限校验)
- 新增 GroupMuteMemberDialog 禁言时长选择弹窗
- ConversationGroupSide 新增「全群禁言」开关
- MessageInput 新增禁言/封禁覆盖层,拦截所有发送入口
- canManageSender 目标角色未知时不展示管理菜单
- 全群禁言群主按 ownerUserId 直接豁免,不依赖成员列表

二、群封禁(GROUP_BANNED 1533)
- constants 激活 GROUP_BANNED 常量,扩展 isGroupNotification 范围
- groupStore 处理 1533 事件,实时更新 banned 字段
- MessageInput 覆盖层最高优先级判断 banned(红底)
- Group 类型、convertGroup 映射 banned 字段

三、禁言事件(1512-1515)
- constants 激活 GROUP_MEMBER_MUTED / CANCEL_MUTED / MUTED / CANCEL_MUTED
- groupStore 处理 1512-1515 事件,更新 muteEndTime / mutedAll
- user.ts 新增 4 条禁言 + 2 条封禁通知文案
- GroupNotificationPayload 扩展 mutedUserId / muteEndTime / banned

四、群主解散群聊
- ConversationGroupSide 底部按钮:群主显示「解散群聊」,非群主显示「退出群聊」
- 新增 handleDissolve 实现(二次确认 → dissolveGroup API → 清本地数据)
2026-05-05 18:41:28 +08:00
YunaiV 7b4c7028a0 feat(im):群禁言功能(阶段三管理后台 UI)
1. group API 新增 mutedAll 字段 + 3 个禁言接口(muteAll、muteMember、cancelMuteMember)
2. group member API 新增 muteEndTime 字段
3. 管理后台群列表新增「全群禁言」列(已禁言/未禁言标签)
4. 群详情抽屉新增「全群禁言」状态行 + 成员表新增「禁言状态」列(禁言中 + 到期时间)
2026-05-05 16:58:51 +08:00
YunaiV 4d006f8e73 feat(im):将"免打扰"字段从 muted 全量重命名为 silent(DO/VO/Service/Mapper/测试/SQL + 前端 types/store/组件/管理后台),为后续 mute 禁言功能腾出词族 2026-05-05 13:51:53 +08:00
YunaiV dd75c702db feat(im):删好友「同时清空聊天记录」弹窗 + 顶部「对方还不是你的朋友」胶囊(点击弹 UserInfoCard)+ fetchFriends 不动 DISABLE 尊重用户选择 2026-05-05 00:57:58 +08:00
YunaiV 2a55748296 feat(im):增加好友删除时,增加是否删除本地聊天的选项 2026-05-05 00:33:06 +08:00
YunaiV 1400bd80dd 🐛 fix(im):loadFriendRequest 按 id 大小决定插入位置,老 id 不入避免破坏倒序 + loadMore 重复 push 2026-05-04 23:06:12 +08:00
YunaiV 14e3f85cb0 ♻️ refactor(im):用户申请列表,增加流式查询,避免一次性加载过多,或者历史无法被加载到。 2026-05-04 22:46:20 +08:00
YunaiV 9fc25b7109 ♻️ refactor(im):friendStore 修 setMuted/removeFriend 一致性 + 新申请直推列表 + 清 dispatcher 防御兜底 2026-05-04 21:13:36 +08:00
YunaiV 45bac49ec0 ♻️ refactor(im):friendStore 回调参数 f 改全名 friend / existing 2026-05-04 19:52:44 +08:00
YunaiV b242b017c0 feat(im):fetchFriends 加 pending 去重 + FRIEND_APPLICATION 重命名 RECEIVED + inflight 命名调整为 pending 2026-05-04 19:14:51 +08:00
YunaiV cfd152addf feat(im):实现 1209 FRIEND_INFO_UPDATED 推送(system 发 AdminUserProfileUpdateMessage,IM Consumer 监听后批量推好友多端) 2026-05-04 18:24:08 +08:00
YunaiV 7618d58a66 feat(im):好友模块 code review 多项修复(补 block/unblock 全链路 + UserInfo 菜单入口、silent 后主动入库、防 currentUserId 切账号失活、雪崩去重与命名/枚举清理) 2026-05-04 17:31:21 +08:00
YunaiV 5c2a185ff9 【IM 优化】通讯录顶部搜索栏改为 h-14,与消息 Tab 顶部对齐,避免切换抖动 2026-05-04 16:47:33 +08:00
YunaiV 42566d1e86 feat(im): 优化好友申请逻辑,增加自我添加校验与异常处理
更新好友申请功能,使用 computed 包裹当前用户 ID,避免在 keep-alive 实例中持有旧 ID。增加自我添加好友的校验逻辑,防止用户添加自己为好友。同时,增强自动通过好友申请的异常处理,确保在事务提交后能正确处理失败情况。
2026-05-04 16:41:55 +08:00