1. 程式人生 > >vue做一個有驗證碼的登陸頁面和註冊頁面,敲回車登陸

vue做一個有驗證碼的登陸頁面和註冊頁面,敲回車登陸

一:登陸頁面
效果圖:
這裡寫圖片描述

樣式問題:
背景頁面UI給的尺寸比較小的情況下,如何按比例不平埔背景呢?

.login {
  width: 100%;
  padding-bottom: 62.5%;
  height: 0;
  background: url('../../images/login.jpg') no-repeat center center fixed;
  background-size: cover;
  background-color: #0C1424;
  -webkit-background-size: cover;
  -moz-background-size: cover
; -o-background-size: cover; }

首先寬度是100%。高度是0,我們使用padding-bottom來固定寬高比
最最重要的是,不平埔還能展示全屏就是使用css3的background-size: cover 屬性了,注意做一下相容。

我們使用element ui 的表單驗證,可以控制輸入的字串格式,當我們做驗證碼的時候,希望只輸入4個字元便不能輸了,當輸入大於四個字元時就擷取掉後面的,並賦值給輸入框。

        vcode: [
          {required: true, validator: validateVcode, triger: 'blur'
} ] data () 中定義: var validateVcode = (rule, value, callback) => { // 將使用者輸入數字轉成字串,同時轉換成大寫 value = value + '' if (value.length > 4) { value = value.substring(0, 4) this.$set(this.loginInfo, 'vcode', value) } }

隨機生成驗證碼,在頁面一載入完畢就執行該函式生成一個驗證碼。

  mounted () {
    this
.generatedCode() }, 在methods中: generatedCode () { const random = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'] let code = '' for (let i = 0; i < 4; i++) { let index = Math.floor(Math.random() * 36) code += random[index] } this.ccode = code }

當用戶點選生成碼可以生成一個新的驗證碼,所以給該生成碼標籤繫結一個點選事件,在點選 後執行生成驗證碼函式。

    // 點選生成驗證碼
    handleCode () {
      this.generatedCode()
    }

當我們輸入驗證碼完成之後,需要驗證輸入的和我們生成的是否一致,所以需要一個判斷輸入驗證碼是否正確的函式。

    // 判斷驗證碼是否輸入準確
    checkCode () {
      let vcode = this.loginInfo.vcode
      vcode = vcode.toUpperCase()
      let ccode = this.ccode
      ccode = ccode.toUpperCase()
      if (vcode !== ccode) {
        this.$message.error('Please enter the correct verification code!')
        this.$set(this.loginInfo, 'vcode', '')
        this.$set(this.loginInfo, 'password', '')
      } else {
        return 1
      }
    },

當點選登陸按鈕的時候,開始驗證,我們在登入按鈕上繫結驗證表單的事件<el-button @click="handleSubmit('loginFrom')">Login</el-button>
思路: 首先在驗證表單之前先驗證驗證碼是否正確,正確的話才開始驗證表單,驗證碼不正確彈出驗證碼輸入有誤!
第二步:表單如果驗證成功,那麼就傳送使用者資訊到後臺登陸,如果驗證不成功的話,彈出表單填寫不正確
第三步:傳送請求到後臺,如果使用者資訊正確登陸成功,執行登陸成功的函式,將資料儲存在本地
如果使用者名稱或者密碼不對,請求出錯,則報使用者名稱或者密碼不對!

具體程式碼如下:

    handleSubmit (formName) {
      let codestatus = this.checkCode()
      // 先驗證輸入的驗證碼是否相同,相同再做密碼和輸入框的正確與否
      if (codestatus) {
        this.$refs[formName].validate((valid) => {
          if (valid) {
            axios.get('/rest/login.json')
              .then(this.loginInfoSucc)
          } else {
            this.$message.error('Please enter a valid username or password')
            return false
          }
        })
      } else {
        this.$message.error('Please enter the correct verification code!')
        this.$set(this.loginInfo, 'vcode', '')
        this.$set(this.loginInfo, 'password', '')
      }
    },
     loginInfoSucc (res) {
      res = res.data
      if (res.payload && !res.status) {
        // 儲存選單的配置
        const allInfo = res.payload
        this.$store.dispatch('configurationInfo', allInfo)
        // 儲存使用者名稱的配置
        let userInfo = {}
        if (this.remember) {
          this.$set(userInfo, 'employeeid', this.loginInfo.employeeid)
          this.$set(userInfo, 'password', this.loginInfo.password)
        } else {
          this.$set(userInfo, 'employeeid', '')
          this.$set(userInfo, 'password', '')
        }
        this.$store.commit('saveUserInfo', userInfo)
        // 設定資料來源的開關為SAP
        let dataswitch = false
        this.$store.commit('switchData', dataswitch)
        this.$router.push('/home')
      } else {
        this.$message.error('Incorrect user name or password')
      }
    }

現在我們實現了點選登陸,使用者體驗度做的好一點,還希望完成敲回車直接登陸,
我們輸入完驗證碼敲回車,也去執行登陸的觸發時間就可以了。
在驗證碼的輸入框中加上@keyup.enter,native ="handleSubmit('loginFrom')" 即可
ok,暫時登陸頁面的技術總結完畢,後續應該會新增localStroage的要點。

二: 註冊頁面
效果圖:
這裡寫圖片描述
註冊頁面的技術要點沒多少,還是表單的問題
1.遇到比較麻煩的一點是,在from中select元件修改全域性樣式無效,因為select元件生成的下拉選單不在父級div中,而是在與app同級的div中,解決這個問題是給select新增一個叫prop-class的屬性,該屬性是給下拉選單定義一個類名,在該類下修改樣式就可以了。
2. password 驗證是使用自定義驗證的。

    var validatePassword = (rule, value, callback) => {
      if (value === '') {
        callback(new Error('please input password'))
      } else {
        if (this.registerInfo.cpassword !== '') {
          this.$refs.registerForm.validateField('cpassword')
        }
        callback()
      }
    }
    var validateCPassword = (rule, value, callback) => {
      if (value === '') {
        callback(new Error('input password again'))
      } else if (value.length >=this.registerInfo.password.length && value !== this.registerInfo.password) {
        callback(new Error('The two passwords do not match!'))
      } else {
        callback()
      }
    }

this.$refs.registerForm.validateField(‘cpassword’) 是當驗證密碼存在時,重新輸入密碼,我們要將根據第二次的輸入密碼作為判斷,當輸入不同時,就會觸發兩次密碼不同的提示
另外驗證密碼,不要一開始剛輸入就顯示不一樣,要在輸入長度一樣之後再判斷,給使用者比較好的體驗。