staff/pagesA/invite/index.vue

454 lines
13 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<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
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-white"></text>
<text class="li-text-34 li-text-white li-ml-15">业主消费返佣</text>
</view>
<view class="li-flex li-items-baseline li-mb-15">
<text class="li-text-70 li-text-white li-font-bold">5</text>
<text class="li-text-34 li-text-white li-ml-10">%</text>
</view>
<text class="li-text-26 li-text-white li-opacity-80">邀请的业主每笔消费,您都可获得返佣</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 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 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="showSharePopup">
<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">(共{{inviteList.length}}人)</text>
</view>
<view 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">累计返佣¥1280.50</text>
</view>
</view>
<scroll-view scroll-y class="records-list li-mt-20" @scrolltolower="loadMore">
<view v-for="(item, index) in inviteList" :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" class="avatar"></image>
<view class="li-ml-20">
<view class="li-text-32 li-text-#333">{{item.name}}</view>
<view class="li-text-26 li-text-#999 li-mt-10">{{item.time}}</view>
</view>
</view>
<view class="status-tag" :class="item.status === 1 ? 'success' : 'pending'">
{{item.status === 1 ? '已绑定' : '待认证'}}
</view>
</view>
</view>
<view v-if="loading" class="loading li-text-center li-py-30 li-text-28 li-text-#999">
加载中...
</view>
<view v-if="!hasMore && inviteList.length > 0" class="li-text-center li-py-30 li-text-28 li-text-#999">
没有更多了
</view>
<view v-if="inviteList.length === 0" class="empty-state li-py-60">
<wd-status-tip image="search" tip="暂无邀请记录" />
</view>
</scroll-view>
</view>
<!-- 分享组件 -->
<share-popup ref="sharePopupRef" :visible.sync="showShare" @update:visible="showShare = $event"
@close="showShare = false" @generate="generatePoster" @share="handleShare" />
<!-- 规则弹窗 -->
<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">每当业主在商城消费时您都可获得订单金额5%的返佣</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>
</view>
</template>
<script setup lang="ts">
import {
ref,
onMounted,
defineExpose
} from 'vue'
import {
useToast
} from '@/uni_modules/wot-design-uni'
import { onLoad } from '@dcloudio/uni-app'
import SharePopup from './components/SharePopup.vue'
import { useNavigation } from '@/hooks/useNavigation'
const {
hasMultiplePages, // 是否有多个页面在路由栈中
isTabBarPage, // 当前页面是否为 tabBar 页面
checkRouteStack // 检查当前路由栈状态的方法
} = useNavigation()
const Toast = useToast()
const sharePopupRef = ref(null)
const showShare = ref(false)
const loading = ref(false)
const hasMore = ref(true)
const page = ref(1)
const inviteList = ref([])
const showRulePopup = ref(false)
onLoad(() => {
checkRouteStack()
})
// 显示分享弹窗
const showSharePopup = () => {
showShare.value = true
}
// 生成海报
const generatePoster = () => {
// 调用分享组件的生成海报方法
sharePopupRef.value?.generatePoster()
}
// 处理分享
const handleShare = (type) => {
if (type === 'wechat') {
// #ifdef APP-PLUS
plus.share.sendWithSystem({
type: 'text',
content: '邀请链接',
href: 'https://example.com/invite'
})
// #endif
// #ifdef MP-WEIXIN
// 小程序分享通过 onShareAppMessage 处理
// #endif
}
}
// 加载邀请记录
const loadInviteRecords = async () => {
if (loading.value || !hasMore.value) return
loading.value = true
try {
// 模拟接口调用
await new Promise(resolve => setTimeout(resolve, 1000))
const mockData = Array(10).fill().map((_, index) => ({
id: page.value * 10 + index,
name: `业主${page.value * 10 + index}`,
avatar: '/static/swiper/1.png',
time: '2024-03-26 12:00:00',
status: Math.random() > 0.5 ? 1 : 0
}))
inviteList.value.push(...mockData)
hasMore.value = page.value < 3 // 模拟只有3页数据
page.value++
} 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 = () => {
loadInviteRecords()
}
onMounted(() => {
loadInviteRecords()
})
// 显示规则弹窗
const showRules = () => {
console.log('显示规则弹窗')
showRulePopup.value = true
}
// 微信小程序分享配置
const onShareAppMessage = () => {
return {
title: '邀请您加入我们的物业管理平台',
path: '/pagesA/invite/index',
imageUrl: '分享图片地址'
}
}
// 分享定义到组件实例上
defineExpose({
onShareAppMessage
})
</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 {
background: linear-gradient(135deg, #4481EB 0%, #0070F0 100%);
border-radius: 20rpx;
padding: 30rpx;
margin-bottom: 30rpx;
.ri-shopping-bag-3-line {
font-size: 48rpx;
color: #fff;
margin-right: 15rpx;
}
.li-text-34 {
font-size: 34rpx;
color: #fff;
font-weight: bold;
}
.li-text-26 {
font-size: 26rpx;
color: #fff;
opacity: 0.8;
}
}
.benefit-list {
padding: 30rpx;
border-radius: 16rpx;
background: #f8faff;
.benefit-item {
.icon-box {
width: 48rpx;
height: 48rpx;
border-radius: 12rpx;
background: #E1F0FF;
margin-right: 20rpx;
padding: 15rpx;
.ri-user-add-line,
.ri-link-m,
.ri-money-cny-box-line {
font-size: 36rpx;
color: #0070F0;
}
}
.li-text-30 {
font-size: 30rpx;
color: #333;
}
.li-text-26 {
font-size: 26rpx;
color: #666;
display: block;
margin-top: 5rpx;
}
}
}
}
.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);
.record-item {
.avatar {
width: 90rpx;
height: 90rpx;
border-radius: 20rpx;
}
.status-tag {
padding: 4rpx 20rpx;
border-radius: 30rpx;
font-size: 24rpx;
&.success {
color: #07c160;
background-color: rgba(7, 193, 96, 0.1);
}
&.pending {
color: #f0ad4e;
background-color: rgba(240, 173, 78, 0.1);
}
}
}
}
}
}
.rules-popup {
width: 580rpx;
overflow: hidden;
.rules-header {
border-color: rgba(0, 0, 0, 0.05);
position: relative;
&::after {
content: '';
position: absolute;
left: 30rpx;
right: 30rpx;
bottom: 0;
height: 1px;
background: rgba(0, 0, 0, 0.05);
transform: scaleY(0.5);
}
.ri-close-line {
padding: 10rpx;
}
}
.rules-content {
padding:40rpx 30rpx 50rpx;
.rule-item {
display: flex;
align-items: flex-start;
margin-bottom: 20rpx;
.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;
}
&:last-child {
margin-bottom: 0;
}
}
}
}
</style>