app/pages/search/user.vue

275 lines
5.7 KiB
Vue
Raw Normal View History

2025-04-21 17:35:54 +08:00
<template>
<view class="wrap">
<view v-if="flowList.length">
<view
class="flex-box"
v-for="i in flowList"
v-if="i.id != id"
:key="i.id"
>
<u-image
2025-05-07 17:45:16 +08:00
@click="tozuozhe(i.id)"
2025-04-21 17:35:54 +08:00
:src="i.face"
class="flxleft"
width="120"
height="120"
shape="circle"
loading-icon="/static/missing-face.png"
error-icon="/static/missing-face.png"
style="display: flex; align-items: center"
></u-image>
2025-05-07 17:45:16 +08:00
<view
class="flxcenter"
@click="tozuozhe(i.id)"
>
2025-04-21 17:35:54 +08:00
<view class="nkname">{{ i.nickname }}</view>
2025-05-07 17:45:16 +08:00
<view
class="fans"
v-if="i.myFansCounts"
>
粉丝{{ getGraceNumber(i.myFansCounts || 0) }}
</view>
<view
class="fans"
v-if="i.totalLikeMeCounts"
>
获赞{{ getGraceNumber(i.totalLikeMeCounts || 0) }}
</view>
2025-04-21 17:35:54 +08:00
</view>
<view class="flxright">
<u-button
type="error"
@click="follow(i)"
v-if="i.followStatus == '未关注'"
>
关注
</u-button>
<u-button
v-else
type="plain"
@click="cancelFollow(i)"
>
{{ i.followStatus }}
</u-button>
</view>
</view>
<u-loadmore
style="padding: 10px 0"
bg-color="#f8f8f8"
:status="loadStatus"
@loadmore="getData"
></u-loadmore>
</view>
<u-empty
v-else
style="margin-top: 20%"
text="暂无数据"
mode="data"
></u-empty>
</view>
</template>
<script>
import storage from '@/utils/storage.js'; //缓存
2025-05-07 17:45:16 +08:00
import { vlogSearchUser, vlogFansFollow, vlogFansCancel, vlogQueryDoIFollowVloger } from '@/api/vlog';
import { clickFeedBack, graceNumber } from '@/utils/tools.js';
2025-04-21 17:35:54 +08:00
export default {
props: {
keywords: {
default: ''
}
},
data() {
return {
flag: 2, // 在tabs中的索引
loadStatus: 'loadmore',
flowList: [],
page: 0,
totalPage: 0,
search: '',
2025-05-07 17:45:16 +08:00
id: '',
channelComment: null
2025-04-21 17:35:54 +08:00
};
},
2025-05-07 17:45:16 +08:00
destroyed() {
console.log('查询用户组件销毁');
// 销毁时关闭 BroadcastChannel
if (this.channelComment) {
this.channelComment.close();
}
},
2025-04-21 17:35:54 +08:00
created() {
this.initData();
2025-05-07 17:45:16 +08:00
this.channelComment = new BroadcastChannel('comment-counts');
2025-04-21 17:35:54 +08:00
},
methods: {
2025-05-07 17:45:16 +08:00
// 把超过1000或10000的数字调整, 比如1.3k/6.8w
getGraceNumber(num) {
return graceNumber(num);
},
tozuozhe(userId) {
uni.navigateTo({
url: '/pages/me/vlogerInfo?userPageId=' + userId
});
},
2025-04-21 17:35:54 +08:00
async getData() {
if (this.loadStatus !== 'loadmore') return;
var info = storage.getVlogUserInfo();
var id = '';
if (info != null) {
id = info.id;
}
this.id = id;
this.loadStatus = 'loading';
this.page += 1;
console.log('加载用户数据');
var params = {
id: id,
nickname: this.search,
page: this.page,
pageSize: 10
};
console.log(params);
var result = await vlogSearchUser(params);
console.log(result);
if (result.data.status == 200) {
var data = result.data.data || [];
if (!data.length) {
this.loadStatus = 'nomore';
} else {
if (data.length < 10) {
this.loadStatus = 'nomore';
} else {
this.loadStatus = 'loadmore';
}
data.forEach((i) => {
i.doIflow = false;
2025-04-30 14:28:07 +08:00
if (i.followStatus == null) {
// 处理未登录时的状态
i.followStatus = '未关注';
}
2025-04-21 17:35:54 +08:00
this.flowList.push(i);
});
// this.flowList.push(...data);
}
}
},
initData() {
this.search = this.keywords;
this.page = 0;
this.totalPage = 0;
this.flowList = [];
this.loadStatus = 'loadmore';
console.log('初始化用户数据');
this.getData();
},
async follow(item) {
2025-05-07 17:45:16 +08:00
clickFeedBack();
2025-04-21 17:35:54 +08:00
let userInfo = storage.getVlogUserInfo();
if (userInfo == null) {
uni.navigateTo({
url: '/pages/passport/login',
animationType: 'slide-in-bottom'
});
return;
}
let data = {
myId: userInfo.id,
vlogerId: item.id
};
var result = await vlogFansFollow(data);
console.log(result);
if (result.data.status == 200) {
2025-05-07 17:45:16 +08:00
var bothFrd = await vlogQueryDoIFollowVloger({ myId: item.id, vlogerId: userInfo.id });
if (bothFrd.data.data) {
item.followStatus = '互相关注';
} else {
item.followStatus = '已关注';
}
console.log(bothFrd);
this.channelComment.postMessage({
type: 'comment-counts',
data: { flag: true, from: 'refresh', vlogerId: item.id, vlogId: item.vlogId }
});
item.myFansCounts++;
2025-04-21 17:35:54 +08:00
} else {
uni.showToast({
title: result.data.msg,
icon: 'none',
duration: 3000
});
}
},
async cancelFollow(item) {
2025-05-07 17:45:16 +08:00
clickFeedBack();
2025-04-21 17:35:54 +08:00
let userInfo = storage.getVlogUserInfo();
if (userInfo == null) {
uni.navigateTo({
url: '/pages/passport/login',
animationType: 'slide-in-bottom'
});
return;
}
let data = {
myId: userInfo.id,
vlogerId: item.id
};
var result = await vlogFansCancel(data);
console.log(result);
if (result.data.status == 200) {
2025-05-07 17:45:16 +08:00
item.followStatus = '未关注';
this.channelComment.postMessage({
type: 'comment-counts',
data: { flag: false, from: 'refresh', vlogerId: item.id, vlogId: item.vlogId }
});
item.myFansCounts--;
2025-04-21 17:35:54 +08:00
} else {
uni.showToast({
title: result.data.msg,
icon: 'none',
duration: 3000
});
}
}
}
};
</script>
<style lang="scss" scoped>
.flex-box {
display: flex;
align-items: center;
margin-bottom: 10rpx;
padding: 10rpx 20rpx;
}
.flxleft {
width: 120rpx;
height: 120rpx;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
margin-right: 5px;
}
.flxcenter {
flex: 1;
}
.nkname {
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 1;
overflow: hidden;
font-weight: 500;
2025-05-07 17:45:16 +08:00
font-size: 32rpx;
2025-04-21 17:35:54 +08:00
}
.fans {
2025-05-07 17:45:16 +08:00
font-size: 26rpx;
color: #000;
2025-04-21 17:35:54 +08:00
}
.flxright {
margin-left: 10px;
}
</style>