Day 6 登录页以及路由(四)Vue页面处理

系列文章目录

 本系列记录一下通过Abp搭建后端,Vue+Element UI Plus搭建前端,实现一个小型项目的过程。

  • Day 1 Vue 页面框架
  • Day 2 Abp框架下,MySQL数据迁移时,添加表和字段注释
  • Day 3 登录页以及路由 (一)
  • Day 4 登录页及路由 (二)Vue状态管理
  • Day 5 登录页及路由 (三) 基于axios的API调用

文章目录

目录

系列文章目录

文章目录

前言

一、整体布局

二、登录窗体

三、API 调用修改

总结


前言

还是走到了这一步,要涉足我的盲区,样式和布局了。先看看最终的效果:


一、页面需求

这是一个非常非常简单的登录页,基本功能如下:

1. 提供账号密码输入框

2. 输入框左侧显示图标

3. 账号可以一键清空

4. 密码可以查看明文

5. 账号不能为空;密码不能为空,密码长度6-12位

6. 重置按钮清空输入的账号密码

7. 登录按钮调用api,成功后转到/home/index,失败则弹出失败消息。

一、整体布局

登录视图中,背景为统一颜色 #2b4b6b,非常好记的一个颜色值。然后整体居中。这个居中是通过视频中的方法,先绝对定位,然后左上点到正中央,再平移回去,这个思路对于居中只知道 text-align的我而言就友好多了。

具体布局如下:

src/views/login/LoginView.vue

<template><div class="login_container"><div class="login_box"><div class="logo_box"><img src="@/assets/logo.svg" alt="logo" /></div></div></div>
</template>
<style lang="less" scoped>
.login_container {background-color: #2b4b6b;height: 100%;
}
.login_box {width: 430px;height: 300px;background-color: white;position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%);border-radius: 3px;.logo_box {height: 100px;width: 100px;position: absolute;left: 50%;transform: translate(-50%, -50%);border-radius: 50%;border: 1px solid #ddd;padding: 10px;box-shadow: 0 0 10px;background-color: #eee;img {height: 100%;width: 100%;border-radius: inherit;background-color: #eee;}}
}
</style>

 

这里基本上都是跟着视频走,用的less,还没有看到和普通css有啥区别,另外,好像element ui plus用的是sass。后续有时间了再看看。

上述代码渲染出来的效果是这样的:

就是一个图标,盖在一个白色矩形上。这个白色矩形,就是后续的输入窗体了。

二、登录窗体

输入窗体直接用el-form,这里提一下和视频不一样的地方,就是图标的自动导入。在前面已经配置好了自动导入,所以不用像视频那样手动引入,直接在代码里写就可以。

在components.d.ts中,会自动生成如下代码:

其它的基本上就是根据ElementUI Plus的官方文档来处理了。包括输入框、校验、事件处理,官方文档上都有说明,基本就是CV大法就可以了。

src/views/login/components/LoginForm.vue

<template><el-form ref='loginFormRef' :model='loginForm' :rules='rules' class='login_form' label-width="0"><el-form-item prop="username"><el-input v-model="loginForm.username" class="w-50 m-2" placeholder="账号" clearable><template #prefix><ElIcon><ElIconUser></ElIconUser></ElIcon></template></el-input></el-form-item><el-form-item prop="password"><el-input v-model="loginForm.password" class="w-50 m-2" type="password" placeholder="密码" show-password><template #prefix><ElIcon><ElIconLock></ElIconLock></ElIcon></template></el-input></el-form-item><el-form-item><div class="login_buttons"><el-button type="primary" class="justify-end" @click="submitForm(loginFormRef)">登录</el-button><el-button class="justify-end" @click="resetForm(loginFormRef)">重置</el-button></div></el-form-item></el-form>
</template>

三、API 调用修改

需要特别说明的就是登录API调用了。昨天已经做了一个简单处理,但是实际上还是需要再修改一下。

修改主要提现在两点,错误处理和响应数据统一处理。

错误处理又分为两个地方,axios的响应拦截器和login方法里面。上代码:

src\api\index.ts

http.interceptors.response.use((response: AxiosResponse) => {const { data } = responsereturn data},async (error: AxiosError) => {if (error.code == AxiosError.ERR_BAD_RESPONSE) {error.message = '服务器错误!请您稍后重试'}if (error.code == AxiosError.ECONNABORTED) {error.message = '请求超时!请您稍后重试'}if (error.code == AxiosError.ERR_NETWORK) {error.message = '网络错误!请您稍后重试'}const result = {code: error.code,message: error.message,success: false}return result   }
)

在响应拦截器中,做了两个处理,第一个就是正常返回时,把data直接返回;第二个就是错误时,针对特定code,添加了中文消息,然后将错误封装成统一响应数据。

然后在调用的地方,也做了相应的修改

src\api\login.ts

主要是针对异常做了处理,具体errorToResult方法如下:

export const errorToResult = (error: unknown) => {const axError = error as AxiosErrorreturn {code: axError ? (axError.code ? axError.code : '-1') : '-1',success: false,message: axError ? (axError.message ? axError.message : '') : error + '',data: null}
}

那为什么要这么做?

首先在调用axios时,会有各种各样的可能出错,那么login方法就需要去try-catch,所以这里的异常处理是必不可少的。

另外,后端返回的结果,会有定义code,根据code不同,会有不同的处理方式,而这个又是和业务紧密相关的,并不是一个统一弹窗就能完全覆盖的。当然,一些基础的错误用统一弹窗也就够了。

总体思路就是在login这里,把所有的异常处理掉,统一成一致的响应数据,然后在实际使用的地方,根据响应数据再进行后续处理。

最后,在LoginForm中,实际调用的代码是这个样子的:

const submitForm = async (formEl: FormInstance | undefined) => {if (!formEl) returnawait formEl.validate(async (valid, fields) => {if (valid) {await doLogin()}})
}const currentUser = useCurrentUserStore()
const router = useRouter()const doLogin = async () => {const result = await login(loginForm)handleResultDTO(result,(r: ResultDTO<Login.LoginResponse>) => {const { data } = rcurrentUser.setToken(data!.token)currentUser.setUserInfo({ name: data!.nickname })router.push('/home/index')})// if (result.success && result.data) {//     const loginResponse = result.data//     currentUser.setToken(loginResponse.token)//     currentUser.setUserInfo({ name: loginResponse.nickname })//     router.push('/home/index')// } else {//     ElMessage.error(result.message)// }
}

在 doLogin中,注释掉的内容后面被封装到 handleResultDTO方法里:


export const handleResultBase = (result: ResultBase, action: (r: ResultBase) => any): any => {if (result && result.success) {return action(result)} else {ElMessage.error(result.message)}
}export const handleResultDTO = <T>(result: ResultDTO<T>, action: (r: ResultDTO<T>) => any): any => {if (result && result.success && result.data) {return action(result)} else {ElMessage.error(result.message)}
}

这个只是两种不同的写法,本质上都是依据响应数据是否返回了正确了结果来处理,提取成方法只是一个习惯。


总结

以上就是今天的内容,本文记录了一下vue登录页面的具体搭建过程,另外对API调用进行了重构,主要是涉及到异常处理部分。

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

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

相关文章

CleanMyMac X2024破解版下载地址链接

如果你是一位Mac用户&#xff0c;你可能会遇到一些问题&#xff0c;比如Mac运行缓慢、磁盘空间不足、应用程序难以管理等。这些问题会影响你的Mac的性能和体验&#xff0c;让你感到沮丧和无奈。那么&#xff0c;有没有一款软件可以帮助你解决这些问题呢&#xff1f;答案是肯定的…

(免费领源码)Java#Springboot#mysql高校实训管理平台01557-计算机毕业设计项目选题推荐

目 录 摘要 1 绪论 1.1 研究背景 1.2 研究意义 1.3论文结构与章节安排 2 高校实训管理平台系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据增加流程 2.2.2 数据修改流程 2.2.3 数据删除流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系…

「图像 cv2.seamlessClone」无中生有制造数据

上一篇博客【「图像 merge」无中生有制造数据 】写的是图片直接融合&#xff0c;此方法生成的图片相对而言比较生硬&#xff0c;虽然目标图片已经透明化处理过了&#xff0c;但是生成的图片依旧很假 除了上述上述的图片叠加融合之外&#xff0c;还有一种更加自然的融合方法&…

Nginx+keepalived实现七层的负载均衡

1.keepalived VRRP 介绍 keepalived是什么&#xff1f; keepalived是集群管理中保证集群高可用的一个服务软件&#xff0c;用来防止单点故障。 keepalived工作原理 keepalived是以VRRP协议为实现基础的&#xff0c;VRRP全称Virtual Router Redundancy Protocol&…

C#使用Oracle.ManagedDataAccess.dll

1、添加引用 在网上下载一个Oracle.ManagedDataAccess.dll&#xff0c;引用即可&#xff0c;操作不受操作系统的位数限制&#xff0c;服务器也不Oracle客户端&#xff1b; 2、web.config字串 <appSettings> <add key"hrp" value"Data Source (DES…

ElasticSearch基本使用

概述 安装 关于ES的安装不做重点讲解&#xff0c;这里提供一个k8s基于sts创建以及ingress访问的模板文件。 --- apiVersion: apps/v1 kind: StatefulSet metadata:labels:app: elasticsearchcomponent: masterrelease: elasticsearchname: elasticsearch-masternamespace: es s…

「Verilog学习笔记」移位运算与乘法

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 分析 1、在硬件中进行乘除法运算是比较消耗资源的一种方法&#xff0c;想要在不影响延迟并尽量减少资源消耗&#xff0c;必须从硬件的特点上进行设计。根据寄存器的原理&a…

C语言之动态内存管理实现通讯录(完整版)

我们在之前的博客中写过静态版的通讯录&#xff0c;我们今天来写一个动态版的&#xff0c;不需要规定它到底需要多大空间&#xff0c;只要还有内存&#xff0c;我们都可以存放的下&#xff01;同时&#xff0c;函数实现原理&#xff0c;我在通讯录静态版的博客里做了详细的讲解…

操作系统学习笔记(学习中)

计算机系统概述 1.操作系统概念 管理系统软/硬件资源&#xff0c;为程序提供服务 2.发展与分类 3.操作系统的运行环境 运行机制 指令&#xff1a;&#xff08;二进制机器指令&#xff09;&#xff0c;CPU能识别&#xff0c;执行的最基本命令 应用程序&#xff1a;程序员写…

Splunk 创建特色 dashboard 报表

1: 背景: 对原有的dashboard 进行增加点东西,特别是文字部分: 比如: 增加:“this is a guidline for how to use performance". 这段话,就不能写在title, 那样,这段文字,会出现在dashboard 的PDF 文件的分割线的上面,不符合要求。 2: 解决问题: 正确的做法是…

Qt学习:图形视图框架的使用

文章目录 前言一、场景、视图和图形项的介绍二、图形视图框架的坐标系统三、图形视图框架的事件处理四、示例完整代码五、QtCreator官方示例总结 前言 近期重温了一下Qt中的图形视图框架&#xff0c;这里将所学习的内容进行记录总结。这个框架提供了一个基于图形项的模型视图编…

Java配置47-Spring Eureka 未授权访问漏洞修复

文章目录 1. 背景2. 方法2.1 Eureka Server 添加安全组件2.2 Eureka Server 添加参数2.3 重启 Eureka Server2.4 Eureka Server 升级版本2.5 Eureka Client 配置2.6 Eureka Server 添加代码2.7 其他问题 1. 背景 项目组使用的 Spring Boot 比较老&#xff0c;是 1.5.4.RELEASE…

Linux生成静态库

GCC 什么是GCC GCC 是 GNU 编译器集合&#xff08;GNU Compiler Collection&#xff09;的缩写。它是一个开源的编程语言编译器&#xff0c;支持多种编程语言&#xff0c;包括 C、C、Objective-C、Fortran、Ada 和 Go 等。GCC 最初由理查德斯托曼&#xff08;Richard Stallman…

2022最新版-李宏毅机器学习深度学习课程-P32 Transformer

一、 seq2seq 1. 含义 输入一个序列&#xff0c;机器输出另一个序列&#xff0c;输出序列长度由机器决定。 文本翻译&#xff1a;文本至文本&#xff1b;  语音识别&#xff1a;语音至文本&#xff1b;  语音合成&#xff1a;文本至语音&#xff1b;  聊天机器人&#…

WPF布局控件之DockPanel布局

前言&#xff1a;博主文章仅用于学习、研究和交流目的&#xff0c;不足和错误之处在所难免&#xff0c;希望大家能够批评指出&#xff0c;博主核实后马上更改。 概述&#xff1a; DockPanel 位置子控件基于子 Dock 属性&#xff0c;你有 4 个选项停靠&#xff0c;左 (默认) &…

HarmonyOS 数据管理与应用数据持久化(二)

通过键值型数据库实现数据持久化 场景介绍 键值型数据库存储键值对形式的数据&#xff0c;当需要存储的数据没有复杂的关系模型&#xff0c;比如存储商品名称及对应价格、员工工号及今日是否已出勤等&#xff0c;由于数据复杂度低&#xff0c;更容易兼容不同数据库版本和设备…

Gradle笔记 一 Gradle的安装与入门

文章目录 Gradle 入门Gradle 简介学习Gradle 的原因&#xff1a; 常见的项目构建工具Gradle 安装Gradle 安装说明安装JDK 下载并解压到指定目录配置环境变量检测是否安装成功 Gradle 项目目录结构Gradle 创建第一个项目Gradle 中的常用指令修改maven 下载源Wrapper 包装器使用教…

项目管理之如何估算项目工作成本

在项目管理中&#xff0c;如何估算项目工作成本是一个关键问题。为了解决这个问题&#xff0c;我们可以采用自上而下的成本限额估算法和自下而上的成本汇总估算法。这两种方法各有优缺点&#xff0c;但都可以帮助我们准确地估算项目工作成本。 自上而下的成本限额估算法 自上…

InnoDB中Buffer Pool详解

1. 概念及特点 Buffer Pool 是 MySQL 中 InnoDB 存储引擎用来缓存表数据和索引数据的内存区域。这个内存区域被用来存储磁盘上的数据页的副本&#xff0c;这样常用的数据可以在内存中快速被访问&#xff0c;而不必每次都从磁盘中读取。 以下是 Buffer Pool 的一些重要特点&a…

串口通信(6)应用定时器中断+串口中断实现接收一串数据

本文为博主 日月同辉&#xff0c;与我共生&#xff0c;csdn原创首发。希望看完后能对你有所帮助&#xff0c;不足之处请指正&#xff01;一起交流学习&#xff0c;共同进步&#xff01; > 发布人&#xff1a;日月同辉,与我共生_单片机-CSDN博客 > 欢迎你为独创博主日月同…