Vue3+SpringBoot实现【登录】【毛玻璃】【渐变色】

2023-10-19 23:10

本文主要是介绍Vue3+SpringBoot实现【登录】【毛玻璃】【渐变色】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

首先创建Login.vue,编写界面和样式

这个是渐变色背景,登陆框背景为白色

<template><div class="wrapper"><div style="margin: 200px auto; background-color: #fff; width: 350px; height: 300px;padding: 20px;border-radius: 10px"><div style="margin: 20px 0;text-align: center;font-size: 24px"><b>登录</b><el-input size="medium" style="margin: 10px 0" v-model="user.username"><template #prefix><el-icon class="el-input__icon"><user></user></el-icon></template></el-input><el-input size="medium" style="margin: 10px 0" show-password v-model="user.password"><template #prefix><el-icon class="el-input__icon"><lock></lock></el-icon></template></el-input><div style="margin: 10px 0; text-align: right"><el-button type="primary" size="small" autocomplete="off">登录</el-button><el-button type="primary" size="small" autocomplete="off">注册</el-button></div></div></div></div>
</template><script>
import {Lock, User} from "@element-plus/icons";
export default {name: "LoginView",components: {Lock, User},data(){return{user:{}}}
}
</script><style scoped>.wrapper{height: 100vh;background-image: linear-gradient(to bottom right,#FC466B,#3F5EFB);overflow:hidden;}
</style>

,如果想要登录框为毛玻璃,可以将上面第二个div的 “background-color: #fff;”去掉

然后把这个div设置为class=login,编写login类的样式如下

 .login{background-color:rgba(255,255,255,0.1); //透明度backdrop-filter: blur(10px);  //毛玻璃效果}

 效果: (如果换一个比较鲜艳的背景,毛玻璃效果会更明显)

3e9045abe86345d3aab2ba0cd6541761.png

设置Login.vue的路由

caf5514e56124b4888bb6a80c9a4e946.png

 绑定登陆按钮的点击时间login 

4b821335552c4f4f93b49f7b7718d4cd.png

 编写login事件

 methods:{login(){this.request.post("http://localhost:8081/login",this.user).then(res =>{if(!res){this.$message.error("用户名或密码错误")}else {this.$message.success("登陆成功")this.$router.push("/new/home")}})}}

定义一个UserDto类

import lombok.Data;/*
接受前端登陆请求的参数*/@Data
public class UserDto {private String username;private String password;}

编写接口:

 //登陆的接口  RequestBody是将前端json传后端@PostMapping("/login")public boolean login(@RequestBody UserDto userDto){String username = userDto.getUsername();String password = userDto.getPassword();//这个if校验最好放在前端做if(StrUtil.isBlank(username)||StrUtil.isBlank(username))  {//判断是否为空,且使用了hutool里的工具类return false;}return userService.login(userDto);}

编写业务层接口

public boolean login(UserDto userDto) {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.eq("username",userDto.getUsername());queryWrapper.eq("password",userDto.getPassword());User one = getOne(queryWrapper);return one!=null;}

即可实现登录功能

452fa0c348c54bd7be17cce94ddb3b41.png

如果想要退出登陆,其实很简单,给退出绑定一个router-link就可以了

    <el-dropdown-item><router-link to="/login" style="text-decoration: none">退出</router-link></el-dropdown-item>

完善:

添加校验

(1)在把需要校验的部分用el-form表单标签括起来

<el-form  :rules="rules"><el-input size="default" style="margin: 10px 0" v-model="user.username"><template #prefix><el-icon class="el-input__icon"><user></user></el-icon></template></el-input><el-input size="default" style="margin: 10px 0" show-password v-model="user.password"><template #prefix><el-icon class="el-input__icon"><lock></lock></el-icon></template></el-input><div style="margin: 10px 0; text-align: right"><el-button type="primary" size="small" autocomplete="off" @click="login">登录</el-button><el-button type="warning" size="small" autocomplete="off">注册</el-button></div></el-form>

(2)在element-plus官网找到form那一块的校验 Form 表单 | Element Plus (element-plus.org)

a7e9373f1c07460db4f8c9f5c315561f.png

将rules绑定属性填进form标签9b0f433631a6479480f5eb3f0dd29af6.png

 然后在return里填写官网给的rules返回的数据形式,编写校验的规则

return {user: {},rules: {username: [{required: true, message: '请输入用户名', trigger: 'blur'},{min: 3, max: 5, message: 'Length should be 3 to 5', trigger: 'blur'},],password: [{required: true, message: '请输入用户名', trigger: 'blur'},{min: 3, max: 5, message: 'Length should be 3 to 5', trigger: 'blur'},],}}

再把我们的规则用prop传值写在el-form-item里面

 <el-form-item  label="用户名" prop="username" ><el-input size="default"  v-model="user.username" ><template #prefix><el-icon class="el-input__icon"><user></user></el-icon></template></el-input></el-form-item><el-form-item  label="密码" prop="password" ><el-input size="default"  show-password v-model="user.password" ><template #prefix><el-icon class="el-input__icon"><lock></lock></el-icon></template></el-input></el-form-item>

 此时如果没有传值,会出提示,但是提示并不会消失

我们则需要在e-form处传一个校验:此时输入正确后,提示将会消失

2617a24a5a7346fd9ea80ba6f0aecea8.png

 label-width=“auto”会让标签默认右对齐

最后效果:

e0ba04f1b9cb42df85d15cc9260282ef.png

 0aa4809b92204c06b072256559b6e73b.png

简单版的login到这里就结束了,但是这样写登陆的业务逻辑判断不是很好。但是如果不是在公司做登陆,只是做一个简单的系统是足够的。

加强处理异常,和规范性

创建一个common的包,里面创建接口Constans和Result类

package com.lnw.common;public interface Constants {String CODE_200 = "200";      //成功String CODE_401 = "401";      //权限不足String CODE_400 = "400";      //参数错误String CODE_500 ="500";       //系统错误String CODE_600 = "600"; //其它业务异常
}
package com.lnw.common;import jdk.nashorn.internal.objects.annotations.Constructor;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;/*
接口统一返回包装类*/@Data
@NoArgsConstructor
@AllArgsConstructor
public class Result {private String code;private String msg;private Object data;public static Result success(){return new Result(Constants.CODE_200,"",null);}public static Result success(Object data){return new Result(Constants.CODE_200,"",data);}public static Result error(String code,String msg){return new Result(code,msg,null);}public static Result error(){return new Result(Constants.CODE_500,"系统错误",null);}}

 创建exception包,创建全局管理器和重写ServiceException

package com.lnw.exception;import com.lnw.common.Result;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
//全局自定义异常处理器@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(ServiceException.class)@ResponseBodypublic Result handle(ServiceException se ){return Result.error(se.getCode(),se.getMessage());}}
@Data
public class ServiceException extends RuntimeException {private String code;//构造器public ServiceException (String code, String msg){super(msg);this.code=code;}
}

 重新封装接口 controller

 //登陆的接口  RequestBody是将前端json传后端@PostMapping("/login")public Result login(@RequestBody UserDto userDto){String username = userDto.getUsername();String password = userDto.getPassword();//这个if校验最好放在前端做if(StrUtil.isBlank(username)||StrUtil.isBlank(username))  {//判断是否为空,且使用了hutool里的工具类return Result.error(Constants.CODE_400,"参数错误");}UserDto dto = userService.login(userDto);return Result.success(dto);}

重新写前端接口

login(){this.request.post("http://localhost:8081/login",this.user).then(res =>{// if(!res){//   this.$message.error("用户名或密码错误")// }else {//   this.$message.success("登陆成功")//   this.$router.push("/new/home")// }if(res.code === '200'){// 如果获取到,则存一个user对象 为了替换登录后右上角的个人用户名localStorage.setItem("user",JSON.stringify(res.data)) //存储用户信息到浏览器this.$router.push("/new/home")this.$message.success("登陆成功")}else {this.$message.error(res.msg)}})}

这样就是更规范版本的登陆

这篇关于Vue3+SpringBoot实现【登录】【毛玻璃】【渐变色】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/242982

相关文章

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2