【1】Vite+Vue3 登录功能

news2024/11/24 9:11:35

一、介绍

在当今前端开发的领域里,快速、高效的项目构建工具以及使用最新技术栈是非常关键的。Vite+Vue3 组合为一体的项目实战示例专栏将带领你深入了解和掌握这一最新的前端开发工具和框架。

作为下一代前端构建工具,Vite 在开发中的启动速度和热重载方面具有突出的优势。而Vue3,则以更加简化的API和更高效的响应式系统为开发者带来了更加流畅的开发体验。结合使用Vite和Vue3,你将能够快速搭建稳定、高效的前端项目。

在这个专栏里,我们将通过100+个实战示例,详细介绍Vite+Vue3的各个方面。从项目的创建和配置开始,我们会一步一步地引导你使用Vite搭建项目的基本框架,并深入讲解Vue3的语法和特性。随后,我们将演示如何构建常见的前端组件、路由管理和状态管理,以及与后端API的交互等实际项目开发中常见的场景。

无论你是从零开始学习Vite+Vue3,还是希望进一步提升你的前端开发能力,本专栏都能为你提供实用的知识和实战经验。通过这100+个实战示例的学习,你将能够掌握Vite+Vue3的核心概念和技术,并能够在实际项目中灵活应用。

赶快加入我们吧,开始你的Vite+Vue3项目实战之旅!

二、系统中登录是什么 ❔ ❔ ❔

登录功能是指用户通过提供一定的凭证(如用户名和密码)来验证自己的身份,并获得对系统的访问权限。

三、登录功能的作用是什么 ❔ ❔ ❔

1、身份验证 ✨ ✨

通过登录功能,系统可以验证用户提供的身份信息,确保只有合法用户可以访问系统的资源和功能。

2、安全性 ✨ ✨

登录功能可以提升系统的安全性,防止未经授权的访问和恶意操作。

3、定制化设置 ✨ ✨

登录功能可以根据用户的身份和权限,将特定的设置、数据和功能展示给用户,实现个性化的用户体验。

四、常见的系统登录方式有那些 ❔ ❔ ❔

1、用户名和密码 🌟 🌟

用户通过输入注册的用户名和密码进行登录。

2、第三方登录 🌟 🌟

用户可以通过社交媒体账号(如微信、QQ、微博等)进行登录。

3、邮箱验证 🌟 🌟

用户通过输入注册时绑定的邮箱和验证链接进行登录。

4、手机号验证 🌟 🌟

用户通过输入注册时绑定的手机号和短信验证码进行登录。

5、指纹识别和面部识别 🌟 🌟

某些设备和系统支持使用指纹或面部识别技术进行登录。

6、双因素验证 🌟 🌟

除了输入用户名和密码外,用户还需要提供额外的身份验证信息,如手机验证码或动态口令。

至于选择什么方式,不同系统根据需求和安全性要求,可能会选择其中的一种或多种登录方式来实现用户登录功能。

五、完整代码实现 👇 👇 👇

由于只是一个demo演示,知道如何实现一个登录功能以后,可以自行去扩展验证码。不管使用哪一种登录方式,对于前端来说都是大差不差的,因为我们使用都是要去调用后端接口进行数据的校验。其次我的脚手架是提前搭建好的,代码中的图标使用可能和常见的写法有些区别。详细请看Vite4+Pinia2+vue-router4+ElmentPlus搭建Vue3项目(组件、图标等按需引入)[保姆级]

<template>
    <div class="login">
        <el-form ref="loginFormRef" :model="loginForm" :rules="loginRules" class="login-form" autocomplete="on" label-position="left">
            <div class="login-form--title">
                <h1>
                    <i-noto-tiger-face class="animate__infinite animate__animated animate__rotateIn" />
                    Etc.End的系统管理平台
                </h1>
            </div>
            <el-form-item prop="userName">
                <el-input ref="userNameRef" v-model="loginForm.userName" placeholder="请输入用户名" name="userName">
                    <template #prefix>
                        <i-ep-avatar />
                    </template>
                </el-input>
            </el-form-item>

            <el-form-item prop="passWord">
                <el-input
                    ref="passwordRef"
                    v-model="loginForm.passWord"
                    placeholder="请输入密码"
                    show-password
                    name="passWord"
                    @blur="capsTooltip = false"
                >
                    <template #prefix>
                        <i-carbon-password />
                    </template>
                </el-input>
            </el-form-item>

            <el-button :loading="loading" type="primary" class="login-form--submit" @click.prevent="handleLogin">
                <template #icon>
                    <i-carbon-login />
                </template>
                登录
            </el-button>
        </el-form>
    </div>
</template>

<script lang="ts">
import {defineComponent, onMounted, reactive, ref, toRefs} from "vue";

type LoginType = {
    userName: string;
    passWord: string;
};

export default defineComponent({
    setup() {

        const userNameRef = ref<Element>();
        const passwordRef = ref<Element>();
        const loginFormRef = ref<Element>();

        const state = reactive({
            loginForm: {
                userName: '',
                passWord: '',
            } as LoginType,
            loginRules: {
                userName: [{ message: '请输入正确的用户名', required: true, trigger: 'blur' }],
                passWord: [{ message: '密码长度为6~20', required: true, trigger: 'blur', min: 6, max: 20 }],
            },
            loading: false,
            capsTooltip: false,
        });

        const handleLogin = () => {
            (loginFormRef.value as any).validate(async (valid: boolean) => {
                if (valid) {
                    state.loading = true;
                    try {
                        // 这里去做一些调用接口的操作,验证用户输入的用户名密码是否正确。然后进行下一步操作
                        console.log(state.loginForm);
                    } catch (e) {
                        console.log(e);
                    } finally {
                        setTimeout(() => {
                            state.loading = false;
                        }, 0.5 * 1000);
                    }
                } else {
                    return false;
                }
            });
        };

        onMounted(() => {
            if (state.loginForm.userName === '') {
                (userNameRef.value as any).focus();
            } else if (state.loginForm.passWord === '') {
                (passwordRef.value as any).focus();
            }
        });

        return {
            ...toRefs(state),
            loginFormRef,
            userNameRef,
            passwordRef,
            handleLogin,
        }
    }
})
</script>

<style scoped lang="scss">
    .login {
        height: 100%;
        width: 100%;
        overflow: hidden;
        background: #2d3a4b;
        -moz-background-size:100% 100%;
        background-size:100% 100%;

        .login-form {
            min-width: 320px;
            max-width: 520px;
            width: auto;
            padding: 160px 35px 0;
            margin: 0 auto;
            overflow: hidden;

            .login-form--title {
                position: relative;
                margin: 0 auto 40px auto;
                h1 {
                    font-size: 40px;
                    color: #eee;
                    font-weight: bold;
                    letter-spacing: 2px;
                    display: flex;
                    align-items: center;
                    justify-content: center;
                    svg {
                        margin-right: 4px;
                    }
                }
            }

            .login-form--submit {
                width: 100%;
                margin: 0 auto;
                display: flex;
                align-items: center;
                justify-content: center;
            }
        }
    }
</style>

六、核心代码解析 👇 👇 👇

1、效果图中的老虎头会一直转动是因为下面代码中加入的class。使用了Animate.css动画库。

<h1>
    <i-noto-tiger-face class="animate__infinite animate__animated animate__rotateIn" />
    Etc.End的系统管理平台
</h1>

2、页面初始化后,输入用户名或者密码为空时就获得焦点。

onMounted(() => {
    if (state.loginForm.userName === '') {
        (userNameRef.value as any).focus();
    } else if (state.loginForm.passWord === '') {
        (passwordRef.value as any).focus();
    }
});

3、用户点击登录按钮以后,调用handleLogin方法,你需要对其进行扩展,比如调用后端的登录校验接口,失败进行提示,成功以后如果有token需要进行cookie或者LocalStorage的缓存。接着进行路由跳转。

const handleLogin = () => {
    (loginFormRef.value as any).validate(async (valid: boolean) => {
        if (valid) {
            state.loading = true;
            try {
                // 这里去做一些调用接口的操作,验证用户输入的用户名密码是否正确。然后进行下一步操作
                console.log(state.loginForm);
            } catch (e) {
                console.log(e);
            } finally {
                setTimeout(() => {
                    state.loading = false;
                }, 0.5 * 1000);
            }
        } else {
            return false;
        }
    });
};

我是Etc.End。每一次进步都值得庆祝,每一次努力都值得赞赏。不要忽视自己的成长,每一步都是向前迈进的力量。如果我的文章对你有所帮助的话,希望能留下你的点赞和收藏。😍。

👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇

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

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

相关文章

sqlserver 获取根据特定符号分割字符串

CREATE function Get_StrArrayStrOfIndex (str varchar(1024), --要分割的字符串split varchar(10), --分隔符号index int --取第几个元素 ) returns varchar(1024) as begindeclare location intdeclare start intdeclare next intdeclare seed intset strltrim(rtrim(str))…

驾驶证——科目一笔记(三)

知识点1&#xff1a;红路灯 黄灯一直闪&#xff1a; 三个框的黄灯——信号暂时解除 一个框的黄灯——危险注意安全 知识点2&#xff1a;通行 看上半部分哪边有三角形 知识点2&#xff1a;禁停 知识点3&#xff1a;导向车道线 有齿可变&#xff0c;无齿导向&#xff08;按…

详解使用JAVA将Julian date(儒略日)日期转换为年月日

一、什么是Julian date 朱莉安日历和普通日历显示是不一样的我就举例演示一下 正常的日历显示 朱莉安的日历显示 174表示的是从2016年1月1日开始到今天已有174天了 普通日历是按月计数&#xff0c;朱莉安日历是按年计数 二、用java将julian日期转换为年月日 将2023199朱莉安…

微信小程序主体名称迁移流程

前言 因一些业务需求&#xff0c;需更换小程序主体名称 按理说&#xff0c;有两种方法&#xff0c; 第一种&#xff1a;重新注册小程序 第二种&#xff1a;在微信公众平台 → 设置 → 基本信息 → 主体信息 → 小程序迁移 第一种方法操作起来是很简单&#xff0c;但是呢&…

ubuntu 20.04 4090 显卡驱动安装 深度学习环境配置

1. 显卡驱动安装 准备工作&#xff1a; 换源安装输入法&#xff1a;重启的步骤先不管&#xff08;自选&#xff09;sudo apt update && sudo apt upgrade 禁用nouveau驱动&#xff08;这个驱动是ubuntu开源小组逆向破解NVIDIA的开源驱动&#xff0c;与英伟达的原有驱…

关于你欠缺的NoSQL中的redis和mongoDB

文章目录 前言一、在string list hash结构中&#xff0c;每个至少完成5个命令&#xff0c;包含插入 修改 删除 查询&#xff0c;list 和hash还需要增加遍历的操作命令1、STRING类型2、List类型数据的命令操作&#xff1a;3、举例说明list和hash的应用场景&#xff0c;每个至少一…

前端开发报表工具所必须的三大能力

摘要&#xff1a;本文由葡萄城技术团队于CSDN原创并首发。转载请注明出处&#xff1a;葡萄城官网&#xff0c;葡萄城为开发者提供专业的开发工具、解决方案和服务&#xff0c;赋能开发者。 数据分析一直以来都是业务决策中非常重要的一环&#xff0c;在数字化时代尤其如此。然…

轻松实现文件夹批量重命名!教你如何使用顺序编号批量改名文件夹!

我们需要对大量文件夹进行重命名时&#xff0c;手动一个个改名无疑是一项耗时且繁琐的任务。不过&#xff0c;别担心&#xff01;我们将向您介绍一种简单而高效的方法来实现文件夹的批量重命名&#xff1a;使用顺序编号。无论是对照片文件夹、音乐文件夹、还是其他文件夹进行改…

cuda 安装教程(win10)

cuda&#xff1a;compute unitifed device architecture-统一计算设备架构。 NVIDIA cuDNN is a GPU-accelerated library of primitives for deep neural networks. 目录 cuda完整安装&#xff1a; 检查显卡安装版本 下载版本 cuda安装步骤 cudnn下载安装(需要登陆账号&…

(2023.07.05-2023.07.15)论文阅读简单记录和汇总

(2023.07.05-2023.07.15)论文阅读简单记录和汇总 2023/07/05&#xff1a;端午回家还没玩几天就被老板召唤回学校了&#xff0c;采购的事情真是太麻烦了&#xff0c;一堆的差错。昨天跟师弟把他的第一篇论文投出去了&#xff0c;祝好运&#xff01; 2023/07/10&#xff1a;可惜…

基于Java+SpringBoot+vue前后端分离社区团购系统设计实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

【Ceph的部署】

目录 一、基于 ceph-deploy 部署 Ceph 集群1、Ceph 生产环境推荐&#xff1a;2、Ceph 环境规划3、环境准备1、关闭 selinux 与防火墙2、根据规划设置主机名3、配置 hosts 解析4、安装常用软件和依赖包5、在 admin 管理节点配置 ssh 免密登录所有节点6、为每一个服务器配置时间同…

【129. 求根节点到叶节点数字之和

129. 求根节点到叶节点数字之和 原题链接&#xff1a;完成情况&#xff1a;解题思路&#xff1a;参考代码&#xff1a; 原题链接&#xff1a; 129. 求根节点到叶节点数字之和 https://leetcode.cn/problems/sum-root-to-leaf-numbers/ 完成情况&#xff1a; 解题思路&#x…

vue2项目使用?.语法报错如何解决?(@babel/plugin-proposal-optional-chaining)

文章目录 一、问题原因二、下载并配置插件第一步第二步第三步 一、问题原因 因为有些浏览器版本不兼容?.语法&#xff0c;可以使用$$来代替&#xff08;如下图所示&#xff09;&#xff0c;但是为了团队协作避免麻烦使用?.带来的问题&#xff0c;可以使用这个(babel/plugin-p…

科技资讯|Apple Vision Pro新专利,关于相对惯性测量系统的校正

美国专利商标局正式授予苹果一项 Apple Vision Pro 相关专利&#xff0c;该专利涵盖了具有视觉校正功能的相对惯性测量系统。这样的系统用于弥补头显内的眼前庭不匹配&#xff0c;当 VR 头显中发生的事情与现实世界环境中发生的运动不匹配时&#xff0c;可能会导致恶心。 苹果…

web(三)前端

1.选择器&#xff1a; 1.伪类选择器: 伪选择器支持按照未被包含在文档树中的状态信息来选择元素超链接元素的四种伪类&#xff1a;1.link:表示没有访问过的的链接2.visited:表示访问过的链接3.hover&#xff1a;将鼠标移动至超链接上时超链接的状态4.active:鼠标点击超链接状态…

IDR: Self-Supervised Image Denoising via Iterative Data Refinement

文章目录 IDR: Self-Supervised Image Denoising via Iterative Data Refinement1. noisy-clean pair 比较难获取2. noiser-noisy pair 比较容易获取&#xff0c;但是训练效果呢&#xff1f;2.1 noiser-noisy 训练的模型&#xff0c;能够对 noisy 图像一定程度的降噪2.2 noiser…

基于Nginx深入浅出亿级流量架构设计(持续更新2023.7.18)

基于Nginx深入浅出亿级流量架构设计 环境准备/安装部署Nginx四个发行版本简单介绍Nginx的安装 Nginx的目录结构与基本运行原理及其最小配置解析Nginx虚拟主机与域名配置ServerName匹配规则反向代理在系统结构中的应用场景Nginx的反向代理配置 环境准备/安装部署 虚拟机使用VMw…

STM32F4_FLASH模拟EEPROM

目录 前言 1. 内部FLASH简介 2. 内部FLASH写入过程 3. 内部FLASH库函数 4. FLASH的读写保护及解除 5. FLASH相关寄存器 6. 实验程序 6.1 main.c 6.2 STMFlash.c 6.3 STMFlash.h 前言 STM32F4本身并没有自带EEPROM&#xff0c;但是STM32F4具有IAP功能&#xff0c;也就…

初阶数据结构——排序

目录 排序的概念常见排序算法插入排序希尔排序选择排序堆排序冒泡排序快速排序hoare挖坑法前后指针法快排的时间复杂度三路划分三数取中和随机数选中快排的非递归版本快速排序的总结 归并排序归并的递归版本归并的非递归版本 内排序和外排序非比较排序稳定性排序算法复杂度和稳…