| <template> | |
| 	<view class="container"> | |
| 		<view class="header"> | |
| 			<view class="header-bg"> | |
| 				<image src="/static/member-background.png" class="header-img" mode="scaleToFill" /> | |
| 				<!-- #ifndef H5 --> | |
| 				<text class="header-title">会员开通</text> | |
| 				<!-- 加一个推出箭头 --> | |
| 				<view class="header-icon" @click="goBack"> | |
| 					<uv-icon name="arrow-left" color="#000" size="20" /> | |
| 				</view> | |
| 				<!-- #endif --> | |
| 				<!-- 轮播容器 --> | |
| 				<view class="uv-demo-block swiper-container"> | |
| 					<uv-swiper bgColor="transparent" :list="list" :loading="!list.length" @change="changeSwiper" | |
| 						keyName="img" previousMargin="70" nextMargin="70" acceleration height="75" circular | |
| 						:autoplay="false" radius="5"> | |
| 					</uv-swiper> | |
| 					<button class="swiper-btn"> | |
| 						已选择 | |
| 					</button> | |
| 					<image class="swiper-arrow" src="/static/decorative-arrow.png" mode="aspectFill" /> | |
| 				</view> | |
| 			</view> | |
| 		</view> | |
| 
 | |
| 		<!-- 会员套餐选择容器 --> | |
| 		<view class="membership-container"> | |
| 			<!-- 套餐选择 --> | |
| 			<view class="package-list"> | |
| 				<view class="package-item" :class="{ 'active': selectedPackage === index }" | |
| 					v-for="(item, index) in packageList" :key="index" @click="selectPackage(index)"> | |
| 					<view class="info"> | |
| 						<!-- 赠送标识 --> | |
| 						<view class="gift-tag" v-if="item.content"> | |
| 							{{ item.content }} | |
| 						</view> | |
|  | |
| 						<view class="package-title">{{ item.title }}</view> | |
|  | |
| 						<view class="package-price">¥{{ getInt(item.discountedprice) }}.<text | |
| 								class="package-decimal">{{ getDecimal(item.discountedprice) }}</text></view> | |
| 						<view class="package-original">¥{{ item.originalprice }}</view> | |
| 					</view> | |
|  | |
| 					<view class="package-btn" :class="{ 'active': selectedPackage === index }"> | |
| 						{{ selectedPackage === index ? '已选择' : '点击选择' }} | |
| 					</view> | |
| 				</view> | |
| 			</view> | |
|  | |
| 			<!-- 优惠券选择 --> | |
| 			<view class="coupon-section"> | |
| 				<view class="coupon-title">选择优惠券</view> | |
| 				<view class="coupon-selector" @click="selectCoupon"> | |
| 					<view v-if="!selectedCoupon" class="coupon-placeholder"> | |
| 						<text class="coupon-text">请选择</text> | |
| 						<uv-icon name="arrow-right" color="#999" size="16" /> | |
| 					</view> | |
| 					<view v-else class="coupon-selected"> | |
| 						<view class="coupon-info"> | |
| 							<text class="coupon-name">{{ selectedCoupon.name }}</text> | |
| 							<text class="coupon-amount">-¥{{ selectedCoupon.money }}</text> | |
| 						</view> | |
| 						<uv-icon name="arrow-right" color="#999" size="16" /> | |
| 					</view> | |
| 				</view> | |
| 			</view> | |
| 		</view> | |
|  | |
| 		<!-- 立即开通会员按钮 --> | |
| 		<view class="member-button-section"> | |
| 			<uv-button type="primary" text="立即开通会员" :custom-style="{ | |
|           width: '100%', | |
|           height: '82rpx', | |
|           borderRadius: '44rpx', | |
|           backgroundColor: '#06DADC', | |
|           fontSize: '36rpx', | |
|           fontWeight: '500', | |
|           border: '1px solid #06DADC' | |
|         }" @click="handleRecharge"></uv-button> | |
| 		</view> | |
|  | |
| 		<!-- 会员权益 --> | |
| 		<view class="benefits-section"> | |
| 			<view class="benefits-title">会员权益</view> | |
|  | |
| 			<view class="benefits-list"> | |
| 				<!-- 碎片学习 系统掌握 --> | |
| 				<!-- <view class="benefit-item" v-for="item in packageList" :key="item.id"> --> | |
| 				<uv-parse :content="list[selectedMember].content" /> | |
| 				<!-- </view> --> | |
|  | |
| 				<!-- 匹配水平 --> | |
| 				<!-- <view class="benefit-item"> | |
|           <view class="benefit-content"> | |
|             <view class="benefit-title">匹配水平</view> | |
|             <view class="benefit-desc">依据水平精准推课,不做无用功快速提升</view> | |
|           </view> | |
|           <view class="benefit-icon"> | |
|             <image src="/static/会员图片2.png" mode="aspectFit"></image> | |
|           </view> | |
|         </view> | |
|          | |
|          科学闭环测 讲练结合 | |
|         <view class="benefit-item"> | |
|           <view class="benefit-content"> | |
|             <view class="benefit-title">科学闭环测 讲练结合</view> | |
|             <view class="benefit-desc">精心设计科学的学习流程 「测试-讲解-练习-检验」知识掌握更牢固</view> | |
|           </view> | |
|           <view class="benefit-icon"> | |
|             <image src="/static/会员图片3.png" mode="aspectFit"></image> | |
|           </view> | |
|         </view> --> | |
| 			</view> | |
| 		</view> | |
| 
 | |
| 	</view> | |
| </template> | |
| 
 | |
| 
 | |
| <script> | |
| 	export default { | |
| 		data() { | |
| 			return { | |
| 				list: [ | |
| 
 | |
| 				], | |
| 				selectedPackage: 0, // 默认选择第一个套餐 | |
| 				selectedMember: 0, // 默认选择第一个会员 | |
| 				defaultPackageList: [ | |
| 
 | |
| 				], | |
| 				couponId: '', | |
| 				selectedCoupon: null // 选中的优惠券信息 | |
| 			} | |
| 		}, | |
| 		computed: { | |
| 			packageList() { | |
| 				return this.list[this.selectedMember]?.setmeals ? this.list[this.selectedMember].setmeals : this | |
| 					.defaultPackageList | |
| 			} | |
| 		}, | |
| 		methods: { | |
| 			handleCouponSelected(coupon) { | |
| 
 | |
| 				// 处理选中的优惠券 | |
| 				this.selectedCoupon = coupon | |
| 				this.couponId = coupon.id | |
| 
 | |
| 				uni.showToast({ | |
| 					title: `已选择优惠券:¥${coupon.money}`, | |
| 					icon: 'success' | |
| 				}) | |
| 			}, | |
| 			async handleRecharge() { | |
| 				// console.log('选中的会员id是:', this.packageList[this.selectedPackage]); | |
|  | |
| 				const object = { | |
| 					// #ifdef H5 | |
| 					type: 'official', | |
| 					// #endif | |
| 					memberId: this.list[this.selectedMember].id, | |
| 					setmealId: this.packageList[this.selectedPackage].id | |
| 				} | |
| 				if (this.couponId) { | |
| 					object.couponId = this.couponId | |
| 				} | |
| 				const res = await this.$api.member.openMember({ | |
| 					...object | |
| 				}) | |
| 				if (res.code === 200) { | |
| 					if (res.result === 0) { | |
| 						// 零元购 | |
| 						uni.showToast({ | |
| 							title: '充值成功', | |
| 							icon: 'success' | |
| 						}) | |
| 						this.goBack() | |
| 					} else { | |
| 						// 调起微信支付 | |
| 						this.$utils.wxPay(res.result, (res) => { | |
| 							setTimeout(() => { | |
| 								this.goBack() | |
| 							}, 1000) | |
| 						}) | |
| 					} | |
| 				} | |
| 			}, | |
| 			goBack() { | |
| 				uni.navigateBack() | |
| 			}, | |
| 			// 截取价格的整数与小数部分 | |
| 			getInt(pri) { | |
| 				const price = String(pri) | |
| 				if (price.indexOf('.') === -1) { | |
| 					return price | |
| 				} | |
| 				if (price === null) { | |
| 					return '0' | |
| 				} | |
| 				return String(price).split('.')[0] | |
| 			}, | |
| 			getDecimal(pri) { | |
| 				const price = String(pri) | |
| 				if (price === null) return '00' | |
| 				const parts = price.split('.') | |
| 				return parts[1] ? parts[1].padEnd(2, '0') : '00' | |
| 			}, | |
| 			selectPackage(index) { | |
| 				this.selectedPackage = index | |
| 			}, | |
| 			selectCoupon() { | |
| 				uni.navigateTo({ | |
| 					url: '/subPages/user/discount?from=recharge' | |
| 				}) | |
| 			}, | |
| 			async getMemberList() { | |
| 				const memberRes = await this.$api.member.getMemberList() | |
| 				if (memberRes.code === 200) { | |
| 					this.list = memberRes.result | |
| 				} | |
| 			}, | |
| 			changeSwiper(e) { | |
| 				this.selectedMember = e.current | |
| 				this.selectedPackage = 0 | |
| 			} | |
| 		}, | |
| 		onShow() { | |
| 			// 监听优惠券选择事件 | |
| 			uni.$on('couponSelected', this.handleCouponSelected) | |
| 			this.getMemberList() | |
| 		}, | |
| 		onUnload() { | |
| 			// 移除事件监听 | |
| 			uni.$off('couponSelected', this.handleCouponSelected) | |
| 			console.log('接触监听'); | |
| 
 | |
| 		}, | |
| 	} | |
| </script> | |
| 
 | |
| <style lang="scss" scoped> | |
| 	.container { | |
| 		min-height: 100%; | |
| 	} | |
| 
 | |
| 	.header { | |
| 		width: 100%; | |
| 
 | |
| 		.header-bg { | |
| 			position: relative; | |
| 			width: 100%; | |
| 			height: 500rpx; | |
| 			/* #ifdef H5 */ | |
| 			margin-top: -100rpx; | |
| 
 | |
| 			/* #endif */ | |
| 			// background: red; | |
| 			.header-img { | |
| 				width: 100%; | |
| 				height: 500rpx; | |
| 			} | |
| 
 | |
| 			.header-title { | |
| 				font-size: 32rpx; | |
| 				color: black; | |
| 				position: absolute; | |
| 				top: 100rpx; | |
| 				font-weight: 500; | |
| 				left: 50%; | |
| 				transform: translateX(-50%); | |
| 			} | |
| 
 | |
| 			.header-icon { | |
| 				position: absolute; | |
| 				top: 100rpx; | |
| 				left: 30rpx; | |
| 			} | |
| 
 | |
| 			.swiper-container { | |
| 				margin-top: -300rpx; | |
| 
 | |
| 				.swiper-arrow { | |
| 					width: 100%; | |
| 					height: 22rpx; | |
| 				} | |
| 
 | |
| 				.swiper-btn { | |
| 					margin: 35rpx auto 15rpx; | |
| 					width: 150rpx; | |
| 					height: 52rpx; | |
| 					border-radius: 999px; | |
| 					background: #06DADC; | |
| 					color: white; | |
| 					font-size: 28rpx; | |
| 					font-weight: 500; | |
| 					text-align: center; | |
| 					line-height: 52rpx; | |
| 				} | |
| 			} | |
| 		} | |
| 
 | |
| 
 | |
| 	} | |
| 
 | |
| 	/* 立即开通会员按钮样式 */ | |
| 	.member-button-section { | |
| 		margin: 0 50rpx 40rpx; | |
| 	} | |
| 
 | |
| 	// 会员套餐选择容器 | |
| 	.membership-container { | |
| 		background: linear-gradient(180deg, #DEFFFF 0%, #FBFEFF 22.65%, #FFFFFF 100%); | |
| 		padding: 40rpx 30rpx; | |
| 		margin-top: 20rpx; | |
| 
 | |
| 		.package-list { | |
| 			display: flex; | |
| 			justify-content: space-between; | |
| 			gap: 16rpx; | |
| 			margin-bottom: 20rpx; | |
| 
 | |
| 			.package-item { | |
| 				position: relative; | |
| 				flex: 1; | |
| 				background: #fff; | |
| 				border-radius: 20rpx; | |
| 
 | |
| 				text-align: center; | |
| 				border: 2rpx solid #EEEEEE; | |
| 				transition: all 0.3s; | |
| 				// width: 119; | |
| 				height: 210rpx; | |
| 
 | |
| 				// width: 238rpx; | |
| 				.info { | |
| 					padding: 16rpx 16rpx 0 16rpx; | |
| 				} | |
| 
 | |
| 				&.active { | |
| 					border-color: $primary-color; | |
| 					// box-shadow: 0 4rpx 20rpx rgba(34, 242, 235, 0.2); | |
| 				} | |
| 
 | |
| 				.gift-tag { | |
| 					position: absolute; | |
| 					top: -10rpx; | |
| 					left: 0%; | |
| 					// transform: translateX(-50%); | |
| 					background: #FF6B6B; | |
| 					color: #fff; | |
| 					font-size: 20rpx; | |
| 					padding: 8rpx 16rpx; | |
| 					border-radius: 20rpx 20rpx 20rpx 0; | |
| 					white-space: nowrap; | |
| 				} | |
| 
 | |
| 				.package-title { | |
| 					font-size: 28rpx; | |
| 					color: #000; | |
| 					margin-bottom: 16rpx; | |
| 					font-weight: 500; | |
| 				} | |
| 
 | |
| 				.package-price { | |
| 					font-size: 36rpx; | |
| 					color: #FF4800; | |
| 					font-weight: 500; | |
| 					margin-bottom: 8rpx; | |
| 
 | |
| 					.package-decimal { | |
| 						font-size: 24rpx; | |
| 					} | |
| 				} | |
| 
 | |
| 				.package-original { | |
| 					font-size: 24rpx; | |
| 					color: #8B8B8B; | |
| 					line-height: 1.4; | |
| 					text-decoration: line-through; | |
| 					margin-bottom: 8rpx; | |
| 				} | |
| 
 | |
| 				.package-btn { | |
| 					background: #E4E7EB; | |
| 					color: #191919; | |
| 					font-size: 28rpx; | |
| 					// padding: 12rpx 20rpx; | |
| 					width: 100%; | |
| 					// border-radius: 30rpx; | |
| 					transition: all 0.3s; | |
| 					height: 52rpx; | |
| 					line-height: 52rpx; | |
| 					border-radius: 0 0 24rpx 24rpx; | |
| 
 | |
| 					&.active { | |
| 						background: $primary-color; | |
| 						color: #fff; | |
| 					} | |
| 				} | |
| 			} | |
| 		} | |
| 
 | |
| 		.coupon-section { | |
| 			.coupon-title { | |
| 				font-size: 26rpx; | |
| 				color: #181818; | |
| 				margin-bottom: 10rpx; | |
| 				// font-weight: 500; | |
| 			} | |
| 
 | |
| 			.coupon-selector { | |
| 				background: #fff; | |
| 				border-radius: 16rpx; | |
| 				padding: 10rpx 0; | |
| 				display: flex; | |
| 				justify-content: space-between; | |
| 				align-items: center; | |
| 				border-bottom: 2rpx solid #f0f0f0; | |
| 
 | |
| 				.coupon-placeholder { | |
| 					display: flex; | |
| 					justify-content: space-between; | |
| 					align-items: center; | |
| 					width: 100%; | |
| 
 | |
| 					.coupon-text { | |
| 						font-size: 32rpx; | |
| 						color: #C6C6C6; | |
| 					} | |
| 				} | |
| 
 | |
| 				.coupon-selected { | |
| 					display: flex; | |
| 					justify-content: space-between; | |
| 					align-items: center; | |
| 					width: 100%; | |
| 
 | |
| 					.coupon-info { | |
| 						display: flex; | |
| 						// flex-direction: column; | |
| 						align-items: center; | |
| 						justify-content: space-between; | |
| 
 | |
| 						.coupon-name { | |
| 							font-size: 28rpx; | |
| 							color: #181818; | |
| 							margin-bottom: 4rpx; | |
| 						} | |
| 
 | |
| 						.coupon-amount { | |
| 							font-size: 28rpx; | |
| 							color: red; | |
| 							font-weight: 500; | |
| 						} | |
| 					} | |
| 				} | |
| 			} | |
| 		} | |
| 	} | |
| 
 | |
| 	/* 会员权益样式 */ | |
| 	.benefits-section { | |
| 		margin-top: 40rpx; | |
| 		padding: 0 30rpx; | |
| 	} | |
| 
 | |
| 	.benefits-title { | |
| 		font-size: 36rpx; | |
| 		font-weight: bold; | |
| 		color: #191919; | |
| 		margin-bottom: 32rpx; | |
| 	} | |
| 
 | |
| 	.benefits-list { | |
| 		display: flex; | |
| 		flex-direction: column; | |
| 		gap: 32rpx; | |
| 	} | |
| 
 | |
| 	.benefit-item { | |
| 		background: #F8F8F8; | |
| 		border: 1px solid #FFFFFF; | |
| 		border-radius: 48rpx; | |
| 		padding: 27rpx 40rpx; | |
| 		display: flex; | |
| 		align-items: center; | |
| 		justify-content: space-between; | |
| 	} | |
| 
 | |
| 	.benefit-content { | |
| 		flex: 1; | |
| 		margin-right: 40rpx; | |
| 	} | |
| 
 | |
| 	.benefit-title { | |
| 		font-size: 32rpx; | |
| 		font-weight: 600; | |
| 		color: #333; | |
| 		margin-bottom: 16rpx; | |
| 	} | |
| 
 | |
| 	.benefit-desc { | |
| 		font-size: 24rpx; | |
| 		color: #09B1B3; | |
| 		line-height: 36rpx; | |
| 	} | |
| 
 | |
| 	.benefit-icon { | |
| 		width: 152rpx; | |
| 		height: 152rpx; | |
| 		// flex-shrink: 0; | |
| 	} | |
| 
 | |
| 	.benefit-icon image { | |
| 		width: 100%; | |
| 		height: 100%; | |
| 	} | |
| </style> |