|                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |  | <template>	<view class="container">    <view class="header">      <view class="header-bg">        <image          src="/static/会员背景.png"          class="header-img"          mode="scaleToFill"        />        <text class="header-title">会员开通</text>				<!-- 加一个推出箭头 -->				 <view class="header-icon"  @click="goBack">    					 <uv-icon name="arrow-left" color="#000" size="20" />				</view>				<!-- 轮播容器 -->				<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/修饰箭头.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">          <view class="benefit-content">            <view class="benefit-title">碎片学习 系统掌握</view>            <view class="benefit-desc">根据薄弱点智能推荐,每节课3-5分钟,碎片化完成系统学习</view>          </view>          <view class="benefit-icon">            <image src="/static/会员图片1.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/会员图片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.length ? 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 = {          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;    // 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>
 |