若依框架(前后端分离)增加手机号验证码登录

这篇文章主要介绍了如何在若依架(前后端分离)版本中集成短信验证码登录功能。文章内容包括了前后端的详细实现步骤,并通过代码示例展示了如何生成验证码、验证验证码、验证码登录、自定义的认证处理等功能的实现。

前端部分:

  • 登录界面改造:在现有的登录界面上增加短信验证码登录选项。用户可以选择使用短信验证码进行登录,前端表单将收集用户的手机号码和验证码信息。
  • 与后端接口的交互:实现前端与后端的交互逻辑,包括请求生成验证码、发送验证码到用户手机、提交验证码进行验证。前端通过调用后端API来完成这些操作,并根据后端的响应结果处理登录流程和用户反馈,确保用户体验的流畅性与安全性。

一、增加短信登录和发送短信验证码方法

        在src/api/login.js新增短信登录、发送短信验证码

// 短信登录方法
export function smsLogin(mobile,smsCode,uuid) {
  const data = {
    mobile,
    smsCode,
    uuid
  }
  return request({
    url: '/sms/login',
    method: 'post',
    data: data
  })
}

// 发送短信验证码
export function getSmsCode(mobile) {

  const data = {
    mobile
  }

  return request({
    url: '/sms/code',
    method: 'post',
    data:data
  })
}

二、增加短信登录方法 

        在src/store/modules/user.js新增短信登录方法

    // 短信登录
    SmsLogin({ commit }, userInfo) {
      const mobile = userInfo.mobile.trim()
      const smsCode = userInfo.smsCode
      const uuid = userInfo.uuid
      return new Promise((resolve, reject) => {
        smsLogin( mobile, smsCode, uuid).then(res => {
          setToken(res.token)
          commit('SET_TOKEN', res.token)
          resolve()
        }).catch(error => {
          reject(error)
        })
      })
    }

注意有没有引入对应类!!!

注意有没有引入对应类!!!

注意有没有引入对应类!!!

import { login, logout, getInfo, smsLogin } from '@/api/login'

三、增加发送短信验证码和短信登录逻辑 

        在src/views/login.vue修改登录页面,增加发送短信验证码和短信登录代码

<template>
    <div class="login">
      <el-form ref="loginForm" :model="loginForm" :rules="loginRules" class="login-form">
        <h3 class="title">若依后台管理系统</h3>
        <el-form-item prop="username" v-if="!isSmsLogin">
          <el-input v-model="loginForm.username" type="text" auto-complete="off" placeholder="账号">
            <svg-icon slot="prefix" icon-class="user" class="el-input__icon input-icon" />
          </el-input>
        </el-form-item>
        <el-form-item prop="password" v-if="!isSmsLogin">
          <el-input v-model="loginForm.password" type="password" auto-complete="off" placeholder="密码" @keyup.enter.native="handleLogin">
            <svg-icon slot="prefix" icon-class="password" class="el-input__icon input-icon" />
          </el-input>
        </el-form-item>
        <el-form-item prop="code" v-if="!isSmsLogin">
          <el-input v-model="loginForm.code" auto-complete="off" placeholder="验证码" style="width: 63%" @keyup.enter.native="handleLogin">
            <svg-icon slot="prefix" icon-class="validCode" class="el-input__icon input-icon" />
          </el-input>
          <div class="login-code">
            <img :src="codeUrl" @click="getCode" class="login-code-img"/>
          </div>
        </el-form-item>
  
  
        <el-form-item prop="mobile" v-if="isSmsLogin">
          <el-input v-model="loginForm.mobile" type="text" auto-complete="off" placeholder="手机号">
            <svg-icon slot="prefix" icon-class="user" class="el-input__icon input-icon" />
          </el-input>
        </el-form-item>
        <el-form-item prop="smsCode" v-if="isSmsLogin">
          <el-input v-model="loginForm.smsCode" auto-complete="off" placeholder="验证码" style="width: 63%" @keyup.enter.native="handleLogin">
            <svg-icon slot="prefix" icon-class="validCode" class="el-input__icon input-icon" />
          </el-input>
          <div class="login-code">
            <el-button round @click.native.prevent="getSmsCode">{
  {computeTime>0 ? `(${computeTime}s)已发送` : '获取验证码'}}</el-button>
          </div>
        </el-form-item>
  
        <el-row>
          <el-checkbox v-model="loginForm.rememberMe" style="margin:0px 0px 25px 0px;">记住密码</el-checkbox>
          <div class="sms-login">
            <el-button
              size="mini"
              type="text"
              @click.native.prevent="loginMethod"
            >
              <span v-if="isSmsLogin">账号密码登录</span>
              <span v-else>短信验证登录</span>
            </el-button>
          </div>
        </el-row>
        <el-form-item style="width:100%;">
          <el-button :loading="loading" size="medium" type="primary" style="width:100%;" @click.native.prevent="handleLogin">
            <span v-if="!loading">登 录</span>
            <span v-else>登 录 中...</span>
          </el-button>
          <div style="float: right;" v-if="register">
            <router-link class="link-type" :to="'/register'">立即注册</router-link>
          </div>
        </el-form-item>
      </el-form>
      <!--  底部  -->
      <div class="el-login-footer">
        <span>Copyright © 2018-2020 ruoyi.vip All Rights Reserved.</span>
      </div>
    </div>
  </template>
  
  <script>
  import {getCodeImg, getSmsCode,smsLogin} from "@/api/login";
  import { authBinding } from "@/api/system/auth";
  import Cookies from "js-cookie";
  import { encrypt, decrypt } from '@/utils/jsencrypt'
  
  export default {
    name: "Login",
    data() {
      return {
        codeUrl: "",
        cookiePassword: "",
        computeTime: 0,
        loginForm: {
          username: "",
          password: "",
          rememberMe: false,
          code: "",
          uuid: "",
          mobile: "",
          smsCode: ""
  
        },
        loginRules: {
          username: [
            { required: true, trigger: "blur", message: "请输入您的账号" }
          ],
          password: [
            { required: true, trigger: "blur", message: "请输入您的密码" }
          ],
          mobile: [
            { required: true, trigger: "blur", message: "手机号不能为空" }
          ],
          code: [{ required: true, trigger: "change", message: "请输入验证码" }
          ],
        },
  
        loading: false,
        // 验证码开关
        captchaEnabled: true,
        // 注册开关
        register: false,
        isSmsLogin: false,
        redirect: undefined
      };
    },
    watch: {
      $route: {
        handler: function(route) {
          this.redirect = route.query && route.query.redirect;
        },
        immediate: true
      }
    },
    created() {
      this.getCode();
      this.getCookie();
    },
    methods: {
      loginMethod(){
        this.isSmsLogin = !this.isSmsLogin;
      },
      getSmsCode(){
        if (!this.computeTime) {
          this.$refs.loginForm.validate(valid => {
            if (valid) {
              getSmsCode(this.loginForm.mobile).then(res =>{
                if(re
  • 14
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值