vue3+Element plus实现登录功能

一、想要实现的效果

二、搭建登录静态

1、实现左边背景和右边登录栏的总体布局布局:

<el-row class="content"><!--el-col 列: --><el-col :span="16" :xs="0" class="content-left"></el-col><el-col :span="8" :xs="24" class="content-right">
<el-row>

2、账号密码登录和手机号码登录切换使用<el-tabs>组件实现:

3、其他省略

4、全部代码:

  <el-row class="content"><!--el-col 列: --><el-col :span="16" :xs="0" class="content-left"></el-col><el-col :span="8" :xs="24" class="content-right"><div class="loginContent"><div class="loginContentTop"><div class="header"><div class="logo"><img src="../assets/images/logo.png" alt="" class="image" /></div><div class="fontSize">JinPiKa</div></div><span class="introduce">全球最大的代码托管平台</span></div><div class="loginContentForm"><div class="loginMethods"><el-tabs><el-tab-panelabel="账号密码登录"class="toLogin":class="{ option: !option }"@click="toOption(0)"><!-- loginForm: 表单数据对象--><el-form:model="loginForm":rules="loginFormRules"style="width: 208px"><el-form-item label="" prop="username"><el-input:prefix-icon="User"placeholder="用户名:user"v-model="loginForm.username"inline-message></el-input></el-form-item><el-form-item label="" prop="password"><el-input:prefix-icon="Lock"placeholder="密码:user"show-passwordv-model="loginForm.password"inline-message></el-input></el-form-item></el-form></el-tab-pane><el-tab-panelabel="手机号码登录"class="toLogin":class="{ option: !option }"@click="toOption(0)"><!-- loginForm: 表单数据对象--><el-form:model="loginFormPhone":rules="loginFormPhoneRules"style="width: 208px"prop="phone"><el-form-item label=""><el-input:prefix-icon="User"placeholder="请输入手机号"v-model="loginFormPhone.phone"inline-message></el-input></el-form-item><el-form-item label="" prop="code"><el-input:prefix-icon="Lock"placeholder="请输入验证码"v-model="loginFormPhone.code"inline-message></el-input></el-form-item></el-form></el-tab-pane></el-tabs></div></div><div class="loginContentButton"><div class="buttonTop"><el-checkbox v-model="checked" label="自动登录" size="small" /><el-link type="primary" :underline="false"><span style="font-size: 12px">忘记密码</span></el-link></div><el-button type="primary" class="loginButton" @click="tologin">登录</el-button><el-divider><span class="fengexian">其他登录方式</span></el-divider><div class="svgItems"><div class="svgItem"><svg-iconname="zhifubao"width="18px"height="18px"color="pink"></svg-icon></div><div class="svgItem"><svg-iconname="taobao"width="18px"height="18px"color="pink"></svg-icon></div><div class="svgItem"><svg-iconname="weibo"width="18px"height="18px"color="pink"></svg-icon></div></div></div></div></el-col></el-row>

三、封装接口

1、首先需要对axios进行一个二次封装,实现请求和响应拦截器,在utils文件夹(一般用于存放封装的文件)下创建一个request.ts文件,

import axios from 'axios'
const requeset=axios.create({baseURL: import.meta.env.BASE_URL,   //基础路径timeout:5000    //发请求超时时间为5s
})
//给request实例添加请求拦截器
request.interceptors.request.use((config)=>{// config:配置对象:里面有个headers属性请求头,经常给服务器端通过请求头携带公共参数return config
})
//配置响应拦截器
request.interceptors.response.use(//成功响应:返回服务端的数据    (response)=>{return response.data},//失败响应:会返回错误对象,用来处理http网络错误(error)=>{// 存储网络错误信息let message = ''// 根据http状态码判断网络错误const status = error.response.statusswitch (status) {case 401:message = '登录已过期,请重新登录'breakcase 403:message = '没有权限,请联系管理员'breakcase 404:message = '请求资源不存在'breakcase 500:message = '服务器内部错误'breakdefault:// eslint-disable-next-line @typescript-eslint/no-unused-varsmessage = '网络错误'break}// 提示错误信息ElMessage({type: 'error',message,})// 返回一个失败的promise对象return Promise.reject(error)})

2、引入pinia

(1)在store文件夹下创建pinia仓库,
// 引入 pinia
import { createPinia } from 'pinia'
// 创建大仓库
const pinia = createPinia()
// 对外暴露
export default pinia
(2)在main.ts中,引入仓库并全局使用pinia
// 引入仓库
import pinia from './store'
// 全局使用 pinia
app.use(pinia)
3、在api文件夹下,封装登录接口,用于统一管理用户相关的接口
// 引入封装好的 request
import request from '@/plugins/request'
// 引入用户相关的 ts 类型检测
import { loginForm, loginResponseData } from './type'
//用户相关接口的请求地址
enum API{//用户登录的请求地址:在接口文档中,去掉默认请求地址baseURL后剩下的部分LOGIN='/admin/login'
}
//登录接口
export const reqLogin=(data:loginForm)=>{request.post<any,loginResponseData>(API.LOGIN,data)
}
或者第二种普通封装方式:
// 封装登录相关接口
import { loginForm } from '@/apis/user/type'
import request from '@/utils/request'
export function useLoginAPI(data: loginForm) {return request({url: 'http://monitor-spring.jinxinapp.cn/api/v1/admin/login',method: 'POST',data,})
}

3、在store文件夹下创建用户相关的小仓库

// 用户相关的小仓库
import { defineStore } from 'pinia'
//引入登录接口
import {reqLogin} from '@/api/user/index.ts'
const useUserStore=defineStore('user',{state:()=>{return{token:localStorage.getItem('token'),}},actions:{//用户登录的方法,data是登录时传入的账号密码async useLogin(data:loginForm){//登录请求const result=awiat reqLogin(data)if(result.code==200){this.token=result.data.tokenlocalStorage.getItem('token',result.data.token)return 'ok'}else{return Promise.reject(new Error(result.data.message))}}},getters:{}
})
export default useUserStore

4、在登录页面,点击登录按钮调用tologin方法

const tologin=async ()=>{try{//调用仓库里的登录方法,传入的loginForm里面是账号密码await useStore.userLogin(loginForm)$router.push('/home')    //登录成功跳转首页,ElNotification({title: '成功',message: '登录成功',type: 'success',})}catch(error){ElNotification({message: (error as Error).message,type: 'error',})}
}


 

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

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

相关文章

仓储管理系统——软件工程报告(可行性研究报告及分析)①

可行性研究报告及分析 一、问题定义 1.1项目背景 随着社会的发展以及企业规模的扩大和业务的复杂化&#xff0c;仓库管理变得愈发重要。传统的手工管理方式已经导致了一系列问题&#xff0c;包括库存准确性低、订单处理效率慢等。为了提高仓库运作效率、降低成本并优化库存管…

unity 单例模式(实例详解)

文章目录 在Unity中&#xff0c;单例模式是一种常用的编程设计模式&#xff0c;用于确保在整个应用程序生命周期中&#xff0c;只有一个类的实例存在。这样可以保证数据的全局唯一性和共享性&#xff0c;例如游戏场景中的资源管理器、游戏控制器、事件管理器等。 以下是一个简单…

如何用 500 行 SQL 实现 GPT2学习

目录 理论背景实现过程GenerationTokenizerEmbeddingsAttention为什么我们需要有因果掩码&#xff1f;为什么矩阵是 Q&#xff0c;K 和 V&#xff1f; BlocksTokens为什么要使用 softmax 转换概率&#xff1f;Inference 俄罗斯有个大佬每年都会用 SQL 来实现一个挑战庆祝新年&a…

Android:JNI实战,理论详解、Java与Jni数据调用

一.概述 上一篇博文讲解了如何搭建一个可以加载和链接第三方库、编译C/C文件的Jni Demo App。 这篇博文在这个Jni Demo App的基础上&#xff0c;从实战出发详细讲解 Jni 开发语法。 接下来&#xff0c;先用一小节将Jni开发比较重要的理论知识点过一下&#xff0c;然后进行代…

matlab appdesigner系列-常用17-编辑字段(数值、文本)

编辑字段&#xff08;数值、文本&#xff09;可直接键入数值、文本&#xff0c;其他组件直接调用其值。也可以利用把其他组件回调的值&#xff0c;返回到编辑字段&#xff08;数值、文本&#xff09;进行显示。 示例&#xff1a;利用按钮组件改变编辑字段&#xff08;数值&…

详解APQC流程分级分类框架PCF13个高阶分类和5级业务流程

一&#xff1a;什么是APQC 美国生产力与质量中心(American Productivity and Quality Center&#xff0c;简称为APQC)&#xff0c;创立于1977年是一个会员制的非营利机构&#xff0c;使命是“发现有效的改进方法&#xff0c;广泛地传播其发现成果&#xff0c;实现个人之间及其…

etcd基本介绍

etcd基本介绍 ETCD是SoreOs公司发布的一个分布式的、高可用的、key-value存储的数据库。基于Go语言实现&#xff0c;k8s中也使用了ETCD作为数据库。主要用于共享配置和服务发现。相对于zookeeper采用的Paxos&#xff0c;ETCD采用的是Raft算法&#xff0c;该算法具备的性能更佳…

Centos7 安装redis 详细步骤访问不了github和windows系统下载

windows系统下载 https://hellowindows.cn/ VMware虚拟机安装Windows Server 2016 VL https://blog.csdn.net/qq_37545849/article/details/134828341 VMware全屏时不显示上方命令栏的边缘 此时如果要返回&#xff0c;可以把鼠标移动至屏幕上方边缘短暂停留以呼出命令栏。或使…

第二篇【传奇开心果短博文系列】Python的OpenCV库技术点案例示例:图像处理

传奇开心果短博文系列 系列短博文目录Python的OpenCV库技术点案例示例短博文系列 博文目录一、项目目标二、第一个示例代码三、第二个示例代码四、第三个示例代码五、第四个示例代码六、第五个示例代码七、知识点归纳总结 系列短博文目录 Python的OpenCV库技术点案例示例短博文…

OPENGL光线追踪

纪念一下运行出了光线追踪代码,用了glfw和glad。 光线的数学表达式 一条光线实际上只是一个起点和一个传播方向&#xff0c;因此光线表达式为&#xff1a; p(t) e t (s-e) 光线与球相交 已知球体的隐式方程为&#xff1a; 把光线 p(t) e t d 代入上述方程&#xff0c;得…

基于SpringBoot Vue医院门诊管理系统

大家好✌&#xff01;我是Dwzun。很高兴你能来阅读我&#xff0c;我会陆续更新Java后端、前端、数据库、项目案例等相关知识点总结&#xff0c;还为大家分享优质的实战项目&#xff0c;本人在Java项目开发领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#x…

RPC和HTTP,它们之间到底啥关系

既然有 HTTP 请求&#xff0c;为什么还要用 RPC 调用&#xff1f; gPRC 为什么使用 HTTP/2 Spring Cloud 默认是微服务通过Restful API来进行互相调用各自微服务的方法&#xff0c;同时也支持集成第三方RPC框架&#xff08;这里的说的RPC是特指在一个应用中调用另一个应用的接…

Git--基本操作介绍(2)

Git 常用的是以下 6 个命令&#xff1a;git clone、git push、git add 、git commit、git checkout、git pull. 说明&#xff1a; workspace&#xff1a;工作区staging area&#xff1a;暂存区/缓存区local repository&#xff1a;版本库或本地仓库remote repository&#xf…

Linux 一键部署grafana

grafana 前言 Grafana 是一款开源的数据可视化和监控仪表盘工具。它提供了丰富的数据查询、可视化和报警功能,可用于实时监控、数据分析和故障排除等领域。 通过 Grafana,您可以连接到各种不同的数据源,包括时序数据库(如 Prometheus、InfluxDB)和关系型数据库(如 MySQ…

2008年苏州大学837复试机试C/C++

2008年苏州大学复试机试 题目 编写程序充成以下功能: 一、从键盘上输入随机变量x的 10个取样点。X0&#xff0c;X1—X9 的值; 1、计算样本平均值 2、判定x是否为等差数列 3、用以下公式计算z的值(t0.63) 注。请对程序中必要地方进行注释 补充&#xff1a;个人觉得这个题目回忆…

Vscode 顶部Menu(菜单)栏消失如何恢复

Vscode 顶部Menu(菜单)栏消失如何恢复&#xff1f; 首先按一下 Alt按键&#xff0c;看一下是否恢复了菜单栏如果恢复了想了解更进一步的设置&#xff0c;或是没能恢复菜单栏&#xff0c;可以看后续。 1.首先点击左下角 齿轮&#xff0c;打开settings; 或者 直接 ctrl 逗号 …

chrome提升搜索效率的快捷方法

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

C# 使用System.Threading.Timer 实现计时器

写在前面 以往一般都是用 System.Timers.Timer 来做计时器&#xff0c;而 System.Threading.Timer 也可以实现计时器功能&#xff0c;并且还可以配置首次执行间隔&#xff0c;在功能上比System.Timers.Timer更加丰富&#xff1b;根据这个特性就可以实现按指定时间间隔对委托进…

书法家深入社区开展“迎春送福”写春联活动

春节将至&#xff0c;岁寒情深。2024年1月22日&#xff0c;在春节即将来临之际&#xff0c;双岗街道万小店社区邀请“四知书画院”院长杨东初、“东方诗书画院”院长杨玉能、“林散之草圣书画院”客座教授倪萍等知名书法家&#xff0c;在合肥市庐阳区为民社会服务中心开展“迎春…

Feign代理目标方法执行流程

总体而言Feign调用目标方法之前被jdk动态代理区分为两种形式&#xff1a;负载均衡方式以及域名直接调用方式。 public class FeignClientFactoryBean{public <T> T getTarget() {//通过父容器创建子容器工厂类FeignContextFeignContext context applicationContext.get…