2022.9.13 手机验证码登录功能

article/2025/10/13 1:33:58

总结一下今天在项目中完成的功能

手机验证码登录功能

用到的前端技术:vue、vuex、axios,element-ui组件库
功能实现总体思路:
一. 用户在登录界面输入手机号,通过表单验证后,点击按钮获取验证码
二. 用户输入手机验证码,再次进行校验,然后点击登录按钮进行登录
三. 向后台发起数据请求,等待后台返回结果,这一步有两件事要做:
1.发请求之前,对axios进行封装,配置基础请求路径、请求时长、默认post请求头,设置请求响应拦截器
2.如果请求响应成功,对后台返回用户登录的token和用户信息进行存储(存到本地)
3.如果请求响应失败,提示错误信息
四.拿到数据之后,对数据进行页面渲染
五.退出登录,清除token和用户信息

一、用户在登录界面输入手机号,通过表单验证后,点击按钮获取验证码 二. 用户输入手机验证码,再次进行校验,然后点击登录按钮进行登录

  1. 登录界面使用element-ui的el-form表单校验
<el-formclass="phone-form"ref="form":model="form"label-position="left"size="small":rules="rules"><el-form-itemprop="phoneNum"><el-inputsize="small"placeholder="请输入手机号"v-model="form.phoneNum"class="input-with-select"><el-select v-model="select" slot="prepend" placeholder="+86"><el-option label="+86" value="+86"></el-option><el-option label="+40" value="+86"></el-option><el-option label="+111" value="+86"></el-option></el-select></el-input></el-form-item><el-form-itemprop="checkCode"><el-inputclass="check-code-box"size="small"v-model.number="form.checkCode"placeholder="请输入验证码"><el-button size="small" slot="append" @click="handleCaptcha">获取验证码</el-button></el-input></el-form-item><el-form-item><el-button class="custom-button" @click="onSubmit('form')" type="primary">登录</el-button></el-form-item></el-form>
  1. 验证规则
data () {return {rules: {phoneNum: [{ required: true, message: '手机号码不能为空哦!', trigger: 'blur' },{ min: 11, message: '请输入11位手机号码', trigger: 'blur' }],checkCode: [{ required: true, message: '验证码不能为空哦!', trigger: 'blur' }]}}},methods: {// 验证手机格式validatePho (value, callback) {if (value.toString().length < 11) {callback(new Error('手机号输入不正确'))}}}
  1. 获取验证码
    // 获取手机验证码handleCaptcha () {captcha(this.form.phoneNum)}

在这里插入图片描述

三. 向后台发起数据请求,等待后台返回结果 四.拿到数据之后,对数据进行页面渲染

  1. 发请求之前,对axios进行封装,配置基础请求路径、请求时长、默认post请求头,设置请求响应拦截器
import axios from 'axios'
import store from '@/store/index'
import { Loading } from 'element-ui'// 对axios进行封装
const request = axios.create({baseURL: '/api',timeout: 10000
})
// 设置post请求默认请求头
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8'
// loading进度样式
const options = {lock: true,background: 'rgb(0, 0, 0, 0.8)',text: 'Loading'
}// 在请求之前拦截
request.interceptors.request.use(function (config) {Loading.service(options)// 每次发送请求之前判断vuex中是否存在token// 如果存在,则统一在http请求的header都加上token,这样后台根据token判断你的登录情况// 即使本地存在token,也有可能token是过期的,所以在响应拦截器中要对返回状态进行判断const token = store.getters.getTokenif (token) {// 已经登录成功,统一添加tokenconfig.headers.Authorization = `Bearer ${token}`}return config},function (error) {if (error.response.status) {// 判断错误类型(状态码)switch (error.response.status) {// 401: 未登录// 未登录则跳转登录页面,并携带当前页面的路径// 在登录成功后返回当前页面,这一步需要在登录页操作。case 401:this.$message({type: 'info',customClass: 'model-message',iconClass: '1',message: '未登录'})break// 403 token过期// 登录过期对用户进行提示// 清除本地token和清空vuex中token对象case 403:this.$message({type: 'info',customClass: 'model-message',iconClass: '1',message: '未登录'})break// 404请求不存在case 404:this.$message({message: '网络请求不存在',duration: 1500,type: 'success'})break// 其他错误,直接抛出错误提示default:this.$message({message: error.response.data.message,duration: 1500,type: 'success'})}// 对请求错误进行操作return Promise.reject(error)}}
)// 在请求之后拦截
request.interceptors.response.use(function (response) {if (response.status === 200) {// 对响应数据进行操作Loading.service(options).close()return Promise.resolve(response)} else {return Promise.reject(response)}},function (error) {// 对响应错误进行操作return Promise.reject(error)}
)export default request
  1. 如果请求响应成功,对后台返回用户登录的token和用户信息进行存储,这里用vuex对token和用户信息进行管理,而且要进行持久化,不然页面一刷新数据就没有了
import Vue from 'vue'
import Vuex from 'vuex'
import createPersistedState from 'vuex-persistedstate'Vue.use(Vuex)const state = {// 存储tokentoken: '',// 当前用户基本信息userInfo: ''
}const getters = {// 获取tokengetToken (state) {return state.token || localStorage.getItem('token') || ''}
}const mutations = {// 设置tokenSETTOKEN (state, token) {state.token = token// 存储tokenlocalStorage.setItem('token', token)},// 删除tokenDELTOKEN (state) {state.token = ''localStorage.removeItem('token')},// 更新用户信息UPDATEUSERINFO (state, value) {state.userInfo = value},// 删除用户信息DELETEUSERINFO (state) {state.userInfo = ''localStorage.removeItem('userInfo')}
}export default new Vuex.Store({// 本地缓存(持久化)PersistedStateplugins: [createPersistedState({reducer: (state) => {return {songInfo: state.songInfo,songUrl: state.songUrl,model: state.model,renList: state.renList,songIndex: state.songIndex,userInfo: state.userInfo}}})],state,getters,mutations
})
  1. 在点击按钮的时候,进行整改表单的校验,如果校验成功,发送手机号和验证码给后台,如果请求响应失败,提示错误信息 (错误信息的提示我用到了element-ui的Message样式组件)
computed: {...mapState({// 登录凭证token: 'token'})
},
methods: {...mapMutations({// 存储tokensetToken: 'SETTOKEN',// 更新用户信息updateUserInfo: 'UPDATEUSERINFO'}),// 手机验证码登录async onSubmit (form) {this.$refs[form].validate(async (valid) => {if (valid) {await cellphone(this.form.phoneNum, this.form.checkCode).then(res => {console.log(res)// 存储tokenthis.setToken(res.data.token)// 存储用户信息this.updateUserInfo(res.data.profile)this.$message({type: 'info',customClass: 'model-message',iconClass: '1',message: '登录成功'})// 通知父组件显示用户名this.$emit('isActive')}).catch(error => {this.$message({type: 'info',customClass: 'model-message',iconClass: '1',message: error})})} else {console.log('error submit!!')return false}})}
}
  1. 渲染数据,用到了element-ui的下拉菜单组件、头像组件
<div class="container"><div class="login-box"><el-dropdownv-if="isActive"class="custom-el-dropdown"@command="handleCommand"><span class="el-dropdown-link hidden-xs-only"><el-avatar v-if="userInfo" size="medium" :src="userInfo.avatarUrl"></el-avatar><div class="nickname">{{ userInfo.nickname }}<i class="el-icon-arrow-down el-icon--right"></i></div></span><el-dropdown-menu slot="dropdown"><el-dropdown-item command="mineHomepage">我的主页</el-dropdown-item><el-dropdown-item command="minePlayList">我的歌单</el-dropdown-item><el-dropdown-item command="logOut">退出登录</el-dropdown-item></el-dropdown-menu></el-dropdown><el-buttonv-elsetype="text"@click="handleDialogForm()"class="custom-login">登录</el-button></div>

五.退出登录,清除token和用户信息

    // 下拉菜单事件async handleCommand (command) {switch (command) {// 退出登录case 'logOut':await logout().then(res => {// 清除tokenthis.delToken()// 清除用户信息this.deleteUserInfo()// 是否显示用户名this.handleUserName()this.$message({type: 'info',customClass: 'model-message',iconClass: '1',message: '注销成功'})}).catch(err => {console.log(err)})break// 获取我的歌单case 'minePlayList':this.minePlayList()break// 我的主页case 'mineHomepage':break}

登录成功效果:
在这里插入图片描述
这功能的实现离不开大佬的手把手教懂,通过学习大佬的下面的文章,我才能顺利完成我的功能。
文章链接:前端老实人


http://chatgpt.dhexx.cn/article/30bJ8uGS.shtml

相关文章

【从零开始分析项目实战】12-阿里云手机验证码登录功能的实现

注&#xff1a;本文章基于黑马程序员相关视频及资料进行编写&#xff0c;代码简单&#xff0c;较容易理解&#xff0c;若有问题或者源码资料获取可以在评论区留言或者联系作者&#xff01; 文章目录 开篇一、短信发送&#xff08;1&#xff09;短信服务介绍&#xff08;2&#…

手机验证码登录

手机验证码登录 符号说明&#xff1a; []&#xff1a;表示可选或某些条件下流程。 需求说明&#xff1a; 用户可在登录页面使用手机验证码登录&#xff0c;若该手机号未绑定则输入验证码后还需输入用户账号密码进行绑定&#xff0c;绑定后则成功使用验证码登录。 用户可在…

登录模块(手机验证码)

本人为实习生,第一次写博客,写的不好的大家多多谅解 应公司近期需求,需要单独开发一个后台管理系统。 自己按实际业务写了一个登录接口已经实现,时序图如下 源码牵扯业务量太大,这里只放出部分关键实现源码,整合思路可以配合时序图去理解。 Controller层 package com…

java十大排序算法

十大排序算法在面试java过程中想必或多或少都会有。尤其是在笔试题上&#xff0c;有些大厂就让你现场写个十大排序。是不是一下子整懵了。。。 目录 一、首先先介绍下十大排序算法&#xff1a; 1、算法分类 2 、算法复杂度 3、 相关概念 二、详细分析各个算法 1、冒泡排…

Go语言十大排序算法

文章目录 Go语言十大排序算法0x01 冒泡排序0x02 选择排序0x03 插入排序0x04 希尔排序0x05 归并排序0x06 快速排序0x07 堆排序0x08 计数排序0x09 桶排序0x10 基数排序总结按时间复杂度分类&#xff1a;按稳定性分类按排序方式 Go语言十大排序算法 稳定&#xff1a;如果a原本在b前…

排序算法——十大排序算法总结与对比

一、十大排序算法复杂度对比 二、关于排序算法的总结 1、基数排序仅仅适用于整型数的排序&#xff0c;一般不与另外的排序方法一起比较。 2、关于算法的稳定性&#xff1a;不稳定的算法有 “快希选堆”——快速排序&#xff0c;希尔排序&#xff0c;选择排序和堆排序。 3、关…

十大排序算法(面试必备)

目录 简单排序 1、冒泡排序 2、选择排序 3、插入排序 高级排序 4、希尔排序&#xff08;缩小增量排序&#xff09; 5、归并排序 6、快速排序 7、计数排序 8、堆排序 9、桶排序 10、基数排序 总结&#xff1a; 1、十大排序算法对比 2、基数排序、计数排序、桶排序…

十大排序算法学习

Sort 排序类算法是非常常见的算法&#xff0c;包括了比较类排序与非比较类排序 排序能够解决很多问题&#xff0c;有的编程语言也提供了一些排序算法函数&#xff08;比如C的sort&#xff09;但是掌握基本的排序算法原理以及写法仍然是很重要的&#xff0c;并且排序也是面试常…

十大排序算法(Java)

目录 1.冒泡排序 2.快速排序 3.插入排序 4.希尔排序 5.选择排序 6.堆排序 7.归并排序 8.计数排序&#xff1a;速度快&#xff0c;一般用于整数排序 9.桶排序 10.基数排序 1.冒泡排序 冒泡排序思路&#xff1a;&#xff08;两层for循环&#xff09; 比较相邻的元素。…

十大排序算法(C++)

十大排序算法Sorting algorithm(C) 百度百科&#xff1a; 所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。排序算法&#xff0c;就是如何使得记录按照要求排列的方法。排序算法在很多领域得到相当地…

十大排序算法——C语言实现

1.冒泡排序 ​ 冒泡排序&#xff08;Bubble Sort&#xff09;也是一种简单直观的排序算法。它重复地走访过要排序的数列&#xff0c;一次比较两个元素&#xff0c;如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换&#xff0c;也就是说该数…

Python实现十大排序算法

1.排序算法概述 非线性时间比较类排序&#xff1a;通过比较来决定元素间的相对次序&#xff0c;由于其时间复杂度不能突破O(nlogn)&#xff0c;因此称为非线性时间比较类排序。 线性时间非比较类排序&#xff1a;不通过比较来决定元素间的相对次序&#xff0c;它可以突破基于比…

Java实现十大排序算法

Java实现十大排序算法 十大排序算法分别为&#xff1a;选择排序、冒泡排序、插入排序、快速排序、归并排序、堆排序、希尔排序、桶排序、计数排序、基数排序。 本篇只是为了方便我在代码中直接复制调用&#xff0c;因此原理和思想解释的并不清楚&#xff0c;想看原理的朋友可…

十大排序算法(C++版)

十大排序算法 前言一、插入排序二、希尔排序三、冒泡排序四、快速排序五、选择排序六、归并排序七、堆排序八、计数排序九、桶排序十、基数排序总结 前言 什么是排序&#xff1f; 排序&#xff1a;将一组杂乱无章的数据按一定规律顺次排列起来。即&#xff0c;将无序序列排成一…

十大排序算法详解

十大排序算法详解 参考程序员必知必会的十大排序算法详解 引言 对于排序的分类&#xff0c;可以将排序算法分为两大类&#xff1a;基于比较和非比较的算法。 基于比较的排序算法可以细分为&#xff1a; 基于交换类&#xff1a;冒泡排序、快速排序基于插入类&#xff1a;直接插入…

JS 实现十大排序算法

文章目录 前言零、十大排序一、冒泡排序&#xff08;bubbleSort&#xff09;二、选择排序&#xff08;selectionSort&#xff09;三、插入排序&#xff08;insertSort&#xff09;四、希尔排序&#xff08;shellSort&#xff09;五、归并排序&#xff08;mergeSort&#xff09;…

十大经典排序算法Java版(动图演示)

文章目录 0 排序算法说明0.1 内部排序和外部排序0.2 比较类排序和非比较类排序0.3 关于时间复杂度0.4 关于稳定性0.5 名词解释&#xff1a; 1 交换排序——冒泡排序&#xff08;Bubble Sort&#xff09;1.1 什么时候最快1.2 什么时候最慢1.3 算法步骤1.4 动图演示1.5 Java实现 …

html之如何让button按钮居中

解决措施&#xff1a;使用center或者div的align属性 示例代码&#xff1a; <html> <body><center><button onClick"clickme()">hit me</button></center><script>function clickme(){alert("123");} </scr…

HTML中让表单和提交按钮居中的方法

表单&#xff1a; form{ width: 500px; /*设置宽度&#xff0c;方便使其居中*/ margin: 40px auto auto auto; /*上右下左*/ font-size: 25px; 提交按钮&#xff1a;div的align属性 <div align"center"><button onClick"clickme()">提交…

android中的Button按钮居中(水平垂直中)

今天发现一个很怪异的事 Android Studio中居然一个简单的按钮水品垂直居中都写不出来 下图为理想效果&#xff1a; 可是当我写原始出代码的时候&#xff08;如下&#xff09;&#xff1a; <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android&quo…