记录一下快速上手Springboot登录注册项目
本教程需要安装以下工具,如果不清楚怎么安装的可以看下我的这篇文章
链接: https://blog.csdn.net/qq_30627241/article/details/134804675
管理工具: maven
IDE: IDEA
数据库: MySQL
测试工具: Postman
打开IDEA

创建项目,创建项目时保持网络通畅

设置项目的基本信息,其中注意jdk版本要与Java版本匹配,这里使用jdk1.8和java8

选择SpringBoot版本,选择项目依赖(依赖可以创建完项目后在pom文件中修改)

至此项目创建完成

创建数据库


创建用户表
CREATE TABLE user
(uid int(10) primary key NOT NULL AUTO_INCREMENT,uname varchar(30) NOT NULL,password varchar(255) NOT NULL,UNIQUE (uname)
);

uid: 用户编号,主键,自增
uname: 用户名,作为登录的账号(业务主键),不可重复
password: 密码,因为可能要加密,所以长度设了较长的255

配置数据库
1、找到配置文件application.properties
# 配置端口号为8081
server.port=8081# 配置数据库
# 配置驱动
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# 若连接的是云数据库则将localhost改为云端ip
spring.datasource.url=jdbc:mysql://localhost:3306/summer?serverTimezone=UTC
# Mysql用户
spring.datasource.username=root
# Mysql对应用户密码
spring.datasource.password=123456
2、输入数据库相关配置信息(此处配置了项目端口号为8081,可不配置,默认端口号为8080)
注意:配置url处summer改为你的数据库名称
现在运行项目就能成功了

3、在IDEA中连接数据库,非必要步骤,连了开发方便些

配置如下

配置时区与配置文件中的一致:

点击Test connection测试一下,如遇提示请下载:

下载后再点击,成功如下:

现在可以在IDEA中管理数据库了:

在说项目的目录结构之前,我们先来聊一聊后端的架构大概是什么样的,方便我们对目录结构的理解:

数据持久层的作用是在java对象与数据库之间建立映射,也就是说它的作用是将某一个Java类对应到数据库中的一张表。在我们的项目中,就将创建一个实体类User映射到数据库的user表,表中的每个字段对应于实体类的每个属性。而之前配置的JPA的作用就是帮助我们完成类到数据表的映射。
repository: 存放一些数据访问类(也就是一些能操纵数据库的类)的包,比如存放能对user表进行增删改查的类
domain:存放实体类的包,比如User类,其作为对应数据库user表的一个实体类
业务逻辑层的作用是处理业务逻辑。比如在本项目中,我们就在业务逻辑层实现登录注册的逻辑,像是判断是否有用户名重复,密码是否正确等逻辑
service: 存放业务逻辑接口的包
serviceImpl: 存放业务逻辑实现类的包,其中的类实现service中的接口
控制层的作用是接收视图层的请求并调用业务逻辑层的方法。比如视图层请求登录并发来了用户的账号和密码,那么控制层就调用业务逻辑层的登录方法,并将账号密码作为参数传入,在将结果返回给视图层。
controller: 存放控制器的包。比如UserController
视图层的作用是展现数据,由于本项目写的是纯后端,就不展开解释视图层了。
注意:根据架构我们可以发现,最佳的开发方式是自底向上开发,因为包之间的调用是上层调用下层,所以下层先实现能保证实现多少测试多少
需要创建domain、repository、service、serviceImpl、controller、utils、config目录,如图所示:

这里再说下utils和config
utils: 存放工具类,一些自己封装的工具
config: 存放配置类,一些配置如登录拦截器,安全配置等
根据框架特点,我们将自底向上开发,所以将按照 实体类-dao-service-serviceImpl-controller 的顺序逐步开发。
所有类或接口的目录位置,如图所示,根据图来创建,蓝色C图标是java类文件,绿色I图标是java接口文件:

实现User实体类
1、在domain中创建User.java
2、创建对应user表中字段的属性
其中注意要添加@Table(name = “user”)和@Entity注解
@Table(name = “user”) 说明此实体类对应于数据库的user表
@Entity 说明此类是个实体类
主键uid上要加上@Id与@GeneratedValue(strategy = GenerationType.IDENTITY)注解

3、为属性生成get,set方法
将光标移至要插入get, set方法的位置
右键-generate-getter and setter


选中所有属性-OK

最后得到User.java,也可以复制,至此User实体类就创建好啦,如果要实现其他表的实体类也类似。
package summer.summerdemo.domain;import javax.persistence.*;@Table(name = "user")
@Entity
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private long uid;private String uname;private String password;public long getUid() {return uid;}public void setUid(long uid) {this.uid = uid;}public String getUname() {return uname;}public void setUname(String uname) {this.uname = uname;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}
}
实现UserDao
1、在repository包中创建UserDao接口
2、首先要添加注解@Repository
接口要继承JpaRepository,这样JPA就能帮助我们完成对数据库的映射,也就是说接口里写的方法只要符合格式可以不需要实现SQL语句就能直接用了。
如果JPA没有提供你想要的方法,可以自定义SQL语句

由于我们只实现登录注册功能,所以只要有根据账号密码查询用户和插入用户信息的方法就行了,这里我们已经实现了根据用户名密码查找用户的方法,而插入用户信息的方法save(object o)JPA已经帮我们实现了,可以直接调用,这里就不需要写了。
注意: 这里接口方法的命名要按照JPA提供的命名格式,比如findBy, deleteBy等等,且要求驼峰命名法。如果自定义查询方法可以不遵守这个规则
package summer.summerdemo.repository;import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import summer.summerdemo.domain.User;@Repository
public interface UserDao extends JpaRepository<User, Long> {User findByUname(String uname);User findByUnameAndPassword(String uname, String password);
}
实现UserService
1、在service包中创建UserService接口
2、添加登录注册需要用到的业务逻辑方法

package summer.summerdemo.service;import summer.summerdemo.domain.User;public interface UserService {/*** 登录业务逻辑* @param uname* @param password* @return*/User loginService(String uname, String password);/*** 注册业务逻辑* @param user* @return*/User registerService(User user);
}
实现UserServiceImpl
1、在serviceImpl包中创建UserServiceImpl类
2、添加需要实现的方法
添加implements UserService
此时会报错,但没关系,只是因为方法还没实现。

鼠标悬停在红色波浪线有一个红色灯泡的图标出现,点击它,自动生成需要实现的方法(也可复制后面贴出来的代码)

全选:

生成后如下:

3、实现登录业务逻辑
因为要用到UserDao中的方法,所以先通过@Resource注解帮助我们实例化UserDao对象
4、实现注册业务逻辑
5、添加@Service注解
package summer.summerdemo.service.serviceImpl;import summer.summerdemo.domain.User;
import summer.summerdemo.repository.UserDao;
import summer.summerdemo.service.UserService;
import org.springframework.stereotype.Service;import javax.annotation.Resource;@Service
public class UserServiceImpl implements UserService {@Resourceprivate UserDao userDao;@Overridepublic User loginService(String uname, String password) {User user = userDao.findByUnameAndPassword(uname, password);if(user != null){user.setPassword("");}return user;}@Overridepublic User registerService(User user) {if(userDao.findByUname(user.getUname())!=null){return null;}else{User newUser = userDao.save(user);if(newUser != null){newUser.setPassword("");}return null;}}
}
实现工具类Result
工具类Result的作用是作为返回给前端的统一后的对象。也就是说返回给前端的都是Result对象,只是对象中的属性不太一样,这样方便前端固定接收格式。
package summer.summerdemo.utils;public class Result<T> {private String code;private String msg;private T data;public String getCode() {return code;}public void setCode(String code) {this.code = code;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}public T getData() {return data;}public void setData(T data) {this.data = data;}public Result(){}public Result(T data){this.data = data;}public static Result success(){Result result = new Result<>();result.setCode("0");result.setMsg("成功");return result;}public static <T> Result<T> success(T data){Result<T> result = new Result<>(data);result.setCode("0");result.setMsg("成功");return result;}public static <T> Result<T> success(T data, String msg){Result<T> result = new Result<>(data);result.setCode("0");result.setMsg(msg);return result;}public static Result error(String code, String msg){Result result = new Result<>();result.setCode(code);result.setMsg(msg);return result;}
}
可以看出Result是个模板类,因此想要返回什么数据类型给前端都行,如Result,要是没看懂没关系,看到下面就知道怎么用了。因为里面有很多静态方法,可以直接用类名.方法名调用。
实现UserController
1、在controller包中创建UserController类
2、添加@RestController与@RequestMapping(“/user”)注解,注入UserService
注解
3、实现登录的控制
4、实现注册的控制
@RequestMapping中的"/user"是这个控制器类的基路由
@PostMapping(“/login”)表示处理post请求,路由为/user/login
@PostMapping(“/register”)表示处理post请求,路由为/user/register
package summer.summerdemo.controller;import summer.summerdemo.domain.User;
import summer.summerdemo.service.UserService;
import summer.summerdemo.utils.Result;import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RequestBody;import javax.annotation.Resource;@RestController
@RequestMapping("/user")
public class UserController {@Resourceprivate UserService userService;@PostMapping("/login")public Result<User> loginController(@RequestParam String uname, @RequestParam String password){User user = userService.loginService(uname, password);if(user != null){return Result.success(user,"登录成功!");}else{return Result.error("123","账号或密码错误!");}}@PostMapping("/register")public Result<User> registerController(@RequestBody User newUser){User user = userService.registerService(newUser);if(user != null){return Result.success(user,"注册成功!");}else{return Result.error("456","用户名已存在!");}}
}
处理跨域访问问题
跨域问题可以简单理解成如果你的前端项目的IP地址和端口号和后端的IP地址和端口号不一样,就会导致前端无法获取到数据,这是一个规定。而在前后端分离开发的项目中,前后端项目的端口号一般都是不一样的,假设我们这个项目的前端端口号是 8080,后端端口号是 8081,就会造成跨域访问的问题,跨域访问的问题可以在前端解决也可以在后端解决,后端只要加上一个配置文件就行了
1 、在config文件下创建全局跨域配置类GlobalCorsConfig.java
注意:SpringBoot2.4.0 以前下方 allowedOriginPatterns 需要被allowedOrigins代替
package summer.summerdemo.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class GlobalCorsConfig {@Beanpublic WebMvcConfigurer corsConfigurer() {return new WebMvcConfigurer() {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**") //添加映射路径,“/**”表示对所有的路径实行全局跨域访问权限的设置.allowedOriginPatterns("*") //开放哪些ip、端口、域名的访问权限 SpringBoot2.4.0以后allowedOrigins被allowedOriginPatterns代替.allowCredentials(true) //是否允许发送Cookie信息.allowedMethods("GET", "POST", "PUT", "DELETE") //开放哪些Http方法,允许跨域访问.allowedHeaders("*") //允许HTTP请求中的携带哪些Header信息.exposedHeaders("*"); //暴露哪些头部信息(因为跨域访问默认不能获取全部头部信息)}};}
}
2、接下来就是运行项目,成功如下:

相关文章:
记录一下快速上手Springboot登录注册项目
本教程需要安装以下工具,如果不清楚怎么安装的可以看下我的这篇文章 链接: https://blog.csdn.net/qq_30627241/article/details/134804675 管理工具: maven IDE: IDEA 数据库: MySQL 测试工具: Postman 打开IDE…...
【LVGL】STM32F429IGT6(在野火官网的LCD例程上)移植LVGL官方的例程(还没写完,有问题 排查中)
这里写目录标题 前言一、本次实验准备1、硬件2、软件 二、移植LVGL代码1、获取LVGL官方源码2、整理一下,下载后的源码文件3、开始移植 三、移植显示驱动1、enable LVGL2、修改报错部分3、修改lv_config4、修改lv_port_disp.c文件到此步遇到的问题 Undefined symbol …...
Vue学习笔记-Vue3中ref和reactive函数的使用
前言 为了让vue3中的数据变成响应式,需要使用ref,reactive函数 ref函数使用方式 导入ref函数 import {ref} from vue在setup函数中,将需要响应式的数据通过ref函数进行包装,修改响应式数据时,需要通过: ref包装的响应式对象.val…...
大数据分析与应用实验任务十一
大数据分析与应用实验任务十一 实验目的 通过实验掌握spark Streaming相关对象的创建方法; 熟悉spark Streaming对文件流、套接字流和RDD队列流的数据接收处理方法; 熟悉spark Streaming的转换操作,包括无状态和有状态转换。 熟悉spark S…...
“78Win-Vận mệnh tốt”Trang web hỗ trợ kỹ thuật
Chng ti l một phần mềm cung cấp dịch vụ mua hộ xổ số cho người Việt Nam gốc Hoa. Bạn c thể gửi số v số lượng v số cần mua hộ, chng ti sẽ gửi đến tay bạn trước khi mở giải thưởng. Bạn chỉ cần trả tiền offline. Nếu bạ…...
React中使用react-json-view展示JSON数据
文章目录 一、前言1.1、在线demo1.2、Github仓库 二、实践2.1、安装react-json-view2.2、组件封装2.3、效果2.4、参数详解2.4.1、src(必须) :JSON Object2.4.2、name:string或false2.4.3、theme:string2.4.4、style:object2.4.5、…...
一文简述“低代码开发平台”到底是什么?
低代码开发平台到底是什么? 低代码开发平台(英文全称Low-Code Development Platform)是一种基于图形界面、可视化编程技术的开发平台,旨在提高软件开发的效率和质量。它可以帮助开发者快速构建应用程序,减少手动编写代…...
HNU计算机体系结构-实验3:多cache一致性算法
文章目录 实验3 多cache一致性算法一、实验目的二、实验说明三 实验内容1、cache一致性算法-监听法模拟2、cache一致性算法-目录法模拟 四、思考题五、实验总结 实验3 多cache一致性算法 一、实验目的 熟悉cache一致性模拟器(监听法和目录法)的使用&am…...
Go语言学习路线规划
🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…...
微软NativeApi-NtQuerySystemInformation
微软有一个比较实用的Native接口:NtQuerySystemInformation,具体可以参考微软msdn官方文档:NtQuerySystemInformation, 是一个系统函数,用于收集特定于所提供的指定种类的系统信息。ProcessHacker等工具使用NtQuerySys…...
灵活与高效的结合,CodeMeter Cloud Lite轻云锁解决方案
众多软件开发商日渐认识到,威步推出的一系列尖端软件产品在维护知识产权、精确控制及有效管理软件授权方面发挥着不可或缺的作用。这些产品的核心功能包括将许可证及其他关键敏感数据安全地存储于高端复杂的硬件设备、经过专业加密的文件,或者置于受严格…...
Flink 系列文章汇总索引
Flink 系列文章 一、Flink 专栏 本专栏系统介绍某一知识点,并辅以具体的示例进行说明。 本专栏的文章编号可能不是顺序的,主要是因为写的时候顺序没统一,但相关的文章又引入了,所以后面就没有调整了,按照写文章的顺…...
计算机网络——期末考试复习资料
什么是计算机网络 将地理位置不同的具有独立功能的多台计算机及其外部设备通过通信线路和通信设备连接起来;实现资源共享和数据传递的计算机的系统。 三种交换方式 报文交换:路由器转发报文; 电路交换:建立一对一电路 分组交换&a…...
【数据结构】面试OJ题——链表
目录 1.移除链表元素 思路: 2.反转链表 思路: 3.链表的中间结点 思路: 4.链表中的倒数第K个结点 思路: 5.合并两个有序链表 思路: 6.链表分割 思路: 7.链表的回文结构 思路: 8.随机链表…...
flask web开发学习之初识flask(三)
文章目录 一、flask扩展二、项目配置1. 直接配置2. 使用配置文件3. 使用环境变量4. 实例文件夹 三、flask命令四、模版和静态文件五、flask和mvc架构 一、flask扩展 flask扩展是指那些为Flask框架提供额外功能和特性的库。这些扩展通常遵循Flask的设计原则,易于集成…...
【设计模式-3.1】结构型——外观模式
说明:本文介绍设计模式中结构型设计模式中的,外观模式; 亲手下厨还是点外卖? 外观模式属于结构型的设计模式,关注类或对象的组合,所呈现出来的结构。以吃饭为例,在介绍外观模式之前࿰…...
flutter学习-day2-认识flutter
📚 目录 简介特点架构 框架层引擎层嵌入层 本文学习和引用自《Flutter实战第二版》:作者:杜文 1. 简介 Flutter 是 Google 推出并开源的移动应用开发框架,主打跨平台、高保真、高性能。开发者可以通过 Dart 语言开发 App&#…...
解决selenium使用.get()报错:unknown error: unsupported protocol
解决方法 将原来的: url "https://www.baidu.com" browser.get(url)替换为: url "https://www.baidu.com" browser.execute_script(f"window.location.replace({url});") # 直接平替 .get()问题解析 之前运行都是正…...
关于加密解密,加签验签那些事
面对MD5、SHA、DES、AES、RSA等等这些名词你是否有很多问号?这些名词都是什么?还有什么公钥加密、私钥解密、私钥加签、公钥验签。这些都什么鬼?或许在你日常工作没有听说过这些名词,但是一旦你要设计一个对外访问的接口ÿ…...
容器重启后,Conda文件完整保存(虚拟环境、库包),如何重新安装conda并迁移之前的虚拟环境
Vim安装 容器重启后默认是vi,升级vim,执行命令 apt install -y vim安装 Anaconda 1. 下载Anaconda 其他版本请查看Anaconda官方库 wget https://mirrors.bfsu.edu.cn/anaconda/archive/Anaconda3-2023.03-1-Linux-x86_64.sh --no-check-certificate…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...
python爬虫——气象数据爬取
一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用: 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests:发送 …...
深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏
一、引言 在深度学习中,我们训练出的神经网络往往非常庞大(比如像 ResNet、YOLOv8、Vision Transformer),虽然精度很高,但“太重”了,运行起来很慢,占用内存大,不适合部署到手机、摄…...
【SpringBoot自动化部署】
SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一,能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时,需要添加Git仓库地址和凭证,设置构建触发器(如GitHub…...
