Skip to content

后端模板

1.初始化环境

1、安装 Java8

2、配置 Maven

3、安装 MySQL8 msi 安装包 链接: https://pan.baidu.com/s/1O6TrRCpb66A5hdgy0EY9HA 提取码: g17s

MySQL 安装教程 并且确定 MySQL 启动状态

初始化

1、设置阿里云的 Spring Initializr https://start.aliyun.com/

image-20250206170841758

2、选择 2.7.6 版本gTP20X3DfLM35oP9bfNArxR6UuHDEamYTd38MBTsrBM=

image-20250206170841757image-20250206171727391

3、修改配置文件 application.propertiesibbBLHPWrQl9roziUnu+bBZIVr+dZrBeEkWwwoLNs3I=

image-20250206172121084

修改后缀为 yml 格式,把名字改成 application.yml ,并且添加以下内容

yml
▼yml复制代码server:
  port: 8123
  servlet:
    context-path: /api
spring:
  application:
    name: yu-picture-backend
  # 数据库配置
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/yu_picture
    username: root
    password: 123456

image-20250206172631472

4、尝试启动看看是否报错

image-20250206172844033

整合依赖

MyBatis-plus

官网:https://baomidou.com/gTP20X3DfLM35oP9bfNArxR6UuHDEamYTd38MBTsrBM=

1、在 pom.xml 添加下面的依赖并且删除 MyBatis 的依赖防止依赖冲突

xml
▼xml复制代码<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.9</version>
</dependency>

image-20250206173834242

如果有相关 MyBatis 的依赖需要删除

image-20250206173909277

2、添加到 pom.xml 之后,点击右上角的 Load Maven ChangesKrryZFef4D1pctURMTqry3GjQ44W/xjmnRorDc4l6E8=

image-20250206175141328

3、在启动文件添加 @MapperScan

java
▼java复制代码@SpringBootApplication
@MapperScan("com.leikooo.yupicturebackend.mapper")
public class YuPictureBackendApplication {

    public static void main(String[] args) {
        SpringApplication.run(YuPictureBackendApplication.class, args);
    }

}

然后在 com.leikooo.yupicturebackend 下面创建 mapper 文件夹

image-20250206175833755

Hutool 工具类

官网:https://hutool.cn

1、在 pom.xml 添加下面的依赖

xml
▼xml复制代码<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.26</version>
</dependency>

2、点击右上角的 Load Maven Changes

Knife4j

官网:https://doc.xiaominfo.com/docs/quick-start#spring-boot-2TqVRUbFNVZXbqk/hUxkmHLiLVxI7bDwn14nbiZDSWtc=

1、在 pom.xml 添加下面的依赖

xml
▼xml复制代码<dependency>
    <groupId>com.github.xiaoymin</groupId>
    <artifactId>knife4j-openapi2-spring-boot-starter</artifactId>
    <version>4.4.0</version>
</dependency>

2、新建 controller 包,然后在 demos.web 下面的东西j/yPunylytGeRjIlPoK/Y8GFlWyG27wU5zB5N3p1+E0=

image-20250206180616280

3、在 application.yml 添加以下依赖

注意下面的 groupdefaultqI9xw9e7xkICTi4p8LSAdDoi8Snc4lUY3aI/FxTRelw=

yml
▼yml复制代码# 接口文档配置
knife4j:
  enable: true
  openapi:
    title: "接口文档"
    version: 1.0
    group:
      default:
        api-rule: package
        api-rule-resources:
          - com.leikooo.yupicturebackend.controller

访问 http://localhost:8123/api/doc.html 可以看到下面的接口文档

image-20250206181002117

其他依赖

1、aop 切面

xml
▼xml复制代码<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

2、可以在主类上加上

java
▼java

复制代码@EnableAspectJAutoProxy(exposeProxy = true)

加上之后可以在代码之中使用 ,获取当前类的代理对象gTP20X3DfLM35oP9bfNArxR6UuHDEamYTd38MBTsrBM=

java
▼java

复制代码AopContext.currentProxy()

通用基础代码

具体代码的位置

image-20250206183332094

自定义异常类

exception 包下面gTP20X3DfLM35oP9bfNArxR6UuHDEamYTd38MBTsrBM=

异常枚举类

java
▼java复制代码@Getter
public enum ErrorCode {

    SUCCESS(0, "ok"),
    PARAMS_ERROR(40000, "请求参数错误"),
    NOT_LOGIN_ERROR(40100, "未登录"),
    NO_AUTH_ERROR(40101, "无权限"),
    NOT_FOUND_ERROR(40400, "请求数据不存在"),
    FORBIDDEN_ERROR(40300, "禁止访问"),
    SYSTEM_ERROR(50000, "系统内部异常"),
    OPERATION_ERROR(50001, "操作失败");

    /**
     * 状态码
     */
    private final int code;

    /**
     * 信息
     */
    private final String message;

    ErrorCode(int code, String message) {
        this.code = code;
        this.message = message;
    }

}

自定义业务异常qI9xw9e7xkICTi4p8LSAdDoi8Snc4lUY3aI/FxTRelw=

java
▼java复制代码@Getter
public class BusinessException extends RuntimeException {

    /**
     * 错误码
     */
    private final int code;

    public BusinessException(int code, String message) {
        super(message);
        this.code = code;
    }

    public BusinessException(ErrorCode errorCode) {
        super(errorCode.getMessage());
        this.code = errorCode.getCode();
    }

    public BusinessException(ErrorCode errorCode, String message) {
        super(message);
        this.code = errorCode.getCode();
    }

}

为了方便抛出异常

java
▼java复制代码public class ThrowUtils {

    /**
     * 条件成立则抛异常
     *
     * @param condition        条件
     * @param runtimeException 异常
     */
    public static void throwIf(boolean condition, RuntimeException runtimeException) {
        if (condition) {
            throw runtimeException;
        }
    }

    /**
     * 条件成立则抛异常
     *
     * @param condition 条件
     * @param errorCode 错误码
     */
    public static void throwIf(boolean condition, ErrorCode errorCode) {
        throwIf(condition, new BusinessException(errorCode));
    }

    /**
     * 条件成立则抛异常
     *
     * @param condition 条件
     * @param errorCode 错误码
     * @param message   错误信息
     */
    public static void throwIf(boolean condition, ErrorCode errorCode, String message) {
        throwIf(condition, new BusinessException(errorCode, message));
    }
}

响应包装类

common 包下面

通用返回包装类PoFzH92dkfxTeZctnfcQ23EvJKA6S8P5RqYrFFpQE9Q=

java
▼java复制代码@Data
public class BaseResponse<T> implements Serializable {

    private int code;

    private T data;

    private String message;

    public BaseResponse(int code, T data, String message) {
        this.code = code;
        this.data = data;
        this.message = message;
    }

    public BaseResponse(int code, T data) {
        this(code, data, "");
    }

    public BaseResponse(ErrorCode errorCode) {
        this(errorCode.getCode(), null, errorCode.getMessage());
    }
}

为了方便返回信息

java
▼java复制代码public class ResultUtils {

    /**
     * 成功
     *
     * @param data 数据
     * @param <T>  数据类型
     * @return 响应
     */
    public static <T> BaseResponse<T> success(T data) {
        return new BaseResponse<>(0, data, "ok");
    }

    /**
     * 失败
     *
     * @param errorCode 错误码
     * @return 响应
     */
    public static BaseResponse<?> error(ErrorCode errorCode) {
        return new BaseResponse<>(errorCode);
    }

    /**
     * 失败
     *
     * @param code    错误码
     * @param message 错误信息
     * @return 响应
     */
    public static BaseResponse<?> error(int code, String message) {
        return new BaseResponse<>(code, null, message);
    }

    /**
     * 失败
     *
     * @param errorCode 错误码
     * @return 响应
     */
    public static BaseResponse<?> error(ErrorCode errorCode, String message) {
        return new BaseResponse<>(errorCode.getCode(), null, message);
    }
}

全局异常处理器

exception 包下面

防止服务器的报错信息返回前端,增加系统风险j/yPunylytGeRjIlPoK/Y8GFlWyG27wU5zB5N3p1+E0=

java
▼java复制代码@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {

    @ExceptionHandler(BusinessException.class)
    public BaseResponse<?> businessExceptionHandler(BusinessException e) {
        log.error("BusinessException", e);
        return ResultUtils.error(e.getCode(), e.getMessage());
    }

    @ExceptionHandler(RuntimeException.class)
    public BaseResponse<?> runtimeExceptionHandler(RuntimeException e) {
        log.error("RuntimeException", e);
        return ResultUtils.error(ErrorCode.SYSTEM_ERROR, "系统错误");
    }
}

请求包装类

像是 分页 、删除 之类的都有很多重复的字段,其他请求直接继承这两个类即可减少代码书写PoFzH92dkfxTeZctnfcQ23EvJKA6S8P5RqYrFFpQE9Q=

分页请求包装类

JAVA
▼JAVA复制代码@Data
public class PageRequest {

    /**
     * 当前页号
     */
    private int current = 1;

    /**
     * 页面大小
     */
    private int pageSize = 10;

    /**
     * 排序字段
     */
    private String sortField;

    /**
     * 排序顺序(默认降序)
     */
    private String sortOrder = "descend";
}

请求删除包装类JP6W2a+u/tK3+CtiEE3dIFH6LGArLhwCpb/rrZiHIv4=

JAVA
▼JAVA复制代码@Data
public class DeleteRequest implements Serializable {

    /**
     * id
     */
    private Long id;

    private static final long serialVersionUID = 1L;
}

全局跨域配置

在 config 包下面JP6W2a+u/tK3+CtiEE3dIFH6LGArLhwCpb/rrZiHIv4=

java
▼java复制代码@Configuration
public class CorsConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        // 覆盖所有请求
        registry.addMapping("/**")
                // 允许发送 Cookie
                .allowCredentials(true)
                // 放行哪些域名(必须用 patterns,否则 * 会和 allowCredentials 冲突)
                .allowedOriginPatterns("*")
                .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
                .allowedHeaders("*")
                .exposedHeaders("*");
    }
}

image-20250206183525301

编写示例代码

移除 controller 包下面的其他代码

java
▼java复制代码@RestController
@RequestMapping("/")
public class MainController {

    /**
     * 健康检查
     */
    @GetMapping("/health")
    public BaseResponse<String> health() {
        return ResultUtils.success("ok");
    }
}

image-20250206183614638

测试,只要看到下面的结果就初始化成功!q(≧▽≦q)

image-20250206183736180

BUG

如果遇到编译器无端爆红但是不影响运行,清除一下缓存即可。

清除缓存 File | Invalidate Caches 全部勾上清楚一下

image-20241211111656864image-20241211111704141

或者直接 Reload All from Disk 即可解决

image-20250208232407870

下载地址:通过网盘分享的文件:万用项目模板 链接: https://pan.baidu.com/s/1nGi1wydxi9vteDCM6iX2PA 提取码: eiin