<script setup> /** * 添加朋友 */ // 工具库 import util from '@/common/js/util'; // api import api from '@/api/index.js' import { useStore, } from 'vuex' import { ref, reactive, computed, getCurrentInstance } from 'vue' import { onLoad, onReady, onReachBottom, onPullDownRefresh } from '@dcloudio/uni-app' // 代理 const { proxy } = getCurrentInstance() // vuex const store = useStore() // 用户信息 const userinfo = computed(() => { let result = store.state.userinfo return result }) // 用户列表 const userList = reactive({ data: [], pageNum: 1, pageSize: 10, total: 0, }) const keyword = ref('') // 表单 const form = reactive({ Remark: '', AddWording: '', }) // 朋友 const friend = ref({}) onLoad((option) => { if (option.account) { keyword.value = option.account refreshFriendList() } }) onReady(() => { // proxy.$refs.friendRef.open() }) onReachBottom(() => { // 获取更多列表 getMoreFriendList() }) onPullDownRefresh(() => { refreshFriendList() }) // 获取朋友列表 function getSearchFriendList() { if (!keyword.value) { util.alert('请输入你想搜索的内容') return } api.news.searchUsers({ query: { searchValue: keyword.value, pageNum: userList.pageNum, pageSize: userList.pageSize, } }).then(rs => { if (rs.code == 200) { const result = rs.data if (userList.pageNum) userList.data.length = 0 // 追加朋友列表 userList.data.push(...result.rows.map(item => { item.format_userPortrait = util.format_url(item.userPortrait, 'img') return item })) // 视频列表 userList.total = rs.total return } util.alert({ content: rs.msg, showCancel: false, }) }).finally(() => { uni.stopPullDownRefresh() }) } // 重载朋友列表 function refreshFriendList() { userList.pageNum = 1 userList.total = 0 getSearchFriendList() } // 获取更多朋友列表 function getMoreFriendList() { if (userList.data.length >= userList.total) return userList.pageNum++ getSearchFriendList() } // 点击用户 function handleUser(item) { uni.navigateTo({ url: util.setUrl('/pages/index/videoHome', { userId: item.userId, }) }) } /** * 添加好友 * @param {Object} item 用户信息 */ function handleAdd(item) { friend.value.userId = item.userId friend.value.userName = item.userName friend.value.AddWording = `你好,我是${userinfo.value.userNickname}` proxy.$refs.friendRef.open() } // 填入对方昵称 function pushNickname() { friend.value.Remark = friend.value.userName } // 发送好友申请 function addFriendConfirm() { api.news.addFriend({ data: [{ toAccount: friend.value.userId, addWording: friend.value.AddWording, remark: friend.value.Remark, }], }).then(rs => { if (rs.code == 200) { util.alert('已发送好友申请,请等待对方同意') proxy.$refs.friendRef.close() return } util.alert({ content: rs.msg, showCancel: false, }) }) } </script> <template> <view class="app"> <view class="searchBox ptb20 bfff"> <view class="search rows mlr20 ptb10 plr30 bar"> <uni-icons type="search" /> <input type="text" focus="true" v-model="keyword" placeholder="输入手机号/账号" class="f1 ml10" confirm-type="search" /> <view class="btn bar sm colourful w120" @click="refreshFriendList">搜索</view> </view> </view> <view class="listArea plr30 bfff"> <view class="item rows ptb30 c333 f32" v-for="(item, index) in userList.data" :key="index" @click="handleUser(item)"> <view class="avatar fs0"> <image class="wh100 cir" :src="item.imageUrl" mode="aspectFill" /> </view> <view class="content f1 mlr20"> <view class="name">{{ item.userName }}</view> <!-- <view class="time c999 f22">{{item.createTime}}</view> --> </view> <template v-if="0"> <view class="btns rows fs0" v-if="item.friendState == 1"> <view class="btn black plr20" @click.stop="">同意</view> <view class="btn cancel plr20 ml20" @click.stop="">拒绝</view> </view> <view class="result fs0 c999" v-else-if="item.friendState == 2">已拒绝</view> <view class="result fs0 c999" v-else-if="item.friendState == 3">已同意</view> </template> <template v-else> <view class="btn black plr20" @click.stop="handleAdd(item)">添加好友</view> </template> </view> </view> <!-- 填充 --> <view class="fill" style="height: 60rpx;"></view> </view> <!-- 设置备注 --> <uni-popup ref="friendRef" type="bottom"> <view class="friendAlt popBot plr20 bfff"> <view class="header rows ptb30 f32"> <view class="">发送好友申请</view> <uni-icons type="closeempty" @click="$refs.friendRef.close()" /> </view> <view class="main mlr30"> <view class="txtplus inputBox mtb30 ptb20 plr20 br10"> <input type="text" v-model="friend.AddWording" placeholder="填写招呼语" /> </view> <view class="txtplus inputBox mtb30 ptb20 plr20 br10"> <input type="text" v-model="friend.Remark" placeholder="设置备注" /> </view> <view class=" mt10 c666 f28" @click="pushNickname"> <text class="push">填入</text> <text>对方昵称</text> </view> <view class="btn lg bar black mtb30" @click="addFriendConfirm">确定</view> </view> </view> </uni-popup> </template> <style lang="scss" scoped> .search { background-color: #eaeaea; } // .listArea { .item+.item { border-top: 1rpx solid #ddd; } } </style>