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

news2024/11/19 20:34:38

文章目录

  • 一、实战概述
  • 二、实战步骤
    • (一)创建数据库
    • (二)创建用户表
    • (三)后端项目引入数据库
      • 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项目与后端联动,输入的用户名和密码经过跨域请求传递至后端,经数据库查询验证后返回结果,成功构建了一个安全、实用的基于数据库用户数据的身份验证系统。

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

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

相关文章

LeetCode讲解篇之216. 组合总和 III

文章目录 题目描述题解思路题解代码 题目描述 题解思路 使用递归回溯算法&#xff0c;当选择数字num后&#xff0c;在去选择大于num的合法数字&#xff0c;计算过程中的数字和&#xff0c;直到选择了k次&#xff0c;如果数组和等于n则加入结果集 从1开始选择数字&#xff0c;直…

【一个中年程序员的独白】

一个中年程序员的独白 从大四开启程序工作的大门大四与实习梦想与现实毕业论文 从大四开启程序工作的大门 2009 年&#xff0c;我在一所在当地还算小有名气的本科院校读大四。大四专业课很少&#xff0c;准确地应该是没有课了。学校组织各种招聘会&#xff0c;但是好多大厂&am…

高级分布式系统-第6讲 分布式系统的容错性--进程的容错

分布式系统的容错原则既适用于硬件&#xff0c; 也适用于软件。 两者的主要区别在于硬件部件的同类复制相对容易&#xff0c; 而软件组件在运行中的同类复制&#xff08; 进程复制&#xff09; 涉及到更为复杂的分布式操作系统的容错机制。 以下是建立进程失效容错机制的一些基…

点击随机红点的简单游戏(pygame)

import pygame import sys import random# 初始化 Pygame pygame.init()# 设置窗口大小 width, height 800, 600 screen pygame.display.set_mode((width, height)) pygame.display.set_caption("Click the Red Dot")# 定义颜色 black (0, 0, 0) red (255, 0, 0)…

XCTF:hello_pwn[WriteUP]

使用checksec查看ELF文件信息 checksec 4f2f44c9471d4dc2b59768779e378282 这里只需要注意两个重点&#xff1a; Arch&#xff1a;64bit的文件&#xff0c;后面写exp的重点 Stack&#xff1a;No canary found 没有栈溢出保护 使用IDA对ELF文件进行反汇编 双击左侧的函数栏…

推荐github热榜项目_crewAI

1 项目地址 https://github.com/joaomdmoura/crewAI 2 功能 通过设置多个智能体&#xff0c;协同解决问题&#xff0c;以处理复杂任务&#xff1b;这种方法的实现方式是将一个任务的输出作为另一个任务的输入。它的优势在于小而有效&#xff0c;原理直观易懂&#xff0c;而且…

window中安装Apache http server(httpd-2.4.58-win64-VS17)

windows中安装Apache http server(httpd-2.4.58-win64-VS17) 1、下载windows版本的的httpd, https://httpd.apache.org/docs/current/platform/windows.html#down 这里选择的是Apache Lounge编译的版本 https://www.apachelounge.com/download/ 2、解压到指定目录&#xff0c;这…

AI出题,做不完,根本做不完

前几天学到了一种针对大模型进行提示词编程的方法&#xff0c;效果比较炸裂&#xff0c;特别分享给大家。 因为有个小朋友正在学习加减法&#xff0c;所以本文的大部分例子都是用来生成加减法练习题。 角色扮演 这是GPT刚刚出现时&#xff0c;我学到的一种提示词编写方法&am…

F-score 和 Dice Loss 原理及代码

文章目录 1. F-score1. 1 原理1. 2 代码2. Dice Loss2.1 原理2.2 代码 通过看开源图像语义分割库的源码&#xff0c;发现它对 Dice Loss 的实现方式&#xff0c;是直接调用 F-score 函数&#xff0c;换言之&#xff0c;Dice Loss 是 F-score的特殊情况。于是就研究了一下这背后…

网站漏洞扫描 awvs 23.11下载 Acunetix Premium build 23.11 for Linux 完美版

Acunetix Premium build 23.11 for Linux 完美版 更新日志&#xff1a; 网站漏洞扫描 awvs 23.11下载 新功能 Java IAST 传感器已更新为支持 Java 17 并删除了对 AspectJWeaver 的要求对管理适用于 Docker 和 Linux 的 Acunetix On-Premises 服务的机制进行了更改&#xff0…

前端js写数据结构与算法

1、什么是数据结构与算法 数据结构&#xff1a;是指数据对象中数据元素之间的相互关系。包括集合结构、线性结构、树形结构、图形结构。 算法&#xff1a;解决问题的思路。 2、时间复杂度 1.是什么? 执行当前算法所“花费的时间” 2.干什么? 在写代码的过程中&#xf…

C# .NET SQL sugar中 IsAny进行根据条件判断数据是否存在 IsAny的使用

SQL sugar 中控制器直接判断数据是否存在 首先确保你的Service层继承的表名 控制器中使用IsAny进行根据条件判断数据是否存在

算法通关村第十五关—继续研究超大规模数据场景的问题(黄金)

继续研究超大规模数据场景的问题 一、对20GB文件进行排序 题目要求&#xff1a;假设你有一个20GB的文件&#xff0c;每行一个字符串&#xff0c;请说明如何对这个文件进行排序&#xff1f;  分析&#xff1a;这里给出大小是20GB,其实面试官就在暗示你不要将所有的文件都装入到…

墙地砖外形检测的技术方案-图像获取

硬件系统 墙地砖外形检测硬件系统主要由工业相机、光源、瓷砖位置检测电路和上位机组成&#xff0c;其结构如图所示。为了提高系统检测精度和稳定性&#xff0c;系统采用的是较高精度的高速工业相机用于抓取墙地砖表面轮廓图像&#xff0c;图像数据通过USB接口向上位机传送&am…

Maven《一》-- 一文带你快速了解Maven

目录 &#x1f436;1.1 为什么使用Maven 1. Mavan是一个依赖管理工具 ①jar包的规模 ②jar包的来源问题 ③jar包的导入问题 ④jar包之间的依赖 2. Mavan是一个构建工具 ①你没有注意过的构建 ②脱离IDE环境仍需构建 3. 结论 &#x1f436;1.2 什么是Maven &#x…

系列四、Spring Security中的认证 授权(前后端不分离)

一、Spring Security中的认证 & 授权&#xff08;前后端不分离&#xff09; 1.1、MyWebSecurityConfigurerAdapter /*** Author : 一叶浮萍归大海* Date: 2024/1/11 21:50* Description:*/ Configuration public class MyWebSecurityConfigurerAdapter extends WebSecuri…

ZZULIOJ 1110: 最近共同祖先(函数专题)

题目描述 如上图所示&#xff0c;由正整数1, 2, 3, ...组成了一棵无限大的二叉树。从某一个结点到根结 点&#xff08;编号是1 的结点&#xff09;都有一条唯一的路径&#xff0c;比如从10 到根结点的路径是(10, 5, 2, 1)&#xff0c; 从4 到根结点的路径是(4, 2, 1)&#xff0…

x-cmd pkg | qrencode - 二维码生成工具

目录 简介首次用户功能特点竞品和相关作品进一步阅读 简介 qrencode 是一个用于生成二维码的命令行工具。它可以将文本、URL、电话号码等信息转换为二维码图像。生成的二维码图像可以保存为图片文件&#xff0c;方便在电子文档、网页、移动应用等各种场景中使用。 它支持的二维…

python爬虫小练习——爬取豆瓣电影top250

爬取豆瓣电影top250 需求分析 将爬取的数据导入到表格中&#xff0c;方便人为查看。 实现方法 三大功能 1&#xff0c;下载所有网页内容。 2&#xff0c;处理网页中的内容提取自己想要的数据 3&#xff0c;导入到表格中 分析网站结构需要提取的内容 代码 import requests…

Random的使用

作用&#xff1a;生成伪随机数 1.导包&#xff1a;import java.util.Random 2.得到随机数对象&#xff1a;Random r new Random(); 3.调用随机数的功能获取随机数&#xff1a; 这里随机生成一个0-9的整数&#xff1a; int number r.nextInt(10); 实现指定区间的随机数&a…