Compare commits
	
		
			No commits in common. "bcbf85525862c0dbbdfbce1a8380d7c605b651b3" and "09e3861b06594699f813c72c41ab8edc02a831b7" have entirely different histories.
		
	
	
		
			bcbf855258
			...
			09e3861b06
		
	
		
							
								
								
									
										
											BIN
										
									
								
								app/components/slider-verify/slider-verify-image/de_DE/bg.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 600 KiB | 
| After Width: | Height: | Size: 610 KiB | 
							
								
								
									
										
											BIN
										
									
								
								app/components/slider-verify/slider-verify-image/de_DE/error.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 4.9 KiB | 
| After Width: | Height: | Size: 6.0 KiB | 
							
								
								
									
										
											BIN
										
									
								
								app/components/slider-verify/slider-verify-image/en_US/bg.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 681 KiB | 
| After Width: | Height: | Size: 691 KiB | 
							
								
								
									
										
											BIN
										
									
								
								app/components/slider-verify/slider-verify-image/en_US/error.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 4.4 KiB | 
| After Width: | Height: | Size: 5.8 KiB | 
| After Width: | Height: | Size: 1.0 KiB | 
							
								
								
									
										
											BIN
										
									
								
								app/components/slider-verify/slider-verify-image/ja_JP/bg.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 600 KiB | 
| After Width: | Height: | Size: 611 KiB | 
							
								
								
									
										
											BIN
										
									
								
								app/components/slider-verify/slider-verify-image/ja_JP/error.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 6.4 KiB | 
| After Width: | Height: | Size: 6.4 KiB | 
							
								
								
									
										
											BIN
										
									
								
								app/components/slider-verify/slider-verify-image/reload.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								app/components/slider-verify/slider-verify-image/zh_CN/bg.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 681 KiB | 
| After Width: | Height: | Size: 691 KiB | 
							
								
								
									
										
											BIN
										
									
								
								app/components/slider-verify/slider-verify-image/zh_CN/error.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 7.2 KiB | 
| After Width: | Height: | Size: 7.2 KiB | 
							
								
								
									
										
											BIN
										
									
								
								app/components/slider-verify/slider-verify-image/zh_TW/bg.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 600 KiB | 
| After Width: | Height: | Size: 611 KiB | 
							
								
								
									
										
											BIN
										
									
								
								app/components/slider-verify/slider-verify-image/zh_TW/error.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 4.8 KiB | 
| After Width: | Height: | Size: 4.9 KiB | 
							
								
								
									
										418
									
								
								app/components/slider-verify/slider-verify/index.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,418 @@ | |||||||
|  | <template> | ||||||
|  | 	<view class="slider-verify-box" v-if="isShow"> | ||||||
|  | 		<view :style="`background-image: url('../../static/image/slider-verify/${ | ||||||
|  | 				$i18n.locale | ||||||
|  | 			}/${isError ? 'bg_error' : 'bg'}.png');`" class="verifyBox"> | ||||||
|  | 			<!-- <view class="slider-title">{{ $t('authentication.title') }}</view> --> | ||||||
|  | 			<image class="slider-verify-box-close" src="/static/image/icon/close.png" @click.stop="hideSliderBox"> | ||||||
|  | 			</image> | ||||||
|  | 			<view class="slide-content"> | ||||||
|  | 				<view class="slider-pintu"> | ||||||
|  | 					<!-- <u-icon | ||||||
|  | 						name="reload" | ||||||
|  | 						size="32" | ||||||
|  | 						color="#fff" | ||||||
|  | 						class="reload" | ||||||
|  | 						@tap="refreshVerify" | ||||||
|  | 						v-if="!isLoading" | ||||||
|  | 					></u-icon> --> | ||||||
|  | 					<image src="../../static/image/slider-verify/reload.png" mode="widthFix" style="width: 38rpx" | ||||||
|  | 						class="reload" @tap="refreshVerify" v-if="!isLoading"></image> | ||||||
|  | 					<view class="load" v-if="isLoading"> | ||||||
|  | 						<van-loading type="spinner" /> | ||||||
|  | 						<!-- <u-loading-icon text="" textSize="16" :vertical="true"></u-loading-icon> --> | ||||||
|  | 					</view> | ||||||
|  | 					<template v-else> | ||||||
|  | 						<image id="pintuImg" :src="canvasSrc" class="pintu"></image> | ||||||
|  | 						<view class="pintukuai" :style="{ top: '0px', left: oldx + 'px' }"> | ||||||
|  | 							<image :src="blockSrc" :style="{ | ||||||
|  | 									top: blockY + 'px', | ||||||
|  | 									left: oldx + 'px', | ||||||
|  | 									width: blockWidth + 'px', | ||||||
|  | 									height: blockHeight + 'px' | ||||||
|  | 								}"></image> | ||||||
|  | 						</view> | ||||||
|  | 						<view class="mark" v-if="isMess"> | ||||||
|  | 							<image :src="`../../static/image/slider-verify/${$i18n.locale}/error.png`" mode="widthFix" | ||||||
|  | 								v-if="isError"></image> | ||||||
|  | 							<image :src="`../../static/image/slider-verify/${$i18n.locale}/success.png`" mode="widthFix" | ||||||
|  | 								v-else></image> | ||||||
|  | 						</view> | ||||||
|  | 					</template> | ||||||
|  | 				</view> | ||||||
|  | 				<view class="slider-movearea" @touchend="endTouchMove"> | ||||||
|  | 					<movable-area :animation="true"> | ||||||
|  | 						<movable-view :class=" | ||||||
|  | 								isLoading | ||||||
|  | 									? 'movable-view btn_info' | ||||||
|  | 									: isError | ||||||
|  | 									? 'movable-view btn_error' | ||||||
|  | 									: 'movable-view btn_success' | ||||||
|  | 							" :x="x" direction="horizontal" @change="startMove"></movable-view> | ||||||
|  | 					</movable-area> | ||||||
|  | 					<view class="huadao">{{ | ||||||
|  | 						$t('authentication.content') | ||||||
|  | 					}}</view> | ||||||
|  | 					<view :class=" | ||||||
|  | 							isError ? 'huadao_done error_bg' : 'huadao_done' | ||||||
|  | 						" :style="'width:' + doneWindth + 'px;'"></view> | ||||||
|  | 				</view> | ||||||
|  | 			</view> | ||||||
|  | 		</view> | ||||||
|  | 	</view> | ||||||
|  | </template> | ||||||
|  | 
 | ||||||
|  | <script> | ||||||
|  | 	import { | ||||||
|  | 		postDataByParams | ||||||
|  | 	} from '../../utils/api.js' | ||||||
|  | 
 | ||||||
|  | 	export default { | ||||||
|  | 		name: 'slider-verify', | ||||||
|  | 		props: { | ||||||
|  | 			isShow: { | ||||||
|  | 				type: Boolean, | ||||||
|  | 				default: true | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
|  | 		data() { | ||||||
|  | 			return { | ||||||
|  | 				x: 0, //初始距离 | ||||||
|  | 				oldx: 0, //移动的距离 | ||||||
|  | 				top: 0, //拼图的top距离 | ||||||
|  | 				canvasSrc: '', | ||||||
|  | 				blockSrc: '', | ||||||
|  | 				blockY: '', | ||||||
|  | 				nonceStr: '', | ||||||
|  | 				blockWidth: 50, //块图像的宽度(blockWidth大于14) | ||||||
|  | 				blockHeight: 50, | ||||||
|  | 				isLoading: true, | ||||||
|  | 				doneWindth: 0, | ||||||
|  | 				isError: false, | ||||||
|  | 				isMess: false | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
|  | 		watch: { | ||||||
|  | 			// 每次打开重新刷新拼图 | ||||||
|  | 			isShow(newValue, oldValue) { | ||||||
|  | 				if (newValue) { | ||||||
|  | 					this.refreshVerify() //刷新 | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
|  | 		mounted() { | ||||||
|  | 			var that = this | ||||||
|  | 			// that.refreshVerify(); | ||||||
|  | 			that.getCaptcha() | ||||||
|  | 			// console.log(this.$i18n.locale, 'this.$i18n.locale') | ||||||
|  | 		}, | ||||||
|  | 		methods: { | ||||||
|  | 			async getCaptcha() { | ||||||
|  | 				this.isLoading = true | ||||||
|  | 				var that = this | ||||||
|  | 				let url = 'generate/captcha' | ||||||
|  | 				let params = { | ||||||
|  | 					canvasWidth: 320, //画布的宽度(canvasWidth大于41并且(canvasWidth-10)/2 - 1> blockWidth) | ||||||
|  | 					canvasHeight: 190, //画布的高度(canvasHeight大于26并且 canvasHeight - blockHeight > 11 | ||||||
|  | 					blockWidth: this.blockWidth, //块图像的宽度(blockWidth大于14) | ||||||
|  | 					blockHeight: this.blockHeight, //块图像的高度(blockHeight大于14) | ||||||
|  | 					// blockRadius: 9, //块图像的圆角半径 | ||||||
|  | 					place: 0 //图像来源标识,0表示URL下载,1表示本地文件  一般用0 | ||||||
|  | 				} | ||||||
|  | 				postDataByParams(url, params) | ||||||
|  | 					.then((res) => { | ||||||
|  | 						if (res.status === 0) { | ||||||
|  | 							that.canvasSrc = 'data:image/jpg;base64,' + res.data.canvasSrc | ||||||
|  | 							that.blockSrc = 'data:image/jpg;base64,' + res.data.blockSrc | ||||||
|  | 							that.blockY = res.data.blockY | ||||||
|  | 							that.nonceStr = res.data.nonceStr | ||||||
|  | 							that.isLoading = false | ||||||
|  | 						} else { | ||||||
|  | 							this.$emit('sliderError', encodeURIComponent(JSON.stringify(res))) | ||||||
|  | 						} | ||||||
|  | 					}) | ||||||
|  | 					.catch((err) => { | ||||||
|  | 						this.$emit('sliderError', encodeURIComponent(JSON.stringify(err)), true) | ||||||
|  | 					}); | ||||||
|  | 			}, | ||||||
|  | 			//刷新验证 | ||||||
|  | 			refreshVerify() { | ||||||
|  | 				this.x = 1 | ||||||
|  | 				this.oldx = 1 | ||||||
|  | 				setTimeout(() => { | ||||||
|  | 					this.x = 0 | ||||||
|  | 					this.oldx = 0 | ||||||
|  | 					this.doneWindth = 0 | ||||||
|  | 				}, 300) | ||||||
|  | 				this.getCaptcha() | ||||||
|  | 				this.isError = false | ||||||
|  | 				this.isMess = false | ||||||
|  | 			}, | ||||||
|  | 			/* 滑动中 */ | ||||||
|  | 			startMove(e) { | ||||||
|  | 				// console.log(e.detail.x) | ||||||
|  | 				this.oldx = e.detail.x / 2 - 5 | ||||||
|  | 				if (e.detail.x > 1) { | ||||||
|  | 					this.doneWindth = e.detail.x + 30 | ||||||
|  | 				} else { | ||||||
|  | 					this.doneWindth = 0 | ||||||
|  | 				} | ||||||
|  | 			}, | ||||||
|  | 			/* 滑动结束 */ | ||||||
|  | 			async endTouchMove() { | ||||||
|  | 				var that = this | ||||||
|  | 				// console.log('滑块结束') | ||||||
|  | 				let url = 'validate/captcha' | ||||||
|  | 				let params = { | ||||||
|  | 					nonceStr: this.nonceStr, | ||||||
|  | 					blockX: this.oldx * 2 + 5 | ||||||
|  | 				} | ||||||
|  | 				postDataByParams(url, params) | ||||||
|  | 					.then((res) => { | ||||||
|  | 						this.isMess = true | ||||||
|  | 						if (res.status == 0) { | ||||||
|  | 							setTimeout(() => { | ||||||
|  | 								that.$emit('touchSliderResult', res.data.nonceStr) | ||||||
|  | 							}, 1000) | ||||||
|  | 						} else { | ||||||
|  | 							this.isError = true | ||||||
|  | 							this.$emit('sliderError', encodeURIComponent(JSON.stringify(res))) | ||||||
|  | 						} | ||||||
|  | 					}) | ||||||
|  | 					.catch((err) => { | ||||||
|  | 						this.$emit('sliderError', encodeURIComponent(JSON.stringify(err)), true) | ||||||
|  | 					}); | ||||||
|  | 			}, | ||||||
|  | 			/* 重置阴影位置 */ | ||||||
|  | 			/* resetMove() { | ||||||
|  | 				this.x = 1; | ||||||
|  | 				this.oldx = 1; | ||||||
|  | 				setTimeout(() => { | ||||||
|  | 					this.x = 0; | ||||||
|  | 					this.oldx = 0; | ||||||
|  | 				}, 300); | ||||||
|  | 			}, */ | ||||||
|  | 			// 关闭 | ||||||
|  | 			closeSlider() { | ||||||
|  | 				this.$emit('touchSliderResult', false) | ||||||
|  | 			}, | ||||||
|  | 			//隐藏滑块验证弹窗 | ||||||
|  | 			hideSliderBox() { | ||||||
|  | 				this.$emit('hideSliderBox') | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | </script> | ||||||
|  | 
 | ||||||
|  | <style lang="scss"> | ||||||
|  | 	.slider-verify-box { | ||||||
|  | 		position: fixed; | ||||||
|  | 		top: 0; | ||||||
|  | 		left: 0; | ||||||
|  | 		width: 100%; | ||||||
|  | 		height: 100%; | ||||||
|  | 		background-color: rgba(0, 0, 0, 0.5); | ||||||
|  | 		z-index: 999; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.error_box { | ||||||
|  | 		// background: url('../../static/image/slider-verify/bg_error.png') no-repeat !important; | ||||||
|  | 		background-size: 100% 100% !important; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.verifyBox { | ||||||
|  | 		// width: 588rpx; | ||||||
|  | 		// height: 662rpx; | ||||||
|  | 		padding: 218rpx 45rpx 30rpx 45rpx; | ||||||
|  | 		position: absolute; | ||||||
|  | 		top: 50%; | ||||||
|  | 		left: 50%; | ||||||
|  | 		transform: translate(-50%, -50%); | ||||||
|  | 		// width: 85%; | ||||||
|  | 		// background-color: #fff; | ||||||
|  | 		background-repeat: no-repeat; | ||||||
|  | 		// background: url('../../static/image/slider-verify/bg.png') no-repeat; | ||||||
|  | 		background-size: 100% 100%; | ||||||
|  | 		border-radius: 20upx; | ||||||
|  | 		// box-shadow: 0 0 5upx rgba(0, 0, 0, 1); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 		.slider-verify-box-close { | ||||||
|  | 			width: 40rpx; | ||||||
|  | 			height: 40rpx; | ||||||
|  | 			position: absolute; | ||||||
|  | 			top: 0; | ||||||
|  | 			right: 0; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		.slider-title { | ||||||
|  | 			font-size: 36upx; | ||||||
|  | 			text-align: center; | ||||||
|  | 			padding: 12rpx 0; | ||||||
|  | 			color: #000000; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		.slide-content { | ||||||
|  | 			// width: 560rpx; | ||||||
|  | 			// padding: 0 ; | ||||||
|  | 			// margin: 0 auto; | ||||||
|  | 
 | ||||||
|  | 			.slide-tips { | ||||||
|  | 				font-size: 28rpx; | ||||||
|  | 				color: rgba(2, 20, 33, 0.45); | ||||||
|  | 				padding: 0.5em 0; | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			.slider-pintu { | ||||||
|  | 				position: relative; | ||||||
|  | 				width: 100%; | ||||||
|  | 				border-radius: 10rpx; | ||||||
|  | 				overflow: hidden; | ||||||
|  | 
 | ||||||
|  | 				.reload { | ||||||
|  | 					position: absolute; | ||||||
|  | 					right: 10rpx; | ||||||
|  | 					top: 10rpx; | ||||||
|  | 					z-index: 110; | ||||||
|  | 				} | ||||||
|  | 
 | ||||||
|  | 				.load { | ||||||
|  | 					width: 320px; | ||||||
|  | 					height: 190px; | ||||||
|  | 					display: flex; | ||||||
|  | 					align-items: center; | ||||||
|  | 					justify-content: center; | ||||||
|  | 					margin: 0 auto; | ||||||
|  | 					background: #000000; | ||||||
|  | 				} | ||||||
|  | 
 | ||||||
|  | 				.pintu { | ||||||
|  | 					width: 320px; | ||||||
|  | 					height: 190px; | ||||||
|  | 					display: block; | ||||||
|  | 					margin: 0 auto; | ||||||
|  | 				} | ||||||
|  | 
 | ||||||
|  | 				.pintukuai { | ||||||
|  | 					position: absolute; | ||||||
|  | 					/* top: 0; | ||||||
|  | 				left: 0; */ | ||||||
|  | 					z-index: 100; | ||||||
|  | 					box-shadow: 0 0 5upx rgba(0, 0, 0, 0.3); | ||||||
|  | 
 | ||||||
|  | 					image { | ||||||
|  | 						display: block; | ||||||
|  | 						position: absolute; | ||||||
|  | 						top: 0; | ||||||
|  | 						left: 0; | ||||||
|  | 						/* width: 560rpx; | ||||||
|  | 					height: 315rpx; */ | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 
 | ||||||
|  | 				.mark { | ||||||
|  | 					position: absolute; | ||||||
|  | 					top: 0; | ||||||
|  | 					left: 0; | ||||||
|  | 					right: 0; | ||||||
|  | 					bottom: 0; | ||||||
|  | 					background: #000000; | ||||||
|  | 					z-index: 101; | ||||||
|  | 					display: flex; | ||||||
|  | 					align-items: center; | ||||||
|  | 					justify-content: center; | ||||||
|  | 
 | ||||||
|  | 					image { | ||||||
|  | 						width: 60%; | ||||||
|  | 						height: 50rpx; | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			.yinying { | ||||||
|  | 				position: absolute; | ||||||
|  | 				width: 120rpx; | ||||||
|  | 				height: 120rpx; | ||||||
|  | 				background-color: rgba(0, 0, 0, 0.5); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.slider-movearea { | ||||||
|  | 		position: relative; | ||||||
|  | 		height: 80upx; | ||||||
|  | 		width: 320px; | ||||||
|  | 		margin-top: 25rpx; | ||||||
|  | 
 | ||||||
|  | 		movable-area { | ||||||
|  | 			width: 100%; | ||||||
|  | 			height: 64rpx; | ||||||
|  | 
 | ||||||
|  | 			.movable-view { | ||||||
|  | 				width: 100upx; | ||||||
|  | 				height: 74rpx; | ||||||
|  | 				border-radius: 40upx; | ||||||
|  | 				// background-color: #699A70; | ||||||
|  | 				background-image: url(../../static/image/slider-verify/icon-button-normal.png); | ||||||
|  | 				background-repeat: no-repeat; | ||||||
|  | 				background-size: auto 30upx; | ||||||
|  | 				background-position: center; | ||||||
|  | 				position: relative; | ||||||
|  | 				z-index: 100; | ||||||
|  | 				border: 1px solid transparent; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.btn_info { | ||||||
|  | 		background-color: #878787 !important; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.btn_error { | ||||||
|  | 		background-color: #fd343c !important; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.btn_success { | ||||||
|  | 		background-color: #699a70 !important; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.error_bg { | ||||||
|  | 		background-color: #ffb7ba !important; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.success_bg { | ||||||
|  | 		background-color: #aad0b0 !important; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.huadao { | ||||||
|  | 		width: 100%; | ||||||
|  | 		// width: 320px; | ||||||
|  | 		height: 66upx; | ||||||
|  | 		line-height: 66upx; | ||||||
|  | 		background: #ededed; | ||||||
|  | 		// box-shadow: inset 0 0 5upx #EDEDED; | ||||||
|  | 		border-radius: 40rpx; | ||||||
|  | 		color: #bcbcbc; | ||||||
|  | 		text-align: center; | ||||||
|  | 		box-sizing: border-box; | ||||||
|  | 		position: absolute; | ||||||
|  | 		top: 7rpx; | ||||||
|  | 		left: 0; | ||||||
|  | 		font-size: 28rpx; | ||||||
|  | 		z-index: 99; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.huadao_done { | ||||||
|  | 		height: 66upx; | ||||||
|  | 		line-height: 66upx; | ||||||
|  | 		background: #aad0b0; | ||||||
|  | 		border-radius: 40rpx; | ||||||
|  | 		text-align: center; | ||||||
|  | 		box-sizing: border-box; | ||||||
|  | 		position: absolute; | ||||||
|  | 		top: 7rpx; | ||||||
|  | 		left: 0; | ||||||
|  | 		font-size: 28rpx; | ||||||
|  | 		z-index: 99; | ||||||
|  | 	} | ||||||
|  | </style> | ||||||