vue + typescript + 极验登录验证的实现方法


Posted in Javascript onJune 27, 2019

此功能基于vue(v2.6.8) + typescript(v3.3.3333), 引入极验(geetest v3+)(官方api),使用其product: 'bind'模式, 页面挂载后初始化ininGeetest,点击登录按钮后先做表单验证,通过后弹出滑块框,拖动验证成功,执行登录方法。

本项目为前后端分离,所以后端部署部分,请自行参考文档操作

vue + typescript + 极验登录验证的实现方法

后台接口:

vue + typescript + 极验登录验证的实现方法

vue + typescript + 极验登录验证的实现方法

vue + typescript + 极验登录验证的实现方法

开始:/public/js目录添加 jquery-1.12.3.min.js文件 和 gt.js(下载)在/public/index.html中引入以上添加的两个文件login.vue使用注意事项:要注意在gt.js中,initGeetest已被挂载到window对象

vue + typescript + 极验登录验证的实现方法

页面可能报错: Uncaught SyntaxError: Unexpected token <

vue + typescript + 极验登录验证的实现方法

vue + typescript + 极验登录验证的实现方法

将报错对象添加到与public同级的static目录下(没有则新建),修改引入路径即可。

源码:

<script lang="ts">
import { isValidUsername } from '@/utils/validate';
import { Component, Vue, Watch } from 'vue-property-decorator';
import { Route } from 'vue-router';
import { ElForm } from 'element-ui/types/form';
import { Loading } from 'element-ui';

import { Action } from 'vuex-class';
import AuthServices from '@/services/user/auth.ts';
import ThirdpartyServices from '@/services/thirdparty/index.ts';

const validateUsername = (rule: any, value: string, callback: any) => {
 if (! value) {
  callback(new Error('用户名不能为空'));
 // } else if (!isValidUsername(value)) {
 //  callback(new Error('请输入正确的用户名'));
 } else {
  callback();
 }
};
const validatePass = (rule: any, value: string, callback: any) => {
  if (! value) {
  callback(new Error('密码不能为空'));
 // } else if (value.length < 5) {
 //  callback(new Error('密码不能小于5位'));
 } else {
  callback();
 }
};

@Component({
 name: 'login',
})
export default class Login extends Vue {
 @Action('auth/login') private login_action!: CCS.LoginAction;

 private loginForm = { username: '', password: '' };
 private loginRules = {
  username: [{trigger: 'blur', validator: validateUsername }],
  password: [{trigger: 'blur', validator: validatePass }],
 };
 private loading = false;
 private redirect: string | undefined = undefined;
 private captchaEntity: any;
 // private loadingInstance: any;

 @Watch('$route', { immediate: true }) private OnRouteChange(route: Route) {
  this.redirect = route.query && route.query.redirect as string;
 }

 // private created() {
 //  this.loadingInstance = Loading.service({
 //   customClass: 'login_loading',
 //   text: '正在初始化,请稍后',
 //   fullscreen: true,
 //   lock: true,
 //  });
 // }

 /** ==================== 验证 START ========================= */
 /**
  * 页面挂载后,后台获取初始化initGeetest所需参数值
  */
 private async mounted() {
  ThirdpartyServices.geetest_init().then((result) => {
   // this.loadingInstance.close();
   if (result.status) {
    this.initGeetest(result.data);
   } else {
    this.$message({ type: 'error', message: result.message });
   }
  });
 }
  /**
  * initGeetest 初始化
  */
 private initGeetest(param: CCS.GeettestInitType) {
  if ( ! (window as any) || ! (window as any).initGeetest ) {
   return false;
  }
  (window as any).initGeetest({
   gt: param.gt,
   challenge: param.challenge,
   offline: ! param.success,
   new_captcha: param.newcaptcha,
   timeout: '5000',
   product: 'bind',
   width: '300px',
   https: true,

  }, this.captchaObj_callback);
 }
 /**
  * 初始化后的回调函数
  */
 private async captchaObj_callback(captchaObj: any) {
  this.captchaEntity = captchaObj; // promise对象
  captchaObj
   .onReady(() => { // 验证码就位
   })
   .onSuccess(() => {
    const rst = captchaObj.getValidate();
    if (!rst) {
     this.$message({ type: 'warning', message: '请完成验证'});
    }

    // 调用后台check this.captchaObj
    this.verify_check(rst);
   })
   .onError((err: Error) => {
    console.log(err);
   });
 }
 /**
  * 后台验证初始化结果
  */
 private async verify_check(validateResult: any) {
  ThirdpartyServices.geetest_checked(validateResult.geetest_challenge, validateResult.geetest_validate, validateResult.geetest_seccode ).then((result) => {
   if (result.status && result.data.result) {
    // 验证通过,发送登录请求
    this.handleLogin(result.data.token);
   } else {
    this.$message({ type: 'error', message: '验证失败'});
    return false;
   }
  });
 }
 /** ==================== 验证 END ========================= */
 /**
  * 点击登录按钮,弹出验证框
  */
 private login_btn_click() {
  (this.$refs.refform as ElForm).validate((valid) => {
   if (valid) {
    this.captchaEntity.verify(); // 显示验证码
   }
  });
 }
 /**
  * 验证成功,发送登录请求
  */
 private async handleLogin(token: string) {
  this.loading = true;
  const { status, message} = await this.login_action({username: this.loginForm.username.trim(), password: this.loginForm.password, token});

  this.loading = false;
  if (status) {
   this.$message({type: 'success', message: '登录成功'});
   this.$router.push({ path: this.redirect || '/' });
  } else {
   this.$message({type: 'error', message});
  }
 }
}
</script>

<template>
 <div class="login-container">
  <div class="login_form_wraper">
   <div class="logo_show">
    <img :src="require('@/assets/images/logo_w328.png')">
   </div>
   <img class="form_bg" :src="require('@/assets/images/login_form.png')">
   <el-form ref="refform" class="login-form" auto-complete="on" label-position="left"
     :model="loginForm" :rules="loginRules">
    <el-form-item prop="username">
     <el-input v-model="loginForm.username" name="username" type="text" auto-complete="on" placeholder="用户名"/>
     <i class="iconfont icon-zhanghaodenglu icon_prefix"></i>
    </el-form-item>
    <el-form-item prop="password">
     <el-input v-model="loginForm.password" name="password" type="password" auto-complete="on" placeholder="密码"
      @keyup.enter.native="handleLogin" />
     <i class="iconfont icon-mima icon_prefix"></i>
    </el-form-item>

    <el-form-item class="login_btn">
     <el-button v-if="!loading" @click.native.prevent="login_btn_click">登录</el-button>
     <el-button :loading="loading" v-else @click.native.prevent="handleLogin">登录中</el-button>
    </el-form-item>
   </el-form>

  </div>
 </div>
</template>

<style lang="stylus" scoped>
@import '~@/assets/styles/var.styl';
@import '~@/assets/styles/pages/login.styl';

.login-container
 pass

</style>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery 获取对象 根据属性、内容匹配, 还有表单元素匹配
May 31 Javascript
JavaScript 基础篇之对象、数组使用介绍(三)
Apr 07 Javascript
JQuery实现简单时尚快捷的气泡提示插件
Dec 20 Javascript
javascript伸缩型菜单实现代码
Nov 16 Javascript
基于jQuery实现选取月份插件附源码下载
Dec 28 Javascript
webstorm中vue语法的支持详解
May 09 Javascript
微信小程序中换行空格(多个空格)写法详解
Jul 10 Javascript
Node.js fs模块(文件模块)创建、删除目录(文件)读取写入文件流的方法
Sep 03 Javascript
Element Steps步骤条的使用方法
Jul 26 Javascript
vue.js+element 默认提示中英文操作
Nov 11 Javascript
vue 解决provide和inject响应的问题
Nov 12 Javascript
VueCli生产环境打包部署跨域失败的解决
Nov 13 Javascript
JS前端知识点 运算符优先级,URL编码与解码,String,Math,arguments操作整理总结
Jun 27 #Javascript
JS前端知识点offset,scroll,client,冒泡,事件对象的应用整理总结
Jun 27 #Javascript
ES6 let和const定义变量与常量的应用实例分析
Jun 27 #Javascript
vue响应式更新机制及不使用框架实现简单的数据双向绑定问题
Jun 27 #Javascript
微信小程序实现form表单本地储存数据
Jun 27 #Javascript
ES6 class的应用实例分析
Jun 27 #Javascript
ES6 Promise对象的应用实例分析
Jun 27 #Javascript
You might like
用PHP和ACCESS写聊天室(六)
2006/10/09 PHP
php 获取可变函数参数的函数
2009/08/26 PHP
php 计划任务 检测用户连接状态
2012/03/29 PHP
PHP调用API接口实现天气查询功能的示例
2017/09/21 PHP
JavaScript toFixed() 方法
2010/04/15 Javascript
cookie在javascript中的使用技巧以及隐私在服务器端的设置
2012/12/03 Javascript
快速解决FusionCharts联动的中文乱码问题
2013/12/04 Javascript
IE6中链接A的href为javascript协议时不在当前页面跳转
2014/06/05 Javascript
JS实现页面超时后自动跳转到登陆页面
2015/01/19 Javascript
js实现屏幕自适应局部代码分享
2015/01/30 Javascript
原生Js实现简易烟花爆炸效果的方法
2015/03/20 Javascript
js基础知识(公有方法、私有方法、特权方法)
2015/11/06 Javascript
AngularJS基础 ng-include 指令简单示例
2016/08/01 Javascript
基于Three.js插件制作360度全景图
2016/11/29 Javascript
Vue.js仿Metronic高级表格(一)静态设计
2017/04/17 Javascript
一个简易时钟效果js实现代码
2020/03/25 Javascript
详解Bootstrap 学习(一)入门
2019/04/12 Javascript
vue router 跳转时打开新页面的示例方法
2019/07/28 Javascript
python正向最大匹配分词和逆向最大匹配分词的实例
2018/11/14 Python
python实现串口通信的示例代码
2020/02/10 Python
使用CSS变量实现炫酷惊人的悬浮效果
2019/04/26 HTML / CSS
英国著名音像制品和图书游戏购物网站:Zavvi
2016/08/04 全球购物
英国比较机场停车场网站:Airport Parking Essentials
2019/12/01 全球购物
都柏林通行卡/城市通票:The Dublin Pass
2020/02/16 全球购物
查询优化的一般准则有哪些
2015/03/08 面试题
摄影实习自我鉴定
2013/09/20 职场文书
党员的自我评价范文
2014/01/02 职场文书
简单的项目建议书模板
2014/03/12 职场文书
《埃及的金字塔》教学反思
2014/04/07 职场文书
支部书记四风问题对照检查材料
2014/10/04 职场文书
优秀共产党员事迹材料
2014/12/18 职场文书
廉洁自律个人总结
2015/02/14 职场文书
2015年妇幼保健工作总结
2015/05/19 职场文书
2015年清剿火患专项行动工作总结
2015/07/27 职场文书
python中的被动信息搜集
2021/04/29 Python
详解PHP设计模式之依赖注入模式
2021/05/25 PHP