做一个网站的费用构成,郑州新闻最新消息今天,搜索引擎收录查询,南城网站建设公司策划本教程需要安装以下工具#xff0c;如果不清楚怎么安装的可以看下我的这篇文章
链接: https://blog.csdn.net/qq_30627241/article/details/134804675
管理工具#xff1a; maven
IDE#xff1a; IDEA
数据库#xff1a; MySQL
测试工具#xff1a; Postman
打开IDE…本教程需要安装以下工具如果不清楚怎么安装的可以看下我的这篇文章
链接: 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.port8081# 配置数据库
# 配置驱动
spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driver
# 若连接的是云数据库则将localhost改为云端ip
spring.datasource.urljdbc:mysql://localhost:3306/summer?serverTimezoneUTC
# Mysql用户
spring.datasource.usernameroot
# Mysql对应用户密码
spring.datasource.password1234562、输入数据库相关配置信息此处配置了项目端口号为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 {IdGeneratedValue(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 JpaRepositoryUser, 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 ResultT {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 ResultT success(T data){ResultT result new Result(data);result.setCode(0);result.setMsg(成功);return result;}public static T ResultT success(T data, String msg){ResultT 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 ResultUser 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 ResultUser 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、接下来就是运行项目成功如下