云端文件下载

This commit is contained in:
2026-06-25 17:48:58 +08:00
parent d284789240
commit 488bebcc87
30 changed files with 5442 additions and 426 deletions

View File

@@ -9,7 +9,13 @@
<view class="popup-title">{{isAgreeBeFriend ? '通过好友申请' : '申请添加朋友'}}</view>
<view class="friend-card">
<view class="friend-card-left">
<view class="friend-avatar">{{currentAddFriend.avatar}}</view>
<!-- <view class="friend-avatar">{{currentAddFriend.avatar}}</view> -->
<image v-if="currentAddFriend.avatar" :src="currentAddFriend.avatar" class="friend-avatar"
mode="aspectFill"></image>
<!-- 如果没有头像显示默认头像 -->
<view v-else class="friend-avatar">
<uni-icons type="person-filled" size="100rpx" color="#ffffff"></uni-icons>
</view>
</view>
<view class="friend-card-middle">
<view class="friend-name">{{currentAddFriend.username}}</view>
@@ -18,9 +24,9 @@
</view>
<view class="nickname-wrapper">
<view>好友备注</view>
<input class="input-nickname" placeholder="请输入好友名称" />
<input class="input-nickname" placeholder="请输入好友名称" v-model="inputFriendNickname"/>
</view>
<view class="text-btn confirm-btn">{{isAgreeBeFriend ? '确认通过' : '发送申请'}}</view>
<view class="text-btn confirm-btn" @click="handleFriendOperate">{{isAgreeBeFriend ? '确认通过' : '发送申请'}}</view>
</view>
</view>
@@ -158,7 +164,7 @@
<view class="search-warpper">
<input class="search-file-input" :class="{active:isSearchFriend}"
@focus="handleFriendSearchFocus" @blur="handleFriendSearchFocus"
v-model="searchFriendName" />
v-model="searchFriendName" confirm-type="search" @confirm="searchFriend"/>
<view class="iconfont icon-sousuo" @click="searchFriend"></view>
</view>
<view v-if="!searchFriendName" class="search-tip">请输入用户名或邮箱进行搜索</view>
@@ -167,13 +173,16 @@
<view class="friend-list">
<view class="friend-card" v-for="friend in searchResultList" :key="friend.id">
<view class="friend-card-left">
<view class="friend-avatar">{{friend.avatar}}</view>
<!-- <view class="friend-avatar">{{friend.avatar}}</view> -->
<view class="friend-avatar">
<image class="friend-avatar" :src="friend.avatar" mode="aspectFill"></image>
</view>
</view>
<view class="friend-card-middle">
<view class="friend-name">{{friend.nickname}}</view>
<view class="friend-label">{{friend.email}}</view>
</view>
<view class="friend-card-right" @click="addNewFriend(friend.id)">
<view class="friend-card-right" @click="addNewFriend(friend._id)">
<view class="add-btn text-btn">添加</view>
</view>
</view>
@@ -218,7 +227,7 @@
<view class="friend-name">friend.nickname</view>
<view class="friend-label">friend.email</view>
</view>
<view class="friend-card-right" @click="addNewFriend(friend.id)">
<view class="friend-card-right" @click="addMeetingMembers(friend.id)">
<view class="add-btn text-btn">添加</view>
</view>
</view>
@@ -258,24 +267,28 @@
<view class="tabpage-title">好友申请</view>
</view>
<view class="tabpage-body">
<scroll-view class="group-member" direction="vertical" scroll-y="true">
<view v-if="!friendRequestList.length" class="no-result">暂无好友申请</view>
<scroll-view v-else class="group-member" direction="vertical" scroll-y="true">
<view class="friend-list">
<view class="friend-card" v-for="friend in mockFriendDB" :key="friend.id">
<view class="friend-card" v-for="request in friendRequestList" :key="request.id">
<view class="friend-card-left">
<view class="friend-avatar">{{friend.avatar}}</view>
</view>
<view class="friend-card-middle">
<view class="friend-name">{{friend.nickname}}</view>
<view class="friend-label">{{friend.email}}</view>
</view>
<view class="friend-card-right">
<view class="friend-option">
<view class="refuse-btn text-btn" @click="refuseBeFriend(friend)">拒绝</view>
<view class="agree-btn text-btn" @click="agreeBeFriend(friend)">同意</view>
<image v-if="request.avatar" :src="request.avatar" class="friend-avatar"
mode="aspectFill"></image>
<view v-else class="friend-avatar">
<uni-icons type="person-filled" size="100rpx" color="#ffffff"></uni-icons>
</view>
</view>
<view class="friend-card-middle">
<view class="friend-name">{{request.friendNickName || request.sendId}}</view>
<view class="friend-label">{{request.message || '请求添加你为好友'}}</view>
</view>
<view class="friend-card-right">
<view v-if="request.state === 0" class="friend-option">
<view class="agree-btn text-btn" @click="agreeBeFriend(request)">同意</view>
</view>
<view v-else class="friend-status agreed">已同意</view>
</view>
</view>
</view>
</scroll-view>
</view>
@@ -306,7 +319,10 @@
} from '@/utils/user-info.js'
import {
getChatFriend,
getGroup
getGroup,
sendFriendRequest,
getFriendRequestList,
saveFriend
} from '@/utils/friend-api.js'
import {
getUserInfo,
@@ -466,6 +482,7 @@
onMounted(async () => {
await takeFriendList()
await takeGroupList()
await takeFriendRequestList()
handleFriendConnect()
})
// 群聊相关
@@ -656,7 +673,7 @@
// 模糊查询:遍历 mockFriendDB匹配 nickname、username 或 email
const keyword = searchFriendName.value.toLowerCase().trim();
searchResultList.value = await searchUsers(userToken.value,keyword)
console.log("searchResultList.value",searchResultList.value);
console.log("searchResultList.value",JSON.stringify(searchResultList.value));
// const results = mockFriendDB.value.filter(friend => {
// const isMatch = friend.nickname.toLowerCase().includes(keyword) || friend.username.toLowerCase()
// .includes(keyword) || friend.email.toLowerCase().includes(keyword);
@@ -670,7 +687,7 @@
const currentAddFriend = ref(null)
const addNewFriend = (id) => {
const friend = mockFriendDB.value.find(friend => friend.id === id)
const friend = searchResultList.value.find(friend => friend._id === id)
if (friend) {
// 创建副本避免引用问题
currentAddFriend.value = {
@@ -685,6 +702,8 @@
currentAddFriend.value = null
isAgreeBeFriend.value = false
}
const inputFriendNickname = ref('')
// 视频会议相关
const isVoice = ref(false);
@@ -698,77 +717,97 @@
// 好友申请相关
const isAgreeBeFriend = ref(false)
const refuseBeFriend = (friend) => {
const friendRequestList = ref([])
// 获取好友申请列表
const takeFriendRequestList = async () => {
try {
if (!UserId.value) return
const list = await getFriendRequestList(UserId.value)
if (list && list.length) {
friendRequestList.value = await takeRequestAvatar(list)
} else {
friendRequestList.value = []
}
} catch (error) {
console.error('获取好友申请列表失败:', error)
friendRequestList.value = []
}
}
const agreeBeFriend = (friend) => {
// 获取好友申请人的头像
const takeRequestAvatar = async (requestList) => {
if (!requestList?.length) return []
try {
const requestIds = requestList.map(item => item.sendId)
const avatarList = await getUserAvatar(userToken.value, requestIds)
const userMap = new Map(avatarList.map(user => [user.user_id, user]) || [])
return requestList.map(request => {
const userInfo = userMap.get(request.sendId)
return {
...request,
avatar: userInfo?.avatar || null
}
})
} catch (err) {
console.error('获取申请人头像失败', err)
return requestList
}
}
const agreeBeFriend = (request) => {
isAgreeBeFriend.value = true
currentAddFriend.value = {
...friend
...request,
username: request.friendNickName || request.sendId
}
}
// 模拟好友数据库
const mockFriendDB = ref([{
id: 1,
nickname: '张三',
username: 'zhangsan',
email: 'zhangsan@example.com',
avatar: '👤'
},
{
id: 2,
nickname: '李四',
username: 'lisi',
email: 'lisi@example.com',
avatar: '👥'
},
{
id: 3,
nickname: '王小明',
username: 'wangxm',
email: 'wang@example.com',
avatar: '👪'
},
{
id: 4,
nickname: '赵磊',
username: 'zhaolei',
email: 'zhao@example.com',
avatar: '🗣️'
},
{
id: 5,
nickname: '张三2',
username: 'zhangsan',
email: 'zhangsan@example.com',
avatar: '👤'
},
{
id: 6,
nickname: '李四2',
username: 'lisi',
email: 'lisi@example.com',
avatar: '👥'
},
{
id: 7,
nickname: '王小明2',
username: 'wangxm',
email: 'wang@example.com',
avatar: '👪'
},
{
id: 8,
nickname: '赵磊2',
username: 'zhaolei',
email: 'zhao@example.com',
avatar: '🗣️'
// 同意好友申请的确认操作
const handleFriendOperate = async () => {
if (isAgreeBeFriend.value) {
// 通过好友申请(保存好友即同意)
try {
const friendId = currentAddFriend.value.sendId
const friendNickName = inputFriendNickname.value || currentAddFriend.value.friendNickName || ''
const sessionId = currentAddFriend.value.sessionId || Date.now()
const friendRelationshipId = currentAddFriend.value.id
await saveFriend([
{
friendNickName: friendNickName,
sender: UserId.value,
receiver: friendId,
sessionId: sessionId,
friendRelationshipId: friendRelationshipId
},
{
friendNickName: '',
sender: friendId,
receiver: UserId.value,
sessionId: sessionId,
friendRelationshipId: friendRelationshipId
}
])
uni.showToast({ title: '已同意好友申请', icon: 'none' })
const target = friendRequestList.value.find(item => item.sendId === friendId)
if (target) target.status = 1
closeAddFriendCard()
await takeFriendList()
} catch (error) {
console.error('同意好友申请失败:', error)
uni.showToast({ title: '操作失败', icon: 'none' })
}
} else {
// 申请好友(添加好友页面的发送申请)
try {
const friendId = currentAddFriend.value._id
const msg = await sendFriendRequest(UserId.value, inputFriendNickname.value, friendId)
uni.showToast({ title: msg, icon: 'none' })
closeAddFriendCard()
} catch (error) {
console.error('发送好友申请失败:', error)
uni.showToast({ title: '发送申请失败', icon: 'none' })
}
}
])
}
// 通讯录相关
</script>