10vue3实战-----实现登录的基本功能

10vue3实战-----实现登录的基本功能

  • 1.基本页面的搭建
  • 2.账号登录的验证规则配置
  • 3.点击登录按钮
  • 4.表单的校验
  • 5.账号的登录逻辑和登录状态保存
  • 6.定义IAccount对象类型

1.基本页面的搭建

大概需要搭建成这样子的页面:
在这里插入图片描述
具体的搭建界面就不多讲。各个项目都有自己的登录界面,搭建方法大同小异,这是基础,在这不做赘叙。

2.账号登录的验证规则配置

直接使用element-plus中现成的表单校验功能。
template:

<template><div class="pane-account"><el-form:model="account":rules="accountRules"label-width="60px"size="large"status-iconref="formRef"><el-form-item label="帐号" prop="name"><el-input v-model="account.name" /></el-form-item><el-form-item label="密码" prop="password"><el-input v-model="account.password" show-password /></el-form-item></el-form></div>
</template>

script:

<script setup lang="ts">
import { reactive} from 'vue'
import type { FormRules} from 'element-plus'
// 1.定义account数据
const account = reactive({name: '',password: ''
})
// 2.定义校验规则
//这里accountRules不需要用reactive进行响应式,因为一般不会改变。
const accountRules: FormRules = {name: [{ required: true, message: '必须输入帐号信息~', trigger: 'blur' },{pattern: /^[a-z0-9]{6,20}$/,message: '必须是6~20数字或字母组成~',trigger: 'blur'}],password: [{ required: true, message: '必须输入密码信息~', trigger: 'blur' },{pattern: /^[a-z0-9]{3,}$/,message: '必须是3位以上数字或字母组成',trigger: 'blur'}]
}
</script>

3.点击登录按钮

上面的登录界面把它封装成了多个组件。登录模块目录结构如下:
在这里插入图片描述
如上,Login.vue有一个login-panel登录面板子组件,登录面板组件下有pane-account和pane-phone两个子组件。
在这里插入图片描述
这里“立即登录”按钮是在login-panel组件中,点击按钮后需要用到账号和密码的信息,但他们都在子组件。有一种方法是把子组件传到父组件;还有一种方法是login-panel父组件中调用子组件的方法。这里我用第二种方法:
以账号登录为例,子组件pane-account文件:

<script setup lang="ts">
import { reactive, ref } from 'vue'
// 1.定义account数据
const account = reactive({name: '',password: ''
})
...
// 3.执行帐号的登录逻辑
function loginAction() {console.log("用户正在登录",account.name,account.password);
}
//一定要暴露出来,父组件才能使用子组件的方法:
defineExpose({loginAction
})
</script>

父组件login-panel.vue文件:

<script setup lang="ts">
import { ref } from 'vue'
import PaneAccount from './pane-account.vue'
import PanePhone from './pane-phone.vue'const activeName = ref('account')
//下面这行代码要特别注意,经常会用到
//一般都是用InstanceType<typeof xxx>这种方法
//这里最好不要const accountRef = ref<any>()
//虽然万事都可以any,但那样子的话就没有相关提示了
const accountRef = ref<InstanceType<typeof PaneAccount>>()
//点击登录按钮
function handleLoginBtnClick() {if (activeName.value === 'account') {//简写方式,accountRef存在才执行accountRef.value.loginAction()accountRef.value?.loginAction()} else {console.log('用户在进行手机登录')}
}
</script>

4.表单的校验

子组件pane-account文件:

<script setup lang="ts">
import { reactive, ref } from 'vue'
import { ElMessage } from 'element-plus'
import type { FormRules, ElForm } from 'element-plus'
// 1.定义account数据
const account = reactive({name: '',password: ''
})
...
// 3.执行帐号的登录逻辑
//这个与上面的accountRef是一样的道理
const formRef = ref<InstanceType<typeof ElForm>>()
function loginAction() {formRef.value?.validate((valid) => {if (valid) {console.log("验证成功","登录的操作")} else {ElMessage.error('Oops, 请您输入正确的格式后再操作~~.')}})
}defineExpose({loginAction
})
</script>

5.账号的登录逻辑和登录状态保存

首先要封装一下登录的网络接口:
在service文件夹中新建main和login模块:
在这里插入图片描述
service/login/login.ts:

import hyRequest from '..'
//这里account类型暂时为any,后面再处理
export function accountLoginRequest(account: any) {return hyRequest.post({url: '/login',data: account})
}

登录之后需要把用户信息保存到pinia中,所以在store里面也要新建login和main模块来处理相关业务:
在这里插入图片描述
store/login/login.ts:

import { defineStore } from 'pinia'
import { accountLoginRequest } from '@/service/login/login'
const useLoginStore = defineStore('login', {state: () => ({id: '',token:'',name: ''}),actions: {//account暂时为any,后面会再进行处理async loginAccountAction(account: any) {// 1.账号登录, 获取token等信息const loginResult = await accountLoginRequest(account)this.id = loginResult.data.idthis.name = loginResult.data.namethis.token = loginResult.data.token...}}
})export default useLoginStore

pinia中的数据一刷新就会消失,下一章节将会解决该问题https://blog.csdn.net/fageaaa/article/details/145532580。

6.定义IAccount对象类型

在上面很多文件里面都用到了一个对象,里面包含有账号和密码,但给它的类型都是any:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这样子是不好的。我们可以把account的类型提取出来,放在一个文件中。
在src中新建一个types文件夹:
在这里插入图片描述
types/login.ts:

export interface IAccount {name: stringpassword: string
}

types/index.ts:

 export * from './login'

然后在需要的文件中引入:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

vue学习5

1.自定义创建项目 2.ESlint代码规范 正规的团队需要统一的编码风格 JavaScript Standard Style 规范说明&#xff1a;https://standardjs.com/rules-zhcn.html 规则中的一部分&#xff1a; (1)字符串使用单引号 ‘aabc’ (2)无分号 const name ‘zs’ (3)关键字后加空格 if(n…

QTreeView和QTableView单元格添加超链接

QTreeView和QTableView单元格添加超链接的方法类似,本文仅以QTreeView为例。 在QTableView仿Excel表头排序和筛选中已经实现了超链接的添加,但是需要借助delegate,这里介绍一种更简单的方式,无需借助delegate。 一.效果 二.实现 QHTreeView.h #ifndef QHTREEVIEW_H #def…

Qt监控设备离线检测/实时监测设备上下线/显示不同的状态图标/海康大华宇视华为监控系统

一、前言说明 监控系统中一般有很多设备&#xff0c;有些用户希望知道每个设备是否已经上线&#xff0c;最好有不同的状态图标提示&#xff0c;海康的做法是对设备节点的图标和颜色变暗处理&#xff0c;离线的话就变暗&#xff0c;有可能是加了透明度&#xff0c;而大华的处理…

IDEA+DeepSeek让Java开发起飞

1.获取DeepSeek秘钥 登录DeepSeek官网 : https://www.deepseek.com/ 进入API开放平台&#xff0c;第一次需要注册一个账号 进去之后需要创建一个API KEY&#xff0c;然后把APIkey记录保存下来 接着我们获取DeepSeek的API对话接口地址&#xff0c;点击左边的&#xff1a;接口…

docker学习笔记

1.docker与虚拟机技术的不同 传统虚拟机&#xff1a;虚拟出一条硬件&#xff0c;运行一个完整的操作系统&#xff0c;然后在这个系统上安装和运行软件。容器内的应用直接运行在&#xff0c;宿主机的内容&#xff0c;容器是没有自己的内核的&#xff0c;也没有虚拟我们的硬件每…

Linux之kernel(4)netlink通信

Linux内核(04)之netlink通信 Author: Once Day Date: 2023年1月3日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章可查看专栏: Linux内核知识_Once-Day的博客-…

视觉硬件选型和算法选择(CNN)

基础知识 什么是机械视觉: 机械视觉是一种利用机器代替人眼来进行测量和判断的技术&#xff0c;通过光学系统、图像传感器等设备获取图像&#xff0c;并运用图像处理和分析算法来提取信息&#xff0c;以实现对目标物体的识别、检测、测量和定位等功能。 机械视觉与人类视觉有什…

Qt元对象系统

目录 1.元对象系统概述 2 宏QOBJECT slots emit 2.1 QOBJECT 2.2 信号槽相关宏 3 信号和槽 3.1 信号和槽的链接使用 3.2 信号槽触发流程 3.3 信号参数自定义 3.4 槽函数中获取发射信号的对象&#xff08;widget&#xff09; 3.4.1 使用QObject::sender() 3.4.2 在连…

verilog练习:i2c slave 模块设计

文章目录 前言1. 结构2.代码2.1 iic_slave.v2.2 sync.v2.3 wr_fsm.v2.3.1 状态机状态解释 2.4 ram.v 3. 波形展示4. 建议5. 资料总结 前言 首先就不啰嗦iic协议了&#xff0c;网上有不少资料都是叙述此协议的。 下面将是我本次设计的一些局部设计汇总&#xff0c;如果对读者有…

什么是中间件中间件有哪些

什么是中间件&#xff1f; 中间件&#xff08;Middleware&#xff09;是指在客户端和服务器之间的一层软件组件&#xff0c;用于处理请求和响应的过程。 中间件是指介于两个不同系统之间的软件组件&#xff0c;它可以在两个系统之间传递、处理、转换数据&#xff0c;以达到协…

【键盘识别】实例分割

第一步 键盘检测 方案一 canny边缘检测 canny边缘检测检测结果不稳定,容易因为复杂背景或光线变换检测出其他目标。 如图是用canny边缘检测方法标出的检测出的边缘的四个红点。 参考的是这篇文章OpenCV实战之三 | 基于OpenCV实现图像校正_opencv 图像校正-CSDN博客 方案二…

线程上下文-ThreadLocal原理

ThreadLocal主要作用&#xff1a;为每个线程提供独立的变量副本&#xff0c;实现线程间的数据隔离&#xff0c;从而避免多线程环境下的资源共享冲突。 原理 ThreadLocal有个内部类 ThreadLocalMap&#xff0c;顾名思义是个Map结构&#xff1a;key为 ThreadLocal实例&#xff0…

【Python】元组

个人主页&#xff1a;GUIQU. 归属专栏&#xff1a;Python 文章目录 1. 元组的本质与基础概念1.1 不可变序列的意义1.2 元组与数学概念的联系 2. 元组的创建方式详解2.1 标准创建形式2.2 单元素元组的特殊处理2.3 使用 tuple() 函数进行转换 3. 元组的基本操作深入剖析3.1 索引操…

SpringSecurity:授权服务器与客户端应用(入门案例)

文章目录 一、需求概述二、开发授权服务器1、pom依赖2、yml配置3、启动服务端 三、开发客户端应用1、pom依赖2、yml配置3、SecurityConfig4、接口5、测试 一、需求概述 maven需要3.6.0以上版本 二、开发授权服务器 1、pom依赖 <dependency><groupId>org.springfr…

android的Compose 简介

Jetpack Compose 简介 Jetpack Compose 是 Android 官方推出的声明式 UI 工具包&#xff0c;用于替代传统 XML 布局&#xff0c;简化界面开发流程。它基于 Kotlin 语言&#xff0c;通过函数式编程实现高效、灵活的 UI 构建&#xff0c;支持实时预览和更直观的状态管理。 优势…

四次挥手详解

文章目录 一、四次挥手各状态FIN_WAIT_1CLOSE_WAITFIN_WAIT_2LAST_ACKTIME_WAITCLOSE 二、双方同时调用close()&#xff0c;FIN_WAIT_1状态后进入CLOSING状态CLOSING状态 三、TIME_WAIT状态详解(1) TIME_WAIT状态下的2MSL是什么MSL &#xff08;报文最大生存时间&#xff09;为…

LIMO:上海交大的工作 “少即是多” LLM 推理

25年2月来自上海交大、SII 和 GAIR 的论文“LIMO: Less is More for Reasoning”。 一个挑战是在大语言模型&#xff08;LLM&#xff09;中的复杂推理。虽然传统观点认为复杂的推理任务需要大量的训练数据&#xff08;通常超过 100,000 个示例&#xff09;&#xff0c;但本文展…

51单片机之引脚图(详解)

8051单片机引脚分类与功能笔记 1. 电源引脚 VCC&#xff08;第40脚&#xff09;&#xff1a;接入5V电源&#xff0c;为单片机提供工作电压。GND&#xff08;第20脚&#xff09;&#xff1a;接地端&#xff0c;确保电路的电位参考点。 2.时钟引脚 XTAL1&#xff08;第19脚&a…

基于yolov11的阿尔兹海默症严重程度检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv11的阿尔兹海默症严重程度检测系统是一种创新的医疗辅助工具&#xff0c;旨在通过先进的计算机视觉技术提高阿尔兹海默症的早期诊断和病情监测效率。阿尔兹海默症是一种渐进性的神经退行性疾病&#xff0c;通常表现为认知障碍、记忆丧失和语言障碍等症状…

TAPEX:通过神经SQL执行器学习的表格预训练

摘要 近年来&#xff0c;语言模型预训练的进展通过利用大规模非结构化文本数据取得了巨大成功。然而&#xff0c;由于缺乏大规模高质量的表格数据&#xff0c;在结构化表格数据上应用预训练仍然是一个挑战。本文提出了TAPEX&#xff0c;通过在一个合成语料库上学习神经SQL执行…