1.创建springboot项目
2. 选择依赖
3. application.properties 的配置
## 连接池源
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
## 数据库连接url
spring.datasource.url=jdbc:mysql://localhost:3306/ghosn2
## 用户名
spring.datasource.username=root
## 密码
spring.datasource.password=123456
## mybatis操作日志显示
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
## 驼峰命名和下划线的对应问题解决
mybatis.configuration.map-underscore-to-camel-case=true
## 文件上传的上传大小设置
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=100MB
## 文件上传的保存地址
file.upload.path=D:/vscode/ghosn/src/assets/static/upload/
## 端口号
server.port=8080
## 文件下载地址
url=http://localhost:8080/file/download/
#邮箱
## stmp标识
spring.mail.host=smtp.qq.com
## qq号
spring.mail.username=qq号
## 授权码
spring.mail.password=授权码
## 端口号
spring.mail.port=465
## ssl加密验证
spring.mail.properties.mail.smtp.ssl.enable=true
spring.mail.properties.mail.smtp.ssl.trust=smtp.qq.com
4. pom.xml的依赖配置
## springboot启动依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
## Mybatis启动依赖
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>3.0.2</version>
</dependency>
## MySQL启动依赖
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
## 实体类工具
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
## springboot测试依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
## jwt令牌依赖
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
## json操作
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>2.0.25</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
## 好用的工具包
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.16</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
## 切面编程AOP
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
## 单元测试
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-launcher</artifactId>
<scope>test</scope>
</dependency>
## 邮箱
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
5. 跨域配置
package com.ghosn.utils;
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 CoreUtils implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
//项目中的所有接口都支持跨域
registry.addMapping("/**")
//所有地址都可以访问,也可以配置具体地址
.allowedOrigins("*")
//允许的请求方式
.allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE")
//是否支持跨域Cookie
// .allowCredentials(true)
// 跨域允许时间
.maxAge(3600);
}
}
6.jwt的配置
package com.ghosn.utils;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
import java.util.Map;
/**
* jwt的生成和解析
*/
public class JwtUtils {
private static final String signKey = "ghosn";
private static final Long expire = 43200000L;
public static String generateJwt(Map<String, Object> claims){
String jwt = Jwts.builder()
.addClaims(claims)
.signWith(SignatureAlgorithm.HS256, signKey)
.setExpiration(new Date(System.currentTimeMillis()+expire))
.compact();
return jwt;
}
public static Claims parseJwt(String jwt) {
Claims claims = Jwts.parser()
.setSigningKey(signKey)
.parseClaimsJws(jwt)
.getBody();
return claims;
}
}
7.状态码自定义类
package com.ghosn.config;
/**
* 错误状态码的设置接口
*/
public interface Constants {
String CODE_200 = "200"; //成功
String CODE_400 = "400"; //服务端请求错误
String CODE_405 = "405"; //服务端请求方式错误
String CODE_302 = "302"; //查询错误
String CODE_401 = "401"; //权限不足
String CODE_402 = "402"; //验证失败
String CODE_404 = "404"; //未找到相关页面
String CODE_500 = "500"; //系统错误
String CODE_503 = "503"; //服务不可用
}
8.统一相应类的配置
package com.ghosn.utils;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
/**
* 统一的返回数据类
*/
@Data
@Slf4j
@AllArgsConstructor
@NoArgsConstructor
public class Result {
private String code;
private String msg;
private Object data;
public static Result success(Object data) {
return new Result("200",null,data);
}
public static Result success(String msg,Object data) {
return new Result("200",msg,data);
}
public static Result success(String msg) {
return new Result("200",msg,null);
}
public static Result success() {
return new Result("200",null,null);
}
public static Result error(String code, String msg, Object data) {
return new Result(code, msg, data);
}
public static Result error(String code, String msg) {
return new Result(code, msg, null);
}
}
9.全局异常配置类
package com.ghosn.utils;
import com.ghosn.config.Constants;
import com.ghosn.exception.ServiceException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestControllerAdvice;
/**
* 自定义全局异常
*/
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(ServiceException.class)
public Result handle(ServiceException se) {
return Result.error(se.getCode(), se.getMessage());
}
}
10.服务层自定义异常类
package com.ghosn.exception;
import lombok.Getter;
/**
* 服务层自定义异常的实现
*/
@Getter
public class ServiceException extends RuntimeException{
private String code;
public ServiceException(String code, String msg){
super(msg);
this.code = code;
}
}
11.拦截器的配置类
package com.ghosn.config;
import com.ghosn.Interceptor.LoginCheckInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* 拦截器的设置类
*/
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Autowired
private LoginCheckInterceptor loginCheckInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginCheckInterceptor).addPathPatterns("/**")
.excludePathPatterns("/*/export","/*/import","/file/upload/**","/file/download/**","/user/login","/user/register","/error/**");
}
}
12.拦截器的实现类
package com.ghosn.Interceptor;
import com.alibaba.fastjson.JSONObject;
import com.ghosn.config.Constants;
import com.ghosn.exception.ServiceException;
import com.ghosn.utils.JwtUtils;
import com.ghosn.utils.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpMethod;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
@Component
@Slf4j
public class LoginCheckInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String url = request.getRequestURI().toString();
if(!(handler instanceof HandlerMethod)){
return true;
}
if(HttpMethod.OPTIONS.toString().equals(request.getMethod())){
return true;
}
if (url.contains("/login")) {
log.info("登录接口请求,放行...");
return true;
}
String jwt = request.getHeader("token");
if (!StringUtils.hasLength(jwt)) {
log.info("请求头token为空,返回重新登录...");
throw new ServiceException(Constants.CODE_401, "非法进入,请登录后操作!");
}
try {
JwtUtils.parseJwt(jwt);
} catch (Exception e) {
e.printStackTrace();
log.info("解析令牌错误,返回未登录信息!");
throw new ServiceException(Constants.CODE_401, "错误登录,返回重新登录!");
}
log.info("令牌合法,放行...");
return true;
}
}
后面就是数据接口的撰写。祝大家学业有成!