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

news2024/11/13 11:26:19

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

前端部分:

  • 登录界面改造:在现有的登录界面上增加短信验证码登录选项。用户可以选择使用短信验证码进行登录,前端表单将收集用户的手机号码和验证码信息。
  • 与后端接口的交互:实现前端与后端的交互逻辑,包括请求生成验证码、发送验证码到用户手机、提交验证码进行验证。前端通过调用后端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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2095545.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Boot集成google Authenticator实现mfa

1.什么时候mfa&#xff1f; 多重身份验证&#xff08;MFA&#xff09;是多步骤的账户登录过程&#xff0c;它要求用户输入更多信息&#xff0c;而不仅仅是输入密码。例如&#xff0c;除了密码之外&#xff0c;用户可能需要输入发送到其电子邮件的代码&#xff0c;回答一个秘密…

GoodSync - 本地云端备份同步工具

最近几年各种加密勒索软件层出不穷&#xff0c;个人数据受到威胁。如何让风险降到最低&#xff1f;养成好的备份习惯就很重要。 GoodSync 就是你值得信赖的同步备份工具&#xff0c;能够实现多合一管理网盘、文件安全备份或同步。 文件同步、备份好助手 要在多种设备中同步文…

9.1centos安装postgres

目录 一、安装并启动postgres 二、设置允许远程连接 三、重置密码 四、开放防火墙端口 五、重启服务后进入命令行模式 六、远程连接 一、安装并启动postgres # Install the repository RPM: sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpm…

用Python实现时间序列模型实战——Day 7: ARIMA 模型的诊断与调整

一、学习内容 1. 残差分析与模型诊断 残差分析&#xff1a; 在 ARIMA 模型拟合之后&#xff0c;我们需要检查模型残差是否满足白噪声的假设。如果模型残差表现为零均值、方差恒定且无自相关性&#xff0c;这说明模型已经捕捉了时间序列中的主要结构&#xff0c;剩下的残差是…

jarbas 靶机渗透(cms 渗透)

靶机信息 vulnhub 靶机 主机发现 (base) ┌──(root㉿kali)-[/home/kali/testJarbas] └─# sudo nmap -sn 192.168.50.0/24 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-08-28 15:45 CST Nmap scan report for 192.168.50.1 Host is up (0.00023s latency). MAC …

职场真相:在草台班子中寻找自我价值

在踏入社会的那一刻起&#xff0c;我们每个人都怀揣着对未来的无限憧憬与梦想&#xff0c;渴望在职场这个广阔的舞台上绽放光彩。然而&#xff0c;现实往往比理想骨感得多&#xff0c;尤其是在初入职场的几年里&#xff0c;那些曾经以为的“精英团队”、“完美计划”逐渐被现实…

如何选到好的宠物空气净化器,用哪款宠物空气净化器比较好?

在当今社会&#xff0c;养宠物已成为许多家庭不可或缺的一部分&#xff0c;猫猫狗狗以其独特的魅力&#xff0c;悄然融入了我们的生活&#xff0c;成为了家中的一员&#xff0c;它们不仅带来了无尽的欢笑与陪伴&#xff0c;更在无形中丰富了我们的情感世界&#xff0c;让家充满…

【Python】如何使用pip,安装第三方库和生成二维码、操作Excel

文章目录 第三方库使用 pip安装第三方库 生成二维码1. 确定使用哪个库2. 查看对应文档3. 开始操作 操作 Excel1. 安装 xlrd2. 编写代码 第三方库 第三方库就是别人已经实现好了的库&#xff0c;我们可以拿过来直接使用 虽然标准库已经很强大了&#xff0c;但是终究是有限的&am…

QT线程同步

#线程同步 在前面理解了QThread两种使用方法&#xff0c;和线程机制以及退出过程后&#xff0c;需要了解线程同步的内容了&#xff0c;今天开启学习线程同步知识。 还是从大佬的文章开始。 从下面这篇文章开始学习 线程同步 线程同步有&#xff1a; QMutex&#xff08;互斥&…

【PID系列】一文理解PID原理

【PID系列目录】 [&#xff11;、一文理解PID原理] &#xff12;、PID代码设计 本文目录 1、引出2、 PID概念2.1 首先&#xff0c;什么是偏差呢&#xff1f;2.2 其次&#xff0c;什么是PID比例项&#xff1f;2.3 积分————解决稳态误差的利器2.4  微分————改善动态响应…

while (r > b[i].r) del(a[r--]); while (r < b[i].r)

论 分治 cdq | [SDOI2011] 拦截导弹 某国为了防御敌国的导弹袭击&#xff0c;发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷&#xff1a;虽然它的第一发炮弹能够到达任意的高度、并且能够拦截任意速度的导弹&#xff0c;但是以后每一发炮弹都不能高于前一发的高度…

利用深度学习实现验证码识别-2-使用Python导出ONNX模型并在Java中调用实现验证码识别

1. Python部分&#xff1a;导出ONNX模型 首先&#xff0c;我们需要在Python中定义并导出一个已经训练好的验证码识别模型。以下是完整的Python代码&#xff1a; import string import torch import torch.nn as nn import torch.nn.functional as FCHAR_SET string.digits# …

静态库和共享库

文章目录 库的概念函数库库函数静态库的创建与使用静态库的概念静态库的创建代码示例--静态库的创建和使用 共享库的创建和是使用共享库的概念共享库的创建共享库的使用 总结 库的概念 当进行编辑C代码的时候常常会用到printf函数&#xff0c;这个函数被声明在stdio.h头文件中…

企业内部通信软件:打造高效协同办公的IM即时通讯工具

在现代企业中&#xff0c;高效的内部通信和协同办公是保持竞争优势的重要因素。为了实现团队间的快速沟通和协作&#xff0c;许多企业采用了企业内部通信软件&#xff0c;其中包括IM即时通讯工具。本文将探讨企业内部通信软件的重要性以及如何利用IM即时通讯工具打造高效协同办…

Clickhouse 为什么这么快

Clickhouse 的缘起 Clickhouse 最初是为 Yandex.Metrica 这个世界上第二大的Web分析平台开发的&#xff0c;并且一直是这个系统的核心组件。ClickHouse在Yandex.Metrica中的主要任务是使用非聚合数据在在线模式下构建报告&#xff0c;使用374台服务器组成的集群&#xff0c;在…

服务器间进行文件传输-SFTPSCP一篇搞定

1.简单介绍一下 在一些特殊场景&#xff0c;两台服务器之间需要进行文件传输的时候&#xff0c;或许我们会想到FTP&#xff0c;这也是我们常见的实现方式&#xff0c;但是如果我们不能操作远程服务器&#xff0c;无法判断远程服务器是否安装了FTP呢&#xff0c;众所周知&#…

学习周报-2024.8.31

目录 摘要 Abstract 创新点总结 模型数学原理 实验设置 一、验证实验 二、对比实验 摘要 这周重新梳理出论文的三个创新点&#xff0c;对所提出方法进行数学原理验证&#xff0c;证明其可行性。重新设置了实验部分&#xff0c;分为验证实验和对比实验&#xff0c;一共四…

使用 Eigen 库中的 Kronecker 积运算

前言 在数值计算和线性代数的众多应用中&#xff0c;Kronecker 积&#xff08;Kronecker Product&#xff09;是一种常用的矩阵运算。Eigen 是一个高性能的 C 数值计算库&#xff0c;广泛用于科学计算和工程应用中。在 Eigen 库中&#xff0c;Kronecker 积运算属于不常用的扩展…

资料分析(1)

1)截三个数去做&#xff0c;属于马上进位了&#xff0c;差距小&#xff0c;1/19<10% 2)截两位数去做&#xff0c;1/18>10% 3)次位差分别是:3&#xff0c;4&#xff0c;1&#xff0c;选项差距分别是大&#xff0c;大&#xff0c;小 截尾不需要考虑数量级 算一半&#xff0…

抽奖项目技术亮点

活动是通过秒杀领取的。&#xff08;即&#xff1a;活动对应着某一商品&#xff09; 这里超卖指&#xff1a;对于一个活动它的参与量有数量限制&#xff0c;就是活动的库存&#xff0c;当活动的领取数大于活动库存总量&#xff0c;就是超卖 用户秒杀参与活动的资格&#xff08;…