vue3实现简单登录页面

使用 Vue3 + ts + scss + element-plus 实现简单的用户登录界面,登录方式包括:手机验证码登录、手机账号密码登录、扫码登录,效果如下图所示:效果示意图
详细代码:
模版部分

<template><div class="login"><div class="container"><div class="content"><h4>{{ title }}登录</h4><div class="qr-code-area" v-if="loginType === 'qrcode'"><img src="@/assets/myblog.png" alt="myblog-qrcode" /></div><div v-else class="account-area"><el-form ref="formRef" :rules="loginRules" :model="loginForm" label-width="auto":hide-required-asterisk="true"><el-form-item label="手机号" prop="account"><el-input v-model="loginForm.account" placeholder="请输入手机号码"><template #prepend>+86</template></el-input></el-form-item><el-form-item v-if="loginType === 'password'" prop="password" label="密码"><el-input v-model="loginForm.password" placeholder="请输入密码"></el-input></el-form-item><el-form-item v-if="loginType === 'vetifycode'" prop="vetifycode" label="验证码"><el-input v-model="loginForm.verifyCode" placeholder="请输入六位验证码" maxlength="6"><template #append><el-button type="primary" @click="handleSendVerifyCode">获取验证码</el-button></template></el-input></el-form-item></el-form><router-link class="forget-area" v-if="loginType === 'password'" to="">忘记密码</router-link><div class="operation-area"><el-button class="submit-btn" type="primary" @click="handleLogin">登录</el-button></div></div><div class="change-login-type"><div :class="['login-type', loginType === 'vetifycode' && 'active']" @click="loginType = 'vetifycode'">手机号</div><div :class="['login-type', loginType === 'password' && 'active']" @click="loginType = 'password'">账号密码</div><div :class="['login-type', loginType === 'qrcode' && 'active']" @click="loginType = 'qrcode'">二维码</div></div></div></div></div>
</template>

js部分

<script lang="ts" setup>
import { ElMessage } from 'element-plus';
import { computed, reactive, ref, watch } from 'vue';const loginRules = {account: [{ required: true, message: '请输入手机号码', trigger: 'blur' },{ pattern: /^1\d{10}$/, message: "请输入正确的手机号码", trigger: "blur" }],password: [{ required: true, message: '请输入密码', trigger: 'blur' }],
}const formRef = ref<HTMLFormElement>(null);
const loginForm = reactive({account: '',password: '',verifyCode: ''
});
const loginType = ref<'password' | 'vetifycode' | 'qrcode'>('vetifycode');const title = computed(() => {switch (loginType.value) {case 'password':return '账号密码'case 'vetifycode':return '短信验证码'case 'qrcode':return '扫码'default:return ''}
})watch(loginType, () => {formRef?.value?.resetFields();
})const handleSendVerifyCode = () => {formRef.value.validateField('account', (valid: boolean) => {if (valid) {ElMessage.info('您的验证码为:005114')}})
}const handleLogin = () => {formRef.value.validate((vaild: boolean) => {if (vaild) {console.log('表单验证通过,提交接口验证信息')if (loginType.value === 'vetifycode' && loginForm.verifyCode !== '005114') {return ElMessage.error('验证码错误')}let message = '登录成功'if (loginForm.account) {message += ',登录的账号为' + loginForm.account;}if (loginForm.password) {message += ',登录的密码为' + loginForm.password;}if (loginForm.verifyCode) {message += ',登录的验证码为' + loginForm.verifyCode;}ElMessage.success(message)} else {console.log('验证失败');}})
}</script>

Scss部分

<style lang="scss" scoped>
%bg {background-repeat: no-repeat;background-size: cover;background-position: center;
}.login {min-height: 675px;height: 100vh;width: 100vw;display: flex;align-items: center;justify-content: center;background-image: url(@/assets/bg.jpg);@extend %bg;
}.container {width: 350px;
}.content {color: #fff;width: 300px;background-color: #fff;border: 1px solid #eee;padding: 20px;box-shadow: -15px 15px 15px rgba(6, 17, 47, 0.7);background: linear-gradient(230deg,rgba(53, 57, 74, 0) 0%,rgb(0, 0, 0) 100%);
}.account-area {margin-top: 50px;
}:deep(.el-form-item__label) {color: #fff;
}.qr-code-area {width: 200px;height: 200px;margin: 40px auto 20px auto;img {width: 100%;height: 100%;}
}.forget-area {float: right;font-size: 13px;line-height: 16px;color: #267EF0;
}.submit-btn {margin: 50px 0 30px 0;width: 100%;
}.change-login-type {display: flex;border-top: 1px solid #eee;justify-content: space-between;padding-top: 10px;.login-type {font-size: 12px;line-height: 16px;text-align: center;color: #fff;width: 25%;position: relative;&:hover {cursor: pointer;color: #267EF0;}}.active {color: #267EF0;}}
</style>

同志们,完整的登陆页面文件地址为:完整代码

欢迎大家有问题随时咨询奥,一起学习!

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

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

相关文章

阿里云Elasticsearch-趣味体验

阿里云Elasticsearch-趣味体验 什么是阿里云Elasticsearch阿里云Elasticsearch开通服务查看Elasticsearch实例配置Kibana公网IP登录Elasticsearch添加测试数据 Kibana数据分析查看数据字段筛选数据页面条件筛选KQL语法筛选保存搜索语句导出筛选结果指定列表展示字段写在最后 什…

(硬件05)电流检测中运放的“虚短”与“虚断”

本文目录 本篇前言知识点讲解软件仿真 本篇前言 运放&#xff0c;全称是运算放大器&#xff0c;一般的用法是用来发大电信号的&#xff0c;本篇讲解到的就是通过运算放大器将大电流流过采样电阻后的电压进行放大后输出给单片机的ADC&#xff0c;单片机根据ADC的值&#xff08…

Commons-Collections篇-CC7链

前言 和CC5反序列化链相似&#xff0c;CC7也是后半条LazyMap执行命令链不变&#xff0c;但是中间过程通过AbstractMap.equals()触发LazyMap.get()方法 环境 我们可以接着使用之前已经搭建好的环境&#xff0c;具体过程可以看CC1分析文章的环境安装部分 Commons-Collections篇…

leecode-动态规划-基础题目

一、简述 DP&#xff0c;如果某一问题有很多重叠子问题&#xff0c;使用动态规划是最有效的。 所以动态规划中每一个状态一定是由上一个状态推导出来的 重点&#xff1a;状态转移公式 二、一维 1、[509]斐波那契数 2、[70]爬楼梯 dp[i]可有dp[i-1]再爬一级台阶dp[i-2]再…

手表名表维修开单系统软件教程,佳易王钟表养护维护保养记录开单软件操作教程

手表名表维修开单系统软件教程&#xff0c;佳易王钟表养护维护保养记录开单软件操作教程 以下软件操作教程以&#xff0c;佳易王钟表养护维修管理系统软件为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 一、软件程序操作教程 1、佳易王钟表维…

第2章 信息技术知识

第2章 信息技术知识 本章简要叙述了信息技术相关基础知识&#xff0c;包含软件工程、面向对象系统分析与设计、应用集成技术、计算机网络技术和新一代信息技术内容。 2.1 软件工程 随着所开发软件的规模越来越大、复杂度越来越高&#xff0c;加之用户需求又并不十分明确&…

k8s上部署单节点apache-lotdb

一、yaml文件 使用的nfs的动态存储类&#xff0c;需要提前搭建。 # cat lotdb.yaml apiVersion: v1 kind: PersistentVolumeClaim metadata:name: logsnamespace: lotdb spec:storageClassName: "nfs-client"accessModes:- ReadWriteManyresources:requests:storag…

Spring Session 多服务Session共享

在新项目中需要开发单点登录功能&#xff0c;单点登录服务端提供方使用的是CAS技术&#xff0c;是根据Session来判断用户是否完成了登录操作的。Session是保存在服务器本地内存中的&#xff0c;而我的项目是需要多服务部署的&#xff0c;这就意味着会部署在不同的服务器中&…

淘宝商品历史价格查询(免费)

当前资料来源于网络&#xff0c;禁止用于商用&#xff0c;仅限于学习。 淘宝联盟里面就可以看到历史价格 并且没有加密 淘宝商品历史价格查询可以通过以下步骤进行&#xff1a; 先下载后&#xff0c;登录app注册账户 打开淘宝网站或淘宝手机App。在搜索框中输入你想要查询的商…

【问题记录】Windows中Node的express无法直接识别

问题描述 在使用express_generator的时候windows平台中出现无法识别express命令的问题&#xff0c;另外就算添加了全局环境变量也没用。 问题解决 查看官方文档发现在node版本8之前的时候使用的是express&#xff0c;但是之后的版本使用npx&#xff0c;这个工具的出现主要想…

keil mdk注释插件合集格式、时间、日期注释

文章目录 一、前言二、安装步骤2.1 解压tools.zip2.2 tools 文件解释2.3 添加注释带keil 三、配置3.1 格式化代码3.2 文件注释3.3函数注释3.4 当前日期3.5 当前时间 四、编辑注释模板4.1 编辑函数注释模板4.2 编辑C文件注释模板4.3 编辑h文件注释模板 五、为注释功能添加快捷键…

【Kubernetes安装】从零开始使用kubeadm命令工具部署K8S v1.28.2 集群

文章目录 一、虚拟机配置参数说明二、kubernetes v1.28.2版本介绍三、CentOS 7.9 系统初始化配置3.1 配置CentOS系统基础环境3.1.1 配置hosts3.1.2 永久关闭selinux3.1.3 关闭swap分区3.1.4 所有节点全部关闭防火墙3.1.5 配置ntp server同步时间3.1.6 添加kubernetes镜像源 3.2…

12--RabbitMQ消息队列

前言&#xff1a;前面一章内容太多&#xff0c;写了kafka&#xff0c;这里就写一下同类产品rabbitmq&#xff0c;rabbitmq内容较少&#xff0c;正好用来过度一下&#xff0c;概念还是会用一些例子来说明&#xff0c;实际部署的内容会放在概念之后。 1、基础概念 1.1、MQ消息队…

CSS原子化

目录 一、定义 二、原子化工具 2.1、tailwind 2.1.1、以PostCss插件形式安装 2.1.2、不依赖PostCss安装 2.1.3、修改原始配置 2.2、unocss 三、优缺点 3.1、优点 3.2、缺点 一、定义 定义&#xff1a;使用一系列的助记词&#xff0c;利用类名来代表样式。 二、原子化…

uniapp——银行卡号脱敏

样式 代码 {{bankNumber.replace(/(\d{4})(?\d)/g, "●●●● ").replace(/(\d{2})(?\d{2}$)/, " $1")}} 将银行卡号按照每四位一组的方式进行处理&#xff0c;前面的变成 剩下的正常显示

uniapp上架到appstore遇到的问题

1、appstore在美国审核&#xff0c;需要把服务器接口的国外访问权限放开 2、登陆部分 a、审核时只能有密码登陆&#xff0c;可以通过接口响应参数将其他登陆方式暂时隐藏&#xff0c;审核成功后放开即可 b、需要有账号注销功能 3、使用照相机和相册功能时需要写清楚描述文案

在 PostgreSQL 里如何实现数据的自动清理和过期处理?

文章目录 一、使用 TIMESTAMP 列和定期任务二、使用事件触发器&#xff08;Event Triggers&#xff09;三、使用分区表&#xff08;Partitioned Tables&#xff09;四、结合存储过程和定时任务示例场景实现步骤测试与验证 在 PostgreSQL 中&#xff0c;可以通过多种方式实现数据…

MySQL资源组的使用方法

MySQL支持创建和管理资源组&#xff0c;并允许将服务器内运行的线程分配给特定的组&#xff0c;以便线程根据组可用的资源执行。组属性允许控制其资源&#xff0c;以启用或限制组中线程的资源消耗。DBA可以针对不同的工作负载适当地修改这些属性。 目前&#xff0c;CPU时间是一…

前端开发攻略---webSocket的简单实现与使用

1、演示 2、实现流程 安装依赖 npm i ws 服务端代码 const WebSocket require(ws)// 创建一个 WebSocket 服务器&#xff0c;监听端口 3000 const wss new WebSocket.Server({ port: 3000 })// 监听连接事件 wss.on(connection, function connection(ws) {console.log(客户端…

HTML(29)——立体呈现

作用&#xff1a;设置元素的子元素是位于3D空间中还是平面中 属性名&#xff1a;transform-style 属性值&#xff1a; flat&#xff1a;子级处于平面中preserve-3d:子级处于3D空间 步骤&#xff1a; 父级元素添加 transform-style:preserve-3d 子级定位调整子盒子的位置&a…