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

news2024/11/27 20:32:47

系列文章目录

 本系列记录一下通过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 } = response
    return 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 AxiosError
  return {
    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) return
    await 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 } = r
            currentUser.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.coloradmin.cn/o/1172815.html

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

相关文章

我终于学会的前端技能——代码调试、打断点

在技术的世界里&#xff0c;要用魔法来打败魔法 说来惭愧我做前端已近三年了竟然还没有学会如何调试代码&#xff0c;也就是给自己的代码打上断点一步步看它的运行状态以达到理清代码运行逻辑、排查问题提升开发效率的目的。直到最近我才学会了这一技能&#xff0c;在这之前我用…

抖音小店参与双十一活动:销售增长的策略与实施

双十一是中国最大的购物狂欢节&#xff0c;对于抖音小店商家来说&#xff0c;参与双十一活动是一个极好的机会&#xff0c;可以在这个繁忙的购物季节中大幅提升销售。下面四川不若与众将介绍一些抖音小店商家如何参与双十一活动的策略和注意事项。 1. 提前准备&#xff1a;在双…

Nginx编译安装和配置

官网:http://nginx.org/ 这里以1.20.2为例 Nginx是C语言写的 如果Linux系统上没有安装C编译环境 先执行下面命令 yum install -y gcc automake autoconf libtool make 如果不确定 可以使用命令查看 命令格式 rpm -q xxx 例如 说明有C编译环境 安装前需要安装4个依赖包…

任正非说:为更好地服务客户,我们把指挥所建到听得到炮声的地方

你好&#xff01;这是华研荟【任正非说】系列的第29篇文章&#xff0c;让我们聆听任正非先生的真知灼见&#xff0c;学习华为的管理思想和管理理念。 一、产品发展的路标是客户需求导向&#xff0c;企业管理的目标是流程化的组织建设&#xff0c;这两句话归纳了我形容的龙的组织…

海康Visionmaster-全局变量:全局变量关联流程中具体 模块结果的方法

将视觉流程中模板匹配算法模块运行的结果数据&#xff1a;特征匹配点 X 关联全局变量 MatchResultX。 在流程运行的主界面中&#xff0c;按照下面 1&#xff0c;2&#xff0c;3&#xff0c;4 步骤操作&#xff0c;第一步选中算法模块&#xff0c;第二步择模块结果 Tab 页&#…

【NeurIPS 2020】基于蒙特卡罗树搜索的黑箱优化学习搜索空间划分

Learning Search Space Partition for Black-box Optimization using Monte Carlo Tree Search 目标&#xff1a;从采样&#xff08;Dt ∩ ΩA&#xff09;中学习一个边界&#xff0c;从而最大化两方的差异 先使用Kmeans在特征向量上&#xff08; [x, f(x)] &#xff09;聚类…

Python算法例4 求平方根

1. 问题描述 实现int sqrt&#xff08;int x&#xff09;函数&#xff0c;计算并返回x的平方根。 2. 问题示例 sqrt&#xff08;3&#xff09;1&#xff1b;sqrt&#xff08;4&#xff09;2&#xff1b;sqrt&#xff08;5&#xff09;2&#xff1b;sqrt&#xff08;17&#…

GEE数据集——原住民土地(原住民土地地图)数据集

原住民土地&#xff08;原住民土地地图&#xff09; 土地承认是人们在日常生活中融入原住民存在和土地权利意识的一种方式。这通常在仪式、讲座或教育指南开始时进行。它可以是一种明确但有限的方式来认识殖民主义和第一民族的历史以及定居者殖民社会变革的需要。在这种情况下…

夜间灯光数据VIIRS Nighttime Day: Night Band Composites Version 1数据集

简介&#xff1a; 新一代对地观测卫星Suomi NPP,搭载的可见光红外成像辐射仪&#xff08;Visible Infrared Imaging Radiometer Suit,VIIRS&#xff09;&#xff0c;能够获取新的夜间灯光遥感影像&#xff08;Day/Night Band,DNB波段&#xff09;。VIIRS_VCMCFG夜光遥感数据的…

航模模拟器训练

准备物品 航模遥控器 aux线 即两端都是耳机插头的线 解密狗 电脑 phoenixRC 航模模拟软件(【飞舜极创】凤凰5.0飞行模拟器 安装和设置方法_哔哩哔哩_bilibili) 操控 美国手(俗称左手油门)——左手油门和方向舵&#xff0c;右手升降和副翼 美国手 左摇杆&#xff1a; 上下…

【qemu逃逸】HITB2017-babyqemu 2019数字经济-qemu

前言 由于本地环境问题&#xff0c;babyqemu 环境都没有起起&#xff0c;这里仅仅做记录&#xff0c;exp 可能不正确。 HITB2017-babyqemu 设备逆向 设备定位啥的就不说了&#xff0c;先看下实例结构体&#xff1a; 其中 dma_state 结构体如下&#xff1a; 这里看字段猜测…

【算法|二分查找No.3】leetcode 35. 搜索插入位置

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…

网络运维Day01

文章目录 环境准备OSI七层参考模型什么是协议&#xff1f;协议数据单元(PDU)设备与层的对应关系什么是IP地址&#xff1f;IP地址分类IP的网络位和主机位IP地址默认网络位与主机位子网掩码默认子网掩码查看IP地址安装CISCO汉化CISCO(可选操作) CISCO之PC机器验证通信 CISCSO之交…

台球厅桌球室计时计算软件计费方法,台球厅的电脑怎么计时

台球厅桌球室计时计算软件计费方法&#xff0c;台球厅的电脑怎么计时 今天给大家分享的是 佳易王桌球计时计费软件V18.0版本&#xff0c;只需点开始计时即可&#xff0c;结账的时候&#xff0c;软件自动计算金额。 灯控为可选&#xff0c;点开始计时&#xff0c;相应的桌灯亮…

【算法|二分查找No.4】leetcode 852. 山脉数组的峰顶索引

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…

一文带你掌握多继承,菱形继承以及虚拟继承

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;强烈推荐优质专栏: &#x1f354;&#x1f35f;&#x1f32f;C的世界(持续更新中) &#x1f43b;推荐专栏1: &#x1f354;&#x1f35f;&#x1f32f;C语言初阶 &#x1f43b;推荐专栏2: &#x1f354;…

第二十三章 LaneAF框架结构以及接入MMDetection3D模型(车道线感知)

一 前言 近期参与到了手写AI的车道线检测的学习中去&#xff0c;以此系列笔记记录学习与思考的全过程。车道线检测系列会持续更新&#xff0c;力求完整精炼&#xff0c;引人启示。所需前期知识&#xff0c;可以结合手写AI进行系统的学习。 二 LaneAF接入openlane数据集 2.1 Lan…

Box2d 物理画线,Cocos Creator 3.8

一个简易的画线刚体Demo 效果 抱歉&#xff0c;放错图了&#xff0c;以上是 孙二喵 iwae https://forum.cocos.org/t/topic/142673[1] 的效果图。本Demo是根据文章的思路&#xff0c;合成的代码。首先&#xff0c;感谢孙二喵的技术分享。 以下是最终效果图 使用 版本 Cocos Cre…

Cube MX 开发高精度电流源跳坑过程/SPI连接ADS1255/1256系列问题总结/STM32 硬件SPI开发过程

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 1.使用STM32F系列开发一款高精度恒流电源&#xff0c;用到了24位高精度采样芯片ADS1255/ADS1256系列。 2.使用时发现很多的坑&#xff0c;详细介绍了每个坑的具体情况和实际的解决办法。 坑1&#xff1a;波特率设置…

【C++初阶】第一站:C++入门基础(上) -- 良心详解

前言: 从这篇文章开始,将进入C阶段的学习&#xff0c;此篇文章是c的第一站的上半篇&#xff0c;讲述C初阶的知识 目录 什么是C C的发展史 C关键字(C98) 命名空间 命名空间定义 命名空间使用 1.加命名空间名称及作用域限定符 2.使用using将命名空间中某个成员引入 3.使…