daShangDao_scanBook/pages/vip/vip.vue
2026-06-03 13:57:58 +08:00

710 lines
15 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="page-container">
<!-- 页面标题 -->
<view class="header-section">
<view class="header-card">
<text class="header-icon">👑</text>
<text class="header-title">选择适合您的会员等级</text>
<text class="header-desc">享受到更多专属权益</text>
</view>
</view>
<!-- 已开通会员 -->
<view class="active-vip-section" v-if="hasActiveVip">
<view class="section-header-row">
<text class="section-icon-small"></text>
<text class="section-title">已开通会员</text>
</view>
<!-- 手机版上书会员 -->
<view class="active-card mobile-active" v-if="activeMobileVip">
<view class="active-header">
<view class="active-name-row">
<text class="active-icon">📱</text>
<text class="active-name">手机版上书会员</text>
</view>
<text class="active-badge">已开通</text>
</view>
<view class="active-info">
<view class="info-row">
<text class="info-label">已上书本数</text>
<text class="info-value">{{ activeMobileVip.uploadCount }}</text>
</view>
<view class="info-row">
<text class="info-label">到期时间</text>
<text class="info-value">{{ activeMobileVip.expireDate }}</text>
</view>
<view class="info-row highlight">
<text class="info-label">剩余天数</text>
<text class="info-value days">{{ activeMobileVip.remainingDays }}</text>
</view>
</view>
</view>
<!-- 孔网翻新会员 -->
<view class="active-card refresh-active" v-if="activeRefreshVip">
<view class="active-header">
<view class="active-name-row">
<text class="active-icon">🔄</text>
<text class="active-name">孔网翻新会员</text>
</view>
<text class="active-badge">已开通</text>
</view>
<view class="active-info">
<view class="info-row">
<text class="info-label">到期时间</text>
<text class="info-value">{{ activeRefreshVip.expireDate }}</text>
</view>
<view class="info-row highlight">
<text class="info-label">剩余天数</text>
<text class="info-value days">{{ activeRefreshVip.remainingDays }}</text>
</view>
</view>
</view>
</view>
<!-- 会员选择 -->
<view class="vip-options">
<view class="section-header-row">
<text class="section-icon-small">💎</text>
<text class="section-title">选择会员</text>
</view>
<!-- 手机版上书会员 -->
<view class="vip-section">
<view class="section-header">
<text class="section-icon">📱</text>
<view class="section-name-box">
<text class="section-name">手机版上书会员</text>
<text class="section-desc">适合经常上架书籍的用户</text>
</view>
</view>
<view class="vip-cards">
<!-- 月付会员 -->
<view
class="vip-card"
:class="{ selected: selectedVip === 'mobile-month' }"
@click="selectVip('mobile-month')"
>
<view class="card-header">
<view class="card-title-box">
<text class="card-title">月付会员</text>
<text class="card-period">/</text>
</view>
<view class="price-box">
<text class="price-symbol">¥</text>
<text class="card-price">29.9</text>
</view>
</view>
<view class="card-features">
<view class="feature-item">
<text class="feature-dot"></text>
<text class="feature-text">每月上传书籍数量增加</text>
</view>
<view class="feature-item">
<text class="feature-dot"></text>
<text class="feature-text">优先展示您的商品</text>
</view>
<view class="feature-item">
<text class="feature-dot"></text>
<text class="feature-text">专属客服服务</text>
</view>
<view class="feature-item">
<text class="feature-dot"></text>
<text class="feature-text">月度VIP标识</text>
</view>
</view>
<view class="select-indicator" v-if="selectedVip === 'mobile-month'">
<text class="indicator-icon">✓</text>
</view>
</view>
<!-- 年度会员 -->
<view
class="vip-card recommended"
:class="{ selected: selectedVip === 'mobile-year' }"
@click="selectVip('mobile-year')"
>
<view class="card-header">
<view class="card-title-box">
<text class="card-title">年度会员</text>
<text class="recommend-badge-inline">
<text class="badge-icon">🔥</text>
<text class="badge-text">推荐</text>
</text>
<text class="card-period">/年</text>
</view>
<view class="price-box">
<text class="price-symbol">¥</text>
<text class="card-price">299</text>
</view>
</view>
<view class="save-badge">省¥59.8</view>
<view class="card-features">
<view class="feature-item">
<text class="feature-dot">✓</text>
<text class="feature-text highlight">无限制上传书籍数量</text>
</view>
<view class="feature-item">
<text class="feature-dot">✓</text>
<text class="feature-text">优先展示您的商品</text>
</view>
<view class="feature-item">
<text class="feature-dot">✓</text>
<text class="feature-text">24小时专属客服服务</text>
</view>
<view class="feature-item">
<text class="feature-dot">✓</text>
<text class="feature-text">年度专属VIP标识</text>
</view>
<view class="feature-item">
<text class="feature-dot">✓</text>
<text class="feature-text">更多增值服务特权</text>
</view>
</view>
<view class="select-indicator" v-if="selectedVip === 'mobile-year'">
<text class="indicator-icon">✓</text>
</view>
</view>
</view>
</view>
<!-- 孔网翻新会员 -->
<view class="vip-section">
<view class="section-header">
<text class="section-icon">🔄</text>
<view class="section-name-box">
<text class="section-name">孔网翻新会员</text>
<text class="section-desc">适合批量处理商品的用户</text>
</view>
</view>
<view class="vip-cards">
<view
class="vip-card"
:class="{ selected: selectedVip === 'refresh-month' }"
@click="selectVip('refresh-month')"
>
<view class="card-header">
<view class="card-title-box">
<text class="card-title">翻新会员</text>
<text class="card-period">/月</text>
</view>
<view class="price-box">
<text class="price-symbol">¥</text>
<text class="card-price">49.9</text>
</view>
</view>
<view class="card-features">
<view class="feature-item">
<text class="feature-dot">✓</text>
<text class="feature-text highlight">无限制使用翻新功能</text>
</view>
<view class="feature-item">
<text class="feature-dot">✓</text>
<text class="feature-text">批量处理商品信息</text>
</view>
<view class="feature-item">
<text class="feature-dot">✓</text>
<text class="feature-text">优先获得新功能体验</text>
</view>
</view>
<view class="select-indicator" v-if="selectedVip === 'refresh-month'">
<text class="indicator-icon">✓</text>
</view>
</view>
</view>
</view>
</view>
<!-- 底部支付按钮 -->
<view class="pay-section">
<view class="pay-btn" :class="{ disabled: !selectedVip }" @click="handlePay">
<text class="pay-text">{{ selectedVip ? '立即支付' : '请选择会员类型' }}</text>
<text class="pay-price" v-if="selectedVip">{{ getSelectedPrice }}</text>
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
selectedVip: '',
// 模拟已开通会员数据
hasActiveVip: true,
activeMobileVip: {
uploadCount: 128,
expireDate: '2024-12-31',
remainingDays: 180
},
activeRefreshVip: {
expireDate: '2024-08-15',
remainingDays: 45
}
}
},
computed: {
getSelectedPrice() {
const prices = {
'mobile-month': '¥29.9',
'mobile-year': '¥299',
'refresh-month': '¥49.9'
}
return prices[this.selectedVip] || ''
},
getSelectedVipInfo() {
const vipInfo = {
'mobile-month': { name: '手机版上书会员 - 月付会员', price: '¥29.9' },
'mobile-year': { name: '手机版上书会员 - 年度会员', price: '¥299' },
'refresh-month': { name: '孔网翻新会员 - 月付会员', price: '¥49.9' }
}
return vipInfo[this.selectedVip] || { name: '', price: '' }
}
},
onLoad() {
uni.setNavigationBarTitle({
title: '会员等级选择'
})
},
methods: {
selectVip(type) {
this.selectedVip = type
},
handlePay() {
if (!this.selectedVip) {
uni.showToast({
title: '请选择会员类型',
icon: 'none'
})
return
}
const vipInfo = this.getSelectedVipInfo
uni.showModal({
title: '确认支付',
content: `会员类型:${vipInfo.name}\n支付金额${vipInfo.price}`,
confirmText: '确认支付',
cancelText: '取消',
success: (res) => {
if (res.confirm) {
uni.showToast({
title: '支付成功',
icon: 'success'
})
}
}
})
}
}
}
</script>
<style>
.page-container {
min-height: 100vh;
background: #f5f6fa;
padding: 24rpx 28rpx 160rpx;
box-sizing: border-box;
}
/* 页面标题 */
.header-section {
margin-bottom: 28rpx;
}
.header-card {
background: #ffffff;
border-radius: 20rpx;
padding: 36rpx 28rpx;
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.06);
text-align: center;
position: relative;
overflow: hidden;
}
.header-icon {
font-size: 48rpx;
display: block;
margin-bottom: 12rpx;
}
.header-title {
font-size: 34rpx;
color: #1d2129;
font-weight: 600;
display: block;
margin-bottom: 8rpx;
}
.header-desc {
font-size: 24rpx;
color: #909399;
}
/* 区块标题 */
.section-header-row {
display: flex;
align-items: center;
margin-bottom: 16rpx;
padding: 0 4rpx;
}
.section-icon-small {
font-size: 28rpx;
margin-right: 8rpx;
}
.section-title {
font-size: 30rpx;
color: #303133;
font-weight: 600;
}
/* 已开通会员 */
.active-vip-section {
margin-bottom: 32rpx;
}
.active-card {
background: #ffffff;
border-radius: 16rpx;
padding: 24rpx;
margin-bottom: 16rpx;
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.06);
border-left: 6rpx solid #409eff;
position: relative;
}
.active-card.refresh-active {
border-left-color: #67c23a;
}
.active-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 16rpx;
}
.active-name-row {
display: flex;
align-items: center;
}
.active-icon {
font-size: 32rpx;
margin-right: 12rpx;
}
.active-name {
font-size: 30rpx;
color: #303133;
font-weight: 600;
}
.active-badge {
background: #67c23a;
color: #ffffff;
font-size: 22rpx;
padding: 6rpx 16rpx;
border-radius: 20rpx;
font-weight: 500;
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.06);
}
.active-info {
display: flex;
flex-direction: column;
gap: 12rpx;
}
.info-row {
display: flex;
align-items: center;
justify-content: space-between;
}
.info-label {
font-size: 26rpx;
color: #909399;
}
.info-value {
font-size: 26rpx;
color: #606266;
font-weight: 500;
}
.info-value.days {
color: #e6a23c;
font-weight: 600;
}
.info-row.highlight .info-label {
color: #e6a23c;
}
/* 会员选择 */
.vip-options {
display: flex;
flex-direction: column;
gap: 24rpx;
}
.vip-section {
background: #ffffff;
border-radius: 20rpx;
padding: 24rpx;
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.06);
}
.section-header {
display: flex;
align-items: flex-start;
margin-bottom: 20rpx;
padding-bottom: 16rpx;
border-bottom: 2rpx solid #f0f2f5;
}
.section-icon {
font-size: 40rpx;
margin-right: 16rpx;
background: #f0f5ff;
width: 72rpx;
height: 72rpx;
border-radius: 16rpx;
display: flex;
align-items: center;
justify-content: center;
}
.section-name-box {
flex: 1;
display: flex;
flex-direction: column;
}
.section-name {
font-size: 32rpx;
color: #303133;
font-weight: 600;
margin-bottom: 4rpx;
}
.section-desc {
font-size: 24rpx;
color: #909399;
}
.vip-cards {
display: flex;
flex-direction: column;
gap: 16rpx;
}
.vip-card {
background: #ffffff;
border-radius: 16rpx;
padding: 24rpx;
border: 3rpx solid #ebeef5;
transition: all 0.25s ease;
position: relative;
}
.vip-card:active {
transform: scale(0.98);
}
.vip-card.selected {
border-color: #409eff;
background: #ffffff;
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.06);
}
.vip-card.recommended {
background: #ffffff;
border-color: #ebeef5;
}
.vip-card.recommended.selected {
border-color: #409eff;
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.06);
}
.recommend-badge-inline {
background: #e6a23c;
color: #ffffff;
font-size: 18rpx;
padding: 4rpx 10rpx;
border-radius: 12rpx;
font-weight: 500;
margin-left: 8rpx;
margin-right: 4rpx;
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.06);
}
.badge-icon {
font-size: 18rpx;
}
.card-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 16rpx;
}
.card-title-box {
display: flex;
align-items: baseline;
}
.card-title {
font-size: 30rpx;
color: #303133;
font-weight: 600;
}
.card-period {
font-size: 24rpx;
color: #909399;
margin-left: 4rpx;
}
.price-box {
display: flex;
align-items: baseline;
}
.price-symbol {
font-size: 24rpx;
color: #f56c6c;
font-weight: 600;
}
.card-price {
font-size: 44rpx;
color: #f56c6c;
font-weight: 700;
}
.save-badge {
display: inline-block;
background: #f56c6c;
color: #ffffff;
font-size: 20rpx;
padding: 4rpx 12rpx;
border-radius: 8rpx;
margin-bottom: 12rpx;
font-weight: 500;
}
.card-features {
display: flex;
flex-direction: column;
gap: 10rpx;
}
.feature-item {
display: flex;
align-items: center;
gap: 10rpx;
}
.feature-dot {
font-size: 22rpx;
color: #67c23a;
font-weight: 600;
}
.feature-text {
font-size: 26rpx;
color: #606266;
}
.feature-text.highlight {
color: #409eff;
font-weight: 500;
}
.select-indicator {
position: absolute;
bottom: 16rpx;
right: 16rpx;
width: 40rpx;
height: 40rpx;
background: #409eff;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.06);
}
.vip-card.recommended .select-indicator {
background: #409eff;
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.06);
}
.indicator-icon {
font-size: 24rpx;
color: #ffffff;
font-weight: 700;
}
/* 底部支付 */
.pay-section {
position: fixed;
bottom: 0;
left: 0;
right: 0;
background: #ffffff;
padding: 24rpx 28rpx;
padding-bottom: calc(24rpx + env(safe-area-inset-bottom));
box-shadow: 0 -2rpx 8rpx rgba(0, 0, 0, 0.06);
}
.pay-btn {
background: #409eff;
border-radius: 16rpx;
padding: 28rpx 0;
display: flex;
align-items: center;
justify-content: center;
gap: 12rpx;
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.06);
transition: all 0.2s ease;
}
.pay-btn.disabled {
background: #c0c4cc;
box-shadow: none;
}
.pay-btn:active:not(.disabled) {
transform: scale(0.98);
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.06);
}
.pay-text {
font-size: 32rpx;
color: #ffffff;
font-weight: 600;
}
.pay-price {
font-size: 28rpx;
color: rgba(255, 255, 255, 0.95);
background: rgba(255, 255, 255, 0.2);
padding: 4rpx 16rpx;
border-radius: 20rpx;
}
</style>