3 changed files with 243 additions and 0 deletions
			
			
		@ -0,0 +1,100 @@ | 
			
		|||||
 | 
				<template> | 
			
		||||
 | 
					<view><slot :time="time" :remain="timeData.remain" :day="timeData.day" :hour="timeData.hour" :minute="timeData.minute" :second="timeData.second" /></view> | 
			
		||||
 | 
				</template> | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				<script> | 
			
		||||
 | 
				// https://ext.dcloud.net.cn/plugin?id=1687 | 
			
		||||
 | 
				export default { | 
			
		||||
 | 
					props: { | 
			
		||||
 | 
						// 倒计时时长(单位:毫秒) | 
			
		||||
 | 
						time: { | 
			
		||||
 | 
							type: Number, | 
			
		||||
 | 
							default: 0 | 
			
		||||
 | 
						}, | 
			
		||||
 | 
						 | 
			
		||||
 | 
						// 是否自动 | 
			
		||||
 | 
						'autoStart': { | 
			
		||||
 | 
							type: Boolean, | 
			
		||||
 | 
							default: false | 
			
		||||
 | 
						} | 
			
		||||
 | 
					}, | 
			
		||||
 | 
					data() { | 
			
		||||
 | 
						return { | 
			
		||||
 | 
							timer: null, | 
			
		||||
 | 
							timeData: { | 
			
		||||
 | 
								remain: 0, | 
			
		||||
 | 
								day: 0, | 
			
		||||
 | 
								hour: 0, | 
			
		||||
 | 
								minute: 0, | 
			
		||||
 | 
								second: 0 | 
			
		||||
 | 
							} | 
			
		||||
 | 
						}; | 
			
		||||
 | 
					}, | 
			
		||||
 | 
					watch: { | 
			
		||||
 | 
						time() { | 
			
		||||
 | 
							this.reset() | 
			
		||||
 | 
						} | 
			
		||||
 | 
					}, | 
			
		||||
 | 
					methods: { | 
			
		||||
 | 
						 | 
			
		||||
 | 
						// 设置timeData | 
			
		||||
 | 
						updateTimeData() { | 
			
		||||
 | 
							let t = this.timeData.remain; | 
			
		||||
 | 
							this.timeData.day = Math.floor(t / 1000 / 60 / 60 / 24); | 
			
		||||
 | 
							this.timeData.hour = Math.floor((t / 1000 / 60 / 60) % 24); | 
			
		||||
 | 
							this.timeData.minute = Math.floor((t / 1000 / 60) % 60); | 
			
		||||
 | 
							this.timeData.second = Math.floor((t / 1000) % 60); | 
			
		||||
 | 
						}, | 
			
		||||
 | 
						 | 
			
		||||
 | 
						// 开启倒计时 | 
			
		||||
 | 
						startTimer() { | 
			
		||||
 | 
							if (this.timer) { | 
			
		||||
 | 
								clearInterval(this.timer); | 
			
		||||
 | 
							} | 
			
		||||
 | 
							if(this.timeData.remain < 1000) { | 
			
		||||
 | 
								 return | 
			
		||||
 | 
							} | 
			
		||||
 | 
							this.timer = setInterval(() => { | 
			
		||||
 | 
								this.timeData.remain -= 1000; | 
			
		||||
 | 
								this.updateTimeData() | 
			
		||||
 | 
								if (this.timeData.remain < 1000) { | 
			
		||||
 | 
									this.pause() | 
			
		||||
 | 
									this.$emit('finish'); | 
			
		||||
 | 
								} | 
			
		||||
 | 
							}, 1000); | 
			
		||||
 | 
						}, | 
			
		||||
 | 
						 | 
			
		||||
 | 
						// 重置倒计时 | 
			
		||||
 | 
						reset() { | 
			
		||||
 | 
							this.timeData.remain = this.time; | 
			
		||||
 | 
							this.updateTimeData(); | 
			
		||||
 | 
							if(this.autoStart) { | 
			
		||||
 | 
								this.start() | 
			
		||||
 | 
							} | 
			
		||||
 | 
							 | 
			
		||||
 | 
						}, | 
			
		||||
 | 
						 | 
			
		||||
 | 
						// 暂停倒计时 | 
			
		||||
 | 
						pause() { | 
			
		||||
 | 
							if(this.timer) { | 
			
		||||
 | 
								clearInterval(this.timer); | 
			
		||||
 | 
								this.timer = null | 
			
		||||
 | 
							} | 
			
		||||
 | 
						}, | 
			
		||||
 | 
						 | 
			
		||||
 | 
						// 开始倒计时 | 
			
		||||
 | 
						start() { | 
			
		||||
 | 
							if(this.timer) { | 
			
		||||
 | 
								return | 
			
		||||
 | 
							} | 
			
		||||
 | 
							this.startTimer();		 | 
			
		||||
 | 
						} | 
			
		||||
 | 
					}, | 
			
		||||
 | 
					mounted() { | 
			
		||||
 | 
						this.reset(); | 
			
		||||
 | 
					}, | 
			
		||||
 | 
					beforeDestroy() { | 
			
		||||
 | 
						this.pause() | 
			
		||||
 | 
					} | 
			
		||||
 | 
				}; | 
			
		||||
 | 
				</script> | 
			
		||||
@ -0,0 +1,136 @@ | 
			
		|||||
 | 
				<template> | 
			
		||||
 | 
					<view> | 
			
		||||
 | 
						<lf-nav title="支付收银台" :showIcon="true" bgColor="#fff"></lf-nav> | 
			
		||||
 | 
						<view class="content"> | 
			
		||||
 | 
							<view class="card lf-flex-column lf-row-center"> | 
			
		||||
 | 
								<view class="lf-font-28 lf-color-222">需要支付</view> | 
			
		||||
 | 
								<view class="lf-m-t-10 lf-m-b-10"> | 
			
		||||
 | 
									<text class="symbol">¥</text> | 
			
		||||
 | 
									<text class="price">385</text> | 
			
		||||
 | 
								</view> | 
			
		||||
 | 
								<view class="tips"> | 
			
		||||
 | 
									<view>剩余支付时间:</view> | 
			
		||||
 | 
									<view> | 
			
		||||
 | 
										<countdown-timer :time="time" :autoStart="true" @finish="dateFinish"> | 
			
		||||
 | 
											<template v-slot="{minute, second}"> | 
			
		||||
 | 
												<!-- <view>{{minute}}:{{second}}</view> --> | 
			
		||||
 | 
												<view class="lf-flex"> | 
			
		||||
 | 
													<view>{{ minute >= 10 ? minute : "0" + minute }}</view> | 
			
		||||
 | 
													<view>:</view> | 
			
		||||
 | 
													<view>{{ second >= 10 ? second : "0" + second }}</view> | 
			
		||||
 | 
												</view> | 
			
		||||
 | 
											</template> | 
			
		||||
 | 
										</countdown-timer> | 
			
		||||
 | 
									</view> | 
			
		||||
 | 
								</view> | 
			
		||||
 | 
							</view> | 
			
		||||
 | 
							<view class="card lf-row-between" v-for="(item, index) in pay_list" :key="index"> | 
			
		||||
 | 
								<view> | 
			
		||||
 | 
									<text class="lf-iconfont" :class="item.icon"></text> | 
			
		||||
 | 
									<text class="lf-m-l-10 lf-font-28 lf-color-222">{{ item.name }}</text> | 
			
		||||
 | 
								</view> | 
			
		||||
 | 
								<radio-group @change="checkChange($event, index)"> | 
			
		||||
 | 
									<radio :checked="item.checked"></radio> | 
			
		||||
 | 
								</radio-group> | 
			
		||||
 | 
							</view> | 
			
		||||
 | 
						</view> | 
			
		||||
 | 
						<view class="fixed-btn" hover-class="lf-opacity" @click="confirm">立即支付</view> | 
			
		||||
 | 
					</view> | 
			
		||||
 | 
				</template> | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				<script> | 
			
		||||
 | 
					import countdownTimer from '@/components/countdown-timer/countdown-timer'; | 
			
		||||
 | 
					export default { | 
			
		||||
 | 
						components: { | 
			
		||||
 | 
							countdownTimer | 
			
		||||
 | 
						}, | 
			
		||||
 | 
						data(){ | 
			
		||||
 | 
							return { | 
			
		||||
 | 
								pay_list: [{ | 
			
		||||
 | 
									name: '余额支付', | 
			
		||||
 | 
									icon: 'icon--', | 
			
		||||
 | 
									checked: false | 
			
		||||
 | 
								},{ | 
			
		||||
 | 
									name: '微信支付', | 
			
		||||
 | 
									icon: 'icon--1', | 
			
		||||
 | 
									checked: true | 
			
		||||
 | 
								}], | 
			
		||||
 | 
								time: new Date('2021/09/8 14:15:00').getTime() - new Date('2021/09/8 14:10:00').getTime() | 
			
		||||
 | 
							} | 
			
		||||
 | 
						}, | 
			
		||||
 | 
						onLoad(){ | 
			
		||||
 | 
							 | 
			
		||||
 | 
						}, | 
			
		||||
 | 
						methods: { | 
			
		||||
 | 
							checkChange(event, current){ | 
			
		||||
 | 
								let list = this.pay_list.map((item, index) => { | 
			
		||||
 | 
									if(index == current){ | 
			
		||||
 | 
										item.checked = true; | 
			
		||||
 | 
									}else{ | 
			
		||||
 | 
										item.checked = false; | 
			
		||||
 | 
									} | 
			
		||||
 | 
									return item; | 
			
		||||
 | 
								}) | 
			
		||||
 | 
								this.pay_list = list; | 
			
		||||
 | 
							}, | 
			
		||||
 | 
							dateFinish(){ | 
			
		||||
 | 
								console.log("倒计时结束"); | 
			
		||||
 | 
							}, | 
			
		||||
 | 
							confirm(){ | 
			
		||||
 | 
								this.$msg('支付成功') | 
			
		||||
 | 
							} | 
			
		||||
 | 
						} | 
			
		||||
 | 
					} | 
			
		||||
 | 
				</script> | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				<style> | 
			
		||||
 | 
					page{ | 
			
		||||
 | 
						background-color: #F8F8F8; | 
			
		||||
 | 
					} | 
			
		||||
 | 
				</style> | 
			
		||||
 | 
				<style lang="scss" scoped="scoped"> | 
			
		||||
 | 
					.content{ | 
			
		||||
 | 
						padding: 30rpx 32rpx; | 
			
		||||
 | 
						width: 750rpx; | 
			
		||||
 | 
						height: max-content; | 
			
		||||
 | 
						box-sizing: border-box; | 
			
		||||
 | 
						.card{ | 
			
		||||
 | 
							width: 100%; | 
			
		||||
 | 
							height: max-content; | 
			
		||||
 | 
							padding: 30rpx 40rpx; | 
			
		||||
 | 
							background-color: #FFFFFF; | 
			
		||||
 | 
							border-radius: 20rpx; | 
			
		||||
 | 
							&:nth-child(n+2){ | 
			
		||||
 | 
								margin-top: 30rpx; | 
			
		||||
 | 
							} | 
			
		||||
 | 
							.symbol{ | 
			
		||||
 | 
								color: #15716E; | 
			
		||||
 | 
								font-size: 32rpx; | 
			
		||||
 | 
							} | 
			
		||||
 | 
							.price{ | 
			
		||||
 | 
								font-size: 72rpx; | 
			
		||||
 | 
								color: #15716E; | 
			
		||||
 | 
								font-weight: bold; | 
			
		||||
 | 
							} | 
			
		||||
 | 
							.tips{ | 
			
		||||
 | 
								font-size: 24rpx; | 
			
		||||
 | 
								color: #FF9D9D; | 
			
		||||
 | 
								display: flex; | 
			
		||||
 | 
							} | 
			
		||||
 | 
						} | 
			
		||||
 | 
					} | 
			
		||||
 | 
					 | 
			
		||||
 | 
					.fixed-btn{ | 
			
		||||
 | 
						position: fixed; | 
			
		||||
 | 
						bottom: 10vh; | 
			
		||||
 | 
						left: calc(50% - 275rpx); | 
			
		||||
 | 
						width: 550rpx; | 
			
		||||
 | 
						height: 100rpx; | 
			
		||||
 | 
						background-color: #15716E; | 
			
		||||
 | 
						color: #FFFFFF; | 
			
		||||
 | 
						text-align: center; | 
			
		||||
 | 
						line-height: 100rpx; | 
			
		||||
 | 
						font-size: 32rpx; | 
			
		||||
 | 
						border-radius: 50rpx; | 
			
		||||
 | 
					} | 
			
		||||
 | 
				</style> | 
			
		||||
						Write
						Preview
					
					
					Loading…
					
					Cancel
						Save
					
		Reference in new issue