记录一下快速上手Springboot登录注册项目

news/2024/12/5 4:38:18/

本教程需要安装以下工具,如果不清楚怎么安装的可以看下我的这篇文章

链接: 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、接下来就是运行项目,成功如下:
在这里插入图片描述


http://www.ppmy.cn/news/1260884.html

相关文章

如何精准操作无人机自动停机坪?

无人机自动停机坪通过自主导航和避障功能&#xff0c;实现了无人机的自主降落和起飞&#xff0c;在无人机技术领域起到了至关重要的作用。停机坪不仅仅是无人机的起降平台&#xff0c;还具备自动换电或充电等功能&#xff0c;为无人机的自动化提供了关键支持。为更有效地操作无…

金蝶云星空使用webapi查询单据附件的主键

文章目录 金蝶云星空使用webapi查询单据附件的主键业务需求详细操作查询单据附件查看账套单据附件查询采购价目表的单据内码和单据体内码查询单据头附件明细webapi查询json返回结果 查询单据明细附件查看账套单据明细附件查询采购价目表的单据内码和单据体内码查询单据体附件明…

基于Java影视明星系统

基于Java影视明星系统 功能需求 1、明星信息管理&#xff1a;系统需要提供明星信息的录入、编辑、查询和删除功能。每个明星的信息应包括姓名、照片、简介、代表作品等。 2、粉丝互动&#xff1a;系统需要提供粉丝与明星互动的功能&#xff0c;如粉丝关注、评论、点赞等。明…

某60区块链安全之薅羊毛攻击实战一学习记录

区块链安全 文章目录 区块链安全薅羊毛攻击实战一实验目的实验环境实验工具实验原理实验内容薅羊毛攻击实战一 实验步骤EXP利用 薅羊毛攻击实战一 实验目的 学会使用python3的web3模块 学会分析以太坊智能合约薅羊毛攻击漏洞 找到合约漏洞进行分析并形成利用 实验环境 Ubun…

exceljs读取el-upload上传的excle数据并转为json输出

当使用 Element UI 的 el-upload 组件上传 Excel 文件时&#xff0c;您可以使用 exceljs 库将上传的 Excel 数据转换为 JSON 格式。以下是一个示例代码&#xff0c;演示了如何在 Vue 项目中实现这一功能&#xff1a; <template><el-uploadclass"upload-demo&quo…

js输入数值后自动进行搜索产品

加载JQuery文件进来 {{ ‘jquery.min.js’ | asset_url | stylesheet_tag }} <script> function validate(elem) {var value1 document.getElementById("inputminbox").value;var value2 document.getElementById("inputmaxbox").value;if (valu…

Linux AMH服务器管理面板本地安装与远程访问

最近&#xff0c;我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念&#xff0c;而且内容风趣幽默。我觉得它对大家可能会有所帮助&#xff0c;所以我在此分享。点击这里跳转到网站。 文章目录 1. Linux 安装AMH 面板2. 本地访问AMH 面板3. Linux安装…

数据库压力测试方法小结

1前言 在前面的压力测试过程中&#xff0c;主要关注的是对接口以及服务器硬件性能进行压力测试&#xff0c;评估请求接口和硬件性能对服务的影响。但是对于多数Web应用来说&#xff0c;整个系统的瓶颈在于数据库。 原因很简单&#xff1a;Web应用中的其他因素&#xff0c;例如…