186 lines
4.3 KiB
Vue
186 lines
4.3 KiB
Vue
<template>
|
|
<div class="verify-content" v-if="show" @mousemove="mouseMove" @mouseup="mouseUp">
|
|
<div class="imgBox" :style="{width:data.originalWidth+'px',height:data.originalHeight + 'px'}">
|
|
<img :src="data.backImage" style="width:100%;height:100%" alt="">
|
|
<img class="slider" :src="data.slidingImage" :style="{left:distance+'px',top:data.randomY+'px'}" :width="data.sliderWidth" :height="data.sliderHeight" alt="">
|
|
<Icon type="md-refresh" class="refresh" @click="refresh" />
|
|
</div>
|
|
<div class="handle" :style="{width:data.originalWidth+'px'}">
|
|
<span class="bgcolor" :style="{width:distance + 'px',background:bgColor}"></span>
|
|
<span class="swiper" :style="{left:distance + 'px'}" @mousedown="mouseDown">
|
|
<Icon type="md-arrow-round-forward" />
|
|
</span>
|
|
<span class="text">{{verifyText}}</span>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
<script>
|
|
import { getVerifyImg, postVerifyImg } from './verify.js';
|
|
export default {
|
|
props: {
|
|
verifyType: {
|
|
defalut: 'LOGIN',
|
|
type: String
|
|
}
|
|
},
|
|
data () {
|
|
return {
|
|
show: false, // 验证码显隐
|
|
type: 'LOGIN', // 请求类型
|
|
data: { // 验证码数据
|
|
backImage: '',
|
|
slidingImage: '',
|
|
originalHeight: 150,
|
|
originalWidth: 300,
|
|
sliderWidth: 60,
|
|
sliderHeight: 60
|
|
},
|
|
distance: 0, // 拼图移动距离
|
|
flag: false, // 判断滑块是否按下
|
|
downX: 0, // 鼠标按下位置
|
|
bgColor: 'aqua', // 滑动背景颜色
|
|
verifyText: '拖动滑块解锁' // 文字提示
|
|
};
|
|
},
|
|
methods: {
|
|
mouseDown (e) {
|
|
this.downX = e.clientX;
|
|
this.flag = true;
|
|
},
|
|
mouseMove (e) {
|
|
if (this.flag) {
|
|
let offset = e.clientX - this.downX;
|
|
|
|
if (offset > this.data.originalWidth - 43) {
|
|
this.distance = this.data.originalWidth - 43;
|
|
} else if (offset < 0) {
|
|
this.distance = 0;
|
|
} else {
|
|
this.distance = offset;
|
|
}
|
|
}
|
|
},
|
|
mouseUp () {
|
|
if (!this.flag) return false;
|
|
this.flag = false;
|
|
let params = {
|
|
verificationEnums: this.type,
|
|
xPos: this.distance
|
|
};
|
|
postVerifyImg(params).then(res => {
|
|
if (res.result) {
|
|
this.bgColor = 'green';
|
|
this.verifyText = '解锁成功';
|
|
this.$emit('change', { status: true, distance: this.distance });
|
|
} else {
|
|
this.bgColor = 'red';
|
|
this.verifyText = '解锁失败';
|
|
let that = this;
|
|
setTimeout(() => {
|
|
that.refresh();
|
|
}, 1000);
|
|
this.$emit('change', { status: false, distance: this.distance });
|
|
}
|
|
});
|
|
},
|
|
refresh () {
|
|
this.flag = false;
|
|
this.downX = 0;
|
|
this.distance = 0;
|
|
this.bgColor = 'aqua';
|
|
this.verifyText = '拖动滑块解锁';
|
|
this.getImg();
|
|
},
|
|
getImg () {
|
|
getVerifyImg(this.type).then(res => {
|
|
this.data = res.result;
|
|
});
|
|
}
|
|
},
|
|
created () {
|
|
// this.getImg();
|
|
},
|
|
watch: {
|
|
verifyType: {
|
|
immediate: true,
|
|
handler: function (v) {
|
|
this.type = v;
|
|
// this.refresh();
|
|
}
|
|
},
|
|
show (v) {
|
|
if (v) this.refresh();
|
|
}
|
|
}
|
|
};
|
|
</script>
|
|
<style lang="scss" scoped>
|
|
.verify-content{
|
|
padding: 10px;
|
|
background: #fff;
|
|
border: 1px solid #eee;
|
|
border-radius: 5px;
|
|
box-shadow: 1px 1px 3px #999;
|
|
}
|
|
.imgBox {
|
|
width: 300px;
|
|
height: 150px;
|
|
position: relative;
|
|
overflow: hidden;
|
|
|
|
.slider {
|
|
position: absolute;
|
|
cursor: pointer;
|
|
}
|
|
|
|
.refresh {
|
|
position: absolute;
|
|
right: 5px;
|
|
top: 5px;
|
|
font-size: 20px;
|
|
color: #fff;
|
|
cursor: pointer;
|
|
}
|
|
}
|
|
.handle {
|
|
border: 1px solid rgb(134, 134, 134);
|
|
margin-top: 5px;
|
|
height: 42px;
|
|
background: #ddd;
|
|
position: relative;
|
|
|
|
.bgcolor {
|
|
position: absolute;
|
|
top: 0;
|
|
left: 0;
|
|
width: 40px;
|
|
height: 40px;
|
|
opacity: 0.5;
|
|
background: aqua;
|
|
}
|
|
|
|
.swiper {
|
|
position: absolute;
|
|
width: 40px;
|
|
height: 40px;
|
|
background-color: #fff;
|
|
cursor: pointer;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
.ivu-icon {
|
|
font-size: 20px;
|
|
}
|
|
}
|
|
|
|
.text {
|
|
display: inline-block;
|
|
width: inherit;
|
|
text-align: center;
|
|
line-height: 42px;
|
|
font-size: 14px;
|
|
user-select: none;
|
|
}
|
|
}
|
|
</style>
|