feat(im): 优化好友申请逻辑,增加自我添加校验与异常处理

更新好友申请功能,使用 computed 包裹当前用户 ID,避免在 keep-alive 实例中持有旧 ID。增加自我添加好友的校验逻辑,防止用户添加自己为好友。同时,增强自动通过好友申请的异常处理,确保在事务提交后能正确处理失败情况。
im
YunaiV 2026-05-04 16:41:55 +08:00
parent 7141e431e2
commit 42566d1e86
3 changed files with 23 additions and 8 deletions

View File

@ -172,7 +172,8 @@ const friendStore = useFriendStore()
const userStore = useUserStore()
const message = useMessage()
const currentUserId = getCurrentUserId() //
/** 当前登录用户编号;用 computed 包一层,切账号后随 wsCache 重取,避免顶层求值在 keep-alive 实例里持有旧 id */
const currentUserId = computed(() => getCurrentUserId())
const keyword = ref('')
const users = ref<UserVO[]>([])
const searched = ref(false)
@ -266,6 +267,11 @@ async function handleSubmitApply() {
if (!targetUser.value) {
return
}
// presetUser /
if (targetUser.value.id === currentUserId.value) {
message.warning('不能添加自己为好友')
return
}
submitting.value = true
try {
const requestId = await friendStore.applyFriend({
@ -274,8 +280,15 @@ async function handleSubmitApply() {
displayName: displayName.value.trim() || undefined,
addSource: props.addSource
})
// silent loadFriendInfo WS FRIEND_ADD
if (requestId === null) {
await friendStore.loadFriendInfo(targetUser.value.id)
}
message.success(requestId ? '申请已发送,等待对方验证' : '已添加为好友')
visible.value = false
} catch {
// / /
visible.value = false
} finally {
submitting.value = false
}

View File

@ -104,10 +104,11 @@ const emit = defineEmits<{
const friendStore = useFriendStore()
const message = useMessage()
const currentUserId = Number(getCurrentUserId() || 0)
/** 当前登录用户编号;用 computed 包一层,切账号后随 wsCache 重取,避免顶层求值在 keep-alive 实例里持有旧 id */
const currentUserId = computed(() => getCurrentUserId())
/** 是不是我发起的fromUserId === me */
const iSentIt = computed(() => props.request.fromUserId === currentUserId)
const iSentIt = computed(() => props.request.fromUserId === currentUserId.value)
/** 是否「已拒绝」态模板里多处用到computed 一次省得到处写枚举比对 */
const refused = computed(

View File

@ -82,30 +82,31 @@ const emit = defineEmits<{
}>()
const expanded = ref(true)
const currentUserId = getCurrentUserId()
/** 当前登录用户编号;用 computed 包一层,切账号后随 wsCache 重取,避免顶层求值在 keep-alive 实例里持有旧 id */
const currentUserId = computed(() => getCurrentUserId())
/** 未处理 + 别人加我的(接收方=我)才进红点;我发起的不进 */
const unhandledCount = computed(
() => props.requests.filter(
(r) => r.handleResult === ImFriendRequestHandleResult.UNHANDLED && r.toUserId === currentUserId
(r) => r.handleResult === ImFriendRequestHandleResult.UNHANDLED && r.toUserId === currentUserId.value
).length
)
/** 列表项展示对端fromUserId == 我 → 对端 = toUser否则对端 = fromUser */
function getPeerUserId(request: FriendRequest): number {
return request.fromUserId === currentUserId ? request.toUserId : request.fromUserId
return request.fromUserId === currentUserId.value ? request.toUserId : request.fromUserId
}
/** 列表项展示对端的昵称fromUserId == 我 → toUser 昵称;否则 fromUser 昵称;缺则用 id 兜底) */
function getPeerNickname(request: FriendRequest): string {
return request.fromUserId === currentUserId
return request.fromUserId === currentUserId.value
? request.toNickname || String(request.toUserId)
: request.fromNickname || String(request.fromUserId)
}
/** 列表项展示对端的头像fromUserId == 我 → toUser 头像;否则 fromUser 头像) */
function getPeerAvatar(request: FriendRequest): string | undefined {
return request.fromUserId === currentUserId ? request.toAvatar : request.fromAvatar
return request.fromUserId === currentUserId.value ? request.toAvatar : request.fromAvatar
}
</script>