滑动验证码--前端部分

1.原理

后端预先保存n张图片用来做滑动验证码的素材,然后在图片上面随机取一块固定大小的小图片作为滑动的素材,然后记录小图片相对于大图的位置,也就是小图上边距和大图上边距之前的距离(x坐标),小图左边距和大图左边距的距离(y坐标)。
前端先请求图片资源,后端返回大图、小图和小图的(y坐标),当用户拖动小图后,获取到小图的x坐标,将此时小图的x,y坐标返给后端做验证。
在这里插入图片描述
在这里插入图片描述

<!--html-->
    <!--滑动验证码-->
	<div class="img_bg" v-if="showImgContent">
						<!--滑动容器-->
                        <div class="sliderImg" >
                        	<!--大图-->
                            <img :src="save_big_url" alt="" class="big_img">
                            <!--小图-->
                            <img :src="save_small_url"
                                 alt="" class="small_img"
                                 ref="small_img"
                                 @mousedown="move"
                            >
                            <div class="img_tip">请滑动验证码进行验证。</div>
                        </div>
                    </div>
//js
data() {
	return {
		showImgContent: false,//是否展示图片验证码
		isCheckImg: false,// 是否使用滑动验证码
		positionX: 0, // 小图相对大图的左边距
		positionY: 0,// 小图相对大图的上边距
		save_big_url: "",//小图url
		save_small_url: "",//大图url
	}
}
methods:{
 	// 获取验证图片和参数
	async mixVerifyCode(x = "") {	// x为空,请求图片和参数,验证时传x坐标
		let result;
		await httpServer("获取验证码图片和y坐标", {
			xvalue: x
		})
		.then((res) => {
			result = res;
		})
		.catch((err) => {
		})
		return result;
	},

	// 渲染图片
	showImg() {
		this.mixVerifyCode().then((res) => {
		// 给图片URL赋值
		this.save_big_url = res.save_big_url
		this.save_small_url = res.save_small_url
		// 初始化小图的位置
		this.$refs.small_img.style.top = `${res.yvalue}px`;
		this.$refs.small_img.style.left = `10px`;
		});
	},

	// 滑动验证码
	move(e) {
	let odiv = e.target;        //获取目标元素(小图)
	
	//算出鼠标相对元素的位置
	let disX = e.clientX - odiv.offsetLeft;
	let disY = e.clientY - odiv.offsetTop;
	
	// 鼠标移动时
	document.onmousemove = (e) => {       //鼠标按下并移动的事件
		if (e.preventDefault) e.preventDefault();
		
		//用鼠标的位置减去鼠标相对元素的位置,得到元素的位置
		let left = e.clientX - disX;
		let top = e.clientY - disY;
		
		//绑定元素位置到positionX和positionY上面
		this.positionX = left;
		this.positionY = top;
		
		let bigImg = document.getElementsByClassName("big_img")[0];
		const bigX = bigImg.clientWidth - odiv.offsetWidth;
		
		left = Math.min(Math.max(0, left), bigX);
		
		 //移动当前元素
		odiv.style.left = left + 'px';
	};
	
	// 鼠标按键释放时
	document.onmouseup = (e) => {
		if (e.stopPropagation) e.stopPropagation();
		if (e.preventDefault) e.preventDefault();
		e.cancelBubble = true;
		
		document.onmousemove = null;
		document.onmouseup = null;
		
		// 计算小图x值
		const xvalue = e.clientX - e.offsetX - document.getElementsByClassName("big_img")[0].getBoundingClientRect().x;
		
		// 想后端发起验证请求
		this.mixVerifyCode(parseInt(xvalue).toString()).then((res) => {
			if (res.is_success) {
				// 验证通过
				this.showImgContent = false;
				this.isCheckImg = true;
				// 继续你的业务逻辑
			} else {
				// 验证未通过
				this.isCheckImg = false;
				this.showImg();// 刷新图片验证码
				odiv.style.left = "0px";
			}
		})
		};
	}
}
  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以使用第三方库 React Swipeable,它提供了一个 Swipeable 组件,可以使用触摸操作进行滑动。结合 Canvas 可以实现滑动验证码功能。 具体实现步骤如下: 1. 安装 React Swipeable:`npm install react-swipeable --save` 2. 创建 Swipeable 组件,并添加 onTouchEnd 事件监听: ```jsx import React from 'react'; import Swipeable from 'react-swipeable'; class SwipeableCanvas extends React.Component { handleSwipe = () => { // 滑动成功,执行相应操作 } render() { return ( <Swipeable onSwiped={this.handleSwipe}> <canvas width="300" height="150"></canvas> </Swipeable> ); } } export default SwipeableCanvas; ``` 3. 在 handleSwipe 方法中,获取 canvas 上下文并绘制验证码: ```jsx handleSwipe = () => { const canvas = document.getElementsByTagName('canvas')[0]; const ctx = canvas.getContext('2d'); const text = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678'; // 绘制背景 ctx.fillStyle = '#f5f5f5'; ctx.fillRect(0, 0, canvas.width, canvas.height); // 绘制文字 ctx.font = 'bold 50px Arial'; for (let i = 0; i < 4; i++) { const char = text.charAt(Math.floor(Math.random() * text.length)); ctx.fillStyle = `rgb(${Math.random() * 255},${Math.random() * 255},${Math.random() * 255})`; ctx.fillText(char, i * 70 + 20, 80); } } ``` 4. 在 Swipeable 组件中添加 onTouchMove 事件监听,实现滑动效果: ```jsx handleTouchMove = (e) => { e.preventDefault(); const canvas = document.getElementsByTagName('canvas')[0]; const ctx = canvas.getContext('2d'); // 获取 canvas 左边距离页面左边的距离 const canvasLeft = canvas.getBoundingClientRect().left; // 获取触摸点在 canvas 中的坐标 const touchX = e.changedTouches[0].clientX - canvasLeft; const touchY = e.changedTouches[0].clientY - canvas.offsetTop; // 绘制滑动轨迹 ctx.beginPath(); ctx.moveTo(this.lastX, this.lastY); ctx.lineTo(touchX, touchY); ctx.strokeStyle = '#000'; ctx.lineWidth = 5; ctx.stroke(); this.lastX = touchX; this.lastY = touchY; } handleSwipe = () => { // 判断滑动是否成功,执行相应操作 } handleTouchStart = (e) => { const canvas = document.getElementsByTagName('canvas')[0]; // 获取 canvas 左边距离页面左边的距离 const canvasLeft = canvas.getBoundingClientRect().left; // 获取触摸点在 canvas 中的坐标 this.lastX = e.changedTouches[0].clientX - canvasLeft; this.lastY = e.changedTouches[0].clientY - canvas.offsetTop; } render() { return ( <Swipeable onSwiped={this.handleSwipe} onSwiping={this.handleTouchMove} onSwipingStart={this.handleTouchStart} > <canvas width="300" height="150"></canvas> </Swipeable> ); } ``` 这样就可以实现一个基本的滑动验证码组件。需要注意的是,为了减少作弊行为,还需要在后端进行相应的验证
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值