Spring Boot 3 + Vue 3实战:引入数据库实现用户登录功能

文章目录

  • 一、实战概述
  • 二、实战步骤
    • (一)创建数据库
    • (二)创建用户表
    • (三)后端项目引入数据库
      • 1、添加相关依赖
      • 2、用户实体类保持不变
      • 3、编写应用配置文件
      • 4、创建用户映射器接口
      • 5、创建用户服务类
      • 6、修改登录控制器
    • (四)测试用户登录功能
      • 1、启动前端项目 - login-vue
      • 2、启动后端项目 - LoginDemo
      • 3、访问前端登录页面
      • 4、测试用户登录功能
  • 三、实战总结

一、实战概述

  • 本次实战,我们深入实践了基于数据库的用户登录功能开发。首先构建了包含id、username和password字段的user表,并初始化了测试数据。接着,在后端Spring Boot项目中集成MySQL数据库驱动与Druid连接池,以及MyBatis持久层框架,通过配置application.yaml文件来指定数据库连接信息。

  • 在模型层,我们保留了User实体类以映射数据库中的用户表结构;在数据访问层,创建了UserMapper接口并使用注解方式编写SQL查询方法,用于根据用户名和密码从数据库获取用户信息。为验证查询逻辑,我们编写了单元测试确保能正确查询到数据库中的用户记录。

  • 服务层上,构建了UserService类,注入UserMapper实例,并封装了一个基于数据库查询的登录方法。最后,在控制器层的LoginController中,通过@Autowired注入UserService,并调整登录处理逻辑,使其调用服务层的登录方法进行实际的身份验证。

  • 在前端Vue项目运行的同时启动后端Spring Boot应用,通过前后端联动测试展示了基于数据库的用户登录功能。用户在前端页面输入用户名和密码,经由跨域请求传递至后端,通过数据库查询验证身份后返回结果,成功实现了根据实际用户数据进行登录的功能,有效提高了系统的安全性与实用性。

二、实战步骤

(一)创建数据库

  • 创建login数据库
    在这里插入图片描述

(二)创建用户表

  • 创建用户表user
    在这里插入图片描述
  • 添加用户表记录
    在这里插入图片描述

(三)后端项目引入数据库

1、添加相关依赖

  • 修改pom.xml文件,添加相关依赖
    在这里插入图片描述
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.2.1</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>net.huawei</groupId>
    <artifactId>LoginDemo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>LoginDemo</name>
    <description>LoginDemo</description>
    <properties>
        <java.version>21</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.18</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>3.0.3</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>


  • 刷新项目依赖
    在这里插入图片描述

2、用户实体类保持不变

  • 用户实体类 - User
    在这里插入图片描述
package net.huawei.login.bean;

/**
 * 功能:用户实体类
 * 作者:华卫
 * 日期:2024年01月14日
 */
public class User {
    private int id;
    private String username;
    private String password;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

3、编写应用配置文件

  • 将全局配置文件application.properties更名为application.yaml
    在这里插入图片描述
# 配置服务器
server:
  port: 8888

# 配置数据源
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/login?useSSL=false&useUnicode=true&characterEncoding=UTF-8
    username: root
    password: 903213

    # 配置Druid数据源类型
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      initial-size: 20 # 初始连接数
      min-idle: 10 # 最小空闲连接数
      max-active: 100 # 最大连接数

4、创建用户映射器接口

  • 创建mapper子包,在子包里创建UserMapper接口
    在这里插入图片描述
package net.huawei.login.mapper;

import net.huawei.login.bean.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

/**
 * 功能:用户映射器接口
 * 作者:华卫
 * 日期:2024年01月14日
 */
@Mapper // 纳入Spring容器管理
public interface UserMapper {
    @Select("select * from user where username = #{username} and password = #{password}")
    User login(String username, String password);
}
  • 测试用户映射器接口
    在这里插入图片描述
package net.huawei.login;

import net.huawei.login.bean.User;
import net.huawei.login.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class LoginDemoApplicationTests {
    @Autowired // 注入用户映射器Bean
    private UserMapper userMapper;

    @Test
    public void testLogin() {
        // 定义用户名和Miami
        String username = "无心剑";
        String password = "903213";
        // 调用用户映射器登录方法
        User user = userMapper.login(username, password);
        // 判断是否登录成功
        if (user != null) {
            System.out.println("恭喜,[" + username + "]登录成功~");
        } else {
            System.err.println("遗憾,[" + username + "]登录失败~");
        }
    }
}
  • 运行testLogin()测试方法,查看结果
    在这里插入图片描述
  • 修改用户名,再运行testLogin()测试方法,查看结果
    在这里插入图片描述

5、创建用户服务类

  • 创建service子包,在子包里创建UserService
    在这里插入图片描述
package net.huawei.login.service;

import net.huawei.login.bean.User;
import net.huawei.login.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * 功能:用户服务类 
 * 作者:华卫
 * 日期:2024年01月14日
 */
@Service // 纳入Spring容器管理
public class UserService {
    @Autowired // 注入用户映射器Bean
    private UserMapper userMapper;

    /**
     * 用户登录方法
     * 
     * @param username
     * @param password
     * @return 用户实体
     */
    public User login(String username, String password) {
        return userMapper.login(username, password);
    }
}

6、修改登录控制器

  • 登录控制器 - LoginController
    在这里插入图片描述
package net.huawei.login.controller;

import net.huawei.login.bean.User;
import net.huawei.login.result.Result;
import net.huawei.login.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.util.HtmlUtils;

/**
 * 功能:登录控制器
 * 作者:华卫
 * 日期:2024年01月14日
 */
@Controller
public class LoginController {
    @Autowired // 注入用户服务Bean
    private UserService userService;
    
    @CrossOrigin
    @PostMapping(value = "/login")
    @ResponseBody
    public Result login(@RequestBody User requestUser) {
        // 获取用户名和密码
        String username = requestUser.getUsername();
        String password = requestUser.getPassword();
        // 对html标签进行转义,防止XSS攻击
        username = HtmlUtils.htmlEscape(username);
        // 调用用户服务对象的登录方法
        User user = userService.login(username, password);
        // 判断登录是否成功
        if (user != null) {
            return new Result(200);
        } else {
            System.out.println("用户名或密码有误!");
            return new Result(400);
        }
    }
}

(四)测试用户登录功能

1、启动前端项目 - login-vue

  • 在前端项目目录里执行命令:npm run serve
    在这里插入图片描述
    在这里插入图片描述

2、启动后端项目 - LoginDemo

  • 运行入口类 - LoginDemoApplication
    在这里插入图片描述

3、访问前端登录页面

  • 访问http://localhost:8080/login
    在这里插入图片描述

4、测试用户登录功能

  • 输入用户名admin与密码903213
    在这里插入图片描述
  • 单击【登录】按钮
    在这里插入图片描述
  • 输入正确的用户名与密码:无心剑 :903213
    在这里插入图片描述
  • 单击【登录】按钮,跳转到首页
    在这里插入图片描述
  • 录屏操作演示
    在这里插入图片描述

三、实战总结

  • 本次实战通过构建数据库用户表,实现了基于Spring Boot和MyBatis的数据库登录验证功能。首先创建了包含必要字段的user表及测试数据,然后在后端配置数据库连接,并利用UserMapper接口与注解SQL实现用户查询。服务层封装了登录方法,在控制器中调用此方法进行身份验证。前端Vue项目与后端联动,输入的用户名和密码经过跨域请求传递至后端,经数据库查询验证后返回结果,成功构建了一个安全、实用的基于数据库用户数据的身份验证系统。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Fiddler抓包】微信扫码访问链接打不开网页

又来每天进步一点点~~~ 背景&#xff1a;某天发版的时候&#xff0c;手机连接电脑抓包查看用户登录之前的sessionID&#xff0c;由于业务需要&#xff0c;是需要用户登录微信扫码跳转至某一页面的&#xff0c;微信&#xff08;分身&#xff09;扫码成功&#xff0c;跳转时打不…

HarmonyOS 通过 animateTo讲解尺寸动画效果

上文 HarmonyOS讲解并演示 animateTo 动画效果 我们已经做出了基本的动画效果 也对 animateTo 的使用比较熟悉了 第一个参数是 配置动画参数的json 第二个参数 则是改变我们元素属性值的事件 但属性值 远远不止位置属性 本文 我们来说 通过尺寸变化 完成动画效果 如果你有看过…

指针理解C部分

目录 1.二级指针 2.指针数组 2.1指针数组的定义和表现形式 2.2指针数组模拟实现二维数组 2.2.1二维数组 2.2.2使用指针数组模拟实现二维数组 3.字符指针 2.数组指针 3.二维数组传参 4.函数指针 4.1函数指针变量的定义和创建 4.2函数指针变量的使用 4.3两段有趣的代码 4.…

【NI国产替代】USB‑7846 Kintex-7 160T FPGA,500 kS/s多功能可重配置I/O设备

Kintex-7 160T FPGA&#xff0c;500 kS/s多功能可重配置I/O设备 USB‑7846具有用户可编程FPGA&#xff0c;可用于高性能板载处理和对I/O信号进行直接控制&#xff0c;以确保系统定时和同步的完全灵活性。 您可以使用LabVIEW FPGA模块自定义这些设备&#xff0c;开发需要精确定时…

NLP论文阅读记录 - 2022 | WOS 一种新颖的优化的与语言无关的文本摘要技术

文章目录 前言0、论文摘要一、Introduction1.1目标问题1.2相关的尝试1.3本文贡献 二.前提三.本文方法四 实验效果4.1数据集4.2 对比模型4.3实施细节4.4评估指标4.5 实验结果4.6 细粒度分析 五 总结思考 前言 A Novel Optimized Language-Independent Text Summarization Techni…

Linux系统编程(十):线程同步(下)

参考引用 UNIX 环境高级编程 (第3版)嵌入式Linux C应用编程-正点原子 1. 为什么需要线程同步&#xff1f; 线程同步是为了对共享资源的访问进行保护 共享资源指的是多个线程都会进行访问的资源&#xff08;如&#xff1a;全局变量&#xff09; 保护的目的是为了解决数据一致性…

前端对接电子秤、扫码枪设备serialPort 串口使用教程

因为最近工作项目中用到了电子秤&#xff0c;需要对接电子秤设备。以前也没有对接过这种设备&#xff0c;当时也是一脸懵逼&#xff0c;脑袋空空。后来就去网上搜了一下前端怎么对接&#xff0c;然后就发现了SerialPort串口。 Serialport 官网地址&#xff1a;https://serialpo…

C# 静态代码织入AOP组件之肉夹馍

写在前面 关于肉夹馍组件的官方介绍说明&#xff1a; Rougamo是一个静态代码织入的AOP组件&#xff0c;同为AOP组件较为常用的有Castle、Autofac、AspectCore等&#xff0c;与这些组件不同的是&#xff0c;这些组件基本都是通过动态代理IoC的方式实现AOP&#xff0c;是运行时…

Mysql-redoLog

Redo Log redo log进行刷盘的效率要远高于数据页刷盘,具体表现如下 redo log体积小,只记录了哪一页修改的内容,因此体积小,刷盘快 redo log是一直往末尾进行追加,属于顺序IO。效率显然比随机IO来的快Redo log 格式 在MySQL的InnoDB存储引擎中,redo log(重做日志)被用…

【EMC专题】浪涌的成因与ICE 61000-4-5标准

什么是浪涌? 浪涌是一种无法预料的瞬态电压或电流尖峰,由附近的电子产品或是环境导致。 了解浪涌非常重要,因为浪涌有可能会导致设备的电气过应力损坏,造成系统故障等。 对于系统设计来说,重要的一点是我们如果无法控制浪涌的产生,那么只能通过将瞬态峰值电流导入到地,…

Mysql查询与更新语句的执行

一条SQL查询语句的执行顺序 FROM&#xff1a;对 FROM 子句中的左表<left_table>和右表<right_table>执行笛卡儿积&#xff08;Cartesianproduct&#xff09;&#xff0c;产生虚拟表 VT1 ON&#xff1a;对虚拟表 VT1 应用 ON 筛选&#xff0c;只有那些符合<join_…

Kafka消费全流程

Kafka消费全流程 1.Kafka一条消息发送和消费的流程图(非集群) 2.三种发送方式 准备工作 创建maven工程&#xff0c;引入依赖 <dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-clients</artifactId><version>3.3.1&l…

UDS 诊断通讯

UDS有哪些车型支持 UDS(统一诊断服务)协议被广泛应用于汽车行业中,支持多种车型。具体来说,UDS协议被用于汽车电子控制单元(ECU)之间的通讯,以实现故障诊断、标定、编程和监控等功能。 支持UDS协议的车型包括但不限于以下几种: 奥迪(Audi)车型:包括A3、A4、A5、A6…

C++I/O流——(4)文件输入/输出(第一节)

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 含泪播种的人一定能含笑收获&#xff…

外部晶振、复位按键、唤醒按键、扩展排针原理图详解

前言&#xff1a;本文对外部晶振、复位按键、唤醒按键、扩展排针原理图详解。本文使用的MCU是GD32F103C8T6 目录 外部晶振原理图 复位按键、唤醒按键原理图 扩展排针部分原理图 ​外部晶振原理图 如下图&#xff0c;两个外部晶振&#xff0c;分别是8M&#xff08;主晶振&a…

git的三种状态概念

git的三种状态 Git 有三种状态&#xff0c;你的文件可能处于其中之一&#xff1a; 已提交&#xff08;committed&#xff09;、已修改&#xff08;modified&#xff09; 和 已暂存&#xff08;staged&#xff09;。 已修改表示修改了文件&#xff0c;但还没保存到数据库中。 …

Rust-函数

简介 Rust的函数使用关键字fn开头。 函数可以有一系列的输入参数&#xff0c;还有一个返回类型。 函数体包含一系列的语句(或者表达式)。 函数返回可以使用return语句&#xff0c;也可以使用表达式。 Rust编写的可执行程序的入口就是fn main()函数。 以下是一个函数的示例…

案例121:基于微信小程序的作品集展示系统设计与实现

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

解决ERROR 24680 --- [ main] o.a.catalina.core.AprLifecycleListener 报错:

1.报错全称&#xff1a; ERROR 24680 --- [ main] o.a.catalina.core.AprLifecycleListener : An incompatible version [1.2.32] of the Apache Tomcat Native library is installed, while Tomcat requires version [1.2.34] 2.解决方案&#xff1a; 步骤一 在…

高创新!EI论文复现+改进:聚合温度调控策略的综合能源系统/微电网/虚拟电厂多目标优化调度程序代码!

程序考虑供热的热惯性&#xff0c;并根据室内供热效果进行柔性供热&#xff0c;发挥热温度负荷的“储能”能力&#xff1b;针对普适性参数的室内空调进行集群研究&#xff0c;深入剖析温度设定值调整导致负荷波动的机理&#xff0c;并提出一种新的温度调整方法&#xff0c;平抑…