Vue如何实现不同登录方式的切换(账号密码登录、邮箱验证登录等)

article/2025/9/11 13:10:05

文章目录

  • 前言
  • 一、使用vue开发框架的时候,无论是vue2或是vue3,都会运用到element ui组件库或是element-plus ui组件库,所以我们要解决的问题首先从这些组件库里来找寻答案
  • 二、项目里按需引入或者全局导入element ui组件库或是element-plus ui组件库
    • 1.省略常规操作,直接在页面中引入Tabs(标签页)组件
    • 2.运行后的效果
  • 三、再说一下Tabs(标签页)的属性(根据项目的实际需求添加)


前言

通常情况下,一个系统无论是前台或者还是后台,从用户层面的考量都不止一种登录方式。
登录方式可以是:账号密码登录、邮箱验证登录、手机短信验证登录、第三方登录…
需要自己单独在页面实现切换的方式吗?(比如说,通过对组件的设置实现登录和注册按钮的切换,也是很简单的一种方式)
可以,但不高效。
如何高效的实现切换呢?请听我一一道来!


一、使用vue开发框架的时候,无论是vue2或是vue3,都会运用到element ui组件库或是element-plus ui组件库,所以我们要解决的问题首先从这些组件库里来找寻答案

参考实例:ProcessOn的登录方式的切换

ProcessOn登录的方式

二、项目里按需引入或者全局导入element ui组件库或是element-plus ui组件库

1.省略常规操作,直接在页面中引入Tabs(标签页)组件

官方示例:
在这里插入图片描述

代码如下:


<template><div class="login_container"><div class="login_logo"><img /></div><div class="login_box"><!-- 登录表单区域 --><el-tabs :stretch="true"><el-tab-pane label="账号密码登录"><!-- 账号密码登录表单 --><el-form ref="pwdLoginFormRef" :model="pwdLoginForm" :rules="pwdLoginFormRules"><!-- 用户名 --><el-form-item prop="username"><el-input placeholder="用户名/邮箱/手机号" clearable prefix-icon="el-icon-user-solid
" v-model="pwdLoginForm.username"></el-input></el-form-item><!-- 密码 --><el-form-item prop="password"><el-input placeholder="密码" type="password" show-password prefix-icon="el-icon-lock"v-model="pwdLoginForm.password"></el-input></el-form-item><!-- 按钮区域 --><el-form-item class="login_btns"><el-button type="primary" @click="pwdLogin" :loading="loading">登录</el-button><el-button type="primary" @click='toRegister'>注册</el-button></el-form-item></el-form></el-tab-pane><el-tab-pane label="邮箱验证登录"><!-- 邮箱验证登录表单 --><el-form ref="emailLoginFormRef" :model="emailLoginForm" :rules="emailLoginFormRules"><!-- 邮箱 --><el-form-item prop="email"><el-input placeholder="邮箱" clearable prefix-icon="el-icon-message" v-model="emailLoginForm.email"></el-input></el-form-item><!-- 邮箱验证码 --><el-form-item prop="emailCode"><el-input placeholder="验证码" prefix-icon="el-icon-key" v-model="emailLoginForm.emailCode"><template #append><el-button :disabled="disabled" @click="getEmailValidateCode">{{buttonText}}</el-button></template></el-input></el-form-item><!-- 按钮区域 --><el-form-item class="login_btns"><el-button type="primary" @click="emailLogin">登录</el-button><el-button type="primary" @click='toRegister'>注册</el-button></el-form-item></el-form></el-tab-pane><!-- <el-tab-pane label="手机验证登录"> --><!-- 手机验证登录表单 --><!-- <el-form ref="phoneLoginFormRef" :model="phoneLoginForm" :rules="phoneLoginFormRules"> --><!-- 手机号 --><!-- <el-form-item prop="phone"><el-input placeholder="手机号" clearable prefix-icon="el-icon-phone" v-model="phoneLoginForm.phone"></el-input></el-form-item> --><!-- 手机验证码 --><!-- <el-form-item prop="phoneCode"><el-input placeholder="验证码" prefix-icon="el-icon-key" v-model="phoneLoginForm.phoneCode"><template #append><el-button>获取验证码</el-button></template></el-input></el-form-item> --><!-- 按钮区域 --><!-- <el-form-item class="login_btns"><el-button type="primary" @click="phoneLogin">登录</el-button><el-button type="success" @click='toRegister'>注册</el-button></el-form-item></el-form></el-tab-pane> --></el-tabs></div><div class="login_footer">登录即表示您已阅读并同意<a href="#">服务条款</a></div></div>
</template><script>import {ref,reactive,toRefs,getCurrentInstance} from 'vue'import qs from 'qs'import axios from 'axios'import {useRouter} from 'vue-router'export default {setup() {// 验证邮箱的规则var checkEmail = (rule, value, cb) => {// 验证邮箱的正则表达式const regEmail = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/if (regEmail.test(value)) {// 合法的邮箱return cb()}cb(new Error('请输入合法的邮箱'))}// // 验证手机号的规则// var checkMobile = (rule, value, cb) => {//   // 验证手机号的正则表达式//   const regMobile = /^(0|86|17951)?(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$///   if (regMobile.test(value)) {//     return cb()//   }//   cb(new Error('请输入合法的手机号'))// }const {proxy} = getCurrentInstance()const router = useRouter()const pwdLoginFormRef = ref(null)const emailLoginFormRef = ref(null)// const phoneLoginFormRef = ref(null)const state = reactive({pwdLoginForm: {username: 'admin',password: '123456'},emailLoginForm: {email: '',emailCode: ''},// phoneLoginForm: {//   phone: '',//   phoneCode: ''// },pwdLoginFormRules: {username: [{required: true,message: '请输入你的账号',trigger: 'blur'}],// 验证密码是否合法password: [{required: true,message: '请输入你的密码',trigger: 'blur'}]},emailLoginFormRules: {email: [{required: true,message: '请输入你的邮箱',trigger: 'blur'},{validator: checkEmail,trigger: 'blur'}],emailCode: [{required: true,message: '请输入你获取到的验证码',trigger: 'blur'}]},// phoneLoginFormRules: {//   phone: [{//       required: true,//       message: '请输入你的手机号',//       trigger: 'blur'//     },//     {//       validator: checkMobile,//       trigger: 'blur'//     }//   ],//   phoneCode: [{//     required: true,//     message: '请输入你获取到的验证码',//     trigger: 'blur'//   }]// },loading: false,// 控制获取验证码buttonText: '获取验证码',disabled: false,duration: 60,timer: null})// 账号密码登录const pwdLogin = async () => {state.loading = trueconst obj = {username: state.pwdLoginForm.username,password: state.pwdLoginForm.password}try {const res = await new proxy.$request(proxy.$urls.m().pwdLogin, qs.stringify(obj)).modepost()console.log(res)if (res.data.success != true) {new proxy.$tips(res.data.message, 'warning').mess_age()} else {new proxy.$tips(res.data.message, 'success').mess_age()localStorage.setItem('token', res.data.data.token)// 成功跳转页面}state.loading = false} catch (e) {state.loading = falsenew proxy.$tips('服务器发生错误', 'error').mess_age()}}// 获取邮箱验证码const getEmailValidateCode = () => {const obj = {email: state.emailLoginForm.email}axios.post('requestUrl', qs.stringify(obj)).then(res => {if (res.data.success != true) {new proxy.$tips(res.data.message, 'warning').mess_age()} else {console.log(res.data)console.log(res.headers)new proxy.$tips(res.data.message, 'success').mess_age()// localStorage.setItem('token', res.data.data.token)state.timer = setInterval(() => {state.disabled = trueconst tmp = state.duration--state.buttonText = `${tmp}秒后重新获取`if (tmp <= 0) {clearInterval(state.timer)state.duration = 60state.buttonText = '重新获取验证码'state.disabled = false}}, 1000)}})}// 邮箱验证登录const emailLogin = async () => {state.loading = trueconst obj = {email: state.emailLoginForm.email,emailValidateCode: state.emailLoginForm.emailCode,token: localStorage.getItem('token')}try {const res = await new proxy.$request(proxy.$urls.m().emailLogin, qs.stringify(obj)).modepost()if (res.data.success != true) {new proxy.$tips(res.data.message, 'warning').mess_age()} else {new proxy.$tips(res.data.message, 'success').mess_age()localStorage.setItem('token', res.data.data.token)// 成功跳转页面}state.loading = false} catch (e) {state.loading = falsenew proxy.$tips('服务器发生错误', 'error').mess_age()}}// 手机号验证登录// const phoneLogin = async () => {//   const obj = {//     phone: state.phoneLoginForm.phone,//     phoneCode: state.phoneLoginForm.phoneCode//   }// }const toRegister = () => {router.push({path: '/register'})}return {...toRefs(state),pwdLoginFormRef,emailLoginFormRef,// phoneLoginFormRef,pwdLogin,getEmailValidateCode,emailLogin,// phoneLogin,toRegister}}}
</script><style lang="less" scoped>.login_container {width: 100%;height: 100%;background: url(../assets/登录页面背景图.png);position: fixed;background-size: 100% 100%;}.login_box {width: 395px;height: 435px;background-color: rgba(225, 225, 225, 0);border: 1px solid rgba(225, 225, 225, 0);box-shadow: 2px 3px 3px #aaaaaa;border-radius: 5px;position: relative;left: 50%;top: 50%;transform: translate(-50%, -50%);}.login_btns {text-align: center;}.login_footer { position: absolute;left: 50%;top: 70%;transform: translate(-50%, -50%);border: 1px solid #ffffff;width: 395px;height: 30px;text-align: center;}
</style><style scoped>.login_box {backdrop-filter: blur(15px);box-shadow: 0 0 5px #fff;}.el-tabs >>> .el-tabs__header { padding: 5% 10% 0 10%;}.el-tabs >>> .el-tabs__item:hover {color: #fff;cursor: pointer;}.el-tabs >>> .el-tabs__item.is-active {color: #c915e5;}.el-form {text-align: center;}.el-form-item>>>.el-form-item__error {left: 10%;}.el-input {width: 80%;}.el-input { --el-input-font-color: black;}.el-input>>>.el-input__inner {background-color: rgba(225, 225, 225, 0);box-shadow: 0 0 2px #fff;border: 1px solid #fff;}.el-button {border-radius: 10px;}.el-button--primary {--el-button-font-color: #409e40;--el-button-background-color: #ffffff;--el-button-border-color: #409eff;--el-button-hover-color: #66b1ff;--el-button-active-font-color: #e6e6e6;--el-button-active-background-color: #0d84ff;--el-button-active-border-color: #0d84ff;}
</style>

2.运行后的效果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
通过点击上面的Tabs(标签)实现三种不同的登录方式

三、再说一下Tabs(标签页)的属性(根据项目的实际需求添加)

通过给el-tabs添加:stretch="true"的属性值,实现撑满上方页头的功能;
通过给el-tabs添加type="border-card"的属性值,实现带有边框的卡片风格样式;
通过给el-tabs添加type="card"的属性值,实现卡片风格的样式;


http://chatgpt.dhexx.cn/article/axM4ivXp.shtml

相关文章

python实现账号密码登录

用Python实现账号密码登录 准备 无需数据库 程序简介 运行这个程序&#xff0c;注册后哪怕重新运行&#xff0c;注册的账号依然存在&#xff0c;我们可以把账号密码分别保存到2个txt中&#xff0c;使用的时候再读取txt 为了安全起见&#xff0c;我们可以对账号密码进行加密…

验证账号、密码登录

在商贸系统登录的时候,不需要验证码的验证,只需要验证账户和密码正确就可以进行登录,所以我们就只需要对账号和密码进行判断。这里写的登录逻辑很简单。 只做到了:当用户输入了账号和密码正确就可以登录进去,并没有完善到其它功能所以逻辑是容易理解而且清晰。给登录按钮…

(Html)实现一个账号密码登录的弹窗界面(代码)

一、代码段 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>账号密码弹窗</title> </head><body><label>账号</label><br><input id"user"><br><label>…

QT 记住账号密码登录

弄了个简单的记住账号密码登录功能&#xff0c;适合初学者学习&#xff0c;直接上代码&#xff0c;代码有注释。 喂饭到嘴边了&#xff0c;看你会不会吃啦 开发环境是VS2015 1、由于没有写注册功能&#xff0c;所以账号和密码我提前写在一个ini文件&#xff0c;这个文件直接手…

31、Java——JDBC实现账号密码登录

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;乐趣国学的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;Java案例分…

基于Java的账号、密码登陆页面及验证

基于Java的登陆页面 需求功能 程序登录页面验证页面 后续 需求 我们在日常上网的过程中&#xff0c;常常会使用很多注册、登录我们的账号和密码的环节。这是网页开发中必不可少的一个环节。本文中将利用JavaTomcat完成一个简单的账号、密码登录的网页。 功能 首先&#xff0…

MATLAB中用imfilter()对图像进行相关或卷积运算前一定要用tofloat()或im2double()将数据类型转换为浮点型

MATLAB中用imfilter()对图像进行相关或卷积运算前一定要用tofloat()将数据类型为float 为什么&#xff1f; 看一个实例的运行结果就知道了~ f imread(F:\material\images\P0020-Line-detection-01.tif); w [2 -1 -1;-1 2 -1;-1 -1 2]; g_tofloat imfilter(tofloat(f),w); …

matlab图像处理函数

1.1 读取和保存图像(其中Iimread(‘’)) 1.1.1 imtool() imtool&#xff08;I&#xff09;在图形中显示灰度图像I&#xff0c;I为矩阵&#xff0c;元素范围为0-255. imtool&#xff08;I&#xff0c;[low&#xff0c;high]&#xff09;小于等于low的为黑色&#xff0c;大于等于…

【Matlab】im2double的用法

im2double函数用于将图像转换为双精度。 语法形式有4种&#xff0c;分别是&#xff1a; I2 im2double(I); RGB2 im2double(RGB); I im2double(BW); X2 im2double(X, indexed); 描述&#xff1a; I2 im2double(I)将灰度图像I转换为双精度&#xff0c;必要时可以…

MATLAB图像处理,double 与im2double的用处与区别【学习笔记】

double只是将像素的灰度值从int8换为double&#xff0c;数值大小不变&#xff0c;125还是125.0。 im2double则附带了归一化操作&#xff0c;125变成了125/2550.490196078 double也不是毫无用处&#xff0c;在将一个256级的灰度图修改为4级时候就用这个&#xff0c;用im2double反…

信息论 | 计算离散信源的信息量和熵的MATLAB实现(函数封装调用)

《信息论基础》 实验报告 姓名 XX 班级 XXXXXX 学号 2020XXXXXXXX 实验项目 计算离散信源的熵 日期 2022.10.21 实验环境 联想电脑MATLAB R2018a版 实验内容与完成情况&#xff08;记录实验内容、操作步骤、实验结果等&#xff0c;包括系统输出的错误信息&#xff0c…

信息量,信息熵,纯度

如果看不懂博文&#xff0c;请阅读《信息论基础》一看便懂。 链接&#xff1a;https://pan.baidu.com/s/1T7rS4owM2nU_DP6rthqUPA 提取码&#xff1a;zu9s &#xff08;1&#xff09;消息 消息是实体&#xff0c;信息是抽象的。可以从消息中获取信息。消息的表现形式可以是…

基于GIS技术的地质灾害易发性评价—信息量模型

1.将上述步骤的所有图层和历史滑坡点导入arcgis,并使用多值提取至点的步骤,提取滑坡点属性值 2.转换工具—表转excel,得到多值提取至点的表格 3.打开各图层属性表提取每一分级的栅格像元,并计算信息量值。

自信息量,熵及其性质

一般地&#xff0c;如果一个随机事件有种等可能的结果&#xff0c;那么对其编码恰需要n位二进制数&#xff0c;即n比特来储存消息。 因此&#xff0c;可以把对所有可能消息的最小二进制编码位数近似着作该随机事件的熵&#xff0c;记为H。 对于上面的例子分别有 定义2.3 …

GIS与地质灾害评价——信息量的统计

GIS与地质灾害评价中一般都要进行信息量的统计&#xff0c;特别是地质灾害易发性评价的过程中&#xff0c;我们通常将某一因子分为几类&#xff0c;为了比较某一因子不同类别致灾的贡献率&#xff0c;我们通常都要进行信息量的统计。 下边我将某一区域的高程因子为例进行信息量…

数学期望、信息量、信息熵、相对熵、交叉熵

1、数学期望 数学期望就是总体的均值&#xff0c;或者各项的加权平均。 先看离散的情况&#xff0c;假设X为离散型随机变量&#xff0c;x1&#xff0c;x2&#xff0c;x3&#xff0c;……&#xff0c;xk为随机变量的所有可能取值&#xff0c;p1&#xff0c;p2&#xff0c;p3&a…

信息论:信息量的计算

香农定义&#xff0c;一个事件包含信息量的大小由这个事件消除了多少不确定性决定 计算得出的信息称为 Shannon information content 信息量在某些情况下是可加的&#xff0c;比如&#xff1a; 得知一个六面骰子投掷三次的结果所包含的信息量&#xff0c;是得知投掷一次的结果…

信息量与信息熵

信息量 信息奠基人香农&#xff08;Shannon&#xff09;认为“信息是用来消除随机不确定性的东西”。也就是说衡量信息量大小就看这个信息消除不确定性的程度。 “太阳从东方升起了”这条信息没有减少不确定性。因为太阳肯定从东面升起。这是句废话&#xff0c;信息量为0。 …

信息量为什么要表示成对数的形式

近期在路上进行了不少的思考&#xff0c;任何方面&#xff0c;任何领域…我会把这些记录在手机的备忘录里&#xff0c;然后在周末总结出来&#xff0c;早就成了习惯。 近日对信息论&#xff0c;排队论以及贝叶斯定理关注比较多&#xff0c;后二者可以完全改造TCP的拥塞控制机制…

离散信源信息量、平均信息量的计算

信息量I与消息出现的概率 P(x) 之间的关系&#xff1a; 1.信息量是概率的函数&#xff0c;即If[P(x)]&#xff1b; 2.P(x) 越小&#xff0c;I越大&#xff0c;P(x) 越大&#xff0c;I越小&#xff1b; 3.若干个相互独立事件构成的消息&#xff0c;所含信息量等于各独立事件信息…