【SpringBoot+Vue】后端代码学习记录——登录功能开发

参考资料
https://www.cnblogs.com/three-fighter/p/14332288.html

零、前端开发

略。之前有过。

一、后端开发

1、统一结果封装

创建了一个 Result 类,用于异步统一返回的结果封装。一般来说,结果里面有几个要素必要的
是否成功,可用 code 表示(如 200 表示成功,400 表示异常)
结果消息
结果数据

public class Result implements Serializable {//响应码private Integer code;//信息private String message;//返回数据private Object data;public Result(Integer code, String message, Object data) {this.code = code;this.message = message;this.data = data;}public Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public Object getData() {return data;}public void setData(Object data) {this.data = data;}
}

实际上由于响应码是固定的,code 属性应该是一个枚举值,这里作了一些简化。

2、登录业务实体类

为了接收前端登录的数据,我们这里创建了一个登录用的业务实体类(LoginDTO)
在这里插入图片描述

public class LoginDTO {private String loginName;private String password;public String getLoginName() {return loginName;}public void setLoginName(String loginName) {this.loginName = loginName;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}
}

3、控制层

LoginController,进行业务响应:

package com.test.demo.controller;import com.test.demo.dto.LoginDTO;
import com.test.demo.result.Result;
import com.test.demo.service.LoginService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;/***** @RestController* 在 Spring Boot 中,@Controller 注解是专门用于处理 Http 请求处理的,是以 MVC 为核心的设计思想的控制层。@RestController 则是 @Controller 的衍生注解。* Spring Boot 本身就 Spring MVC 的简化版本。是在 Spring MVC 的基础上实现了自动配置,简化了开发人员开发过程。**@Autowired** 注解基于依赖注入(Dependency Injection,DI)的原理。在Spring容器中,所有的Bean都会被实例化和管理,它们之间的依赖关系由Spring容器来维护。当一个Bean依赖于另一个Bean时,可以使用@Autowired注解来告诉Spring容器自动装配这些依赖。** @PostMapping* 在 Spring Boot 中,使用 @PostMapping 注解非常简单,只需要将它添加到一个方法的定义上即可*我们使用 @PostMapping 注解声明了一个方法 loginr(),这个方法用来处理客户端发送的 POST 请求,并将请求体中的数据转换为 loginDTO 对象(并返回)。** */@RestController
public class LoginController {@AutowiredLoginService loginService;@PostMapping(value = "/api/login")public Result login(@RequestBody LoginDTO loginDTO){return loginService.login(loginDTO);}@PostMapping(value = "/api/hello")public Result hello(){return new Result(200,"hello","world");}
}

Spring Boot Web 开发@Controller @RestController 使用教程

4、业务层

业务层进行实际的业务处理。

LoginService: service接口

public interface LoginService {public Result login(LoginDTO loginDTO);
}

LoginServiceImpl:service接口实现类

@Service
public class LoginServiceImpl implements LoginService {//    @Autowired 是idea的问题,@Mapper 这个注解是 Mybatis 提供的,而 @Autowried 注解是 Spring 提供的@Autowired(required=false)private UserMapper userMapper;@Overridepublic Result login(LoginDTO loginDTO) {//判断登录名和密码是否为空://StringUtils 方法的操作对象是 Java.lang.String 类型的对象,是 JDK 提供的 String 类型操作方法的补充if (StringUtils.isEmpty(loginDTO.getLoginName())){return new Result(400,"账号不能为空","");}if (StringUtils.isEmpty(loginDTO.getPassword())){return new Result(400,"密码不能为空","");}//通过登录名查询用户//wrapper.eq("实体类::查询字段", "条件值"); //相当于where条件QueryWrapper<User> wrapper = new QueryWrapper();wrapper.eq("login_name", loginDTO.getLoginName());User uer=userMapper.selectOne(wrapper);//比较密码if (uer!=null&&uer.getPassword().equals(loginDTO.getPassword())){LoginVO loginVO=new LoginVO();loginVO.setId(uer.getId());//这里token直接用一个uuid//使用jwt的情况下,会生成一个jwt token,jwt token里会包含用户的信息loginVO.setToken(UUID.randomUUID().toString());loginVO.setUser(uer);return new Result(200,"",loginVO);}return new Result(401,"登录失败","");}
}

LoginVO
.登录返回接口实体类
数据包:vo
token:返回一段随机字符串


public class LoginVO implements Serializable {private Integer id;private String token;private User user;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getToken() {return token;}public void setToken(String token) {this.token = token;}public User getUser() {return user;}public void setUser(User user) {this.user = user;}
}

一个登录功能完成了
在这里插入图片描述

登录功能完善

前面虽然实现了登录,但只是一个简单的登录跳转,实际上并不能对用户的登录状态进行判别,接下来我们进一步完善登录功能。

首先开始后端的开发。

1、后端开发
1.1、拦截器
创建 interceptor 包,包下新建拦截器 LoginInterceptor

public class LoginInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException {//从header中获取tokenString token = request.getHeader("token");//如果token为空if (StringUtils.isBlank(token)) {setReturn(response,400,"用户未登录,请先登录");return false;}//在实际使用中还会:// 1、校验token是否能够解密出用户信息来获取访问者// 2、token是否已经过期return true;}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {}//返回json格式错误信息private static void setReturn(HttpServletResponse response, Integer code, String msg) throws IOException {HttpServletResponse httpResponse = (HttpServletResponse) response;httpResponse.setHeader("Access-Control-Allow-Credentials", "true");httpResponse.setHeader("Access-Control-Allow-Origin", HttpContextUtil.getOrigin());//UTF-8编码httpResponse.setCharacterEncoding("UTF-8");response.setContentType("application/json;charset=utf-8");Result result = new Result(code,msg,"");ObjectMapper objectMapper = new ObjectMapper();String json = objectMapper.writeValueAsString(result);httpResponse.getWriter().print(json);}}

为了能给前端返回 json 格式的结果,这里还用到了一个工具类,新建 util 包,util 包下新建工具类 HttpContextUtil

public class HttpContextUtil {public static HttpServletRequest getHttpServletRequest() {return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();}public static String getDomain() {HttpServletRequest request = getHttpServletRequest();StringBuffer url = request.getRequestURL();return url.delete(url.length() - request.getRequestURI().length(), url.length()).toString();}public static String getOrigin() {HttpServletRequest request = getHttpServletRequest();return request.getHeader("Origin");}
}

1.2、拦截器配置
拦截器创建完成之后,还需要进行配置。

@Configuration
public class DemoWebConfig implements WebMvcConfigurer {/*** 拦截器配置** @param registry*/@Overridepublic void addInterceptors(InterceptorRegistry registry) {//添加拦截器registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/api/**")//放行路径,可以添加多个.excludePathPatterns("/api/login");}}

1.3、跨域配置
在之前的后台接口,有一个注解@CrossOrigin ,这个注解是用来跨域的,每个接口都写一遍肯定是不太方便的,这里我们 创建跨域配置类并添加统一的跨域配置:

@Configuration
public class CorsConfig {@Beanpublic CorsFilter corsFilter() {UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();CorsConfiguration corsConfiguration = new CorsConfiguration();//允许源,这里允许所有源访问,实际应用会加以限制corsConfiguration.addAllowedOrigin("*");//允许所有请求头corsConfiguration.addAllowedHeader("*");//允许所有方法corsConfiguration.addAllowedMethod("*");source.registerCorsConfiguration("/**", corsConfiguration);return new CorsFilter(source);}
}

2.、登录service
这样一来,后端就需要生成一个 token 返回给前端,所以更改 LoginServiceImpl 里的登录方法。

@Service
public class LoginServiceImpl implements LoginService {//    @Autowired 是idea的问题,@Mapper 这个注解是 Mybatis 提供的,而 @Autowried 注解是 Spring 提供的@Autowired(required=false)private UserMapper userMapper;@Overridepublic Result login(LoginDTO loginDTO) {//判断登录名和密码是否为空://StringUtils 方法的操作对象是 Java.lang.String 类型的对象,是 JDK 提供的 String 类型操作方法的补充if (StringUtils.isEmpty(loginDTO.getLoginName())){return new Result(400,"账号不能为空","");}if (StringUtils.isEmpty(loginDTO.getPassword())){return new Result(400,"密码不能为空","");}//通过登录名查询用户//wrapper.eq("实体类::查询字段", "条件值"); //相当于where条件QueryWrapper<User> wrapper = new QueryWrapper();wrapper.eq("login_name", loginDTO.getLoginName());User uer=userMapper.selectOne(wrapper);//比较密码if (uer!=null&&uer.getPassword().equals(loginDTO.getPassword())){LoginVO loginVO=new LoginVO();loginVO.setId(uer.getId());//这里token直接用一个uuid//使用jwt的情况下,会生成一个jwt token,jwt token里会包含用户的信息loginVO.setToken(UUID.randomUUID().toString());loginVO.setUser(uer);return new Result(200,"",loginVO);}return new Result(401,"登录失败","");}
}

其中对返回的data 封装了一个VO:

3.、登录接口测试
在这里插入图片描述
在这里插入图片描述

2、前端开发

实现前端登录器,需要在前端判断用户的登录状态。我们可以像之前那样在组件的 data 中设置一个状态标志,但登录状态应该被视为一个全局属性,而不应该只写在某一组件中。
所以我们需要引入一个新的工具——Vuex,它是专门为 Vue 开发的状态管理方案,我们可以把需要在各个组件中传递使用的变量、方法定义在这里。

  • 访问前端接口自动跳转到login界面

在这里插入图片描述

打开 Application ,在 Session Storage 中看到我们存储的信息-
在这里插入图片描述

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

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

相关文章

不会开发的你也能管理好企业漏洞,开源免费工具:洞察(insight II)

公司刚开始建设安全管理时&#xff0c;都是从一片混沌开始的&#xff0c;资源总是不够的&#xff0c;我们每个做安全的人员&#xff0c;又要会渗透&#xff0c;又要抓制度&#xff0c;还得管理各种漏洞。在管理楼栋是&#xff0c;我相信大家都遇到过以下几个问题&#xff1a; …

李宏毅深度学习01——基本概念简介

视频链接 基本概念 Regression&#xff08;回归&#xff09;&#xff1a; 类似于填空 Classification&#xff08;分类&#xff09;&#xff1a; 类似于选择 Structure Learning&#xff08;机器学习&#xff09;&#xff1a; &#xff1f;&#xff1f; 机器学习找对应函数…

Python基础教程(十六):正则表达式

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…

查分易老师怎么用?

老师们想知道怎么样创建一个查分易成绩查询系统吗&#xff1f;" 这是许多老师在学期结束时关心的问题。别担心&#xff0c;查分易小程序让查询发布工作变得省事又高效。 首先成绩Excel表格格式要设置正确。第一行必须是表头&#xff0c;包含学生的"姓名"、"…

C++中的结构体——结构体中const的使用场景

作用&#xff1a;用const来防止误操作 示例 运行结果

2024酒店IPTV云桌面系统建设方案

Hello大家好&#xff0c;我是点量小芹&#xff0c;这一年多的时间一直在分享实时云渲染像素流相关的内容&#xff0c;今天和大家聊聊酒店IPTV云桌面电视系统解决方案&#xff0c;或者有的朋友也会称之为IPTV服务器。熟悉小芹的朋友知道&#xff0c;IPTV软件系统是我们一直在推的…

MySQL之高级特性(三)

高级特性 分布式(XA)事务 存储引擎的事务特性能够保证在存储引擎级别实现ACID,而分布式事务则让存储引擎级别的ACID可以扩展到数据库层面&#xff0c;甚至可以扩展到多个数据库之间——这需要通过两阶段提交实现。MySQL5.0和更新版本的数据库已经开始支持XA事务了。XA事务中需…

架构设计 - nginx 的核心机制与主要应用场景

一、nginx 的核心机制&#xff1a; 1. 事件驱动模型&#xff08;epoll 多路复用&#xff09; 事件循环&#xff1a; Nginx的核心组件是一个事件循环&#xff0c;它不断地监听事件&#xff08;如新连接的到来、请求数据的可读性等&#xff09;。 当有事件发生时&#xff0c;事…

放弃Venn-Upset-花瓣图,拥抱二分网络

写在前面 让点随机排布在一个区域&#xff0c;保证点之间不重叠,并且将点的图层放到最上层&#xff0c;保证节点最清晰&#xff0c;然后边可以进行透明化&#xff0c;更加突出节点的位置。这里我新构建了布局函数 PolyRdmNotdCirG 来做这个随机排布。调用的是packcircles包的算…

商家转账到零钱最全面攻略:申请、使用、注意事项等详解

一、微信商家转账到零钱功能概述 微信支付作为国内最大社交软件的增值服务&#xff0c;在商业活动中广泛使用。其开发的营销功能“商家转账到零钱”则允许商家直接将资金转入用户的微信钱包&#xff0c;操作简便快捷。本文将详细探讨此功能的使用条件、操作步骤以及解答一些常…

Java中Transactional在不同方法间的穿透性,rollbackFor参数含义

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; 在Java开发中&#xff0c;经常会遇到需要在一个事务中执行多个操作的场景。为了确保这些操作的原子性&#xff0c;可以使用Spring框架提供的Transactional注解来实现事务管理。然而&#xff0c;在实际开发过程中&…

LeetCode刷题之HOT100之验证二叉搜索树

1、题目描述 2、逻辑分析 要求给定的根节点是否是有效的二叉树。有效的二叉搜索树定义如上。那么如何求解呢&#xff1f;题解给出了两张求解方法&#xff1a;递归、中序遍历。这边倾向于中序遍历&#xff0c;中序遍历后的二叉树是升序排序的&#xff0c;以这个性质即可解题。 …

Prometheus——部署详解

目录 一、Prometheus Server端安装和相关配置 1.上传安装包并解压 2.配置系统启动文件 3.启动 二、部署Node Exporters监控系统指标 三、监控Mysql配置示例 1.Mysql服务器操作 2.Prometheus服务器操作 四、监控Nginx配置示例 1.在Nginx服务器操作 2.Prometheus服务器…

HTML列表和表格标签

目录 1.列表标签 1.1无序列表 1.2有序列表 1.3定义列表 2. 表格标签、 2.1表格标签的属性 2.2合并单元格 1.列表标签 1.1无序列表 <ul>: [type 属性&#xff1a; disc( 实心圆点 )( 默认 ) 、 circle( 空心圆圈 ) 、 square( 实心方块 )] <li>: 列表中…

vue+java实现简易AI问答组件(基于百度文心大模型)

一、需求 公司想要在页面中加入AI智能对话功能&#xff0c;故查找免费gpt接口&#xff0c;最终决定百度千帆大模型&#xff08;进入官网、官方文档中心&#xff09;&#xff1b; 二、主要功能列举 AI智能对话&#xff1b;记录上下文回答环境&#xff1b;折叠/展开窗口&#…

使用MATLAB对地铁站、公交站等求解最短路径

使用MATLAB对城市的地铁站、公交站等站点&#xff0c;根据站点的经纬度坐标和彼此之间的权重&#xff0c;求解其最短路径、途径站点和路程 已知的数据如图&#xff0c;是西安市地铁站点的数据&#xff0c;保存在一个Excel里 如图&#xff0c;每列的内容都在上面&#xff0c;不…

滚动条样式

/*滚动条*/ //滚动条没有滑块的轨道部分. ::-webkit-scrollbar-track-piece {background: #fff;border-radius: 0px;opacity: 1;border: 1px solid #D9D9D9; } //整个滚动条 ::-webkit-scrollbar {width: 8px;height: 8px;background-color: transparent; } //滚动条上的滚动滑…

经常加班却不给加班费,我又不想离开这个单位,该怎么办?

经常加班却不给加班费&#xff0c;我又不想离开这个单位&#xff0c;该怎么办&#xff1f; --#李秘书讲写作#教你如何在维护权益与保持工作稳定间找到平衡&#xff1f; 在现代社会中&#xff0c;加班已经成为许多职场人士的常态。你也许也不例外&#xff0c;每天都在忙碌的工作…

用idea将java文件打成jar包

一、用idea将java文件打成jar包 1、在idea上选择file—Project Structure 2、Artifacts —点–JAR—From modules with dependencies 3、选择要打包的java文件 4、Build — Build Artifacts 5、找到刚才添加的Artifacts直接Build 6、生成jar包文件

C语言 | Leetcode C语言题解之第140题单词拆分II

题目&#xff1a; 题解&#xff1a; struct Trie {int ch[26];bool flag; } trie[10001];int size;void insert(char* s, int sSize) {int add 0;for (int i 0; i < sSize; i) {int x s[i] - a;if (trie[add].ch[x] 0) {trie[add].ch[x] size;memset(trie[size].ch, 0…