verifySlider.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657
  1. <template>
  2. <view style="position: relative;">
  3. <view v-if="type === '2'" class="verify-img-out" :style="{height: (parseInt(imgSize.height) + vSpace) + 'px'}">
  4. <view class="verify-img-panel" :style="{width: imgSize.width,
  5. height: imgSize.height,}">
  6. <image :src="backImgBase?('data:image/png;base64,'+backImgBase):defaultImg" alt=""
  7. style="width:100%;height:100%;display:block"></image>
  8. <view class="verify-refresh" @click="refresh" v-show="showRefresh">
  9. <text class="iconfont icon-refresh"></text>
  10. </view>
  11. <transition name="tips">
  12. <text class="verify-tips" v-if="tipWords" :class="passFalg ? 'suc-bg':'err-bg'">{{tipWords}}</text>
  13. </transition>
  14. </view>
  15. </view>
  16. <!-- 公共部分 -->
  17. <view class="verify-bar-area" :style="{width: imgSize.width,
  18. height: '40px',
  19. 'line-height':'40px'}">
  20. <text class="verify-msg" v-text="text"></text>
  21. <view class="verify-left-bar"
  22. :style="{width: leftBarWidth?leftBarWidth:'40px', height: '40px', 'border-color': leftBarBorderColor, transaction: transitionWidth}">
  23. <text class="verify-msg" v-text="finishText"></text>
  24. <view class="verify-move-block" @touchstart="start" @touchend="end" @touchmove="move"
  25. :style="{width:'40px', height: '40px', 'background-color': moveBlockBackgroundColor, left: moveBlockLeft, transition: transitionLeft}">
  26. <text :class="['verify-icon iconfont', iconClass]" :style="{color: iconColor}"></text>
  27. <view v-if="type === '2'" class="verify-sub-block" :style="{'width':Math.floor(parseInt(imgSize.width)*47/310)+ 'px' ,
  28. 'height': imgSize.height,
  29. 'top':'-' + (parseInt(imgSize.height) + vSpace) + 'px',
  30. }">
  31. <image :src="'data:image/png;base64,'+blockBackImgBase" alt=""
  32. style="width:100%;height:100%;display:block"></image>
  33. </view>
  34. </view>
  35. </view>
  36. </view>
  37. </view>
  38. </template>
  39. <script>
  40. // +----------------------------------------------------------------------
  41. // | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
  42. // +----------------------------------------------------------------------
  43. // | Copyright (c) 2016~2024 https://www.crmeb.com All rights reserved.
  44. // +----------------------------------------------------------------------
  45. // | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
  46. // +----------------------------------------------------------------------
  47. // | Author: CRMEB Team <admin@crmeb.com>
  48. // +----------------------------------------------------------------------
  49. /**
  50. * VerifySlide
  51. * @description 滑块
  52. * */
  53. import {
  54. aesEncrypt
  55. } from "./../utils/ase.js"
  56. import {
  57. getAjcaptcha,
  58. ajcaptchaCheck
  59. } from '@/api/api.js';
  60. export default {
  61. name: 'VerifySlide',
  62. props: {
  63. captchaType: {
  64. type: String,
  65. },
  66. type: {
  67. type: String,
  68. default: '1'
  69. },
  70. //弹出式pop,固定fixed
  71. mode: {
  72. type: String,
  73. default: 'fixed'
  74. },
  75. vSpace: {
  76. type: Number,
  77. default: 5
  78. },
  79. explain: {
  80. type: String,
  81. default: '向右滑动完成验证'
  82. },
  83. imgSize: {
  84. type: Object,
  85. default () {
  86. return {
  87. width: '310px',
  88. height: '155px'
  89. }
  90. }
  91. },
  92. blockSize: {
  93. type: Object,
  94. default () {
  95. return {
  96. width: '50px',
  97. height: '50px'
  98. }
  99. }
  100. },
  101. barSize: {
  102. type: Object,
  103. default () {
  104. return {
  105. width: '100%',
  106. height: '40px'
  107. }
  108. }
  109. },
  110. defaultImg: {
  111. type: String,
  112. default: ''
  113. }
  114. },
  115. data() {
  116. return {
  117. secretKey: '', //后端返回的加密秘钥 字段
  118. passFalg: false, //请求通过与否
  119. backImgBase: '', //验证码背景图片
  120. blockBackImgBase: '', //验证滑块的背景图片
  121. backToken: "", //后端返回的唯一token值
  122. startMoveTime: "", //移动开始的时间
  123. endMovetime: '', //移动结束的时间
  124. tipsBackColor: '', //提示词的北京颜色
  125. tipWords: '',
  126. text: '',
  127. finishText: '',
  128. setSize: {
  129. imgHeight: 0,
  130. imgWidth: 0,
  131. barHeight: 0,
  132. barWidth: 0
  133. },
  134. top: 0,
  135. left: 0,
  136. moveBlockLeft: undefined,
  137. leftBarWidth: undefined,
  138. // 移动中样式
  139. moveBlockBackgroundColor: undefined,
  140. leftBarBorderColor: '#ddd',
  141. iconColor: undefined,
  142. iconClass: 'icon-right',
  143. status: false, //鼠标状态
  144. isEnd: false, //是够验证完成
  145. showRefresh: true,
  146. transitionLeft: '',
  147. transitionWidth: ''
  148. }
  149. },
  150. methods: {
  151. init() {
  152. this.text = this.explain
  153. this.getPictrue();
  154. this.$nextTick(() => {
  155. this.$parent.$emit('ready', this)
  156. })
  157. },
  158. //鼠标按下
  159. start: function(e) {
  160. this.startMoveTime = new Date().getTime(); //开始滑动的时间
  161. if (this.isEnd == false) {
  162. this.text = ''
  163. this.moveBlockBackgroundColor = '#337ab7'
  164. this.leftBarBorderColor = '#337AB7'
  165. this.iconColor = '#fff'
  166. e.stopPropagation();
  167. this.status = true;
  168. }
  169. },
  170. //鼠标移动
  171. move: function(e) {
  172. var query = uni.createSelectorQuery().in(this);
  173. this.barArea = query.select('.verify-bar-area')
  174. var bar_area_left, barArea_offsetWidth;
  175. this.barArea.boundingClientRect(data => {
  176. bar_area_left = Math.ceil(data.left)
  177. barArea_offsetWidth = Math.ceil(data.width)
  178. if (this.status && this.isEnd == false) {
  179. if (!e.touches) { //兼容移动端
  180. var x = Math.ceil(e.clientX);
  181. } else { //兼容PC端
  182. var x = Math.ceil(e.touches[0].pageX);
  183. }
  184. // var bar_area_left = this.getLeft(this.barArea);
  185. var move_block_left = x - bar_area_left //小方块相对于父元素的left值
  186. if (this.type !== '1') { //图片滑动
  187. if (move_block_left >= barArea_offsetWidth - parseInt(parseInt(this.blockSize
  188. .width) / 2) - 2) {
  189. move_block_left = barArea_offsetWidth - parseInt(parseInt(this.blockSize
  190. .width) / 2) - 2;
  191. }
  192. }
  193. if (move_block_left <= 0) {
  194. move_block_left = parseInt(parseInt(this.blockSize.width) / 2);
  195. }
  196. //拖动后小方块的left值
  197. this.moveBlockLeft = (move_block_left - parseInt(parseInt(this.blockSize.width) / 2)) +
  198. "px"
  199. this.leftBarWidth = (move_block_left - parseInt(parseInt(this.blockSize.width) / 2)) +
  200. "px"
  201. }
  202. }).exec();
  203. },
  204. //鼠标松开
  205. end: function() {
  206. this.endMovetime = new Date().getTime();
  207. var _this = this;
  208. // 判断是否重合
  209. if (this.status && this.isEnd == false) {
  210. if (this.type !== '1') { //图片滑动
  211. var moveLeftDistance = parseInt((this.moveBlockLeft || '').replace('px', ''));
  212. moveLeftDistance = moveLeftDistance * 310 / parseInt(this.imgSize.width)
  213. var captchaVerification = this.secretKey ? aesEncrypt(this.backToken + '---' + JSON.stringify({
  214. x: moveLeftDistance,
  215. y: 5.0
  216. }), this.secretKey) : this.backToken + '---' + JSON.stringify({
  217. x: moveLeftDistance,
  218. y: 5.0
  219. })
  220. let data = {
  221. captchaType: this.captchaType,
  222. "pointJson": this.secretKey ? aesEncrypt(JSON.stringify({
  223. x: moveLeftDistance,
  224. y: 5.0
  225. }), this.secretKey) : JSON.stringify({
  226. x: moveLeftDistance,
  227. y: 5.0
  228. }),
  229. "token": this.backToken
  230. }
  231. ajcaptchaCheck(data).then((result) => {
  232. let res = result.data
  233. this.moveBlockBackgroundColor = '#5cb85c'
  234. this.leftBarBorderColor = '#5cb85c'
  235. this.iconColor = '#fff'
  236. this.iconClass = 'icon-check'
  237. this.showRefresh = true
  238. this.isEnd = true;
  239. setTimeout(() => {
  240. if (this.mode == 'pop') {
  241. this.$parent.clickShow = false;
  242. }
  243. this.refresh();
  244. }, 1500)
  245. this.passFalg = true
  246. this.tipWords =
  247. `${((this.endMovetime-this.startMoveTime)/1000).toFixed(2)}s验证成功`
  248. setTimeout(() => {
  249. this.tipWords = ""
  250. this.$emit('success', {
  251. captchaVerification
  252. })
  253. }, 1000)
  254. }).catch(res => {
  255. this.moveBlockBackgroundColor = '#d9534f'
  256. this.leftBarBorderColor = '#d9534f'
  257. this.iconColor = '#fff'
  258. this.iconClass = 'icon-close'
  259. this.passFalg = false
  260. setTimeout(() => {
  261. this.refresh();
  262. }, 1000);
  263. this.$parent.$emit('error', this)
  264. this.tipWords = "验证失败"
  265. setTimeout(() => {
  266. this.tipWords = ""
  267. }, 1000)
  268. })
  269. }
  270. this.status = false;
  271. }
  272. },
  273. refresh: function() {
  274. this.showRefresh = true
  275. this.finishText = ''
  276. this.transitionLeft = 'left .3s'
  277. this.moveBlockLeft = 0
  278. this.leftBarWidth = false
  279. this.transitionWidth = 'width .3s'
  280. this.leftBarBorderColor = '#ddd'
  281. this.moveBlockBackgroundColor = '#fff'
  282. this.iconColor = '#000'
  283. this.iconClass = 'icon-right'
  284. this.getPictrue()
  285. this.isEnd = false
  286. setTimeout(() => {
  287. this.transitionWidth = ''
  288. this.transitionLeft = ''
  289. this.text = this.explain
  290. }, 300)
  291. },
  292. //获取left值
  293. getLeft: function(node) {
  294. let leftValue = 0;
  295. while (node) {
  296. leftValue += node.offsetLeft;
  297. node = node.offsetParent;
  298. }
  299. let finalvalue = leftValue;
  300. return finalvalue;
  301. },
  302. // 请求背景图片和验证图片
  303. getPictrue() {
  304. let data = {
  305. captchaType: this.captchaType,
  306. clientUid: uni.getStorageSync('slider'),
  307. ts: Date.now(), // 现在的时间戳
  308. }
  309. getAjcaptcha(data).then((result) => {
  310. let res = result.data
  311. this.backImgBase = res.originalImageBase64
  312. this.blockBackImgBase = res.jigsawImageBase64
  313. this.backToken = res.token
  314. this.secretKey = res.secretKey
  315. }).catch(() => {
  316. this.backImgBase = null
  317. this.blockBackImgBase = null
  318. })
  319. },
  320. },
  321. watch: {
  322. // type变化则全面刷新
  323. type: {
  324. immediate: true,
  325. handler() {
  326. this.init()
  327. }
  328. }
  329. },
  330. mounted() {},
  331. }
  332. </script>
  333. <style scoped>
  334. .verifybox {
  335. position: relative;
  336. box-sizing: border-box;
  337. border-radius: 2px;
  338. border: 1px solid #e4e7eb;
  339. background-color: #fff;
  340. box-shadow: 0 0 10px rgba(0, 0, 0, .3);
  341. left: 50%;
  342. top: 50%;
  343. transform: translate(-50%, -50%);
  344. }
  345. .verifybox-top {
  346. padding: 0 15px;
  347. height: 50px;
  348. line-height: 50px;
  349. text-align: left;
  350. font-size: 16px;
  351. color: #45494c;
  352. border-bottom: 1px solid #e4e7eb;
  353. box-sizing: border-box;
  354. }
  355. .verifybox-bottom {
  356. /* padding: 15px; */
  357. box-sizing: border-box;
  358. }
  359. .verifybox-close {
  360. position: absolute;
  361. top: 13px;
  362. right: 9px;
  363. width: 24px;
  364. height: 24px;
  365. text-align: center;
  366. cursor: pointer;
  367. }
  368. .mask {
  369. position: fixed;
  370. top: 0;
  371. left: 0;
  372. z-index: 1001;
  373. width: 100%;
  374. height: 100vh;
  375. background: rgba(0, 0, 0, .3);
  376. /* display: none; */
  377. transition: all .5s;
  378. }
  379. .verify-tips {
  380. position: absolute;
  381. left: 0px;
  382. bottom: 0px;
  383. width: 100%;
  384. height: 30px;
  385. background-color: rgb(231, 27, 27, .5);
  386. line-height: 30px;
  387. color: #fff;
  388. }
  389. .suc-bg {
  390. background-color: rgba(92, 184, 92, .5);
  391. filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=#7f5CB85C, endcolorstr=#7f5CB85C);
  392. }
  393. .err-bg {
  394. background-color: rgba(217, 83, 79, .5);
  395. filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=#7fD9534F, endcolorstr=#7fD9534F);
  396. }
  397. .tips-enter,
  398. .tips-leave-to {
  399. bottom: -30px;
  400. }
  401. .tips-enter-active,
  402. .tips-leave-active {
  403. transition: bottom .5s;
  404. }
  405. /* ---------------------------- */
  406. /*常规验证码*/
  407. .verify-code {
  408. font-size: 20px;
  409. text-align: center;
  410. cursor: pointer;
  411. margin-bottom: 5px;
  412. border: 1px solid #ddd;
  413. }
  414. .cerify-code-panel {
  415. height: 100%;
  416. overflow: hidden;
  417. }
  418. .verify-code-area {
  419. float: left;
  420. }
  421. .verify-input-area {
  422. float: left;
  423. width: 60%;
  424. padding-right: 10px;
  425. }
  426. .verify-change-area {
  427. line-height: 30px;
  428. float: left;
  429. }
  430. .varify-input-code {
  431. display: inline-block;
  432. width: 100%;
  433. height: 25px;
  434. }
  435. .verify-change-code {
  436. color: #337AB7;
  437. cursor: pointer;
  438. }
  439. .verify-btn {
  440. width: 200px;
  441. height: 30px;
  442. background-color: #337AB7;
  443. color: #FFFFFF;
  444. border: none;
  445. margin-top: 10px;
  446. }
  447. /*滑动验证码*/
  448. .verify-bar-area {
  449. position: relative;
  450. background: #FFFFFF;
  451. text-align: center;
  452. -webkit-box-sizing: content-box;
  453. -moz-box-sizing: content-box;
  454. box-sizing: content-box;
  455. border: 1px solid #ddd;
  456. -webkit-border-radius: 4px;
  457. }
  458. .verify-bar-area .verify-move-block {
  459. position: absolute;
  460. top: 0px;
  461. left: 0;
  462. background: #fff;
  463. cursor: pointer;
  464. -webkit-box-sizing: content-box;
  465. -moz-box-sizing: content-box;
  466. box-sizing: content-box;
  467. box-shadow: 0 0 2px #888888;
  468. -webkit-border-radius: 1px;
  469. }
  470. .verify-bar-area .verify-move-block:hover {
  471. background-color: #337ab7;
  472. color: #FFFFFF;
  473. }
  474. .verify-bar-area .verify-left-bar {
  475. position: absolute;
  476. top: -1px;
  477. left: -1px;
  478. background: #f0fff0;
  479. cursor: pointer;
  480. -webkit-box-sizing: content-box;
  481. -moz-box-sizing: content-box;
  482. box-sizing: content-box;
  483. border: 1px solid #ddd;
  484. }
  485. .verify-img-panel {
  486. margin: 0;
  487. -webkit-box-sizing: content-box;
  488. -moz-box-sizing: content-box;
  489. box-sizing: content-box;
  490. border-top: 1px solid #ddd;
  491. border-bottom: 1px solid #ddd;
  492. border-radius: 3px;
  493. position: relative;
  494. }
  495. .verify-img-panel .verify-refresh {
  496. width: 25px;
  497. height: 25px;
  498. text-align: center;
  499. padding: 5px;
  500. cursor: pointer;
  501. position: absolute;
  502. top: 0;
  503. right: 0;
  504. z-index: 2;
  505. }
  506. .verify-img-panel .icon-refresh {
  507. font-size: 20px;
  508. color: #fff;
  509. }
  510. .verify-img-panel .verify-gap {
  511. background-color: #fff;
  512. position: relative;
  513. z-index: 2;
  514. border: 1px solid #fff;
  515. }
  516. .verify-bar-area .verify-move-block .verify-sub-block {
  517. position: absolute;
  518. text-align: center;
  519. z-index: 3;
  520. /* border: 1px solid #fff; */
  521. }
  522. .verify-bar-area .verify-move-block .verify-icon {
  523. width: 80rpx;
  524. height: 80rpx;
  525. font-size: 18px;
  526. }
  527. .verify-bar-area .verify-msg {
  528. z-index: 3;
  529. }
  530. /*字体图标的css*/
  531. /*@font-face {font-family: "iconfont";*/
  532. /*src: url('../fonts/iconfont.eot?t=1508229193188'); !* IE9*!*/
  533. /*src: url('../fonts/iconfont.eot?t=1508229193188#iefix') format('embedded-opentype'), !* IE6-IE8 *!*/
  534. /*url('data:application/x-font-woff;charset=utf-8;base64,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') format('woff'),*/
  535. /*url('../fonts/iconfont.ttf?t=1508229193188') format('truetype'), !* chrome, firefox, opera, Safari, Android, iOS 4.2+*!*/
  536. /*url('../fonts/iconfont.svg?t=1508229193188#iconfont') format('svg'); !* iOS 4.1- *!*/
  537. /*}*/
  538. .iconfont {
  539. font-family: "iconfont" !important;
  540. font-size: 16px;
  541. font-style: normal;
  542. -webkit-font-smoothing: antialiased;
  543. -moz-osx-font-smoothing: grayscale;
  544. }
  545. .icon-check:before {
  546. content: " ";
  547. display: block;
  548. width: 16px;
  549. height: 16px;
  550. position: absolute;
  551. margin: auto;
  552. left: 0;
  553. right: 0;
  554. top: 0;
  555. bottom: 0;
  556. z-index: 9999;
  557. background-image: url("@/static/images/arrow-good.png");
  558. background-size: contain;
  559. }
  560. .icon-close:before {
  561. content: " ";
  562. display: block;
  563. width: 16px;
  564. height: 16px;
  565. position: absolute;
  566. margin: auto;
  567. left: 0;
  568. right: 0;
  569. top: 0;
  570. bottom: 0;
  571. z-index: 9999;
  572. background-image: url("@/static/images/arrow-close.png");
  573. background-size: contain;
  574. }
  575. .icon-right:before {
  576. content: " ";
  577. display: block;
  578. width: 16px;
  579. height: 16px;
  580. position: absolute;
  581. margin: auto;
  582. left: 0;
  583. right: 0;
  584. top: 0;
  585. bottom: 0;
  586. background-size: cover;
  587. z-index: 9999;
  588. background-image: url("@/static/images/arrow-right.png");
  589. background-size: contain;
  590. }
  591. .icon-refresh:before {
  592. content: " ";
  593. display: block;
  594. width: 16px;
  595. height: 16px;
  596. position: absolute;
  597. margin: auto;
  598. left: 0;
  599. right: 0;
  600. top: 0;
  601. bottom: 0;
  602. z-index: 9999;
  603. background-image: url("@/static/images/refresh.png");
  604. background-size: contain;
  605. }
  606. </style>