翼度科技»论坛 编程开发 JavaScript 查看内容

node+vue前后端分离实现登录时使用图片验证码功能

4

主题

4

帖子

12

积分

新手上路

Rank: 1

积分
12
记录一下前端使用验证码登录的过程
后端用的是node.js,关键模块是svg-captcha
前端使用的是vue2
最后的登录界面如下:


后端代码

先上代码,然后解释
  1. const svgCaptcha = require('svg-captcha')

  2. exports.checkCode = (req, res) => {
  3.     const img = svgCaptcha.create({
  4.         size: 4,
  5.         ignoreChars: '0o1l',
  6.         color: true,
  7.         noise: 1,
  8.         background: '#666',
  9.         height: 40,
  10.         width: 113
  11.     })
  12.     console.log(img.text);
  13.     res.send(img)
  14. }
复制代码
这是最关键的代码,我习惯将路由和路由处理函数分开写,上面这块代码是路由处理函数
实际上就是利用svg-captcha生成了一个验证码图片,其中有几个参数需要重点关注一下:

  • height和width,这个是设置的验证码的高度和宽度,需要看一下前端页面上input输入框的高度和宽度,我用的是elementUI,高度是40,所以这里的高度也是40,宽度自己慢慢调
  • ignoreChars:验证码中不出现这些字符
    看一下路由代码:
  1. const express = require('express');
  2. const userHandle = require('../route_handle/user')

  3. const router = express.Router();

  4. router.get('/checkCode', userHandle.checkCode)

  5. module.exports = router
复制代码
这没啥好说的
后端就这些了,后端的端口用的是3020,需要设置一下跨域,不然前端访问不到

前端代码

先上代码
  1. <template>
  2.   <div class="login">
  3.     <el-form class="login-form" :model="loginForm">
  4.       <h3 class="title">若依后台管理系统</h3>
  5.       <el-form-item>
  6.         <el-input placeholder="Account" type="text" prefix-icon="el-icon-user-solid" v-model="loginForm.username">
  7.         </el-input>
  8.       </el-form-item>
  9.       <el-form-item>
  10.         <el-input placeholder="Password" type="password" prefix-icon="el-icon-lock" v-model="loginForm.password">
  11.         </el-input>
  12.       </el-form-item>
  13.       <el-form-item>
  14.         <el-input placeholder="CheckCode" prefix-icon="el-icon-picture-outline-round" v-model="loginForm.checkCode"
  15.           style="width: 63%">
  16.         </el-input>
  17.         <div class="login-code">
  18.           <!-- <img :src="codeUrl" class="login-code-imgs" @click="getCode"/>
  19.           -->
  20.           <div @click="getCode" v-html="code" style="vertical-align:middle"></div>
  21.         </div>
  22.       </el-form-item>
  23.       <el-checkbox v-model="loginForm.rememberme" style="margin: 0 0 15px 0;">Remenber Me</el-checkbox>
  24.       <el-form-item>
  25.         <el-button style="width: 100%" @click="submit('loginForm')" type="primary">Login</el-button>
  26.       </el-form-item>
  27.     </el-form>
  28.     <div class="el-login-footer">
  29.       <span>Copyright © 2018-2022 huanggang All Rights Reserved.</span>
  30.     </div>
  31.   </div>
  32. </template>

  33. <script>
  34. // import { getCodeImg } from '@/api/login'
  35. export default {
  36.   data() {
  37.     return {
  38.       loginForm: {
  39.         username: '',
  40.         password: '',
  41.         checkCode: '',
  42.         rememberme: false
  43.       },
  44.       codeUrl: '',
  45.       code: '',
  46.       codeText: ''
  47.     }
  48.   },
  49.   methods: {
  50.     submit() {
  51.       if (this.loginForm.checkCode.toLowerCase() == this.codeText.toLowerCase()) {
  52.         this.$message({
  53.           type: "success",
  54.           message: '登录成功'
  55.         })
  56.       } else (this.$message({
  57.         type: 'error',
  58.         message: '验证码错误!'
  59.       }))
  60.     },
  61.     getCode() {
  62.       this.$axios.get('/checkCode')
  63.         .then(res => {
  64.           console.log(res)
  65.           this.code = res.data.data
  66.           this.codeText = res.data.text
  67.         })
  68.     }
  69.   },
  70.   created() {
  71.     this.getCode()
  72.   }
  73. }
  74. </script>

  75. <style scoped lang="scss">
  76. .login {
  77.   display: flex;
  78.   height: 100%;
  79.   background: url(../assets/images/login-background.jpg);
  80.   background-size: cover;
  81.   justify-content: center;
  82.   align-items: center;
  83. }

  84. .title {
  85.   text-align: center;
  86.   color: #707070;
  87.   margin: 0 auto 30px;
  88. }

  89. .login-form {
  90.   box-sizing: border-box;
  91.   width: 400px;
  92.   border-radius: 6px;
  93.   background-color: #fff;
  94.   padding: 25px 25px 5px 25px;
  95. }

  96. .el-login-footer {
  97.   height: 40px;
  98.   line-height: 40px;
  99.   position: fixed;
  100.   bottom: 0;
  101.   color: #fff;
  102.   font-size: 12px;
  103.   letter-spacing: 1px;
  104.   font-family: Arial;
  105. }

  106. .login-code {
  107.   width: 33%;
  108.   float: right;

  109.   div {
  110.     cursor: pointer;
  111.   }
  112. }

  113. .login-code-imgs {}
  114. </style>
复制代码
这里不再赘述相关的配置了,直接看关键代码

获取验证码方法

getCode() 方法实现的功能是点击验证码图片时,切换获取验证码
获取验证码的方法是访问后端接口/checkCode,这个接口返回两个值(后端补充说明),一个是text,一个是data,text就是验证码的字符串值,data是验证码的html地址,在postman中测试返回的结果如下:

页面上使用v-html绑定验证码显示的地址
然后把text和data的值都赋给相应的数据
当然,为了能打开登录页面时,直接能显示验证码图片,需要把getCode方法挂载在生命周期函数created上

登录验证方法

登录验证不再校验数据库中的用户名和密码,只示意一下验证码的功能
在点击login按钮时校验验证码是否正确,功能写在submit()方法中,前端input框中使用v-model双向绑定了loginForm.checkCode的值,所以只要验证loginForm.checkCode与验证码codeText是否相等即可,为了保证用户体验,一般是忽略字母输入大小写的,所以都使用toLowerCase()处理一下。
这样就完成了前后端分离模式的登录验证码使用功能
到此这篇关于node+vue前后端分离实现登录时使用图片验证码的文章就介绍到这了,更多相关node vue图片验证码登录内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

来源:https://www.jb51.net/article/266732.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具