app/pages/me/myFans.nvue

246 lines
5.5 KiB
Plaintext
Raw Normal View History

2025-03-28 15:46:11 +08:00
<template>
<view class="mpage">
<view class="line"></view>
<scroll-view scroll-y="true" @scrolltolower="pagingFansList()">
<view class="user-wrapper" v-for="(f, index) in fansList" :key="index">
<view class="user-info" @click="goTovlogerInfo(f.fanId)">
<image class="face" :src="f.face" />
<text class="user-name">
{{ f.nickname }}
</text>
</view>
<view v-if="isLogin && f.me" class="operator-wrapper">
<text class="operator-words" style="color: #ffffff">你</text>
</view>
<view v-else-if="!isLogin || isLogin && !f.follow && !f.fan" class="operator-wrapper">
<text class="operator-words" style="color: #ffffff" @click="followMe(f.fanId)">
关注
</text>
</view>
<view v-else-if="isLogin && !f.follow && f.fan" class="operator-wrapper">
<text class="operator-words" style="color: #ffffff" @click="followMe(f.fanId)">
回粉
</text>
</view>
<view v-else-if="isLogin && f.follow && !f.fan" class="operator-wrapper">
<text class="operator-words" style="color: #ef274d" @click="cancelFollow(f.fanId)">
已关注
</text>
</view>
<view v-else-if="isLogin && f.follow && f.fan" class="operator-wrapper">
<text class="operator-words" style="color: #ef274d" @click="cancelFollow(f.fanId)">
互关
</text>
</view>
</view>
</scroll-view>
</view>
</template>
<script>
let system = uni.getSystemInfoSync();
import storage from "@/utils/storage.js"; //缓存
import {
vlogFansCancel,
vlogFansFollow,
vlogQueryMyFans
} from "@/api/vlog"
import {
isStrEmpty
} from '@/utils/tools.js'
export default {
data() {
return {
userId: "",
currentUserId: "",
isLogin: false,
screenHeight: 0,
page: 0,
totalPage: 0,
fansList: [],
};
},
onLoad(param) {
var uinfo = storage.getVlogUserInfo()
if (uinfo == null) {
return
}
this.isLogin = true;
this.currentUserId = uinfo.id
this.userId = param.userId;
this.queryMyFansList(0);
},
methods: {
goTovlogerInfo(vlogerId) {
// 是否是当前登录的用户
if (this.currentUserId == vlogerId) {
uni.switchTab({
url: "me",
});
} else {
uni.navigateTo({
url: "vlogerInfo?userPageId=" + vlogerId,
});
}
},
// 关注/取关后的list重新状态刷新设置
reFreshList(vlogerId, status) {
let me = this;
let fansList = me.fansList;
for (let i = 0; i < fansList.length; i++) {
let fan = fansList[i];
if (fan.fanId == vlogerId) {
fan.follow = status;
fansList.splice(i, 1, fan);
}
}
me.fansList = fansList;
},
async cancelFollow(vlogerId) {
let me = this;
let userId = storage.getVlogUserInfo().id
let data = {
myId: userId,
vlogerId
}
var result = await vlogFansCancel(data)
console.log(result)
if (result.data.status == 200) {
me.reFreshList(vlogerId, false);
} else {
uni.showToast({
title: result.data.msg,
icon: "none",
duration: 3000,
});
}
},
async followMe(vlogerId) {
let me = this;
let userId = this.currentUserId;
let data = {
myId: userId,
vlogerId
}
var result = await vlogFansFollow(data)
console.log(result)
if (result.data.status == 200) {
me.reFreshList(vlogerId, true);
} else {
uni.showToast({
title: result.data.msg,
icon: "none",
duration: 3000,
});
}
},
async queryMyFansList(page) {
let me = this;
page = page + 1;
let userId = me.userId;
let currentUserId = this.currentUserId;
var data = {
myId:userId,
// vlogerId: userId,
// currentUserId: currentUserId,
page: page,
pageSize: 10
}
var result = await vlogQueryMyFans(data)
if (result.data.status == 200) {
let fansList = result.data.data.rows;
let totalPage = result.data.data.total;
me.fansList = me.fansList.concat(fansList);
me.page = page;
me.totalPage = totalPage;
}
},
// 上滑分页粉丝列表
pagingFansList() {
if (this.page >= this.totalPage) {
return;
}
this.queryMyFansList(this.page);
},
},
};
</script>
<style scoped>
.user-info {
display: flex;
flex-direction: row;
justify-content: flex-start;
}
.face {
align-self: center;
width: 110rpx;
height: 110rpx;
border-radius: 100rpx;
border-width: 2rpx;
border-color: #f1f1f1;
}
.user-name {
align-self: center;
color: #ffffff;
font-size: 30rpx;
margin-left: 20rpx;
}
.line {
height: 1rpx;
background-color: #393a41;
width: 750rpx;
}
.mpage {
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
background-color: #181b27;
}
.user-wrapper {
padding-left: 30rpx;
padding-right: 30rpx;
width: 750rpx;
height: 120rpx;
display: flex;
flex-direction: row;
justify-content: space-between;
margin-top: 20rpx;
margin-bottom: 20rpx;
}
.operator-wrapper {
width: 140rpx;
height: 60rpx;
display: flex;
flex-direction: row;
justify-content: center;
background-color: #ef274d;
border-radius: 20rpx;
align-self: center;
border-width: 2rpx;
border-color: #ef274d;
background-color: #181b27;
}
.operator-words {
align-self: center;
font-size: 28rpx;
}
</style>