vue登录人机校验--图片旋转验证

  1. login.vue文件
<template>
	<!-- 图片旋转 -->
	<uni-popup ref="visible" style="background-color: antiquewhite;">
		<!--子组件-->
		<picturesRotating :visible.sync="true" @result="result" :maskClick="maskClick" />
	</uni-popup>
</template>
<script>
import picturesRotating from '../../components/piaoyi-picturesRotating/piaoyi-picturesRotating.vue'
export default {
	components:{
		picturesRotating
	},
	data(){
		return{
			maskClick: true
		}
	},
	methods:{
		result(e) {
			this.verivyIs = e
			if (e) {
				this.$refs.visible.close()
			}
		}
	}
}
</script>
  1. piaoyi-picturesRotating.vue 文件
<template>
	<view class="piaoyi-picturesRotating">
		<view class="picturesRotating" v-if="visible">
			<view class="title">
				人工验证
			</view>
			<view class="mintitle">
				滑动滑块,使图片显示角度为正
			</view>
			<view class="detail" :class="{'detailactive' : detail == '验证失败,请重试'}">
				{{detail ? detail : ''}}
			</view>
			<view class="imgbox" :style="'transform: rotate(' + deg + 'deg);'">
				<image v-if="imgurl" :src="imgurl" mode=""></image>
			</view>
			<view class="movablebox">
				<movable-area>
					<movable-view @touchstart="touchstart" @touchend="touchend" :disabled="disabled" direction="horizontal" :x="x" @change="onchange">
						<image :src="icon" mode=""></image>
					</movable-view>
				</movable-area>
			</view>
		</view>
		<view @tap="close" @touchmove.stop.prevent :class="visible ? 'pupop-model' : 'pupop-models'"></view>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				x: 0,
				startDeg: 0,
				deg: 0,
				isPass: false,
				timer: null,
				disabled: false,
				detail: '',
				imgurl: '',
				imgList: [
					'https://ts2.cn.mm.bing.net/th?id=OIP-C.7DoQwd5S5Uo010esfn9ZAQAAAA&w=250&h=250&c=8&rs=1&qlt=90&o=6&dpr=1.3&pid=3.1&rm=2',
					'https://tse1-mm.cn.bing.net/th/id/OIP-C.keLuuLXa1_XmRhJiQjwZFgAAAA?w=202&h=202&c=7&r=0&o=5&dpr=1.3&pid=1.7',
					'https://tse4-mm.cn.bing.net/th/id/OIP-C.HNCroQQ0lGlvJTs4ZELojwAAAA?w=202&h=202&c=7&r=0&o=5&dpr=1.3&pid=1.7',
					'https://ts1.cn.mm.bing.net/th?id=OIP-C.UgVPqAbA56SxLMox5_4A9QHaHa&w=250&h=250&c=8&rs=1&qlt=90&o=6&dpr=1.3&pid=3.1&rm=2'
				]
			}
		},
		props: {
			visible: {
				type: Boolean,
				default: false
			},
			maskClick: {
				type: Boolean,
				default: true
			},
			icon: {
				type: String,
				default: "data:image/png;base64,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"
			}
		},
		mounted() {
			this.start()
		},
		watch: {
			visible: function() {
				this.detail = ''
				this.start()
			}
		},
		methods: {
			touchstart(e) {
			},
			touchend(e) {
				if (this.isPass) {
					this.disabled = true
					this.detail = '验证成功,2秒后自动关闭'
					setTimeout(() => {
						this.close()
						this.$emit('result', this.isPass)
					}, 2000)
				} else {
					this.detail = '验证失败,请重试'
					this.start()
				}
			},
			onchange(e) {
				var x = e.detail.x + this.startDeg
				this.deg = x
				var isPass = false
				if (Math.abs((this.startDeg + x) % 360) - this.startDeg > -10 && Math.abs((this.startDeg + x) % 360) - this.startDeg < 10) {
					isPass = true
				}
				this.isPass = isPass
			},
			start() {
				var index = this.random(0, 2)
				this.imgurl = this.imgList[index]
				console.log(this.imgurl)
				var deg = this.random(240, 300)
				this.deg = deg
				this.startDeg = deg
				this.x = this.x == 0 ? 0.1 : 0
				this.disabled = false
			},
			close() {
				if (!this.maskClick) return
				this.$emit('update:visible', false)
				this.disabled = false
			},
			random(min, max) {
			    return Math.floor(Math.random() * (max - min)) + min;
			}
		}
	}
</script>

<style lang="scss" scoped>
	.piaoyi-picturesRotating {
		.pupop-model {
			position: fixed;
			left: 0;
			top: 0;
			width: 100%;
			height: 100%;
			z-index: 100;
			background: rgba(0, 0, 0, .5);
		}
		.pupop-models{
			display: none;
		}
		.title {
			text-align: center;
			font-size: 32rpx;
			line-height: 32rpx;
			padding-top: 30rpx;
			color: #999;
		}
		.mintitle {
			text-align: center;
			font-size: 36rpx;
			line-height: 36rpx;
			font-weight: 700;
			color: #333;
			padding: 20rpx 0;
		}
		.detail {
			text-align: center;
			font-size: 32rpx;
			color: #666;
			line-height: 32rpx;
			padding-bottom: 15rpx;
		}
		.detailactive {
			color: red;
		}
		.picturesRotating {
			position: fixed;
			width: 600rpx;
			height: 800rpx;
			border-radius: 30rpx;
			left: 0;
			right: 0;
			top: 0;
			bottom: 0;
			margin: auto;
			z-index: 120;
			background: #fff;
		}
		.imgbox {
			margin: 30rpx 0;
			display: flex;
			justify-content: center;
			align-items: center;
			image {
				width: 400rpx;
				height: 400rpx;
				border-radius: 100%;
			}
		}
		.movablebox {
			padding: 0 50rpx;
			movable-area {
				height: 100rpx;
				width: 100%;
				border-radius: 100rpx;
				background: #f3f9f1;
				border: 2rpx solid rgba(0,163,68,0.3);
				movable-view {
					width: 80rpx;
					height: 80rpx;
					border-radius: 100%;
					padding: 10rpx;
					image {
						width: 100%;
						height: 100%;
					}
				}
			}
		}
	}
</style>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值