408 lines
9.0 KiB
Vue
Raw Permalink Normal View History

2024-05-15 17:54:48 +08:00
<template>
2024-05-17 18:17:07 +08:00
<view class="template-edit tn-safe-area-inset-bottom">
2025-03-21 16:50:18 +08:00
<tn-nav-bar :isBack="false" backTitle="" :bottomShadow="false" backgroundColor="#FFFFFF">
2024-05-17 18:17:07 +08:00
<view class="custom-nav tn-flex tn-flex-col-center tn-flex-row-left">
<view style="padding-left: 15rpx;" @click="goBack()">
<text class="tn-icon-left" style="font-size: 40rpx;"></text>
</view>
2025-03-21 16:50:18 +08:00
<view style="width: 83%;font-weight: bold;">
邀请会员
2024-05-17 18:17:07 +08:00
</view>
</view>
</tn-nav-bar>
2024-05-15 17:54:48 +08:00
2025-03-21 16:50:18 +08:00
<view class="tn-safe-area-inset-bottom" :style="{ paddingTop: vuex_custom_bar_height + 'px' }">
<!-- 顶部卡片 -->
<view class="invite-card tn-shadow-blur">
<view class="card-stats">
<view class="stat-item">
<text class="number">{{ inviteCount}}</text>
<text class="label">已邀请</text>
</view>
2024-05-17 18:17:07 +08:00
</view>
2025-03-21 16:50:18 +08:00
<!-- 按钮组 -->
<view class="button-group">
<!-- <tn-button @click="openQrcode" class="invite-btn" backgroundColor="#FFFFFF" height="80rpx"
:shadow="true" fontColor="#5C8FFF">
<text class="tn-icon-qr-code"></text> 生成二维码
</tn-button> -->
<tn-button open-type="share" width="100%" class="invite-btn" backgroundColor="#FFFFFF"
height="80rpx" :shadow="true" fontColor="#5C8FFF">
<text class="tn-icon-share"></text> 邀请好友
</tn-button>
</view>
</view>
<!-- 邀请列表 -->
<view class="invite-list">
<view class="list-header">
<text class="title">邀请记录</text>
<text class="count">{{ inviteCount }}</text>
</view>
<view class="list-content">
<view v-for="(item, index) in inviteList" :key="index" class="list-item tn-flex tn-flex-row">
<image v-if="item.photo_image!=''&&item.photo_image!=null" :src="apiImgUrl+item.photo_image"
class="avatar" mode="aspectFill">
</image>
<image v-if="item.photo_image==''||item.photo_image==null" src="/static/def.png" class="avatar"
mode="aspectFill">
</image>
<view class="info">
<view class="name">{{ item.nikename || '匿名用户' }}</view>
<view class="time">{{ item.createtime || '未知时间' }}</view>
</view>
<view class="status" :class="item.if_xianshi === 1 ? 'success' : 'pending'">
{{ item.if_xianshi === 1 ? '已入会' : '未入会' }}
</view>
</view>
2024-05-17 18:17:07 +08:00
</view>
</view>
</view>
<tn-popup :closeBtn="true" v-model="show" mode="center" width="500rpx" height="700rpx">
<div style="text-align: center;padding: 30rpx;font-size: 32rpx;font-weight: 600;">使用二维码邀请入会</div>
<view style="text-align: center;margin-top: 40rpx;">
<image :src="qrcode_url" style="width: 400rpx;height: 400rpx;"></image>
</view>
<view style="text-align: center;margin-top: 40rpx;">
<tn-button shape="round" backgroundColor="#82B2FF" fontColor="#ffffff"
@click="saveBase64">保存图片</tn-button>
</view>
</tn-popup>
<view class='tn-tabbar-height'></view>
</view>
2024-05-15 17:54:48 +08:00
</template>
<script>
2024-05-17 18:17:07 +08:00
import {
getUserIndex,
2025-03-21 16:50:18 +08:00
getQrcode,
getrecommendationList
2024-05-17 18:17:07 +08:00
} from "@/util/api";
import store from "@/store";
export default {
data() {
return {
2025-03-21 16:50:18 +08:00
apiImgUrl: this.$store.state.imgUrl,
apiUpUrl: this.$store.state.apiUrl,
2024-05-17 18:17:07 +08:00
show: false,
topCurrent: 0,
uid: 0,
userInfo: {},
2025-03-21 16:50:18 +08:00
qrcode_url: '',
inviteList: [],
inviteCount: 0,
page: 1
2024-05-17 18:17:07 +08:00
}
},
onShareAppMessage() {
return {
title: this.userInfo.nikename + '邀请你加入【' + this.userInfo.association_name + '】',
2025-03-21 16:50:18 +08:00
path: '/pages/index/index?id=' + this.uid,
2024-05-17 18:17:07 +08:00
imageUrl: this.apiImgUrl + this.userInfo.association_image,
}
},
onShareTimeline() { // 分享到朋友圈
return {
title: this.userInfo.nikename + '邀请你加入【' + this.userInfo.association_name + '】',
2025-03-21 16:50:18 +08:00
path: '/pages/index/index?id=' + this.uid,
2024-05-17 18:17:07 +08:00
imageUrl: this.apiImgUrl + this.userInfo.association_image,
}
},
onLoad() {
var u = uni.getStorageSync('uid');
this.uid = u;
this.getUserInfo();
2025-03-21 16:50:18 +08:00
this.getList();
},
onReachBottom() {
this.page += 1;
this.getList();
2024-05-17 18:17:07 +08:00
},
methods: {
saveBase64() {
wx.saveImageToPhotosAlbum({
filePath: this.qrcode_url,
success: function(res) {
wx.showToast({
title: '保存成功',
})
},
fail: function(err) {
console.log(err, '失败')
}
})
},
openQrcode() {
2024-06-21 16:15:26 +08:00
uni.showLoading({
2024-05-17 18:17:07 +08:00
title: '生成中',
2024-06-21 16:15:26 +08:00
mask: true,
2024-05-17 18:17:07 +08:00
});
var that = this;
uni.request({
url: store.state.apiUrl + '/move/login/getUnlimitedQRCode',
method: 'POST',
data: {
path: 'pages/index/apply_in',
scene: "id=" + this.uid + "&association_id=" + this.userInfo.association_id
},
responseType: 'arraybuffer',
arraybuffer: true,
success: (result) => {
const url = 'data:image/png;base64,' + uni.arrayBufferToBase64(result.data);
that.base64ToImage(url);
}
})
},
base64ToImage(base64Data) {
var that = this;
const fs = uni.getFileSystemManager();
var filePath = wx.env.USER_DATA_PATH + '/qrcode.jpg';
const base64 = base64Data.split(',')[1]; // 获取base64字符串部分
fs.writeFile({
filePath: filePath,
data: base64,
encoding: 'base64',
success: (res) => {
that.qrcode_url = filePath;
console.log('图片保存成功', filePath);
// 成功回调
that.show = true;
2024-06-21 16:15:26 +08:00
uni.hideLoading()
2024-05-17 18:17:07 +08:00
},
fail: (err) => {
console.error('图片保存失败', err);
2024-06-21 16:15:26 +08:00
uni.hideLoading()
2024-05-17 18:17:07 +08:00
// 失败回调
}
});
},
getUserInfo() {
getUserIndex({
member_b_id: this.uid,
member_id: this.uid
})
.then(res => {
console.log(res);
if (res.code == 1) {
this.userInfo = res.data;
}
})
.catch(error => {
uni.showToast({
title: error,
icon: 'none',
duration: 2000
});
})
},
2025-03-21 16:50:18 +08:00
getList() {
console.log(1);
getrecommendationList({
page: this.page,
size: 10
})
.then(res => {
console.log(res);
if (res.code == 1) {
this.inviteList.push(...res.data.ret);
this.inviteCount = res.data.count;
}
})
.catch(error => {
uni.showToast({
title: error,
icon: 'none',
duration: 2000
});
})
},
2024-05-17 18:17:07 +08:00
// 跳转
tn(e) {
uni.navigateTo({
url: e,
});
},
goBack() {
if (getCurrentPages().length > 1) {
uni.navigateBack()
} else {
uni.redirectTo({
url: '/pages/index/index'
})
2024-05-15 17:54:48 +08:00
2024-05-17 18:17:07 +08:00
}
},
}
}
2024-05-15 17:54:48 +08:00
</script>
<style lang="scss" scoped>
2024-05-17 18:17:07 +08:00
/* 底部悬浮按钮 start*/
.tn-tabbar-height {
min-height: 100rpx;
height: calc(120rpx + env(safe-area-inset-bottom) / 2);
}
2024-05-15 17:54:48 +08:00
2024-05-17 18:17:07 +08:00
.tn-footerfixed {
position: fixed;
width: 100%;
bottom: calc(30rpx + env(safe-area-inset-bottom));
z-index: 1024;
box-shadow: 0 1rpx 6rpx rgba(0, 0, 0, 0);
2024-05-15 17:54:48 +08:00
2024-05-17 18:17:07 +08:00
}
2024-05-15 17:54:48 +08:00
2024-05-17 18:17:07 +08:00
/* 底部悬浮按钮 end*/
2024-05-15 17:54:48 +08:00
2024-05-17 18:17:07 +08:00
/* 标签内容 start*/
.tn-tag-content {
&__item {
display: inline-block;
line-height: 45rpx;
padding: 10rpx 30rpx;
margin: 20rpx 20rpx 5rpx 0rpx;
2024-05-15 17:54:48 +08:00
2024-05-17 18:17:07 +08:00
&--prefix {
padding-right: 10rpx;
}
}
}
2024-05-15 17:54:48 +08:00
2024-05-17 18:17:07 +08:00
/* 标签内容 end*/
2025-03-21 16:50:18 +08:00
/* 邀请卡片 */
.invite-card {
margin: 30rpx;
padding: 40rpx;
background: linear-gradient(45deg, #5C8FFF, #82B2FF);
border-radius: 24rpx;
color: #FFFFFF;
.card-title {
font-size: 32rpx;
font-weight: bold;
margin-bottom: 20rpx;
}
.card-content {
.invite-code {
font-size: 48rpx;
font-weight: bold;
letter-spacing: 4rpx;
}
}
.card-stats {
margin: 30rpx 0;
.stat-item {
text-align: center;
.number {
font-size: 80rpx;
font-weight: bold;
display: block;
}
.label {
font-size: 24rpx;
opacity: 0.8;
}
}
}
.button-group {
display: flex;
gap: 20rpx;
.invite-btn {
width: 100%;
flex: 1;
border-radius: 40rpx;
.tn-icon-qr-code,
.tn-icon-share {
margin-right: 10rpx;
}
}
}
}
/* 邀请列表 */
.invite-list {
margin: 30rpx;
background-color: #FFFFFF;
border-radius: 24rpx;
padding: 30rpx;
.list-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 30rpx;
.title {
font-size: 32rpx;
font-weight: bold;
color: #333333;
}
.count {
font-size: 28rpx;
color: #999999;
}
}
.list-content {
.list-item {
display: flex;
align-items: center;
padding: 20rpx 0;
border-bottom: 1rpx solid #F5F5F5;
&:last-child {
border-bottom: none;
}
.avatar {
width: 80rpx;
height: 80rpx;
border-radius: 50%;
margin-right: 20rpx;
}
.info {
flex: 1;
.name {
font-size: 28rpx;
color: #333333;
margin-bottom: 6rpx;
}
.time {
font-size: 24rpx;
color: #999999;
}
}
.status {
font-size: 24rpx;
padding: 4rpx 16rpx;
border-radius: 20rpx;
&.success {
background-color: #E8F3FF;
color: #5C8FFF;
}
&.pending {
background-color: #FFF7E6;
color: #FFA726;
}
}
}
}
}
</style>