项目初始化

git

git init
git config user.name "Zwww"
git config user.email "zv041118@163.com"
git remote add origin git@git.acwing.com:Zwww/zwww_blog.git
git status
git add .
git status
git commit -m "项目搭建 后端初始化"
git push -u origin master

后端初始化

SpringBoot

jdk8 SpringBoot2.7.6

image-dc83c4a5 image-91aaf21d

Database

mysql:

create database Zwww_blog;
use zwww_blog
image-e2d45678

yml:

server:
  port: 8124
  servlet:
    context-path: /api

spring:
  application:
    name: Zwww-blog-backend
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/zwww_blog?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
    username: root
    password: zw200495

整合依赖

Pom

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.zwnsyw</groupId>
    <artifactId>Zwww-blog-backend</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>Zwww-blog-backend</name>
    <description>Zwww-blog-backend</description>
    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.7.6</spring-boot.version>
    </properties>
    <dependencies>
        <!--  - - - - - - - - SpringBoot Base - - - - - - - - -  -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- AOP 切面 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!--  - - - - - - - - - - Database - - - - - - - - - - - -  -->
        <!--  MyBatis Plus (需移除MyBatis)  -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.9</version>
        </dependency>
        <!--  MyBatis Plus 分页插件  -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-jsqlparser-4.9</artifactId>
        </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>
        <!--  dto校验注解  -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>
        <dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
        </dependency>

        <!--  - - - - - - - - - - utools - - - - - - - - - - - -  -->
        <!--  hutool工具箱  -->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.26</version>
        </dependency>
        <!--  Apache commons 工具箱  -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.12.0</version>
        </dependency>
        <!--  swagger 接口文档  -->
        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>knife4j-openapi2-spring-boot-starter</artifactId>
            <version>4.4.0</version>
        </dependency>

    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-bom</artifactId>
                <version>3.5.9</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot.version}</version>
                <configuration>
                    <mainClass>com.zwnsyw.zwwwblogbackend.ZwwwBlogBackendApplication</mainClass>
                    <skip>true</skip>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

MVC层级

image-c8a28f9b

src

└── main

└── java

   └── com.zwnsyw.zwwwblogbackend

       ├── controller

       │   └── UserController.java

       ├── service

       │   └── impl

       │       └── UserServiceimpl.java

       │   └── UserService.java

       ├── mapper

       │   └── UserMapper.java

       ├── entity

       │   └── UserEntity.java

       ├── dto

       │   └── UserRegisterDTO.java

       ├── vo

       │   └── UserVO.java

       ├── enums

       │   └── UserTypeEnum.java

       ├── config

       │   └── MyBatisPlusConfig.java

       ├── utils

       │   └── BeanCopyUtil.java

       ├── exception

       │   └── BusinessException.java

       ├── task

           └── DataCleanupTask.java
mapper层 配置mybatis-plus

扫描mapper包 由mybatis-plus自动处理 添加MyBatisPlusConfig

package com.zwnsyw.zwwwblogbackend.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@MapperScan("com.zwnsyw.zwwwblogbackend.mapper")
public class MyBatisPlusConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}

application.yml 中追加配置

开启日志 、逻辑删除

mybatis-plus:
  configuration:
    map-underscore-to-camel-case: false # 不自动下划线转驼峰 手动统一命名为全驼峰
#    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 仅在开发环境开启日志(会输出拼接的sql语句方便调试)
    default-enum-type-handler: org.apache.ibatis.type.EnumOrdinalTypeHandler # 解决@EnumValue不生效
  global-config:
    db-config:
      logic-delete-field: isDelete # 全局逻辑删除的实体字段名
      logic-delete-value: 1 # 逻辑已删除值(默认为 1)
      logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
controller层 配置swagger

application.yml 中追加接口文档配置,扫描 Controller 包:

# 接口文档配置
knife4j:
  enable: true
  openapi:
    title: "接口文档"
    version: 1.0
  group:
    default:
      api-rule: package
      api-rule-resources:
        - com.zwnsyw.zwwwblogbackend.controller
启动类配置启动AOP

exposeProxy = true 的:通过 Spring AOP 提供对当前代理对象的访问,使得可以在业务逻辑中访问到当前的代理对象。

可以在方法执行时通过 AopContext.currentProxy() 获取当前的代理对象

package com.zwnsyw.zwwwblogbackend;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

@SpringBootApplication
@EnableAspectJAutoProxy(exposeProxy = true)
public class ZwwwBlogBackendApplication {

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

}

全局跨域配置

package com.zwnsyw.zwwwblogbackend.config;

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 CorsConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowCredentials(true)
                .allowedOriginPatterns("http://localhost:5173", "http://127.0.0.1:5173")
                .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
                .allowedHeaders("Content-Type", "Authorization")
                .exposedHeaders("X-Total-Count")
                .maxAge(3600);
    }
}

通用基础代码

自定义异常 响应包装 全局异常处理 请求包装 直接把两个写好的包复制进来即可

image-b8d80743

项目分区导航:⬅️ 01-项目介绍 | 02-项目初始化 | ➡️ 03-Blog模块