staff/pagesA/invite/index.vue

457 lines
13 KiB
Vue

<template>
<view class="invite-page">
<!-- 自定义导航栏 -->
<!-- 自定义导航栏 -->
<wd-navbar :bordered="false"
custom-style="background: transparent !important; backdrop-filter: blur(10px) !important; -webkit-backdrop-filter: blur(10px) !important;"
safeAreaInsetTop fixed placeholder>
<template #left>
<view class="li-ml-15 li-mt-10 li-flex li-items-center">
<text v-if="hasMultiplePages" class="ri-arrow-left-s-line li-text-70"
@click="toPages({type:'nav'})"></text>
<text v-if="!hasMultiplePages" class="ri-home-5-line li-text-55 li-mb-8 li-mr-10"
@click="toPages({type:'home'})"></text>
<text class="li-text-42">邀请业主</text>
</view>
</template>
</wd-navbar>
<!-- 导航栏背景 -->
<view class="nav-bg-layer"></view>
<!-- 邀请卡片区域 -->
<view class="invite-card li-w-92% li-mx-auto li-mt-40 li-bg-white li-rd-20 li-shadow-sm li-p-30">
<view class="card-header li-flex li-justify-between li-items-center">
<text class="li-text-36 li-text-#333">邀请福利</text>
<!-- <text class="li-text-28 li-text-#0070F0" @click="showRules">活动规则</text> -->
</view>
<view class="card-content li-mt-30">
<!-- 主要返佣说明 -->
<view :style="{backgroundImage:`url(${card_back})`,backgroundSize:'cover',backgroundPosition:'center'}"
class="commission-card li-bg-gradient-to-r li-from-#4481EB li-to-#0070F0 li-rd-20 li-p-30 li-mb-30">
<view class="li-flex li-items-center li-mb-20">
<text class="ri-shopping-bag-3-line li-text-48 li-text-#0a4696"></text>
<text
class="li-text-34 li-text-#0a4696 li-ml-15 li-font-medium">{{codeInfo?.config?.shop_brokerage_mode==1?'业主消费返佣':'业主关系'}}</text>
</view>
<view v-if="codeInfo?.config?.shop_brokerage_mode == 1" class="li-flex li-items-baseline li-mb-15">
<text
class="li-text-70 li-text-#0a4696 li-font-bold">{{codeInfo?.config?.employee_shop_brokerage_rate}}</text>
<text class="li-text-34 li-text-#0a4696 li-ml-10">%</text>
</view>
<view v-else class="li-flex li-items-baseline li-mb-15">
<text class="li-text-50 li-text-#0a4696 li-font-bold">业主专属顾问</text>
</view>
<text
class="li-text-26 li-text-#0a4696 li-opacity-100">{{codeInfo?.config?.shop_brokerage_mode==1?'邀请的业主每笔消费,您都可获得返佣':'建立长期服务关系,共创双赢'}}</text>
</view>
<!-- 收益说明 -->
<view class="benefit-list li-bg-#f8faff li-rd-16 li-p-30">
<view class="benefit-item li-flex li-items-center li-mb-30">
<view class="icon-box li-bg-#E1F0FF li-rd-12 li-p-15">
<text class="ri-user-add-line li-text-36 li-text-#0070F0"></text>
</view>
<view class="li-ml-20">
<text class="li-text-30 li-text-#333">邀请入驻</text>
<text class="li-text-26 li-text-#666 li-block li-mt-5">邀请业主注册并完成实名认证</text>
</view>
</view>
<view v-if="codeInfo?.config?.shop_brokerage_mode!=1"
class="benefit-item li-flex li-items-center li-mb-30">
<view class="icon-box li-bg-#E1F0FF li-rd-12 li-p-15">
<text class="ri-link-m li-text-36 li-text-#0070F0"></text>
</view>
<view class="li-ml-20">
<text class="li-text-30 li-text-#333">优先关系</text>
<text class="li-text-26 li-text-#666 li-block li-mt-5">建立专属业主服务通道</text>
</view>
</view>
<view v-if="codeInfo?.config?.shop_brokerage_mode==1" class="benefit-item li-flex li-items-center">
<view class="icon-box li-bg-#E1F0FF li-rd-12 li-p-15">
<text class="ri-money-cny-box-line li-text-36 li-text-#0070F0"></text>
</view>
<view class="li-ml-20">
<text class="li-text-30 li-text-#333">持续收益</text>
<text class="li-text-26 li-text-#666 li-block li-mt-5">业主每次消费都可获得返佣</text>
</view>
</view>
</view>
</view>
<view class="invite-button li-mt-40">
<wd-button type="primary" block custom-class="share-btn" @click="openSharePoster">
<text class="ri-share-forward-line li-mr-10"></text>立即邀请
</wd-button>
</view>
</view>
<!-- 邀请记录区域 -->
<view class="invite-records li-w-92% li-mx-auto li-mt-40">
<view class="records-header li-flex li-justify-between li-items-center">
<view class="li-flex li-items-center">
<text class="li-text-34 li-text-#333">邀请记录</text>
<text class="li-text-26 li-text-#666 li-ml-15">(共{{inviteListData?.length}}人)</text>
</view>
<view v-if="codeInfo?.config?.shop_brokerage_mode==1" class="li-flex li-items-center">
<text class="ri-money-cny-box-line li-text-32 li-text-#0070F0"></text>
<text class="li-text-26 li-text-#666 li-ml-10">累计返佣:¥{{codeInfo?.sumMoney}}</text>
</view>
</view>
<scroll-view scroll-y class="records-list li-mt-20" @scrolltolower="loadMore">
<view v-for="(item, index) in inviteListData" :key="index"
class="record-item li-bg-white li-rd-20 li-p-30 li-mb-20 li-shadow-sm">
<view class="li-flex li-justify-between li-items-center">
<view class="li-flex li-items-center">
<image :src="item.avatar?item.avatar:'/static/logo.png'" class="avatar"></image>
<view class="li-ml-20">
<view class="li-text-32 li-text-#333">{{item.user_name}}</view>
<view class="li-text-26 li-text-#999 li-mt-10">{{item.create_time}}</view>
</view>
</view>
<view class="status-tag success">
已建立关系
</view>
</view>
</view>
<view v-if="inviteListData?.length>0">
<wd-loadmore loading-text="努力加载中" finished-text="没有更多了" :state="state" />
</view>
<view v-if="inviteListData?.length === 0" class="empty-state">
<wd-status-tip :image="uni.$globalData?.RESOURCE_URL+'tip/search.png'" tip="暂无邀请记录" />
</view>
</scroll-view>
</view>
<!-- 规则弹窗 -->
<wd-popup v-model="showRulePopup" position="center" @close="showRulePopup = false">
<view class="rules-popup li-bg-white ">
<view class="rules-header li-py-20 li-px-30 li-flex li-justify-between li-items-center li-border-b">
<text class="li-text-34 li-font-medium">邀请规则</text>
<text class="ri-close-line li-text-44 li-text-#999" @click="showRulePopup = false"></text>
</view>
<view class="rules-content li-p-30">
<view class="rule-item li-mb-15 li-flex li-items-center">
<text class="rule-icon li-mr-15">1</text>
<text class="li-text-28 li-text-#333">邀请业主加入平台并完成实名认证后,您将成为业主的专属顾问</text>
</view>
<view class="rule-item li-mb-15 li-flex li-items-center">
<text class="rule-icon li-mr-15">2</text>
<text class="li-text-28 li-text-#333">作为专属顾问,您将获得更多与业主合作的机会</text>
</view>
<view class="rule-item li-flex li-items-center">
<text class="rule-icon li-mr-15">3</text>
<text class="li-text-28 li-text-#333">平台将不断完善业主顾问机制,为您创造更多价值</text>
</view>
</view>
</view>
</wd-popup>
<zero-loading type="wobble" v-if="loading"></zero-loading>
<SharePoster v-model:show="showPoster" :posterInfo="posterInfo" @updateShare="handleUpdateShare"></SharePoster>
</view>
</template>
<script setup>
import {
ref,
onMounted,
defineExpose
} from 'vue'
import {
inviteList,
inviteCode
} from '@/api/invite'
import {
useToast
} from '@/uni_modules/wot-design-uni'
import {
onLoad
} from '@dcloudio/uni-app'
import {
useNavigation
} from '@/hooks/useNavigation'
import SharePoster from '@/components/SharePoster.vue'
const {
hasMultiplePages, // 是否有多个页面在路由栈中
isTabBarPage, // 当前页面是否为 tabBar 页面
checkRouteStack // 检查当前路由栈状态的方法
} = useNavigation()
const Toast = useToast()
const loading = ref(false)
const inviteListData = ref([])
const showRulePopup = ref(false)
const showPoster = ref(false)
const posterInfo = ref({})
const state = ref('loading')
const codeInfo = ref({})
const page = ref(1)
const limit = ref(10)
const userInfo = ref(uni.getStorageSync('userInfo'))
const count = ref(0)
const card_back = uni.$globalData?.RESOURCE_URL + 'invite/card-back.png'
onLoad(() => {
checkRouteStack()
getInviteCode()
loadInviteRecords()
})
const getInviteCode = async () => {
var res = await inviteCode()
if (res.code == 200) {
codeInfo.value = res.data
}
posterInfo.value = {
title: userInfo.value.owner.name,
name: userInfo.value.realname,
qrcode: codeInfo.value.code,
backImage: uni.$globalData?.RESOURCE_URL + 'invite/poster_back.png'
}
}
// 加载邀请记录
const loadInviteRecords = async () => {
loading.value = true
try {
const res = await inviteList({
page: page.value,
limit: limit.value,
})
if (res.code == 200) {
if (res.data.length < 10) {
state.value = 'finished'
}
inviteListData.value = [...inviteListData.value, ...res.data]
count.value = res.count
}
} catch (error) {
Toast.error('加载失败')
} finally {
loading.value = false
}
}
// 页面跳转
const toPages = (item) => {
if (item.type === 'nav') {
uni.navigateBack()
} else if (item.type === 'home') {
// 这里是项目内部的跳转逻辑
uni.switchTab({
url: '/pages/index/index'
})
}
}
// 滚动加载更多
const loadMore = () => {
if (inviteListData?.value.length >= count.value) {
state.value = 'finished'
return
}
page++
loadInviteRecords()
}
onMounted(() => {
// loadInviteRecords()
// 初始化海报信息
})
// 显示规则弹窗
const showRules = () => {
console.log('显示规则弹窗')
showRulePopup.value = true
}
// 打开分享海报
const openSharePoster = () => {
showPoster.value = true
}
// 处理分享海报关闭
const handleUpdateShare = (val) => {
showPoster.value = val
}
</script>
<style lang="scss">
page {
background-color: #f7f8fc;
}
.invite-page {
min-height: 100vh;
padding-bottom: 40rpx;
}
/* 导航背景层 */
.nav-bg-layer {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: calc(var(--status-bar-height) + 88rpx);
background: linear-gradient(180deg, rgba(255, 255, 255, 0.95) 0%, rgba(255, 255, 255, 0.9) 100%);
z-index: -1;
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
}
.invite-card .card-content .commission-card {
border-radius: 20rpx;
padding: 30rpx;
margin-bottom: 30rpx;
}
.invite-card .card-content .commission-card .ri-shopping-bag-3-line {
font-size: 48rpx;
margin-right: 15rpx;
}
.invite-card .card-content .commission-card .li-text-34 {
font-size: 34rpx;
font-weight: bold;
}
.invite-card .card-content .commission-card .li-text-26 {
font-size: 26rpx;
opacity: 0.8;
}
.invite-card .card-content .benefit-list {
padding: 30rpx;
border-radius: 16rpx;
background: #f8faff;
}
.invite-card .card-content .benefit-list .benefit-item .icon-box {
width: 48rpx;
height: 48rpx;
border-radius: 12rpx;
background: #E1F0FF;
margin-right: 20rpx;
padding: 15rpx;
}
.invite-card .card-content .benefit-list .benefit-item .icon-box .ri-user-add-line,
.invite-card .card-content .benefit-list .benefit-item .icon-box .ri-link-m,
.invite-card .card-content .benefit-list .benefit-item .icon-box .ri-money-cny-box-line {
font-size: 36rpx;
color: #0070F0;
}
.invite-card .card-content .benefit-list .benefit-item .li-text-30 {
font-size: 30rpx;
color: #333;
}
.invite-card .card-content .benefit-list .benefit-item .li-text-26 {
font-size: 26rpx;
color: #666;
display: block;
margin-top: 5rpx;
}
.invite-card .share-btn {
background: linear-gradient(135deg, #42a5ff 0%, #0070F0 100%) !important;
border: none !important;
height: 90rpx !important;
font-size: 32rpx !important;
}
.invite-records .records-list {
height: calc(100vh - 600rpx);
}
.invite-records .records-list .record-item .avatar {
width: 90rpx;
height: 90rpx;
border-radius: 20rpx;
}
.invite-records .records-list .record-item .status-tag {
padding: 4rpx 20rpx;
border-radius: 30rpx;
font-size: 24rpx;
}
.invite-records .records-list .record-item .status-tag.success {
color: #07c160;
background-color: rgba(7, 193, 96, 0.1);
}
.invite-records .records-list .record-item .status-tag.pending {
color: #f0ad4e;
background-color: rgba(240, 173, 78, 0.1);
}
.rules-popup {
width: 580rpx;
overflow: hidden;
}
.rules-popup .rules-header {
border-color: rgba(0, 0, 0, 0.05);
position: relative;
}
.rules-popup .rules-header::after {
content: '';
position: absolute;
left: 30rpx;
right: 30rpx;
bottom: 0;
height: 1px;
background: rgba(0, 0, 0, 0.05);
transform: scaleY(0.5);
}
.rules-popup .rules-header .ri-close-line {
padding: 10rpx;
}
.rules-popup .rules-content {
padding: 40rpx 30rpx 50rpx;
}
.rules-popup .rules-content .rule-item {
display: flex;
align-items: flex-start;
margin-bottom: 20rpx;
}
.rules-popup .rules-content .rule-item .rule-icon {
display: flex;
align-items: center;
justify-content: center;
width: 36rpx;
height: 36rpx;
border-radius: 50%;
background: #0070F0;
color: white;
font-size: 24rpx;
margin-right: 16rpx;
flex-shrink: 0;
}
.rules-popup .rules-content .rule-item:last-child {
margin-bottom: 0;
}
::v-deep .wd-divider,
.wd-divider::after,
.wd-divider::before {
border: none !important;
margin: 0 !important;
}
</style>