Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
N
NFT
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
JIRA
JIRA
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
hanfeng zhang
NFT
Commits
508d1712
Commit
508d1712
authored
Jul 05, 2021
by
chenqikuai
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
feat:添加滑动验证
parent
f675ee01
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
150 additions
and
3 deletions
+150
-3
index.vue
src/components/common/SlideValidator/index.vue
+132
-0
Login.vue
src/view/Auth/Login/Login.vue
+18
-3
No files found.
src/components/common/SlideValidator/index.vue
0 → 100644
View file @
508d1712
<
template
>
<div
class=
"drag"
ref=
"dragDiv"
>
<div
class=
"drag_bg"
></div>
<div
class=
"drag_text"
>
{{
confirmWords
}}
</div>
<div
ref=
"moveDiv"
@
touchstart=
"mousedownFn($event)"
:class=
"
{ handler_ok_bg: confirmSuccess }"
class="handler handler_bg"
style="position: absolute; top: 0px; left: 0px; bottom: 0px"
>
</div>
</div>
</
template
>
<
script
>
export
default
{
data
()
{
return
{
beginClientX
:
0
/*距离屏幕左端距离*/
,
mouseMoveStata
:
false
/*触发拖动状态 判断*/
,
maxwidth
:
""
/*拖动最大宽度,依据滑块宽度算出来的*/
,
confirmWords
:
"拖动滑块验证"
/*滑块文字*/
,
confirmSuccess
:
false
/*验证成功判断*/
,
};
},
methods
:
{
mousedownFn
:
function
(
e
)
{
if
(
!
this
.
confirmSuccess
)
{
e
.
preventDefault
&&
e
.
preventDefault
();
//阻止文字选中等 浏览器默认事件
this
.
mouseMoveStata
=
true
;
this
.
beginClientX
=
e
.
changedTouches
[
0
].
clientX
;
}
},
//mousedoen 事件
successFunction
()
{
this
.
confirmSuccess
=
true
;
this
.
$emit
(
"confirm"
,
true
);
this
.
confirmWords
=
"验证通过"
;
if
(
window
.
addEventListener
)
{
document
.
getElementsByTagName
(
"html"
)[
0
]
.
removeEventListener
(
"touchmove"
,
this
.
mouseMoveFn
);
document
.
getElementsByTagName
(
"html"
)[
0
]
.
removeEventListener
(
"touchend"
,
this
.
moseUpFn
);
}
else
{
document
.
getElementsByTagName
(
"html"
)[
0
]
.
removeEventListener
(
"touchend"
,
()
=>
{});
}
document
.
getElementsByClassName
(
"drag_text"
)[
0
].
style
.
color
=
"#fff"
;
document
.
getElementsByClassName
(
"handler"
)[
0
].
style
.
left
=
this
.
maxwidth
+
"px"
;
document
.
getElementsByClassName
(
"drag_bg"
)[
0
].
style
.
width
=
this
.
maxwidth
+
"px"
;
},
//验证成功函数
mouseMoveFn
(
e
)
{
if
(
this
.
mouseMoveStata
)
{
let
width
=
e
.
changedTouches
[
0
].
clientX
-
this
.
beginClientX
;
if
(
width
>
0
&&
width
<=
this
.
maxwidth
)
{
document
.
getElementsByClassName
(
"handler"
)[
0
].
style
.
left
=
width
+
"px"
;
document
.
getElementsByClassName
(
"drag_bg"
)[
0
].
style
.
width
=
width
+
"px"
;
}
else
if
(
width
>
this
.
maxwidth
)
{
this
.
successFunction
();
}
}
},
//mousemove事件
moseUpFn
(
e
)
{
this
.
mouseMoveStata
=
false
;
var
width
=
e
.
changedTouches
[
0
].
clientX
-
this
.
beginClientX
;
if
(
width
<
this
.
maxwidth
)
{
document
.
getElementsByClassName
(
"handler"
)[
0
].
style
.
left
=
0
+
"px"
;
document
.
getElementsByClassName
(
"drag_bg"
)[
0
].
style
.
width
=
0
+
"px"
;
}
},
//mouseup事件
},
mounted
()
{
this
.
maxwidth
=
this
.
$refs
.
dragDiv
.
clientWidth
-
this
.
$refs
.
moveDiv
.
clientWidth
;
document
.
getElementsByTagName
(
"html"
)[
0
]
.
addEventListener
(
"touchmove"
,
this
.
mouseMoveFn
);
document
.
getElementsByTagName
(
"html"
)[
0
]
.
addEventListener
(
"touchend"
,
this
.
moseUpFn
);
},
};
</
script
>
<
style
scoped
>
.drag
{
position
:
relative
;
background-color
:
#e8e8e8
;
width
:
100%
;
height
:
34px
;
line-height
:
34px
;
text-align
:
center
;
}
.handler
{
width
:
40px
;
border
:
1px
solid
#ccc
;
cursor
:
move
;
}
.handler_bg
{
background
:
#fff
url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA3hpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NTc3MiwgMjAxNC8wMS8xMy0xOTo0NDowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo0ZDhlNWY5My05NmI0LTRlNWQtOGFjYi03ZTY4OGYyMTU2ZTYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NTEyNTVEMURGMkVFMTFFNEI5NDBCMjQ2M0ExMDQ1OUYiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NTEyNTVEMUNGMkVFMTFFNEI5NDBCMjQ2M0ExMDQ1OUYiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo2MTc5NzNmZS02OTQxLTQyOTYtYTIwNi02NDI2YTNkOWU5YmUiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NGQ4ZTVmOTMtOTZiNC00ZTVkLThhY2ItN2U2ODhmMjE1NmU2Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+YiRG4AAAALFJREFUeNpi/P//PwMlgImBQkA9A+bOnfsIiBOxKcInh+yCaCDuByoswaIOpxwjciACFegBqZ1AvBSIS5OTk/8TkmNEjwWgQiUgtQuIjwAxUF3yX3xyGIEIFLwHpKyAWB+I1xGSwxULIGf9A7mQkBwTlhBXAFLHgPgqEAcTkmNCU6AL9d8WII4HOvk3ITkWJAXWUMlOoGQHmsE45ViQ2KuBuASoYC4Wf+OUYxz6mQkgwAAN9mIrUReCXgAAAABJRU5ErkJggg==")
no-repeat
center
;
}
.handler_ok_bg
{
background
:
#fff
url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA3hpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NTc3MiwgMjAxNC8wMS8xMy0xOTo0NDowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo0ZDhlNWY5My05NmI0LTRlNWQtOGFjYi03ZTY4OGYyMTU2ZTYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NDlBRDI3NjVGMkQ2MTFFNEI5NDBCMjQ2M0ExMDQ1OUYiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NDlBRDI3NjRGMkQ2MTFFNEI5NDBCMjQ2M0ExMDQ1OUYiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDphNWEzMWNhMC1hYmViLTQxNWEtYTEwZS04Y2U5NzRlN2Q4YTEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NGQ4ZTVmOTMtOTZiNC00ZTVkLThhY2ItN2U2ODhmMjE1NmU2Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+k+sHwwAAASZJREFUeNpi/P//PwMyKD8uZw+kUoDYEYgloMIvgHg/EM/ptHx0EFk9I8wAoEZ+IDUPiIMY8IN1QJwENOgj3ACo5gNAbMBAHLgAxA4gQ5igAnNJ0MwAVTsX7IKyY7L2UNuJAf+AmAmJ78AEDTBiwGYg5gbifCSxFCZoaBMCy4A4GOjnH0D6DpK4IxNSVIHAfSDOAeLraJrjgJp/AwPbHMhejiQnwYRmUzNQ4VQgDQqXK0ia/0I17wJiPmQNTNBEAgMlQIWiQA2vgWw7QppBekGxsAjIiEUSBNnsBDWEAY9mEFgMMgBk00E0iZtA7AHEctDQ58MRuA6wlLgGFMoMpIG1QFeGwAIxGZo8GUhIysmwQGSAZgwHaEZhICIzOaBkJkqyM0CAAQDGx279Jf50AAAAAABJRU5ErkJggg==")
no-repeat
center
;
}
.drag_bg
{
background-color
:
#7ac23c
;
height
:
34px
;
width
:
0px
;
}
.drag_text
{
position
:
absolute
;
top
:
0px
;
width
:
100%
;
text-align
:
center
;
-moz-user-select
:
none
;
-webkit-user-select
:
none
;
user-select
:
none
;
-o-user-select
:
none
;
-ms-user-select
:
none
;
}
</
style
>
\ No newline at end of file
src/view/Auth/Login/Login.vue
View file @
508d1712
...
...
@@ -66,6 +66,13 @@
</div>
</div>
<transition
name=
"fade"
mode=
"out-in"
>
<SlideValidator
v-if=
"accountType !== undefined && loginWay !== undefined"
@
confirm=
"handleSlideConfirm"
class=
"my-3"
/>
</transition>
<transition
name=
"fade"
mode=
"out-in"
>
<div
v-if=
"accountType !== undefined && loginWay !== undefined"
>
<div>
<div
v-if=
"accountType === eAccountType.NO_REG"
>
...
...
@@ -108,7 +115,7 @@
<
script
lang=
'ts'
>
import
Input
from
"@/components/common/Input/index.vue"
;
import
CodeInput
from
"./components/CodeInput/index.vue"
;
import
{
RadioGroup
,
Radio
,
Overlay
,
Toast
,
Dialog
}
from
"vant"
;
import
{
RadioGroup
,
Radio
,
Overlay
,
Dialog
}
from
"vant"
;
import
Vue
,
{
PropType
}
from
"vue"
;
import
{
eAccountType
,
...
...
@@ -126,6 +133,7 @@ import LoginButton from "./components/LoginButton/index.vue";
import
UserAgreement
from
"./UserAgreement.vue"
;
import
Check
from
"@/components/common/Check/index.vue"
;
import
PhoneInput
from
"./components/PhoneInput/index.vue"
;
import
SlideValidator
from
"@/components/common/SlideValidator/index.vue"
;
const
notCheckedIcon
=
require
(
"@/assets/icons/not_checked.png"
);
const
checkedIcon
=
require
(
"@/assets/icons/checked.png"
);
...
...
@@ -173,6 +181,7 @@ export default Vue.extend({
UserAgreement
,
Check
,
PhoneInput
,
SlideValidator
,
},
data
()
{
return
{
...
...
@@ -192,6 +201,7 @@ export default Vue.extend({
overlayShow
:
false
,
rememberPwdChecked
:
false
,
btnLoading
:
false
,
slideConfirmed
:
false
,
};
},
methods
:
{
...
...
@@ -213,6 +223,9 @@ export default Vue.extend({
name
:
"PwdFind"
,
});
},
handleSlideConfirm
()
{
this
.
slideConfirmed
=
true
;
},
handlePwdChange
(
v
:
string
)
{
this
.
pwd
=
v
;
},
...
...
@@ -314,12 +327,14 @@ export default Vue.extend({
if
(
this
.
loginWay
===
eLoginWay
.
CODE
)
{
return
(
!
(
this
.
codeValid
&&
this
.
phoneValid
&&
this
.
checkStatusValid
)
||
this
.
btnLoading
this
.
btnLoading
||
!
this
.
slideConfirmed
);
}
else
if
(
this
.
loginWay
===
eLoginWay
.
PWD
)
{
return
(
!
(
this
.
pwdValid
&&
this
.
phoneValid
&&
this
.
checkStatusValid
)
||
this
.
btnLoading
this
.
btnLoading
||
!
this
.
slideConfirmed
);
}
return
true
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment