首頁 > 軟體

node+vue前後端分離實現登入時使用圖片驗證碼功能

2022-11-05 14:00:48

記錄一下前端使用驗證碼登入的過程
後端用的是node.js,關鍵模組是svg-captcha
前端使用的是vue2
最後的登入介面如下:

後端程式碼

先上程式碼,然後解釋

const svgCaptcha = require('svg-captcha')

exports.checkCode = (req, res) => {
    const img = svgCaptcha.create({
        size: 4,
        ignoreChars: '0o1l',
        color: true,
        noise: 1,
        background: '#666',
        height: 40,
        width: 113
    })
    console.log(img.text);
    res.send(img)
}

這是最關鍵的程式碼,我習慣將路由和路由處理常式分開寫,上面這塊程式碼是路由處理常式
實際上就是利用svg-captcha生成了一個驗證碼圖片,其中有幾個引數需要重點關注一下:

  • height和width,這個是設定的驗證碼的高度和寬度,需要看一下前端頁面上input輸入框的高度和寬度,我用的是elementUI,高度是40,所以這裡的高度也是40,寬度自己慢慢調
  • ignoreChars:驗證碼中不出現這些字元
    看一下路由程式碼:
const express = require('express');
const userHandle = require('../route_handle/user')

const router = express.Router();

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

module.exports = router

這沒啥好說的
後端就這些了,後端的埠用的是3020,需要設定一下跨域,不然前端存取不到

前端程式碼

先上程式碼

<template>
  <div class="login">
    <el-form class="login-form" :model="loginForm">
      <h3 class="title">若依後臺管理系統</h3>
      <el-form-item>
        <el-input placeholder="Account" type="text" prefix-icon="el-icon-user-solid" v-model="loginForm.username">
        </el-input>
      </el-form-item>
      <el-form-item>
        <el-input placeholder="Password" type="password" prefix-icon="el-icon-lock" v-model="loginForm.password">
        </el-input>
      </el-form-item>
      <el-form-item>
        <el-input placeholder="CheckCode" prefix-icon="el-icon-picture-outline-round" v-model="loginForm.checkCode"
          style="width: 63%">
        </el-input>
        <div class="login-code">
          <!-- <img :src="codeUrl" class="login-code-imgs" @click="getCode"/> 
          -->
          <div @click="getCode" v-html="code" style="vertical-align:middle"></div>
        </div>
      </el-form-item>
      <el-checkbox v-model="loginForm.rememberme" style="margin: 0 0 15px 0;">Remenber Me</el-checkbox>
      <el-form-item>
        <el-button style="width: 100%" @click="submit('loginForm')" type="primary">Login</el-button>
      </el-form-item>
    </el-form>
    <div class="el-login-footer">
      <span>Copyright © 2018-2022 huanggang All Rights Reserved.</span>
    </div>
  </div>
</template>

<script>
// import { getCodeImg } from '@/api/login'
export default {
  data() {
    return {
      loginForm: {
        username: '',
        password: '',
        checkCode: '',
        rememberme: false
      },
      codeUrl: '',
      code: '',
      codeText: ''
    }
  },
  methods: {
    submit() {
      if (this.loginForm.checkCode.toLowerCase() == this.codeText.toLowerCase()) {
        this.$message({
          type: "success",
          message: '登入成功'
        })
      } else (this.$message({
        type: 'error',
        message: '驗證碼錯誤!'
      }))
    },
    getCode() {
      this.$axios.get('/checkCode')
        .then(res => {
          console.log(res)
          this.code = res.data.data
          this.codeText = res.data.text
        })
    }
  },
  created() {
    this.getCode()
  }
}
</script>

<style scoped lang="scss">
.login {
  display: flex;
  height: 100%;
  background: url(../assets/images/login-background.jpg);
  background-size: cover;
  justify-content: center;
  align-items: center;
}

.title {
  text-align: center;
  color: #707070;
  margin: 0 auto 30px;
}

.login-form {
  box-sizing: border-box;
  width: 400px;
  border-radius: 6px;
  background-color: #fff;
  padding: 25px 25px 5px 25px;
}

.el-login-footer {
  height: 40px;
  line-height: 40px;
  position: fixed;
  bottom: 0;
  color: #fff;
  font-size: 12px;
  letter-spacing: 1px;
  font-family: Arial;
}

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

  div {
    cursor: pointer;
  }
}

.login-code-imgs {}
</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圖片驗證碼登入內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com