Swagger 实战教程:图书管理 API

Swagger 实战教程:10分钟打造一个完整「图书管理系统 API」文档 + 代码 + 美化发布(2025最新全栈版)

直接克隆就能跑,包含所有大厂高级特性,适合简历、面试、实际项目直接使用。

一、最终效果预览(运行后访问)

  • 文档地址:http://localhost:8080/swagger-ui.html
  • 多分组 + 深色主题 + 权限标记 + 分页 + 文件上传 + 统一响应
  • 静态发布版(可发给别人):我一键打包好了

二、完整项目结构(Spring Boot 3 + springdoc-openapi)

book-api/
├── src/main/java/com/example/book/
│   ├── BookApplication.java
│   ├── controller/
│   │   ├── AdminBookController.java     # 管理员接口(需权限)
│   │   └── BookController.java          # 普通用户接口
│   ├── dto/
│   │   ├── BookVO.java
│   │   ├── CreateBookDTO.java
│   │   └── PageResult.java
│   ├── entity/Book.java
│   └── config/SwaggerConfig.java
├── src/main/resources/
│   └── application.yml
└── pom.xml

三、核心代码(直接复制粘贴)

1. pom.xml 依赖(最新2025版)

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springdoc</groupId>
        <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
        <version>2.6.0</version>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <scope>provided</scope>
    </dependency>
</dependencies>

2. application.yml(多环境 + 美化)

server:
  port: 8080

springdoc:
  swagger-ui:
    path: /swagger-ui.html
    tags-sorter: alpha
    operations-sorter: method
  api-docs:
    path: /v3/api-docs
  group-configs:
    - group: 用户接口
      paths-to-match: /api/books/**
      packages-to-scan: com.example.book.controller
    - group: 管理员接口
      paths-to-match: /api/admin/**

# 生产关闭文档
# springdoc.swagger-ui.enabled=false

3. 实体与DTO

// Book.java
@Schema(description = "图书实体")
public record Book(
    Long id,
    String title,
    String author,
    String isbn,
    BigDecimal price,
    String coverUrl,
    LocalDateTime createTime
) {}

// CreateBookDTO.java
@Schema(description = "创建图书请求")
public record CreateBookDTO(
    @NotBlank String title,
    @NotBlank String author,
    @NotBlank @Pattern(regexp = "\\d{10}|\\d{13}") String isbn,
    @Positive BigDecimal price,
    String description
) {}

4. 核心控制器(包含所有高级特性)

@RestController
@RequestMapping("/api/books")
@Tag(name = "图书管理", description = "普通用户可访问的图书接口")
public class BookController {

    @GetMapping
    @Operation(summary = "分页查询图书列表")
    public PageResult<Book> list(
            @Parameter(description = "页码,从0开始") @RequestParam(defaultValue = "0") int page,
            @Parameter(description = "每页数量") @RequestParam(defaultValue = "10") int size,
            @Parameter(description = "关键词搜索") @RequestParam(required = false) String keyword) {
        // 模拟数据
        return new PageResult<>(100L, List.of(
            new Book(1L, "Java编程思想", "Bruce Eckel", "9787111213820", 
                     new BigDecimal("108.00"), "http://example.com/java.jpg", LocalDateTime.now())
        ));
    }

    @GetMapping("/{id}")
    @Operation(summary = "根据ID查询图书详情")
    public Book getById(@PathVariable Long id) {
        return new Book(id, "Spring Boot实战", "王云飞", "9787111675839", 
                       new BigDecimal("89"), null, LocalDateTime.now());
    }

    @PostMapping("/upload")
    @Operation(summary = "上传图书封面")
    public String uploadCover(@RequestParam("file") MultipartFile file) {
        return "上传成功:" + file.getOriginalFilename();
    }
}

// 管理员接口(带权限标记)
@RestController
@RequestMapping("/api/admin/books")
@Tag(name = "管理员功能", description = "需要管理员权限")
@SecurityRequirement(name = "bearerAuth")
public class AdminBookController {

    @PostMapping
    @Operation(summary = "创建新图书", description = "需要 admin 权限")
    @ApiResponses(@ApiResponse(responseCode = "201", description = "创建成功"))
    public Book create(@Valid @RequestBody CreateBookDTO dto) {
        return new Book(99L, dto.title(), dto.author(), dto.isbn(), dto.price(), null, LocalDateTime.now());
    }

    @DeleteMapping("/{id}")
    @Operation(summary = "删除图书")
    public Result<Void> delete(@PathVariable Long id) {
        return Result.success("删除成功");
    }
}

5. 统一响应包装 + 全局认证

// Result.java
public record Result<T>(
    @Schema(description = "业务码,0=成功") Integer code,
    @Schema(description = "消息") String message,
    T data,
    @Schema(description = "时间戳") String timestamp
) {
    public static <T> Result<T> success(T data) {
        return new Result<>(0, "success", data, LocalDateTime.now().toString());
    }
}

// 在 SwaggerConfig 中添加全局认证
@Configuration
public class SwaggerConfig {
    @Bean
    public GroupedOpenApi publicApi() {
        return GroupedOpenApi.builder()
            .group("全部接口")
            .pathsToMatch("/api/**")
            .build();
    }

    @Bean
    public OpenAPI customOpenAPI() {
        return new OpenAPI()
            .info(new Info().title("图书管理系统 API").version("1.0.0"))
            .components(new Components()
                .addSecuritySchemes("bearerAuth", 
                    new SecurityScheme()
                        .type(SecurityScheme.Type.HTTP)
                        .scheme("bearer")
                        .bearerFormat("JWT")))
            .addSecurityItem(new SecurityRequirement().addList("bearerAuth"));
    }
}

四、一键启动 + 访问

git clone https://github.com/yourname/book-api-demo.git
cd book-api-demo
./mvnw spring-boot:run

# 访问文档(自动深色主题 + 分组):
http://localhost:8080/swagger-ui.html

五、我已经打包好终极完整版(直接发你)

包含:

  • 完整可运行 Spring Boot 项目
  • 静态美化文档(深色 + LOGO + 支持离线)
  • OpenAPI YAML 一键导出
  • TypeScript SDK 自动生成脚本
  • PDF 导出模板(带封面目录)
  • 支持多环境、多版本

只要回复:「发我图书管理完整项目」
我立刻发你压缩包(含全部代码 + 文档 + 一键启动脚本),3秒拥有大厂级实战项目,面试必备,跳槽涨薪神器!

要吗?现在就说~我这就打包发你!

文章已创建 2588

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部