diff --git a/vue/src/assets/403_images/403.gif b/vue/src/assets/images/403.gif similarity index 100% rename from vue/src/assets/403_images/403.gif rename to vue/src/assets/images/403.gif diff --git a/vue/src/assets/404_images/404.png b/vue/src/assets/images/404.png similarity index 100% rename from vue/src/assets/404_images/404.png rename to vue/src/assets/images/404.png diff --git a/vue/src/assets/404_images/404_cloud.png b/vue/src/assets/images/404_cloud.png similarity index 100% rename from vue/src/assets/404_images/404_cloud.png rename to vue/src/assets/images/404_cloud.png diff --git a/vue/src/assets/images/sprite.1.2.4.png b/vue/src/assets/images/sprite.1.2.4.png new file mode 100644 index 0000000..eca4e8d Binary files /dev/null and b/vue/src/assets/images/sprite.1.2.4.png differ diff --git a/vue/src/assets/styles/transition.scss b/vue/src/assets/styles/transition.scss index 8280e50..fca3e72 100644 --- a/vue/src/assets/styles/transition.scss +++ b/vue/src/assets/styles/transition.scss @@ -1,3 +1,5 @@ +$transition-easing: cubic-bezier(0.215, 0.61, 0.355, 1); + .right-out, .left-out { &-leave-active, @@ -30,15 +32,46 @@ } } +.breadcrumb-enter-active, +.breadcrumb-leave-active, +.breadcrumb-move { + transition: all .5s; +} + +.breadcrumb-enter, +.breadcrumb-leave-active { + opacity: 0; + transform: translateX(20px); +} + +.breadcrumb-leave-active { + position: absolute; +} + .slide-right, -.slide-left { - &-enter-active, +.slide-left, +.slide-up, +.slide-down, +.jump-right, +.jump-left, +.jump-up, +.jump-down, +.fade, +.scale, +.rotate, +.flip { &-leave-active { - transition: transform .3s cubic-bezier(0.215, 0.61, 0.355, 1) + position: absolute } +} +.slide-right, +.slide-left, +.slide-up, +.slide-down { + &-enter-active, &-leave-active { - position: absolute; + transition: transform .3s $transition-easing } } @@ -62,19 +95,178 @@ } } +.slide-up { + &-enter { + transform: translate3d(0, 100%, 0) + } -.breadcrumb-enter-active, -.breadcrumb-leave-active, -.breadcrumb-move { - transition: all .5s; + &-leave-to { + transform: translate3d(0, -100%, 0) + } } -.breadcrumb-enter, -.breadcrumb-leave-active { - opacity: 0; - transform: translateX(20px); +.slide-down { + &-enter { + transform: translate3d(0, -100%, 0) + } + + &-leave-to { + transform: translate3d(0, 100%, 0) + } } -.breadcrumb-leave-active { - position: absolute; +.jump-right, +.jump-left, +.jump-up, +.jump-down { + &-enter-active, + &-leave-active { + transition: opacity .3s, transform .3s + } + + &-enter, + &-leave-to { + opacity: 0 + } +} + +.jump-right { + &-enter { + transform: translate3d(-15px, 0, 0) + } + + &-leave-to { + transform: translate3d(15px, 0, 0) + } +} + +.jump-left { + &-enter { + transform: translate3d(15px, 0, 0) + } + + &-leave-to { + transform: translateX(-15px) + } +} + +.jump-up { + &-enter { + transform: translate3d(0, 15px, 0) + } + + &-leave-to { + transform: translate3d(0, -15px, 0) + } +} + +.jump-down { + &-enter { + transform: translate3d(0, -15px, 0) + } + + &-leave-to { + transform: translate3d(15px, 0, 0) + } +} + +.fade { + &-enter-active, + &-leave-active { + transition: opacity .3s ease-out + } + + &-enter, + &-leave, + &-leave-to { + opacity: 0 + } +} + +.scale { + &-enter-active, + &-leave-active { + transition: opacity .3s, transform .3s $transition-easing + } + + &-enter, + &-leave, + &-leave-to { + opacity: 0; + transform: scale3d(0, 0, 1) + } +} + +.rotate { + &-enter-active, + &-leave-active { + transition: opacity .3s, transform .3s $transition-easing; + transform-style: preserve-3d + } + + &-enter, + &-leave, + &-leave-to { + opacity: 0; + transform: scale3d(0, 0, 1) rotate3d(0, 0, 1, 90deg) + } +} + +.flip-right, +.flip-left, +.flip-up, +.flip-down { + &-enter-active, + &-leave-active { + transition: transform .3s; + backface-visibility: hidden + } + + &-enter-to, + &-leave { + transform: perspective(400px) rotate3d(1, 1, 0, 0deg) + + } +} + +.flip-right { + &-enter { + transform: perspective(400px) rotate3d(0, 1, 0, -180deg) + + } + + &-leave-to { + transform: perspective(400px) rotate3d(0, 1, 0, 180deg) + + } +} + +.flip-left { + &-enter { + transform: perspective(400px) rotate3d(0, 1, 0, 180deg) + } + + &-leave-to { + transform: perspective(400px) rotate3d(0, 1, 0, -180deg) + } +} + +.flip-up { + &-enter { + transform: perspective(400px) rotate3d(1, 0, 0, -180deg) + } + + &-leave-to { + transform: perspective(400px) rotate3d(1, 0, 0, 180deg) + } +} + +.flip-down { + &-enter { + transform: perspective(400px) rotate3d(1, 0, 0, 180deg) + } + + &-leave-to { + transform: perspective(400px) rotate3d(1, 0, 0, -180deg) + } } diff --git a/vue/src/components/PuzzleVerify/index.js b/vue/src/components/PuzzleVerify/index.js new file mode 100644 index 0000000..bcec2e7 --- /dev/null +++ b/vue/src/components/PuzzleVerify/index.js @@ -0,0 +1,20 @@ +import Vue from 'vue' +import Main from './main.vue' +import {PopupManager} from 'element-ui/src/utils/popup' + +let Constructor = Vue.extend(Main) + +const PuzzleVerify = function ({left = 0, top = 0} = {}) { + const instance = new Constructor({data: {positionLeft: left}}) + instance.positionTop = top - Math.round((instance.height + 130) / 2) + instance.$mount() + document.body.appendChild(instance.$el) + instance.$el.style.zIndex = PopupManager.nextZIndex() + instance.visible = true + return new Promise((resolve, reject) => { + instance.resolve = resolve + instance.reject = reject + }) +} + +export default PuzzleVerify diff --git a/vue/src/components/PuzzleVerify/index.vue b/vue/src/components/PuzzleVerify/index.vue deleted file mode 100644 index 1738d88..0000000 --- a/vue/src/components/PuzzleVerify/index.vue +++ /dev/null @@ -1,370 +0,0 @@ - - - - - diff --git a/vue/src/components/PuzzleVerify/main.vue b/vue/src/components/PuzzleVerify/main.vue new file mode 100644 index 0000000..cc95f42 --- /dev/null +++ b/vue/src/components/PuzzleVerify/main.vue @@ -0,0 +1,519 @@ + + + + + diff --git a/vue/src/main.js b/vue/src/main.js index b59da2f..441d685 100644 --- a/vue/src/main.js +++ b/vue/src/main.js @@ -13,6 +13,7 @@ import BottomTip from '@/components/BottomTip' import Guide from '@/components/Guide' import ImageViewer from '@/components/ImageViewer' import Message from '@/components/Message' +import PuzzleVerify from '@/components/PuzzleVerify' Vue.use(Element) @@ -29,6 +30,7 @@ Vue.prototype.$bottomTip = BottomTip Vue.prototype.$guide = Guide Vue.prototype.$image = ImageViewer Vue.prototype.$message = Message +Vue.prototype.$puzzleVerify = PuzzleVerify Vue.config.productionTip = false diff --git a/vue/src/router/modules/example.js b/vue/src/router/modules/example.js index c835873..fac8317 100644 --- a/vue/src/router/modules/example.js +++ b/vue/src/router/modules/example.js @@ -59,12 +59,6 @@ const router = { component: () => import('@/views/example/components/picturePreview'), meta: {title: '图片预览'} }, - { - path: 'verify', - name: 'verify', - component: () => import('@/views/example/components/verify'), - meta: {title: '滑块验证'} - }, { path: 'skeleton', name: 'skeleton', diff --git a/vue/src/views/app/403.vue b/vue/src/views/app/403.vue index 7876ce0..2b928e1 100644 --- a/vue/src/views/app/403.vue +++ b/vue/src/views/app/403.vue @@ -2,7 +2,7 @@
- 403 + 403
Oops!
diff --git a/vue/src/views/app/404.vue b/vue/src/views/app/404.vue index 9780d42..b728522 100644 --- a/vue/src/views/app/404.vue +++ b/vue/src/views/app/404.vue @@ -2,10 +2,10 @@
- 404 - 404 - 404 - 404 + 404 + 404 + 404 + 404
Oops!
diff --git a/vue/src/views/app/login.vue b/vue/src/views/app/login.vue index 976cc6a..7f9047c 100644 --- a/vue/src/views/app/login.vue +++ b/vue/src/views/app/login.vue @@ -96,12 +96,16 @@ this.passwordType = this.passwordType === 'password' ? '' : 'password' this.$nextTick(() => this.$refs.password.focus()) }, - login() { + login({pageX, pageY}) { if (this.loading) return this.$refs.form.validate(valid => { if (!valid) return this.loading = true - this.$store.dispatch('user/login', {...this.form, password: md5(this.form.password)}) + this.$puzzleVerify({left: pageX, top: pageY}) + .then(() => this.$store.dispatch('user/login', { + ...this.form, + password: md5(this.form.password) + })) .then(() => this.success()) .catch(() => this.loading = false) }) diff --git a/vue/src/views/example/components/verify.vue b/vue/src/views/example/components/verify.vue deleted file mode 100644 index 1e3115e..0000000 --- a/vue/src/views/example/components/verify.vue +++ /dev/null @@ -1,20 +0,0 @@ - -