3 changed files with 961 additions and 52 deletions
@ -0,0 +1,810 @@ |
|||||
|
<template> |
||||
|
<view class="invite-page"> |
||||
|
<view class="ambient ambient-one"></view> |
||||
|
<view class="ambient ambient-two"></view> |
||||
|
<view class="ambient ambient-three"></view> |
||||
|
|
||||
|
<view class="back-btn glass-card" @tap="goBack"> |
||||
|
<text class="back-arrow">‹</text> |
||||
|
<text>返回</text> |
||||
|
</view> |
||||
|
|
||||
|
<view class="invite-hero glass-card"> |
||||
|
<view class="hero-copy"> |
||||
|
<view class="invite-badge">半径里邀友计划</view> |
||||
|
<view class="invite-title">叫上好友一起来省钱</view> |
||||
|
<view class="invite-subtitle">{{activityDesc}}</view> |
||||
|
<view class="reward-panel" :class="{'reward-panel-empty': !hasRewardActivity}"> |
||||
|
<view class="reward-label">{{hasRewardActivity ? '当前区域奖励' : '当前区域'}}</view> |
||||
|
<view class="reward-amount" v-if="hasRewardActivity">¥{{formatAmount(rewardAmount)}}</view> |
||||
|
<view class="reward-empty-text" v-else>暂无拉新奖励活动</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
<view class="hero-ip"> |
||||
|
<view class="ip-halo"></view> |
||||
|
<image class="squirrel" src="https://jewel-shop.oss-cn-beijing.aliyuncs.com/f7227759d693497a8beab87ff437a875.png" mode="aspectFit"></image> |
||||
|
<view class="sticker sticker-a">好友 +1</view> |
||||
|
<view class="sticker sticker-b">现金奖励</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<view class="rule-card glass-card"> |
||||
|
<view class="section-title">奖励规则</view> |
||||
|
<view class="rule-grid"> |
||||
|
<view class="rule-item"> |
||||
|
<text class="rule-dot">1</text> |
||||
|
<text>新用户首次注册并绑定手机号才可计奖</text> |
||||
|
</view> |
||||
|
<view class="rule-item"> |
||||
|
<text class="rule-dot">2</text> |
||||
|
<text>同一手机号、同一设备只奖励一次</text> |
||||
|
</view> |
||||
|
<view class="rule-item"> |
||||
|
<text class="rule-dot">3</text> |
||||
|
<text>好友需在分享时所在区域范围内登录</text> |
||||
|
</view> |
||||
|
<view class="rule-item"> |
||||
|
<text class="rule-dot">4</text> |
||||
|
<text>奖励通过微信商家转账发放到微信零钱</text> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<view v-if="hasRewardActivity" class="auth-card glass-card"> |
||||
|
<view> |
||||
|
<view class="section-title">微信收款授权</view> |
||||
|
<view class="auth-desc">{{transferAuthDesc}}</view> |
||||
|
</view> |
||||
|
<view class="auth-action" :class="{'auth-action-done': isTransferAuthorized}" @tap="openTransferAuth"> |
||||
|
{{isTransferAuthorized ? '已开通' : '开通免确认收款'}} |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<button class="share-btn" :class="{'share-btn-disabled': !hasRewardActivity}" :disabled="!hasRewardActivity" open-type="share"> |
||||
|
{{hasRewardActivity ? '立即邀请好友' : '暂无活动'}} |
||||
|
</button> |
||||
|
|
||||
|
<view class="record-card glass-card"> |
||||
|
<view class="record-head"> |
||||
|
<view> |
||||
|
<view class="section-title">我的拉新记录</view> |
||||
|
<view class="record-subtitle">只展示已进入奖励处理流程的记录</view> |
||||
|
</view> |
||||
|
<view class="record-refresh" @tap="refreshRecords">刷新</view> |
||||
|
</view> |
||||
|
<view v-if="records.length === 0 && !recordLoading" class="record-empty"> |
||||
|
暂无拉新奖励记录 |
||||
|
</view> |
||||
|
<view v-for="item in records" :key="item.id" class="record-item"> |
||||
|
<view class="record-row"> |
||||
|
<text class="record-phone">{{maskMobile(item.invitedMobile)}}</text> |
||||
|
<text class="record-status" :class="'record-status-' + Number(item.status)">{{statusText(item.status)}}</text> |
||||
|
</view> |
||||
|
<view class="record-row record-row-sub"> |
||||
|
<text>奖励金额 ¥{{formatAmount(item.amount)}}</text> |
||||
|
<text>{{item.createTime || ''}}</text> |
||||
|
</view> |
||||
|
<view v-if="item.failReason" class="record-reason">{{item.failReason}}</view> |
||||
|
<view v-if="canConfirmTransfer(item)" class="confirm-transfer-btn" @tap="confirmTransfer(item)"> |
||||
|
确认收款 |
||||
|
</view> |
||||
|
</view> |
||||
|
<view v-if="records.length > 0" class="record-more" @tap="loadMoreRecords"> |
||||
|
{{recordLoading ? '加载中...' : (recordFinished ? '没有更多了' : '加载更多')}} |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
import { buildInviteHomeSharePath } from '@/utils/sharePath.js' |
||||
|
import { requireLoginToCurrentPage } from '@/utils/authRedirect.js' |
||||
|
|
||||
|
export default { |
||||
|
data() { |
||||
|
return { |
||||
|
records: [], |
||||
|
recordPageNumber: 1, |
||||
|
recordPageSize: 10, |
||||
|
recordTotal: 0, |
||||
|
recordLoading: false, |
||||
|
recordFinished: false, |
||||
|
rewardAmount: 0, |
||||
|
configLoaded: false, |
||||
|
transferAuth: { |
||||
|
state: '', |
||||
|
authNo: '', |
||||
|
authId: '', |
||||
|
mchId: '', |
||||
|
appId: '', |
||||
|
packageInfo: '' |
||||
|
}, |
||||
|
transferAuthLoading: false, |
||||
|
authStatusLoaded: false, |
||||
|
autoAuthTriggered: false |
||||
|
} |
||||
|
}, |
||||
|
computed: { |
||||
|
hasRewardActivity() { |
||||
|
return Number(this.rewardAmount || 0) > 0 |
||||
|
}, |
||||
|
isTransferAuthorized() { |
||||
|
return this.transferAuth && this.transferAuth.state === 'TAKING_EFFECT' |
||||
|
}, |
||||
|
transferAuthDesc() { |
||||
|
if (this.isTransferAuthorized) { |
||||
|
return '已授权微信收款,后续奖励将自动到账微信零钱。' |
||||
|
} |
||||
|
return '开通后无需每笔确认,好友完成注册奖励会自动发放到微信零钱。' |
||||
|
}, |
||||
|
activityDesc() { |
||||
|
return this.hasRewardActivity |
||||
|
? '好友在当前区域完成新用户注册并绑定手机号后,你将获得现金奖励。' |
||||
|
: '当前区域暂未开启拉新奖励,活动开启后这里会第一时间展示金额。' |
||||
|
} |
||||
|
}, |
||||
|
onLoad() { |
||||
|
if (!requireLoginToCurrentPage()) return |
||||
|
this.enableShareMenu() |
||||
|
this.loadInviteConfig() |
||||
|
this.loadTransferAuthStatus() |
||||
|
this.refreshRecords() |
||||
|
}, |
||||
|
onReachBottom() { |
||||
|
this.loadMoreRecords() |
||||
|
}, |
||||
|
onShareAppMessage() { |
||||
|
return { |
||||
|
title: '来半径里一起拼团,注册后我还能领现金奖励', |
||||
|
path: buildInviteHomeSharePath() |
||||
|
} |
||||
|
}, |
||||
|
methods: { |
||||
|
goBack() { |
||||
|
const pages = getCurrentPages ? getCurrentPages() : [] |
||||
|
if (pages && pages.length > 1) { |
||||
|
uni.navigateBack() |
||||
|
return |
||||
|
} |
||||
|
uni.switchTab({ |
||||
|
url: '/pages/index/index', |
||||
|
fail: () => { |
||||
|
uni.redirectTo({ |
||||
|
url: '/pages/index/index' |
||||
|
}) |
||||
|
} |
||||
|
}) |
||||
|
}, |
||||
|
enableShareMenu() { |
||||
|
if (!uni.showShareMenu) return |
||||
|
uni.showShareMenu({ |
||||
|
withShareTicket: true, |
||||
|
menus: ['shareAppMessage'] |
||||
|
}) |
||||
|
}, |
||||
|
readCurrentRegionId() { |
||||
|
try { |
||||
|
const area = uni.getStorageSync('area') |
||||
|
if (!area) return '' |
||||
|
const data = typeof area === 'string' ? JSON.parse(area) : area |
||||
|
return data && data.id ? String(data.id) : '' |
||||
|
} catch (e) { |
||||
|
return '' |
||||
|
} |
||||
|
}, |
||||
|
loadInviteConfig() { |
||||
|
const regionId = this.readCurrentRegionId() |
||||
|
if (!regionId) { |
||||
|
this.rewardAmount = 0 |
||||
|
this.configLoaded = true |
||||
|
this.tryAutoOpenTransferAuth() |
||||
|
return |
||||
|
} |
||||
|
this.tui.request('/app/inviteReward/config', 'GET', { |
||||
|
regionId |
||||
|
}, false, true, true).then((res) => { |
||||
|
this.configLoaded = true |
||||
|
const config = res && res.code == 200 ? (res.result || null) : null |
||||
|
this.rewardAmount = config && Number(config.rewardAmount || 0) > 0 ? Number(config.rewardAmount || 0) : 0 |
||||
|
this.tryAutoOpenTransferAuth() |
||||
|
}).catch(() => { |
||||
|
this.configLoaded = true |
||||
|
this.rewardAmount = 0 |
||||
|
this.tryAutoOpenTransferAuth() |
||||
|
}) |
||||
|
}, |
||||
|
loadTransferAuthStatus() { |
||||
|
this.tui.request('/app/inviteReward/transferAuth/status', 'GET', {}, false, true, true).then((res) => { |
||||
|
if (res && res.code == 200 && res.result) { |
||||
|
this.transferAuth = Object.assign({}, this.transferAuth, res.result) |
||||
|
} |
||||
|
this.authStatusLoaded = true |
||||
|
this.tryAutoOpenTransferAuth() |
||||
|
}).catch(() => { |
||||
|
this.authStatusLoaded = true |
||||
|
this.tryAutoOpenTransferAuth() |
||||
|
}) |
||||
|
}, |
||||
|
tryAutoOpenTransferAuth() { |
||||
|
if (!this.configLoaded || !this.authStatusLoaded || this.autoAuthTriggered) return |
||||
|
if (!this.hasRewardActivity || this.isTransferAuthorized) return |
||||
|
this.autoAuthTriggered = true |
||||
|
setTimeout(() => this.openTransferAuth(), 300) |
||||
|
}, |
||||
|
openTransferAuth() { |
||||
|
if (this.isTransferAuthorized || this.transferAuthLoading) return |
||||
|
this.transferAuthLoading = true |
||||
|
this.tui.request('/app/inviteReward/transferAuth/apply', 'POST', {}, false, true, true).then((res) => { |
||||
|
this.transferAuthLoading = false |
||||
|
if (!res || res.code != 200 || !res.result) { |
||||
|
this.tui.toast((res && res.message) || '收款授权申请失败') |
||||
|
return |
||||
|
} |
||||
|
this.transferAuth = Object.assign({}, this.transferAuth, res.result) |
||||
|
if (this.isTransferAuthorized) { |
||||
|
this.tui.toast('已开通自动收款') |
||||
|
return |
||||
|
} |
||||
|
this.requestMerchantTransferAuth(res.result) |
||||
|
}).catch(() => { |
||||
|
this.transferAuthLoading = false |
||||
|
this.tui.toast('收款授权申请失败') |
||||
|
}) |
||||
|
}, |
||||
|
requestMerchantTransferAuth(authInfo) { |
||||
|
const packageInfo = authInfo && authInfo.packageInfo |
||||
|
if (!packageInfo) { |
||||
|
this.tui.toast('缺少微信授权信息') |
||||
|
return |
||||
|
} |
||||
|
if (typeof wx === 'undefined' || !wx.requestMerchantTransfer) { |
||||
|
this.tui.toast('当前微信版本暂不支持收款授权') |
||||
|
return |
||||
|
} |
||||
|
wx.requestMerchantTransfer({ |
||||
|
mchId: authInfo.mchId, |
||||
|
appId: authInfo.appId, |
||||
|
'package': packageInfo, |
||||
|
success: () => { |
||||
|
this.tui.toast('授权完成,正在同步状态', 1600, true) |
||||
|
}, |
||||
|
fail: () => { |
||||
|
this.tui.toast('未完成收款授权') |
||||
|
}, |
||||
|
complete: () => { |
||||
|
setTimeout(() => this.refreshTransferAuth(2), 1500) |
||||
|
} |
||||
|
}) |
||||
|
}, |
||||
|
refreshTransferAuth(retryLeft = 0) { |
||||
|
this.tui.request('/app/inviteReward/transferAuth/query', 'POST', {}, false, true, true).then((res) => { |
||||
|
if (res && res.code == 200 && res.result) { |
||||
|
this.transferAuth = Object.assign({}, this.transferAuth, res.result) |
||||
|
if (this.isTransferAuthorized) { |
||||
|
this.tui.toast('已开通自动收款') |
||||
|
} else if (retryLeft > 0) { |
||||
|
setTimeout(() => this.refreshTransferAuth(retryLeft - 1), 1500) |
||||
|
} |
||||
|
} |
||||
|
}) |
||||
|
}, |
||||
|
refreshRecords() { |
||||
|
this.recordPageNumber = 1 |
||||
|
this.recordFinished = false |
||||
|
this.loadRecords(true) |
||||
|
}, |
||||
|
loadMoreRecords() { |
||||
|
if (this.recordLoading || this.recordFinished) return |
||||
|
this.recordPageNumber += 1 |
||||
|
this.loadRecords(false) |
||||
|
}, |
||||
|
loadRecords(reset) { |
||||
|
this.recordLoading = true |
||||
|
this.tui.request('/app/inviteReward/my/page', 'GET', { |
||||
|
pageNumber: this.recordPageNumber, |
||||
|
pageSize: this.recordPageSize |
||||
|
}, false, true, true).then((res) => { |
||||
|
this.recordLoading = false |
||||
|
if (res.code != 200 || !res.result) { |
||||
|
if (!reset) this.recordPageNumber -= 1 |
||||
|
this.tui.toast(res.message || '拉新记录加载失败') |
||||
|
return |
||||
|
} |
||||
|
const page = res.result || {} |
||||
|
const nextRecords = page.records || [] |
||||
|
this.recordTotal = Number(page.total || 0) |
||||
|
this.records = reset ? nextRecords : this.records.concat(nextRecords) |
||||
|
this.recordFinished = this.records.length >= this.recordTotal || nextRecords.length < this.recordPageSize |
||||
|
}).catch(() => { |
||||
|
this.recordLoading = false |
||||
|
if (!reset) this.recordPageNumber -= 1 |
||||
|
this.tui.toast('拉新记录加载失败') |
||||
|
}) |
||||
|
}, |
||||
|
statusText(status) { |
||||
|
const map = { |
||||
|
0: '处理中', |
||||
|
1: '已发放', |
||||
|
2: '发放失败', |
||||
|
3: '已跳过' |
||||
|
} |
||||
|
return map[Number(status)] || '未知' |
||||
|
}, |
||||
|
formatAmount(value) { |
||||
|
const num = Number(value || 0) |
||||
|
return num.toFixed(2) |
||||
|
}, |
||||
|
maskMobile(mobile) { |
||||
|
const value = String(mobile || '') |
||||
|
if (value.length < 7) return value || '新用户' |
||||
|
return value.slice(0, 3) + '****' + value.slice(-4) |
||||
|
}, |
||||
|
parseWxResponse(item) { |
||||
|
try { |
||||
|
return item && item.wxResponse ? JSON.parse(item.wxResponse) : {} |
||||
|
} catch (e) { |
||||
|
return {} |
||||
|
} |
||||
|
}, |
||||
|
transferPackageInfo(item) { |
||||
|
const wxResponse = this.parseWxResponse(item) |
||||
|
return wxResponse.package_info || '' |
||||
|
}, |
||||
|
canConfirmTransfer(item) { |
||||
|
return Number(item && item.status) === 0 && !!this.transferPackageInfo(item) |
||||
|
}, |
||||
|
confirmTransfer(item) { |
||||
|
const packageInfo = this.transferPackageInfo(item) |
||||
|
if (!packageInfo) { |
||||
|
this.tui.toast('缺少收款确认信息,请刷新后再试') |
||||
|
return |
||||
|
} |
||||
|
if (typeof wx === 'undefined' || !wx.openBusinessView) { |
||||
|
this.tui.toast('当前微信版本暂不支持确认收款') |
||||
|
return |
||||
|
} |
||||
|
wx.openBusinessView({ |
||||
|
businessType: 'weappBusinessTransfer', |
||||
|
extraData: { |
||||
|
mchId: WECHAT_TRANSFER_MCH_ID, |
||||
|
appId: WECHAT_TRANSFER_APP_ID, |
||||
|
package: packageInfo |
||||
|
}, |
||||
|
success: () => { |
||||
|
this.tui.toast('请按微信页面提示确认收款', 1600, true) |
||||
|
setTimeout(() => this.refreshRecords(), 1200) |
||||
|
}, |
||||
|
fail: () => { |
||||
|
this.tui.toast('未完成收款确认') |
||||
|
} |
||||
|
}) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
</script> |
||||
|
|
||||
|
<style lang="scss" scoped> |
||||
|
.invite-page { |
||||
|
position: relative; |
||||
|
min-height: 100vh; |
||||
|
overflow: hidden; |
||||
|
padding: 132rpx 34rpx 56rpx; |
||||
|
box-sizing: border-box; |
||||
|
background: |
||||
|
radial-gradient(circle at 12% 8%, rgba(255, 255, 255, 0.96) 0, rgba(255, 255, 255, 0) 260rpx), |
||||
|
radial-gradient(circle at 84% 0, rgba(199, 248, 219, 0.72) 0, rgba(199, 248, 219, 0) 300rpx), |
||||
|
linear-gradient(160deg, #f8f5e8 0%, #eefbe8 42%, #e7f8ef 72%, #fbf7ed 100%); |
||||
|
color: #123b31; |
||||
|
} |
||||
|
|
||||
|
.ambient { |
||||
|
position: absolute; |
||||
|
border-radius: 999rpx; |
||||
|
pointer-events: none; |
||||
|
} |
||||
|
|
||||
|
.ambient-one { |
||||
|
top: 88rpx; |
||||
|
left: -94rpx; |
||||
|
width: 270rpx; |
||||
|
height: 270rpx; |
||||
|
background: rgba(255, 255, 255, 0.58); |
||||
|
box-shadow: 0 0 90rpx rgba(255, 255, 255, 0.78); |
||||
|
} |
||||
|
|
||||
|
.ambient-two { |
||||
|
top: 268rpx; |
||||
|
right: -84rpx; |
||||
|
width: 230rpx; |
||||
|
height: 230rpx; |
||||
|
background: rgba(166, 255, 234, 0.42); |
||||
|
box-shadow: 0 0 88rpx rgba(42, 191, 139, 0.14); |
||||
|
} |
||||
|
|
||||
|
.ambient-three { |
||||
|
left: 84rpx; |
||||
|
bottom: 190rpx; |
||||
|
width: 150rpx; |
||||
|
height: 150rpx; |
||||
|
background: rgba(255, 240, 199, 0.48); |
||||
|
box-shadow: 0 0 76rpx rgba(255, 213, 127, 0.24); |
||||
|
} |
||||
|
|
||||
|
.glass-card { |
||||
|
position: relative; |
||||
|
z-index: 1; |
||||
|
box-sizing: border-box; |
||||
|
border: 1rpx solid rgba(255, 255, 255, 0.72); |
||||
|
background: rgba(255, 255, 255, 0.58); |
||||
|
box-shadow: |
||||
|
0 24rpx 64rpx rgba(62, 116, 91, 0.14), |
||||
|
inset 0 1rpx 0 rgba(255, 255, 255, 0.76); |
||||
|
backdrop-filter: blur(24rpx); |
||||
|
} |
||||
|
|
||||
|
.back-btn { |
||||
|
position: absolute; |
||||
|
top: 62rpx; |
||||
|
left: 34rpx; |
||||
|
z-index: 5; |
||||
|
display: inline-flex; |
||||
|
align-items: center; |
||||
|
gap: 4rpx; |
||||
|
height: 56rpx; |
||||
|
padding: 0 20rpx 0 14rpx; |
||||
|
border-radius: 999rpx; |
||||
|
color: #123b31; |
||||
|
font-size: 24rpx; |
||||
|
font-weight: 800; |
||||
|
} |
||||
|
|
||||
|
.back-arrow { |
||||
|
font-size: 40rpx; |
||||
|
line-height: 1; |
||||
|
transform: translateY(-2rpx); |
||||
|
} |
||||
|
|
||||
|
.invite-hero { |
||||
|
display: flex; |
||||
|
min-height: 392rpx; |
||||
|
padding: 34rpx 30rpx 28rpx; |
||||
|
overflow: hidden; |
||||
|
border-radius: 46rpx; |
||||
|
} |
||||
|
|
||||
|
.hero-copy { |
||||
|
position: relative; |
||||
|
z-index: 2; |
||||
|
flex: 1; |
||||
|
min-width: 0; |
||||
|
} |
||||
|
|
||||
|
.invite-badge { |
||||
|
display: inline-flex; |
||||
|
align-items: center; |
||||
|
height: 46rpx; |
||||
|
padding: 0 18rpx; |
||||
|
border-radius: 999rpx; |
||||
|
background: rgba(18, 59, 49, 0.92); |
||||
|
color: #fff5cf; |
||||
|
font-size: 22rpx; |
||||
|
font-weight: 800; |
||||
|
} |
||||
|
|
||||
|
.invite-title { |
||||
|
width: 420rpx; |
||||
|
margin-top: 28rpx; |
||||
|
color: #17372d; |
||||
|
font-size: 43rpx; |
||||
|
font-weight: 900; |
||||
|
line-height: 1.22; |
||||
|
} |
||||
|
|
||||
|
.invite-subtitle { |
||||
|
width: 410rpx; |
||||
|
margin-top: 18rpx; |
||||
|
color: rgba(43, 83, 70, 0.66); |
||||
|
font-size: 25rpx; |
||||
|
line-height: 1.58; |
||||
|
} |
||||
|
|
||||
|
.reward-panel { |
||||
|
display: inline-flex; |
||||
|
align-items: center; |
||||
|
gap: 18rpx; |
||||
|
margin-top: 26rpx; |
||||
|
padding: 14rpx 18rpx; |
||||
|
border-radius: 999rpx; |
||||
|
background: linear-gradient(90deg, rgba(227, 255, 150, 0.95), rgba(166, 255, 234, 0.95)); |
||||
|
box-shadow: 0 16rpx 36rpx rgba(42, 191, 139, 0.18); |
||||
|
} |
||||
|
|
||||
|
.reward-panel-empty { |
||||
|
background: rgba(255, 255, 255, 0.66); |
||||
|
box-shadow: none; |
||||
|
} |
||||
|
|
||||
|
.reward-label { |
||||
|
color: rgba(7, 61, 51, 0.7); |
||||
|
font-size: 22rpx; |
||||
|
font-weight: 700; |
||||
|
} |
||||
|
|
||||
|
.reward-amount { |
||||
|
color: #073d33; |
||||
|
font-size: 36rpx; |
||||
|
font-weight: 950; |
||||
|
line-height: 1; |
||||
|
} |
||||
|
|
||||
|
.reward-empty-text { |
||||
|
color: rgba(43, 83, 70, 0.62); |
||||
|
font-size: 24rpx; |
||||
|
font-weight: 800; |
||||
|
} |
||||
|
|
||||
|
.hero-ip { |
||||
|
position: absolute; |
||||
|
right: -18rpx; |
||||
|
bottom: 8rpx; |
||||
|
width: 260rpx; |
||||
|
height: 300rpx; |
||||
|
} |
||||
|
|
||||
|
.ip-halo { |
||||
|
position: absolute; |
||||
|
left: 22rpx; |
||||
|
bottom: 42rpx; |
||||
|
width: 220rpx; |
||||
|
height: 150rpx; |
||||
|
border-radius: 50%; |
||||
|
background: radial-gradient(circle, rgba(255, 255, 255, 0.82), rgba(245, 225, 177, 0.18) 64%, rgba(255, 255, 255, 0)); |
||||
|
} |
||||
|
|
||||
|
.squirrel { |
||||
|
position: absolute; |
||||
|
right: 22rpx; |
||||
|
bottom: 28rpx; |
||||
|
width: 150rpx; |
||||
|
height: 150rpx; |
||||
|
filter: drop-shadow(0 28rpx 28rpx rgba(80, 103, 79, 0.16)); |
||||
|
} |
||||
|
|
||||
|
.sticker { |
||||
|
position: absolute; |
||||
|
z-index: 2; |
||||
|
padding: 10rpx 16rpx; |
||||
|
border: 1rpx solid rgba(255, 255, 255, 0.76); |
||||
|
border-radius: 999rpx; |
||||
|
background: rgba(255, 255, 255, 0.62); |
||||
|
box-shadow: 0 14rpx 38rpx rgba(93, 132, 101, 0.12); |
||||
|
color: rgba(26, 69, 55, 0.72); |
||||
|
font-size: 21rpx; |
||||
|
font-weight: 800; |
||||
|
} |
||||
|
|
||||
|
.sticker-a { |
||||
|
right: 150rpx; |
||||
|
top: 58rpx; |
||||
|
transform: rotate(-7deg); |
||||
|
} |
||||
|
|
||||
|
.sticker-b { |
||||
|
right: 18rpx; |
||||
|
top: 26rpx; |
||||
|
color: #8a6834; |
||||
|
transform: rotate(5deg); |
||||
|
} |
||||
|
|
||||
|
.rule-card { |
||||
|
margin-top: 28rpx; |
||||
|
padding: 30rpx; |
||||
|
border-radius: 38rpx; |
||||
|
} |
||||
|
|
||||
|
.section-title { |
||||
|
color: #17372d; |
||||
|
font-size: 32rpx; |
||||
|
font-weight: 900; |
||||
|
} |
||||
|
|
||||
|
.rule-grid { |
||||
|
margin-top: 22rpx; |
||||
|
} |
||||
|
|
||||
|
.rule-item { |
||||
|
display: flex; |
||||
|
align-items: flex-start; |
||||
|
gap: 16rpx; |
||||
|
margin-top: 18rpx; |
||||
|
color: rgba(18, 59, 49, 0.76); |
||||
|
font-size: 25rpx; |
||||
|
line-height: 1.55; |
||||
|
} |
||||
|
|
||||
|
.rule-dot { |
||||
|
display: inline-flex; |
||||
|
align-items: center; |
||||
|
justify-content: center; |
||||
|
flex-shrink: 0; |
||||
|
width: 34rpx; |
||||
|
height: 34rpx; |
||||
|
margin-top: 2rpx; |
||||
|
border-radius: 14rpx; |
||||
|
background: rgba(42, 191, 139, 0.14); |
||||
|
color: #15956a; |
||||
|
font-size: 21rpx; |
||||
|
font-weight: 900; |
||||
|
} |
||||
|
|
||||
|
.auth-card { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
justify-content: space-between; |
||||
|
gap: 22rpx; |
||||
|
margin-top: 28rpx; |
||||
|
padding: 30rpx; |
||||
|
border-radius: 38rpx; |
||||
|
} |
||||
|
|
||||
|
.auth-desc { |
||||
|
margin-top: 12rpx; |
||||
|
color: rgba(18, 59, 49, 0.58); |
||||
|
font-size: 24rpx; |
||||
|
line-height: 1.5; |
||||
|
} |
||||
|
|
||||
|
.auth-action { |
||||
|
flex-shrink: 0; |
||||
|
padding: 16rpx 24rpx; |
||||
|
border-radius: 999rpx; |
||||
|
background: linear-gradient(90deg, #dcff8d, #8fffe7); |
||||
|
color: #0b5b47; |
||||
|
font-size: 24rpx; |
||||
|
font-weight: 900; |
||||
|
box-shadow: 0 12rpx 28rpx rgba(44, 175, 121, 0.18); |
||||
|
} |
||||
|
|
||||
|
.auth-action-done { |
||||
|
background: rgba(42, 191, 139, 0.12); |
||||
|
color: #198861; |
||||
|
box-shadow: none; |
||||
|
} |
||||
|
|
||||
|
.share-btn { |
||||
|
position: relative; |
||||
|
z-index: 1; |
||||
|
margin-top: 34rpx; |
||||
|
height: 96rpx; |
||||
|
line-height: 96rpx; |
||||
|
border-radius: 999rpx; |
||||
|
border: 0; |
||||
|
background: linear-gradient(90deg, #123b31, #2abf8b); |
||||
|
color: #ffffff; |
||||
|
font-size: 31rpx; |
||||
|
font-weight: 900; |
||||
|
box-shadow: 0 22rpx 42rpx rgba(42, 191, 139, 0.3); |
||||
|
} |
||||
|
|
||||
|
.share-btn::after { |
||||
|
border: 0; |
||||
|
} |
||||
|
|
||||
|
.share-btn-disabled { |
||||
|
background: rgba(255, 255, 255, 0.64); |
||||
|
color: rgba(43, 83, 70, 0.48); |
||||
|
box-shadow: none; |
||||
|
} |
||||
|
|
||||
|
.record-card { |
||||
|
margin-top: 34rpx; |
||||
|
padding: 32rpx; |
||||
|
border-radius: 38rpx; |
||||
|
} |
||||
|
|
||||
|
.record-head { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
justify-content: space-between; |
||||
|
margin-bottom: 20rpx; |
||||
|
} |
||||
|
|
||||
|
.record-subtitle { |
||||
|
margin-top: 8rpx; |
||||
|
color: rgba(18, 59, 49, 0.52); |
||||
|
font-size: 23rpx; |
||||
|
} |
||||
|
|
||||
|
.record-refresh { |
||||
|
padding: 10rpx 22rpx; |
||||
|
border-radius: 999rpx; |
||||
|
background: rgba(42, 191, 139, 0.12); |
||||
|
color: #198861; |
||||
|
font-size: 24rpx; |
||||
|
font-weight: 700; |
||||
|
} |
||||
|
|
||||
|
.record-empty { |
||||
|
padding: 54rpx 0; |
||||
|
color: rgba(18, 59, 49, 0.48); |
||||
|
font-size: 26rpx; |
||||
|
text-align: center; |
||||
|
} |
||||
|
|
||||
|
.record-item { |
||||
|
padding: 22rpx 0; |
||||
|
border-top: 1rpx solid rgba(18, 59, 49, 0.08); |
||||
|
} |
||||
|
|
||||
|
.record-row { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
justify-content: space-between; |
||||
|
gap: 18rpx; |
||||
|
} |
||||
|
|
||||
|
.record-row-sub { |
||||
|
margin-top: 12rpx; |
||||
|
color: rgba(18, 59, 49, 0.58); |
||||
|
font-size: 24rpx; |
||||
|
} |
||||
|
|
||||
|
.record-phone { |
||||
|
font-size: 29rpx; |
||||
|
font-weight: 800; |
||||
|
} |
||||
|
|
||||
|
.record-status { |
||||
|
padding: 6rpx 16rpx; |
||||
|
border-radius: 999rpx; |
||||
|
background: #edf3f1; |
||||
|
color: #50615c; |
||||
|
font-size: 22rpx; |
||||
|
font-weight: 700; |
||||
|
} |
||||
|
|
||||
|
.record-status-0 { |
||||
|
background: #eaf3ff; |
||||
|
color: #2f74c0; |
||||
|
} |
||||
|
|
||||
|
.record-status-1 { |
||||
|
background: #e9fbf2; |
||||
|
color: #1b9a66; |
||||
|
} |
||||
|
|
||||
|
.record-status-2 { |
||||
|
background: #fff0f0; |
||||
|
color: #d94f4f; |
||||
|
} |
||||
|
|
||||
|
.record-reason { |
||||
|
margin-top: 12rpx; |
||||
|
color: #d94f4f; |
||||
|
font-size: 23rpx; |
||||
|
line-height: 1.5; |
||||
|
} |
||||
|
|
||||
|
.confirm-transfer-btn { |
||||
|
display: inline-flex; |
||||
|
align-items: center; |
||||
|
justify-content: center; |
||||
|
height: 56rpx; |
||||
|
margin-top: 16rpx; |
||||
|
padding: 0 24rpx; |
||||
|
border-radius: 999rpx; |
||||
|
background: linear-gradient(90deg, #dcff8d, #8fffe7); |
||||
|
color: #0b5b47; |
||||
|
font-size: 24rpx; |
||||
|
font-weight: 900; |
||||
|
box-shadow: 0 12rpx 28rpx rgba(44, 175, 121, 0.18); |
||||
|
} |
||||
|
|
||||
|
.record-more { |
||||
|
padding-top: 24rpx; |
||||
|
border-top: 1rpx solid rgba(18, 59, 49, 0.08); |
||||
|
color: rgba(18, 59, 49, 0.58); |
||||
|
font-size: 25rpx; |
||||
|
text-align: center; |
||||
|
} |
||||
|
</style> |
||||
Loading…
Reference in new issue