硅谷甄选二(登录)

一、登录路由静态组件

src\views\login\index.vue

<template><div class="login_container"><!-- Layout 布局 --><el-row><el-col :span="12" :xs="0"></el-col><el-col :span="12" :xs="24"><el-form class="login_form"><h1>Hello</h1><h2>欢迎来到硅谷甄选</h2><el-form-item><el-input:prefix-icon="User"v-model="loginForm.username"></el-input></el-form-item><el-form-item><el-inputtype="password":prefix-icon="Lock"v-model="loginForm.password"show-password></el-input></el-form-item><el-form-item><el-button class="login_btn" type="primary" size="default">登录</el-button></el-form-item></el-form></el-col></el-row></div>
</template><script setup lang="ts">import { User, Lock } from '@element-plus/icons-vue'import { reactive } from 'vue'//收集账号与密码数据let loginForm = reactive({ username: 'admin', password: '111111' })
</script><style lang="scss" scoped>.login_container {width: 100%;height: 100vh;background: url('@/assets/images/background.jpg') no-repeat;background-size: cover;.login_form {position: relative;width: 80%;top: 30vh;background: url('@/assets/images/login_form.png') no-repeat;background-size: cover;padding: 40px;h1 {color: white;font-size: 40px;}h2 {color: white;font-size: 20px;margin: 20px 0px;}.login_btn {width: 100%;}}}
</style>

注意:el-col是24份的,在此左右分为了12份。我们在右边放置我们的结构。:xs="0"是为了响应式。el-form下的element-plus元素都用el-form-item包裹起来。

二、登陆业务实现 

1)安装大仓库(笔记只写一次)

安装pinia:pnpm i pinia@2.0.34

src\store\index.ts

//仓库大仓库
import { createPinia } from 'pinia'
//创建大仓库
const pinia = createPinia()
//对外暴露:入口文件需要安装仓库
export default pinia

main.ts引入

//引入仓库
import pinia from './store'
app.use(pinia);

2)用户相关的小仓库

src\store\modules\user.ts

//创建用户相关的小仓库
import { defineStore } from 'pinia'
//创建用户小仓库
const useUserStore = defineStore('User', {//小仓库存储数据地方state: () => {},//处理异步|逻辑地方actions: {},getters: {},
})
//对外暴露小仓库
export default useUserStore

使用

//引入用户相关的小仓库import useUserStore from '@/store/moudles/user'let useUserStore2 = useUserStore()

3)按钮回调

//引入路由
import { useRouter } from 'vue-router'
import { ElNotification } from 'element-plus'
//引入ElNotification
import { ElNotification } from 'element-plus'
let $router = useRouter();
//登录按钮的回调
const login = async () => {//按钮加载效果loading.value = true//点击登录按钮以后干什么//通知仓库发起请求//请求成功->路由跳转//请求失败->弹出登陆失败信息try {//也可以书写.then语法await useStore.userLogin(loginForm)//编程式导航跳转到展示数据的首页$router.push('/')//登录成功的提示信息ElNotification({type: 'success',message: '登录成功!',})//登录成功,加载效果也消失loading.value = false} catch (error) {//登陆失败加载效果消失loading.value = false//登录失败的提示信息ElNotification({type: 'error',message: (error as Error).message,})}
}

4)用户仓库

//创建用户相关的小仓库
import { defineStore } from 'pinia'
//引入接口
import { reqLogin } from '@/api/user'
//引入数据类型
import type { loginForm } from '@/api/user/type'
//创建用户小仓库
const useUserStore = defineStore('User', {//小仓库存储数据地方state: () => {return {token: localStorage.getItem('TOKEN'), //用户唯一标识token}},//处理异步|逻辑地方actions: {//用户登录的方法async userLogin(data: loginForm) { //返回一个promise对象//登录请求const result: any = await reqLogin(data)if (result.code == 200) {//pinia仓库存储token//由于pinia|vuex存储数据其实利用js对象this.token = result.data.token//本地存储持久化存储一份localStorage.setItem('TOKEN', result.data.token)//保证当前async函数返回一个成功的promise函数return 'ok'} else {return Promise.reject(new Error(result.data.message))}},},getters: {},
})
//对外暴露小仓库
export default useUserStore

5)小结

Element-plus中ElNotification用法(弹窗):

引入:import { ElNotification } from 'element-plus'

使用:

//登录失败的提示信息ElNotification({type: 'error',message: (error as Error).message//类型断言,Error是ts内置类型})
//登录成功的提示信息
ElNotification({type: 'success',message: '登录成功!'
})
  1. Element-plus中el-buttonloading属性。
  2. pinia使用actions、state的方式和vuex不同:需要引入函数创建实例
  3. $router的使用:也需要引入函数创建实例
  4. 在actions中使用state的token数据:this.token
  5. 类型定义需要注意。
  6. promise的使用和vue2现在看来是一样的。

三、模板封装登陆业务

1)result返回类型封装

//src\api\user\type.ts
interface dataType {token?: stringmessage?: string
}//登录接口返回的数据类型
export interface loginResponseData {code: numberdata: dataType
}

2)State仓库类型封装 

//src\store\modules\types\type.ts
//定义小仓库数据state类型
export interface UserState {token: string | null
}

3)本地存储封装

将本地存储的方法封装到一起 

//src\utils\token.ts
//封装本地存储存储数据与读取数据方法
export const SET_TOKEN = (token: string) => {localStorage.setItem('TOKEN', token)
}export const GET_TOKEN = () => {return localStorage.getItem('TOKEN')
}

 4)登录时间的判断

//src\utils\time.ts
//封装函数:获取当前时间段
export const getTime = () => {let message = ''//通过内置构造函数Dateconst hour = new Date().getHours()if (hour <= 9) {message = '早上'} else if (hour <= 14) {message = '上午'} else if (hour <= 18) {message = '下午'} else {message = '晚上'}return message
}

使用

ElNotification({type: 'success',message: '欢迎回来',title: `HI,${getTime()}好`})

五、表单校验规则

1)表单校验

表单绑定项

<el-form class="login_form" :model="loginForm" :rules="rules" ref="loginForms"> 
</el-form>

Form 组件提供了表单验证的功能,只需为 rules 属性传入约定的验证规则,并将 form-Item 的 prop 属性设置为需要验证的特殊键值即可

 

定义

//收集账号与密码数据let loginForm = reactive({ username: 'admin', password: '111111' })//定义表单校验需要的配置对象const rules = {username: [//规则对象属性:{required: true, // required,代表这个字段务必要校验的min: 5, //min:文本长度至少多少位max: 10, // max:文本长度最多多少位message: '长度应为6-10位', // message:错误的提示信息trigger: 'change', //trigger:触发校验表单的时机 change->文本发生变化触发校验, blur:失去焦点的时候触发校验规则}, ],password: [{required: true,min: 6,max: 10,message: '长度应为6-15位',trigger: 'change',}, ],}//获取表单元素let loginForms = ref()

校验规则通过后运行

const login = async () => {//保证全部表单项校验通过await loginForms.value.validate()。。。。。。
}

2)自定义表单校验

//自定义校验规则函数const validatorUserName = (rule: any, value: any, callback: any) => {//rule:校验规则对象//value:表单元素文本内容//callback:符合条件,callback放行通过,不符合:注入错误提示信息if (value.length >= 5) {callback()} else {callback(new Error('账号长度至少5位'))}}const validatorPassword = (rule: any, value: any, callback: any) => {if (value.length >= 6) {callback()} else {callback(new Error('密码长度至少6位'))}}//定义表单校验需要的配置对象const rules = {username: [//规则对象属性:/* {required: true, // required,代表这个字段务必要校验的min: 5, //min:文本长度至少多少位max: 10, // max:文本长度最多多少位message: '长度应为6-10位', // message:错误的提示信息trigger: 'change', //trigger:触发校验表单的时机 change->文本发生变化触发校验, blur:失去焦点的时候触发校验规则}, */{ trigger: 'change', validator: validatorUserName },],password: [{ trigger: 'change', validator: validatorPassword },],}

 

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

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

相关文章

kali安装vulhub遇到的问题及解决方法(docker及docker镜像源更换)

kali安装vulhub&#xff1a; 提示&#xff1a;项目地址 https://github.com/vulhub/vulhub 项目安装&#xff1a; git clone https://github.com/vulhub/vulhub.git 安装docker 提示&#xff1a;普通用户请使用sudo&#xff1a; 首先安装 https 协议、CA 证书 apt-get in…

大模型日报 2024-07-10

大模型日报 2024-07-10 大模型资讯 CVPR 最佳论文候选 | NeRF 新突破&#xff0c;用启发式引导分割去除瞬态干扰物&#xff0c;无需额外先验知识 介绍 NeRF 研究中消除瞬态干扰物影响的新方法。 彻底改变语言模型&#xff1a;全新架构 TTT 超越 Transformer&#xff0c;ML 模型…

针对tcp不出网打——HTTP封装隧道代理(以CFS演示)

目录 上传工具到攻击机 使用说明 生成后门文件 由于电脑短路无法拖动文件&#xff0c;我就wget发送到目标主机tunnel.php文件​ 成功上传​ 可以访问上传的文件 启动代理监听 成功带出 后台私信获取弹药库工具reGeorg 上传工具到攻击机 使用说明 生成后门文件 pyt…

FFmpeg 初级操作—打印日志,文件目录操作

文章目录 日志输出操作文件的删除与重命名操作目录实现实现简单的ls命令—代码实现 日志输出操作 FFmpeg 提供了一套LOG操作&#xff0c;基本上和printf用法差不多&#xff0c;如下方所示 #include<stdio.h> #include<libavutil/log.h> int main(int argc, char …

文案策划新手必看:7大秘诀助你快速融入创意领域

从报社编辑到品牌策划和文案策划&#xff0c;这一转变虽有不少共通之处&#xff0c;但也有一些独到之处。 作为一名多年行业从业人员&#xff0c;以下是一些小建议&#xff0c;帮你在这个转型过程中游刃有余。 1、深入了解行业 得多读读行业报告、专业杂志、博客文章&#x…

和鲸科技荣耀入选2024 H1 「中国最具价值 AGI 创新机构 TOP 50」

以下文章来源于Founder Park&#xff0c;作者Founder Par 大模型的盛宴&#xff0c;不应该只属于那些无数光环加身的算法天才们。 模型的冰山一角下&#xff0c;是应用层的暗流涌动&#xff0c;这是一个更庞大&#xff0c;也更隐秘的蓝海。但发掘这一切的前提是&#xff0c;所…

【RHCE】NFS 实验

主服务器 下载nfs-utils软件包&#xff1a; 1.如果停⽌该服务&#xff0c;启动并启⽤该服务&#xff1a; systemctl enable - now rpcbind 2.要启动 NFS 服务器&#xff0c;并使其在引导时⾃动启动&#xff1a;systemctl enable - now nfs- server 3.配置防火墙&#xff0c;开…

力扣题解( 最长湍流子数组)

978. 最长湍流子数组 已解答 给定一个整数数组 arr &#xff0c;返回 arr 的 最大湍流子数组的长度 。 如果比较符号在子数组中的每个相邻元素对之间翻转&#xff0c;则该子数组是 湍流子数组 。 更正式地来说&#xff0c;当 arr 的子数组 A[i], A[i1], ..., A[j] 满足仅满…

pd虚拟机去虚拟化是什么意思?pd虚拟机去虚拟化教程 PD虚拟机优化设置

Parallels Desktop for Mac&#xff08;PD虚拟机&#xff09;去虚拟化是指在虚拟机&#xff08;Virtual Machine&#xff0c;简称 VM&#xff09;中禁用或减少虚拟化层的影响&#xff0c;使其表现更接近于物理机。这种操作通常用于提高虚拟机的性能或解决某些软件兼容性问题。具…

ASP.NET Core----基础学习04----Model模型的创建 服务的注入

文章目录 1. 创建Models文件夹&#xff0c;3个文件的内容如下&#xff1a;&#xff08;1&#xff09;模型的创建&#xff08;2&#xff09;服务的注入 1. 创建Models文件夹&#xff0c;3个文件的内容如下&#xff1a; &#xff08;1&#xff09;模型的创建 模型的基础类Student…

单测使用 mock 如何解决使用 @Value 注解注入的属性

在编写单元测试时&#xff0c;在不启动容器的条件下&#xff0c;如何对这种属性进行mock ? 项目代码 Service public class LoginServiceImpl {Value("${config.timeLimit}")private int timeLimit;......public Object login(User user) {...} } 单测代码 RunW…

python拆分Excel数据,自动发邮箱

import pandas as pd import poplib import email from email.header import decode_header from email.parser import Parser df = pd.read_excel("年假明细表.xlsx") depts = df["部门"].unique() for dept in depts: department_df = df[df[&q…

每日Attention学习9——Efficient Channel Attention

模块出处 [CVPR 20] [link] [code] ECA-Net: Efficient Channel Attention for Deep Convolutional Neural Networks 模块名称 Efficient Channel Attention (ECA) 模块作用 通道注意力 模块结构 模块代码 import torch import torch.nn as nn import torch.nn.functional …

【雷达原理】数字波束形成(DBF)

目录 一、数字波束形成1.1 DBF原理1.2 工程应用实现方式1.2.1 预先存储权矢量1.2.2 利用DFT/FFT实现DBF 二、DBF应用2.1 通道间相干积累2.2 测量目标角度 三、MATLAB代码 一、数字波束形成 数字波束形成&#xff08;Digital Beam Forming&#xff0c;DBF) 技术&#xff0c;是针…

使用Python绘制气泡图

使用Python绘制气泡图 气泡图效果代码 气泡图 气泡图通过气泡的大小表示数据的一个维度&#xff0c;用于展示三个维度的数据。例如&#xff0c;可以展示城市的人口、面积和GDP。 效果 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Mjj27sP7-1720…

PDF 分割拆分 API 数据接口

PDF 分割拆分 API 数据接口 文件处理&#xff0c;PDF 高效的 PDF 分割工具&#xff0c;高效处理&#xff0c;可永久存储。 1. 产品功能 高效处理大文件&#xff1b;支持多语言字符识别&#xff1b;支持 formdata 格式 PDF 文件流传参&#xff1b;支持设置每个 PDF 文件的页数…

Docker核心知识手册

Docker核心知识手册 文章目录 Docker核心知识手册1 安装Docker1.1 环境说明1.2 安装1.3 修改配置1.4 启动 2 Docker基础命令2.1 查看Docker相关信息2.2 配置Docker镜像加速 3 Docker镜像相关命令3.1 搜索官方镜像3.2 获取镜像3.3 查看当前主机镜像列表3.4 导出镜像3.5 删除镜像…

java.time.ZonedDateTime介绍

java.time.ZonedDateTime 是 Java 8 引入的新日期时间 API 的一部分,用于表示带有时区的日期和时间。它结合了日期、时间和时区信息,使得处理跨时区的日期时间变得更加简单和直观。 主要特性 表示日期和时间,并包括时区。提供了一系列方法来操作和格式化日期时间。支持从其…

三、CoInitialize是以单线程的方式创建com对象是什么意思

CoInitialize函数是COM&#xff08;Component Object Model&#xff09;编程中的一个关键API&#xff0c;用于初始化COM库并为当前线程创建一个“公寓”&#xff08;Apartment&#xff09;。当提到CoInitialize是以单线程的方式创建COM对象时&#xff0c;这是指它准备当前线程以…

电脑压缩视频怎么压缩,电脑压缩视频大小

随着科技的进步&#xff0c;我们越来越喜欢用视频记录生活中的点点滴滴。但随之而来的问题就是&#xff0c;视频文件体积庞大&#xff0c;给我们的存储和分享带来了不小的困扰。那么&#xff0c;有没有什么方法能够轻松解决这个问题呢&#xff1f;答案当然是肯定的&#xff01;…