| 
						 | 
						- <template>
 - 	<view class="receive-gift">
 - 
 -         <template v-if="isOpeningEnd">
 - 
 -             <navbar title="礼品领取" leftClick @leftClick="$utils.navigateBack" />
 -             
 -             <!-- 主图片展示区 -->
 -             <view class="main-image">
 -                 <image :src="giftInfo.image" mode="aspectFill"></image>
 -             </view>
 -             
 -             <!-- 礼品信息区域 -->
 -             <view class="gift-info">
 -                 <view class="gift-name">{{giftInfo.title}}</view>
 -                 <view class="gift-value">
 -                     <text>礼品价值:</text>
 -                     <text class="price">¥{{giftInfo.price}}</text>
 -                 </view>
 -             </view>
 -             
 -             <!-- 祝福语区域 -->
 -             <view class="blessing-area">
 -                 <view class="sender-info">
 -                     <text class="label">来自</text>
 -                     <text class="sender">{{giftInfo.name}}</text>
 -                     <text class="label">的祝福</text>
 -                 </view>
 -                 <view class="blessing-content">
 -                     {{ giftInfo.giveTitle }}
 -                 </view>
 -             </view>
 -             
 -             <!-- 底部区域 -->
 -             <view class="bottom-area">
 -                 <!-- <view class="countdown">距离礼包失效:{{countdownText}}</view> -->
 -                 <!-- <button class="receive-btn" 
 -                 @click="receiveGift" 
 -                 :disabled="giftInfo.giveStatus !== 0">
 -                     {{giftInfo.giveStatus === 0 ? '立即领取' : '已领取'}}
 -                 </button> -->
 -                 
 -                 <button class="receive-btn"
 - 				v-if="giftInfo.giveStatus != 1"
 -                 @click="openAddress">
 -                     立即领取
 -                 </button>
 -             </view>
 -         </template>
 - 
 -         <!-- 礼物开启动画弹窗 -->
 -         <uv-popup ref="giftPopup" 
 -             mode="center" 
 -             :round="20" 
 -             :closeable="false" 
 - 			:closeOnClickOverlay="false"
 -             :maskClick="false"
 -             :customStyle="{backgroundColor: 'transparent', padding: 0}"
 -             overlayOpacity="0.8">
 -             <view class="gift-card" :class="{ 'open': isOpening }">
 -                 <view class="gift-icon" :class="{ 'bounce': !isOpening }">
 -                     <uv-icon name="gift-fill" size="120" color="#FFD700"></uv-icon>
 -                 </view>
 -                 <view class="gift-content">
 -                     <view class="gift-title" :class="{ 'fade': isOpening }">
 -                         {{ giftInfo.name }}送你一份礼物
 -                     </view>
 -                     <view class="gift-open-btn" 
 -                         @click="openGift"
 -                         :class="{ 'pulse': !isOpening }">
 -                         <text>开</text>
 -                         <view class="btn-sparkle"></view>
 -                     </view>
 -                     <view class="gift-tip" :class="{ 'fade': isOpening }">
 -                         {{ giftInfo.giveTitle }}
 -                     </view>
 -                 </view>
 -             </view>
 -         </uv-popup>
 - 
 -         <!-- 抽奖弹窗 -->
 -         <uv-popup ref="lotteryPopup" 
 -             mode="center" 
 -             :round="20" 
 -             :closeable="false" 
 -             :maskClick="false"
 - 			:closeOnClickOverlay="false"
 -             :customStyle="{backgroundColor: 'transparent', padding: 0}"
 -             overlayOpacity="0.8">
 -             <view class="lottery-card">
 -                 <view class="lottery-title">{{ giftInfo.name }}为您精选了一份抽奖礼包</view>
 -                 <view class="gift-tip">
 -                         {{ giftInfo.giveTitle }}
 -                     </view>
 -                 <view class="lottery-content">
 -                     <view class="product-image">
 -                         <image :src="giftInfo.image" mode="aspectFill"></image>
 -                     </view>
 -                     <view class="product-info">
 -                         <view class="product-name">{{giftInfo.title}}</view>
 -                         <view class="product-price">¥{{giftInfo.price}}</view>
 -                     </view>
 -                 </view>
 - 				
 -                 <view class="lottery-btn" @click="startLottery" v-if="!isSpinning">
 -                     试试手气
 -                 </view>
 - 				
 -                 <view class="lottery-result" v-if="showResult">
 -                     <text v-if="isWinner">恭喜您中奖了!</text>
 -                     <text v-else>很遗憾,下次再来!</text>
 -                 </view>
 - 				
 - 				<view class="lottery-btn" 
 - 				@click="openAddress" 
 - 				v-if="isWinner && giftInfo.giveStatus != 1">
 - 				    立即领取
 - 				</view>
 -             </view>
 -         </uv-popup>
 - 		
 - 		
 - 		<!-- 地址选择 -->
 - 		<uv-popup ref="addressPopup" :round="30" style="padding-bottom: 90rpx;">
 - 			
 - 			<view class="addressPopupTitle">
 - 				填写地址就能收礼了
 - 			</view>
 - 			
 - 			<!-- <view class="tabs">
 - 				<uv-tabs :list="tabs" 
 - 				:activeStyle="{color : 'rgb(235, 51, 0)', fontWeight : 600}" 
 - 				lineColor="#fff"
 - 				:inactiveStyle="{color: 'rgba(235, 51, 0, 0.8)'}" 
 - 				lineHeight="8rpx" 
 - 				lineWidth="50rpx" 
 - 				:current="addressCurrent"
 - 				@click="clickTabs"></uv-tabs>
 - 			</view> -->
 - 			
 - 			<addressList 
 - 			ref="addressList" 
 - 			height="60vh" 
 - 			v-if="addressCurrent == 1"
 - 			@select="receiveGift" />
 - 			
 - 			<view class="redactAddressForm"
 - 			v-else>
 - 			
 - 				<redactAddressForm
 - 				ref="redactAddressForm"
 - 				@saveOrUpdate="receiveGift"
 - 				/>
 - 				
 - 				<view 
 - 				@click="$refs.redactAddressForm.onSubmit" 
 - 				class="save">确认收礼</view>
 - 			</view>
 - 			
 - 		</uv-popup>
 - 		
 - 		<loginPopup ref="loginPopup" @login="getGiftInfo"/>
 - 	</view>
 - </template>
 - 
 - <script>
 - 	import addressList from '../components/address/addressList.vue'
 - 	import redactAddressForm from '../components/address/redactAddressForm.vue'
 -     import loginPopup from '@/components/config/loginPopup.vue'
 - 	export default {
 - 		components : {
 - 			addressList,
 - 			redactAddressForm,
 -             loginPopup,
 - 		},
 - 		data() {
 - 			return {
 - 				giftId: '',
 - 				giftInfo: {
 - 				},
 - 				countdown: 24 * 60 * 60, // 倒计时秒数
 - 				countdownTimer: null,
 - 
 - 				// 领奖
 -                 isOpening: false,
 -                 isOpeningEnd : false,
 - 
 -                 // 抽奖
 -                 isSpinning: false,
 -                 showResult: false,
 -                 isWinner: false,
 - 				
 - 				// 地址
 - 				addressTotal: 0,
 - 				tabs: [
 - 					{
 - 						name: '新地址'
 - 					},
 - 					{
 - 						name: '现有地址'
 - 					}
 - 				],
 - 				addressCurrent : 0,
 - 			}
 - 		},
 - 		computed: {
 - 			countdownText() {
 - 				const hours = Math.floor(this.countdown / 3600)
 - 				const minutes = Math.floor((this.countdown % 3600) / 60)
 - 				const seconds = this.countdown % 60
 - 				return `${hours}时${minutes}分${seconds}秒`
 - 			}
 - 		},
 - 		methods: {
 -             // 打开礼物动画
 -             openGift() {
 -                 this.isOpening = true
 -                 setTimeout(() => {
 -                     this.$refs.giftPopup.close()
 - 					this.isOpeningEnd = true
 -                 }, 1000)
 -             },
 -             // 开始抽奖
 -             startLottery() {
 -                 if (this.isSpinning) return
 - 				uni.showLoading({
 - 					title: '抽奖中...',
 - 				})
 -                 
 -                 this.isSpinning = true
 -                 this.showResult = false
 -                 
 -                 // 模拟抽奖过程
 -                 setTimeout(() => {
 - 					
 - 					this.$api('getGiveShopLottery', {
 - 						orderId : this.giftId,
 - 					}).then(res => {
 - 						uni.hideLoading()
 - 						this.showResult = true
 - 						if(res.code == 200){
 - 							this.isWinner = !!res.result
 - 						}
 - 					})
 - 					
 -                     // this.isSpinning = false
 -                     
 -                     // 这里可以根据实际接口返回决定是否中奖
 -                     // this.isWinner = Math.random() > 0.5
 -                     
 -                 }, 2000)
 -             },
 - 			// 获取礼品信息
 - 			async getGiftInfo() {
 - 				try {
 - 					const res = await this.$api('getOrderDetail', {
 - 						id: this.giftId
 - 					})
 - 					this.giftInfo = res.result
 - 
 -                     this.$nextTick(() => {
 -                         // 获取信息后显示弹窗
 - 						if(this.giftInfo.isGive == 3){
 - 							this.$refs.lotteryPopup.open()
 - 						}else{
 - 							this.$refs.giftPopup.open()
 - 						}
 -                     })
 -                     
 - 					// 计算倒计时
 - 					// if (this.giftInfo.expireTime) {
 - 					// 	const expireTime = new Date(this.giftInfo.expireTime).getTime()
 - 					// 	const now = new Date().getTime()
 - 					// 	this.countdown = Math.max(0, Math.floor((expireTime - now) / 1000))
 - 					// 	this.startCountdown()
 - 					// }
 - 				} catch (e) {
 - 					uni.showToast({
 - 						title: '获取礼品信息失败',
 - 						icon: 'none'
 - 					})
 - 				}
 - 			},
 - 			// 领取礼品
 - 			async receiveGift(address) {
 - 				try {
 - 					let res = await this.$api('getGiveShop', {
 - 						orderId : this.giftId,
 - 						address : address.address,
 - 						addressDetails : address.addressDetails,
 - 						name : address.name,
 - 						phone : address.phone,
 - 					})
 - 					if(res.code == 200){
 - 						this.$refs.addressPopup.close()
 - 						uni.showToast({
 - 							title: '领取成功',
 - 							icon: 'success'
 - 						})
 - 					}
 - 					this.giftInfo.giveStatus = 1
 - 				} catch (e) {
 - 					uni.showToast({
 - 						title: '领取失败',
 - 						icon: 'none'
 - 					})
 - 				}
 - 			},
 - 			// 开始倒计时
 - 			startCountdown() {
 - 				this.countdownTimer = setInterval(() => {
 - 					if (this.countdown > 0) {
 - 						this.countdown--
 - 					} else {
 - 						clearInterval(this.countdownTimer)
 - 					}
 - 				}, 1000)
 - 			},
 - 			// 打开选择地址
 - 			openAddress() {
 - 				this.$refs.addressPopup.open('bottom')
 - 			},
 - 			// 获取地址列表
 - 			getAddressList() {
 - 				// 获取地址列表
 - 				this.$refs.addressList.getAddressList().then(res => {
 - 					this.addressTotal = res.total
 - 				})
 - 			},
 - 			clickTabs({index}){
 - 				this.addressCurrent = index
 - 				if(index == 1){
 - 					this.$nextTick(() => {
 - 						this.getAddressList()
 - 					})
 - 				}
 - 			},
 - 		},
 - 		onLoad(options) {
 - 			if (options.shareId) {
 - 				uni.setStorageSync('shareId', options.shareId)
 - 			}
 - 			if (options.id) {
 - 				this.giftId = options.id
 - 				if(uni.getStorageSync('token')){
 - 					this.getGiftInfo()
 - 				}else{
 - 					this.$refs.loginPopup.open()
 - 				}
 - 			}
 - 		},
 - 		onShow() {
 - 		},
 - 		beforeDestroy() {
 - 			if (this.countdownTimer) {
 - 				clearInterval(this.countdownTimer)
 - 			}
 - 		}
 - 	}
 - </script>
 - 
 - <style lang="scss" scoped>
 - .receive-gift {
 - 	min-height: 100vh;
 - 	background: #fff;
 - 	
 - 	.main-image {
 - 		width: 100%;
 - 		height: 400rpx;
 - 		
 - 		image {
 - 			width: 100%;
 - 			height: 100%;
 - 		}
 - 	}
 - 	
 - 	.gift-info {
 - 		padding: 30rpx;
 - 		
 - 		.gift-name {
 - 			font-size: 36rpx;
 - 			font-weight: 600;
 - 			color: #333;
 - 			margin-bottom: 20rpx;
 - 		}
 - 		
 - 		.gift-value {
 - 			font-size: 28rpx;
 - 			color: #666;
 - 			
 - 			.price {
 - 				color: #E3441A;
 - 				font-weight: 600;
 - 				margin-left: 10rpx;
 - 			}
 - 		}
 - 	}
 - 	
 - 	.blessing-area {
 - 		padding: 30rpx;
 - 		background: #FFF5F5;
 - 		margin: 30rpx;
 - 		border-radius: 12rpx;
 - 		
 - 		.sender-info {
 - 			text-align: center;
 - 			margin-bottom: 20rpx;
 - 			
 - 			.label {
 - 				color: #666;
 - 				font-size: 28rpx;
 - 			}
 - 			
 - 			.sender {
 - 				color: #333;
 - 				font-size: 32rpx;
 - 				font-weight: 600;
 - 				margin: 0 10rpx;
 - 			}
 - 		}
 - 		
 - 		.blessing-content {
 - 			color: #333;
 - 			font-size: 30rpx;
 - 			line-height: 1.6;
 - 			text-align: center;
 - 		}
 - 	}
 - 	
 - 	.bottom-area {
 - 		position: fixed;
 - 		left: 0;
 - 		bottom: 0;
 - 		width: 100%;
 - 		box-sizing: border-box;
 - 		padding: 20rpx 30rpx calc(30rpx + env(safe-area-inset-bottom)) 30rpx;
 - 		background: #fff;
 - 		box-shadow: 0 -2rpx 10rpx rgba(0,0,0,0.05);
 - 		z-index: 10;
 - 		
 - 		.countdown {
 - 			text-align: center;
 - 			font-size: 28rpx;
 - 			color: #666;
 - 			margin-bottom: 20rpx;
 - 			font-weight: 500;
 - 		}
 - 		
 - 		.receive-btn {
 - 			width: 100%;
 - 			height: 88rpx;
 - 			line-height: 88rpx;
 - 			background: linear-gradient(to right, #FF4B4B, #E3441A);
 - 			color: #fff;
 - 			border-radius: 44rpx;
 - 			font-size: 32rpx;
 - 			font-weight: 500;
 - 			
 - 			&[disabled] {
 - 				background: #ccc;
 - 				opacity: 0.8;
 - 			}
 - 		}
 - 	}
 - }
 - 
 - .addressPopupTitle{
 -     padding: 40rpx;
 - 	font-size: 32rpx;
 - 	font-weight: 900;
 - 	text-align: center;
 - }
 - .redactAddressForm{
 - 	padding: 0 40rpx;
 - 	padding-bottom: 40rpx;
 - 	.save {
 - 		display: flex;
 - 		align-items: center;
 - 		justify-content: center;
 - 		width: 90%;
 - 		height: 80rpx;
 - 		border-radius: 40rpx;
 - 		color: white;
 - 		font-size: 28rpx;
 - 		margin: 0rpx auto;
 - 		background: $uni-color;
 - 		margin-top: 150rpx;
 - 	}
 - }
 - 
 - // 普通礼包开启动画
 - .gift-card {
 -     position: relative;
 -     background: $uni-color;
 -     border-radius: 20rpx;
 -     padding: 60rpx 40rpx;
 -     width: 600rpx;
 -     transform-origin: center;
 -     transition: all 0.8s cubic-bezier(0.68, -0.55, 0.265, 1.55);
 -     
 -     .gift-icon {
 -         position: absolute;
 -         top: -60rpx;
 -         left: 50%;
 -         transform: translateX(-50%);
 -         width: 120rpx;
 -         height: 120rpx;
 -         display: flex;
 -         align-items: center;
 -         justify-content: center;
 -         transition: all 0.6s cubic-bezier(0.68, -0.55, 0.265, 1.55);
 -         transform-origin: center bottom;
 -         animation: giftBounce 2s infinite;
 -     }
 -     
 -     .gift-content {
 -         margin-top: 60rpx;
 -         transform-origin: center;
 -         transition: all 0.6s cubic-bezier(0.68, -0.55, 0.265, 1.55);
 -         color: #fff;
 - 		text-align: center;
 -         
 -         .gift-open-btn {
 -             position: relative;
 -             width: 120rpx;
 -             height: 120rpx;
 -             border-radius: 50%;
 -             background: linear-gradient(135deg, #FF4B4B, #E3441A);
 -             margin: 40rpx auto;
 -             display: flex;
 -             align-items: center;
 -             justify-content: center;
 -             cursor: pointer;
 -             overflow: hidden;
 -             box-shadow: 0 6rpx 20rpx rgba(227, 68, 26, 0.3);
 -             
 -             text {
 -                 color: #fff;
 -                 font-size: 36rpx;
 -                 font-weight: bold;
 -                 z-index: 1;
 -             }
 -             
 -             .btn-sparkle {
 -                 position: absolute;
 -                 top: -50%;
 -                 left: -50%;
 -                 width: 200%;
 -                 height: 200%;
 -                 background: linear-gradient(90deg, 
 -                     rgba(255,255,255,0) 0%,
 -                     rgba(255,255,255,0.2) 50%,
 -                     rgba(255,255,255,0) 100%);
 -                 transform: rotate(45deg);
 -                 animation: sparkle 2s infinite;
 -             }
 -             
 -             &.pulse {
 -                 animation: pulse 2s infinite;
 -             }
 -         }
 - 		.gift-title{
 - 			color: #fff;
 - 			font-size: 32rpx;
 - 			font-weight: bold;
 - 			margin-bottom: 20rpx;
 - 		}
 -         
 -         .gift-title, .gift-tip {
 -             transition: all 0.5s ease;
 -             
 -             &.fade {
 -                 opacity: 0;
 -                 transform: translateY(-20rpx);
 -             }
 -         }
 -         
 -         .gift-icon {
 -             &.bounce {
 -                 animation: giftBounce 2s infinite;
 -             }
 -         }
 -     }
 -     
 -     &.open {
 -         transform: perspective(1000px) rotateY(720deg) scale(0.5);
 -         opacity: 0;
 -         
 -         .gift-icon {
 -             transform: translateX(-50%) translateY(-200%) scale(1.5) rotate(720deg);
 -             opacity: 0;
 -         }
 -         
 -         .gift-content {
 -             transform: scale(0) rotate(-720deg);
 -             opacity: 0;
 -         }
 -     }
 - }
 - 
 - @keyframes sparkle {
 -     0% {
 -         transform: rotate(45deg) translateX(-100%);
 -     }
 -     50% {
 -         transform: rotate(45deg) translateX(100%);
 -     }
 -     100% {
 -         transform: rotate(45deg) translateX(100%);
 -     }
 - }
 - 
 - @keyframes pulse {
 -     0% {
 -         transform: scale(1);
 -     }
 -     50% {
 -         transform: scale(1.05);
 -     }
 -     100% {
 -         transform: scale(1);
 -     }
 - }
 - 
 - // 修改原有的giftBounce动画
 - @keyframes giftBounce {
 -     0%, 100% {
 -         transform: translateX(-50%) translateY(0) rotate(0deg);
 -     }
 -     25% {
 -         transform: translateX(-50%) translateY(-15rpx) rotate(-5deg);
 -     }
 -     75% {
 -         transform: translateX(-50%) translateY(-15rpx) rotate(5deg);
 -     }
 - }
 - 
 - // 抽奖动画
 - .lottery-card {
 -     width: 600rpx;
 -     background: linear-gradient(135deg, #FF6B6B, #E3441A);
 -     border-radius: 20rpx;
 -     padding: 40rpx;
 -     text-align: center;
 -     
 -     .lottery-title {
 -         color: #fff;
 -         font-size: 32rpx;
 -         font-weight: bold;
 -         margin-bottom: 20rpx;
 -     }
 -     .gift-tip{
 -         color: #fff;
 -         font-size: 28rpx;
 -         margin-bottom: 40rpx;
 -     }
 -     
 -     .lottery-content {
 -         background: #fff;
 -         border-radius: 16rpx;
 -         padding: 30rpx;
 -         margin: 0 auto 30rpx;
 -         
 -         .product-image {
 -             width: 300rpx;
 -             height: 300rpx;
 -             margin: 0 auto 20rpx;
 -             border-radius: 8rpx;
 -             overflow: hidden;
 -             
 -             image {
 -                 width: 100%;
 -                 height: 100%;
 -             }
 -         }
 -         
 -         .product-info {
 -             text-align: center;
 -             
 -             .product-name {
 -                 font-size: 28rpx;
 -                 color: #333;
 -                 margin-bottom: 10rpx;
 -             }
 -             
 -             .product-price {
 -                 font-size: 36rpx;
 -                 color: #E3441A;
 -                 font-weight: bold;
 -             }
 -         }
 -     }
 -     
 -     .lottery-btn {
 -         margin-top: 40rpx;
 -         background: #FFD700;
 -         color: #E3441A;
 -         padding: 20rpx 60rpx;
 -         border-radius: 40rpx;
 -         display: inline-block;
 -         font-weight: bold;
 -         box-shadow: 0 6rpx 20rpx rgba(255, 215, 0, 0.3);
 -     }
 -     
 -     .lottery-result {
 -         margin-top: 30rpx;
 -         color: #fff;
 -         font-size: 32rpx;
 -         font-weight: bold;
 -         animation: fadeIn 0.5s ease;
 -     }
 - }
 - </style>
 
 
  |