SpringBoot3整合Knife4j4.x版本(Swagger3、OpenApi3)

news2024/12/23 4:33:55
😊 @ 作者: 一恍过去
💖 @ 主页: https://blog.csdn.net/zhuocailing3390
🎊 @ 社区: Java技术栈交流
🎉 @ 主题: SpringBoot3整合Knife4j4.x版本(Swagger3、OpenApi3)
⏱️ @ 创作时间: 2024年03月14日

目录

  • 前言
  • 1、为什么使用Knife4j
  • 2、基本使用
    • 2.1 pom
    • 2.2 配置Knife4j
    • 2.3 拦截器放行
    • 2.4 实体类
    • 2.5 SpringBoot整合基础使用
      • 2.5.1 基础配置
      • 2.5.2 Post(实体)请求
      • 2.5.3 Get(实体)请求
      • 2.5.4 响应参数配置
        • 1. 响应对象
        • 2.响应List集合
      • 2.5.5 Header参数请求
      • 2.5.6 非实体参数请求
      • 2.5.7 文件类型的请求
        • 1. 文件上传
        • 2. 文件上传带参数
  • 4、接口排序
  • 5、访问页面权限控制
  • 6、生产环境屏蔽
  • 7、多个Controller分组
  • 8、对比Swagger2
    • 8.1 实体类注解对比
    • 8.2 分组类注解对比
    • 8.3 方法注解对比
    • 8.4 请求参数注解对比
    • 8.5 响应参数注解对比

前言

适用于:SpringBoot 3.x版本

1、为什么使用Knife4j

在前后端分离的开发模式下,后端人员开发完接口后,需要单独出一份文档,说明每个接口的作用以及接口的传入参数与响应参数;但是项目处于快速开发阶段时,就会出现文档更新不及时的情况,久而久之在对接接口时就会出现效率下降的情况,Knife4j提供一个可视化的UI界面,通过Knife4j只需要注解就可以向前端暴漏出所有的接口信息,便于前端对接以及对系统的测试。页面访问方式为:ip:prot/context-path/doc.html

2、基本使用

2.1 pom

        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
            <version>4.4.0</version>
        </dependency>

2.2 配置Knife4j

创建配置文件:Knife4jConfig

@Configuration
public class SwaggerConfig {
    @Bean
    public OpenAPI customOpenAPI() {
        return new OpenAPI()
                .info(new Info()
                        .title("XXX系统API")
                        .version("1.0")
                        .description("Knife4j集成接口文档")
                        .termsOfService("http://www.lhz.com")
                        .license(new License().name("Apache 2.0")));
    }
}

yaml

# springdoc-openapi项目配置
springdoc:
  swagger-ui:
    path: /swagger-ui.html
    # 排序方式为首字母
    tags-sorter: alpha
    # 使用增强order属性进行排序,或者不设置该参数( @ApiOperationSupport(order = n)直接生效)
    operations-sorter: order
  api-docs:
    path: /v3/api-docs
  group-configs:
    - group: '测试'
      paths-to-match: '/**'
      # controller所在包
      packages-to-scan: com.lhz.demo.controller.swagger3

# knife4j的增强配置,不需要增强可以不配
knife4j:
  enable: true
  setting:
    language: zh_cn

2.3 拦截器放行

如果项目中配置了拦截器,那么会拦截Knife4j的请求的资源,需要进行放行处理,放行的url如下:

  • “/swagger-resources/**”
  • “/doc.html”
  • “/swagger-ui.html”
  • “/v2/**”
  • “/v3/**”
  • “/webjars/**”

2.4 实体类

创建一个实体类

@Data
@Schema(description = "测试实体类")
public class TestEntity {

    @Schema(description = "名称", requiredMode = Schema.RequiredMode.REQUIRED)
    private String name;

    @Schema(description = "手机号")
    private String phone;
}

2.5 SpringBoot整合基础使用

2.5.1 基础配置

通过@Tag注解,为当前Controller进行命名,通过@OperationController中的方法设置名称

@Tag(name = "XX接口管理")
@RestController
public class TestController {

    @Operation(summary = "测试方法", description = "测试方法")
    @GetMapping("/test")
    public void test() {
        System.out.println("进入了test接口");
    }
}

2.5.2 Post(实体)请求

和传统的Post请求写法一致参数加上@RequestBody注解,通过@Operation为接口命名

Controller:

@Tag(name = "XX接口管理")
@RestController
public class TestController {

    @Operation(summary = "测试方法", description = "测试")
    @PostMapping("/test")
    public void test(@RequestBody TestEntity test) {
        System.out.println("test = " + test);
    }
}

文档页面:
在这里插入图片描述

调试页面:
在这里插入图片描述

2.5.3 Get(实体)请求

对于Get请求时,需要加一个由springdoc提供的注解@ParameterObject

@Tag(name = "XX接口管理")
@RestController
public class TestController {

    @Operation(summary = "测试Get请求", description = "测试")
    @GetMapping("/testGet")
    public void testGet(@ParameterObject TestEntity test) {
        System.out.println("test = " + test);
    }
    
}

文档页面:
在这里插入图片描述

调试页面:
可以看到Get请求的请求参数形式是以列表的形式进行呈现,而Post的请求参数是json形式
在这里插入图片描述

2.5.4 响应参数配置

对于返回对象,我们通常可以为某个具体的Object或者List<Object>针对这两类情况有不同的处理方式,
需要使用到swagger3提供的@ApiResponse注解

1. 响应对象
@Tag(name = "XX接口管理")
@RestController
public class TestController {

    @Operation(summary = "测试响应对象", description = "测试")
    @GetMapping("/responseObject")
    @ApiResponse(content = @Content(schema = @Schema(implementation = TestEntityRes.class)))
    public TestEntityRes testGet2() {
        return new TestEntityRes();
    }
    
}

文档页面:
在这里插入图片描述

2.响应List集合
@Tag(name = "XX接口管理")
@RestController
public class TestController {

    @Operation(summary = "测试响应List集合", description = "测试")
    @GetMapping("/responseList")
    @ApiResponse(content = @Content(array = @ArraySchema(schema = @Schema(implementation = TestEntityRes.class))))
    public List<TestEntityRes> testGetList() {
        return new ArrayList<>();
    }
    
}

文档页面:
在这里插入图片描述

2.5.5 Header参数请求

在项目开发中,存在接口需要传入在header中传递token获取其他参数的情况,通过GlobalOpenApiCustomizer进行全局的配置,此处需要进行配置类的修改,其中HttpHeaders.AUTHORIZATION表示header的名称 该参数可以按照自己系统的header名称进行设置。

Tips:配置后所有的接口,都会在调试请求时,RequestHeader中都会默认加上HttpHeaders.AUTHORIZATION

配置如下:

@Configuration
public class SwaggerConfig {
    @Bean
    public OpenAPI customOpenAPI() {
        return new OpenAPI()
                .info(new Info()
                        .title("XXX系统API")
                        .version("1.0")
                        .description("Knife4j集成接口文档")
                        .termsOfService("http://www.lhz.com")
                        .license(new License().name("Apache 2.0")))
                .addSecurityItem(new SecurityRequirement().addList(HttpHeaders.AUTHORIZATION))
                .components(new Components().addSecuritySchemes(HttpHeaders.AUTHORIZATION, new SecurityScheme()
                        .name(HttpHeaders.AUTHORIZATION).type(SecurityScheme.Type.HTTP)));
    }

    @Bean
    public GlobalOpenApiCustomizer orderGlobalOpenApiCustomizer() {
        return openApi -> {
            // 全局添加鉴权参数(HttpHeaders.AUTHORIZATION)
            if (openApi.getPaths() != null) {
                openApi.getPaths().forEach((s, pathItem) -> {
                    // 为所有接口添加鉴权
                    pathItem.readOperations().forEach(operation -> {
                        operation.addSecurityItem(new SecurityRequirement().addList(HttpHeaders.AUTHORIZATION));
                    });
                });
            }
        };
    }
}

效果:
在这里插入图片描述

2.5.6 非实体参数请求

对于传入请求参数,没有进行实体类封装时,那么可以进行单独的参数配置,可能会将参数在path上进行传递,也可以提供query方式进行传递,通过@Parameters@Parameter来实现

@Tag(name = "XX接口管理")
@RestController
public class TestController {

    @Operation(summary = "测试响应List集合", description = "测试")
    @GetMapping("/responseList")
    @ApiResponse(content = @Content(array = @ArraySchema(schema = @Schema(implementation = TestEntityRes.class))))
    public List<TestEntityRes> testGetList() {
        return new ArrayList<>();
    }
    
}

Tips:如果只有一个请求参数的情况下,直接使用@Parameter注解即可

文档页面:
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

调试页面:
在这里插入图片描述

2.5.7 文件类型的请求

1. 文件上传
@Tag(name = "XX接口管理")
@RestController
public class TestController {
    
    @Operation(summary = "单文件上传", description = "单文件上传")
    @Parameter(name = "file", description = "文件", required = true, schema = @Schema(name = "file", format = "binary"))
    @PostMapping("/upload")
    public void upload(@RequestParam("file") MultipartFile file) {
        System.out.println("file = " + file.getOriginalFilename());
    }
    
        @Operation(summary = "多文件上传", description = "多文件上传")
    @Parameter(name = "files", description = "文件", required = true, schema = @Schema(name = "files", format = "binary"))
    @PostMapping("/uploadBatch")
    public void uploadBatch(@RequestParam("files") List<MultipartFile> files) {
        for (MultipartFile file : files) {
            System.out.println("file = " + file.getOriginalFilename());
        }
    }
}

文档页面:

在这里插入图片描述

2. 文件上传带参数
@Tag(name = "XX接口管理")
@RestController
public class TestController {
    
    @Operation(summary = "文件上传带参数", description = "文件上传带参数")
    @Parameters({
            @Parameter(name = "id", description = "文件id", in = ParameterIn.PATH),
            @Parameter(name = "file", description = "文件", required = true, schema = @Schema(name = "file", format = "binary")),
            @Parameter(name = "name", description = "文件名称", in = ParameterIn.QUERY, required = true),
    })
    @PostMapping("/uploadParam/{id}")
    public void uploadParamPath(@PathVariable("id") String id, @RequestParam("file") MultipartFile file, @RequestParam("name") String name) {
        System.out.println("id = " + id);
        System.out.println("file = " + file.getOriginalFilename());
        System.out.println("name = " + name);
    }
    
}

文档页面:
在这里插入图片描述

4、接口排序

接口排序的目的是,我们可以将一些新写的接口按照自定义的序号进行从上到下的顺序排序;

接口排序要生效,需要在yaml配置中operations-sorter属性需要设置为order,并且配合ApiOperationSupport注解使用

Yaml配置:

# springdoc-openapi项目配置
springdoc:
  swagger-ui:
    # 使用增强order属性进行排序,或者不设置该参数( @ApiOperationSupport(order = n)直接生效)
    operations-sorter: order

注解使用:

@Tag(name = "XX接口管理")
@RestController
public class TestController {

    @Operation(summary = "测试排序-一", description = "测试")
    @ApiOperationSupport(order = 1)
    @PostMapping("/testSort1")
    public void test(@RequestBody TestEntity test) {
        System.out.println("test = " + test);
    }

    @Operation(summary = "测试排序-二", description = "测试")
    @ApiOperationSupport(order = 2)
    @GetMapping("/testSort2")
    public void testGet(@ParameterObject TestEntity test) {
        System.out.println("test = " + test);
    }
    
}

5、访问页面权限控制

通过开启页面权限控制 使得访问Knife4j接口地址时需要进行账户密码验证,通过Knife4j提供的增强功能实现,用法如下:

yml配置:

knife4j:
  # 开启增强配置
  enable: true
  basic:
    enable: true
    # Basic认证用户名
    username: admin
    # Basic认证密码
    password: 123456

效果:
在这里插入图片描述

6、生产环境屏蔽

我们在开发阶段时,是可以任意访问Knife4j文档的,当项目上线以后,我们为了保证不被外部系统访问,在不大量修改代码的情况下,可以使用Knife4j提供的生产环境屏蔽功能,用法如下:

knife4j:
  # 开启增强配置
  enable: true
 # 开启生产环境屏蔽
  production: true

效果:
在这里插入图片描述

7、多个Controller分组

实际开发项目中,我们可以存在多个页面模块,每个模块的controller路径不同,那么可以在yaml中配置,多个不同的分组,如下:

# springdoc-openapi项目配置
springdoc:
  group-configs:
    - group: '测试组'
      paths-to-match: '/**'
      packages-to-scan: com.lhz.demo.a
    - group: '应用组'
      paths-to-match: '/**'
      packages-to-scan: com.lhz.demo.b

效果:
在这里插入图片描述

8、对比Swagger2

8.1 实体类注解对比

在Swagger2中通过@ApiModel@ApiModelProperty两个注解进行实现,使用required = true来表示必填标识;

@ApiModel("测试实体类")
public class TestEntity {
    @ApiModelProperty(value = "名称", required = true)
    private String name;
}

在Swagger3中通过一个@Schema注解进行实现,使用requiredMode = Schema.RequiredMode.REQUIRED来表示必填标识;

@Schema(description = "测试实体类")
public class TestEntity {

    @Schema(description = "名称", requiredMode = Schema.RequiredMode.REQUIRED)
    private String name;
}

8.2 分组类注解对比

在Swagger2中通过@Api注解进行实现;

@Api(tags = "测试管理")
@RestController
@RequestMapping("test")
public class TestController {
    
}

在Swagger3中通过一个@Tag注解进行实现;

@Tag(name = "测试管理")
@RestController
@RequestMapping("test")
public class TestController {
    
}

8.3 方法注解对比

在Swagger2中通过@Api注解进行实现;

@Api(tags = "测试管理")
@RestController
@RequestMapping("test")
public class TestController {
    
    @ApiOperation(value = "根据Id查询", notes = "根据Id查询")
    @PostMapping("/test")
    public void test() {
        System.out.println("test");
    }
}

在Swagger3中通过一个@Operation注解进行实现;

@Tag(name = "测试管理")
@RestController
@RequestMapping("test")
public class TestController {    
	@Operation(summary = "测试方法", description = "测试")
    @PostMapping("/test")
    public void test() {
        System.out.println("test");
    }
}

8.4 请求参数注解对比

在Swagger2中通过@ApiImplicitParams@ApiImplicitParam注解进行实现,并且通过dataType指定数据类型,通过paramType指定参数类型;

@Api(tags = "测试管理")
@RestController
@RequestMapping("test")
public class TestController {
    
    @ApiOperation(value = "测试非实体参数请求", notes = "测试非实体参数请求"")
    @GetMapping("/testParam/{id}")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "id", value = "Id字段", paramType = "path", required = true, dataType = "integer"),
            @ApiImplicitParam(name = "name", value = "名称", paramType = "query", required = true, dataType = "string")
    })
    public void test(@PathVariable Integer id, @RequestParam String name) {
        System.out.println("id = " + id + ",name = " + name);
    }
    
}

在Swagger3中通过一个@Parameters@Parameter注解进行实现,并且通过schema指定数据类型,通过in指定参数类型;

@Tag(name = "测试管理")
@RestController
@RequestMapping("test")
public class TestController {    

    @Operation(summary = "测试非实体参数请求", description = "测试非实体参数请求")
    @GetMapping("/testParam/{id}")
    @Parameters({
            @Parameter(name = "id", description = "Id字段", required = true, in = ParameterIn.PATH, schema = @Schema(type = "integer")),
            @Parameter(name = "name", description = "名称", required = true, in = ParameterIn.QUERY, schema = @Schema(type = "string"))
    })
    public void test(@PathVariable Integer id, @RequestParam String name) {
        System.out.println("id = " + id + ",name = " + name);
    }
    
}

Tips:如果是Get请求,并且参数为实体时,需要使用@ParameterObject注解,比如:

@Operation(summary = "测试Get请求", description = "测试")
@ApiOperationSupport(order = 2)
@GetMapping("/testGet")
public void testGet(@ParameterObject TestEntity test) {
  System.out.println("test = " + test);
}

8.5 响应参数注解对比

在Swagger2中通过@ApiOperation注解的responseresponseContainer进行实现;

@Api(tags = "测试管理")
@RestController
@RequestMapping("test")
public class TestController {
    
    @ApiOperation(value = "返回对象", notes = "返回对象",response = TestEntityRes.class)
    @GetMapping("/responseObject")
	public TestEntityRes responseObject() {
        return new TestEntityRes();
    }
    
	@ApiOperation(value = "返回List集合", notes = "返回List集合", response = TestEntityRes.class, responseContainer = "List")
    @GetMapping("/responseList")
    public List<TestEntityRes> responseList() {
        return new ArrayList<>();
    }
}

在Swagger3中通过一个@ApiResponse注解进行实现,通过@Schema注解实现返回对象,通过ArraySchema注解实现返回List集合

@Tag(name = "测试管理")
@RestController
@RequestMapping("test")
public class TestController {    

    @Operation(summary = "返回对象", description = "返回对象")
    @GetMapping("/responseObject")
    @ApiResponse(content = @Content(schema = @Schema(implementation = TestEntityRes.class)))
    public TestEntityRes responseObject() {
        return new TestEntityRes();
    }

    @Operation(summary = "返回List集合", description = "返回List集合")
    @GetMapping("/responseList")
    @ApiResponse(content = @Content(array = @ArraySchema(schema = @Schema(implementation = TestEntityRes.class))))
    public List<TestEntityRes> responseList() {
        return new ArrayList<>();
    }
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1525438.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【每日力扣】131.分割回文串与450.删除二叉搜索树中的节点

&#x1f525; 个人主页: 黑洞晓威 &#x1f600;你不必等到非常厉害&#xff0c;才敢开始&#xff0c;你需要开始&#xff0c;才会变的非常厉害。 131.分割回文串 给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是 回文串 。返回 s 所有可能的…

C#使用MiniExcel读取excel表格文件

使用MiniExcel读取excel表格文件 MiniExecl提供了几种读取方法。 准备测试数据 测试类&#xff1a; public class Person{public int Id { get; set; }public string Name { get; set; }public string Description { get; set; }public double Value { get; set; }}测试数据…

伦敦数据科学与Scikit-learn:一次探索与实践的旅程

1.题目 Data Science London正在举办一场关于Scikit-learn的聚会。 这个比赛是尝试、分享和创建 sklearn 分类能力示例的练习场&#xff08;如果这变成了有用的东西&#xff0c;我们可以跟进回归或更复杂的分类问题&#xff09;。Scikit-learn&#xff08;sklearn&#xff09;…

Django项目不显示图片,路径找不到

1.问题 创建Django项目简单写一个网页&#xff0c;文字能显示&#xff0c;图片却无法加载&#xff0c;路径错误&#xff0c;找不到图片。 2.背景 我的项目结构 C:. ├─.idea │ └─inspectionProfiles ├─app01 │ ├─migrations │ ├─templates │ │ ├─app0…

postgres让别人连接自己本地的库

本地安装了postgres&#xff0c;一般只能自己连接&#xff0c;如果别人想要连接我们自己的库&#xff0c;需要修改postgres的配置。 找到pg.gba.conf&#xff0c;路径是&#xff1a;postgres安装路径/PostgreSQL/data 使用记事本打开这个文件&#xff0c;将别人的ip填入其中即…

Python数学建模-2.5Pandas库介绍

2.5.1Pandas基本操作 Pandas是一个强大的Python数据分析库&#xff0c;它提供了快速、灵活且富有表现力的数据结构&#xff0c;设计初衷是为了处理关系型或标记型数据。Pandas的基本操作涵盖了数据的读取、处理、筛选、排序、分组、合并以及可视化等多个方面。 以下是一些Pan…

CentOS7环境——yum安装nginx

目录 1.修改yum源为阿里云 2.下载wget 3.下载阿里云的 CentOS-Base.repo 到/etc/yum.repos.d/ 4.清空原本yum缓存 5.生成新的阿里云的yum缓存&#xff0c;加速下载预热数据 6.下载epel-release 7.下载nginx 8.启动并检查nginx状态 1.修改yum源为阿里云 cp /etc/yum.re…

QQ 截图工具独立版安装使用

前言 之前截图一直使用的QQ截图&#xff0c;相比于微信截图&#xff0c;QQ截图还支持长截图&#xff0c;总体来说&#xff0c;QQ截图是我使用过的最好的截图工具 。但是现在公司不让用微信、QQ、钉钉等通讯软件&#xff0c;要求使用公司自研的通讯软件&#xff0c;这样就不能使…

EMQX 实践

MQTT 核心概念 发布订阅 MQTT 基于发布订阅模式&#xff0c;它解耦了消息的发送方&#xff08;发布者&#xff09;和接收方&#xff08;订阅者&#xff09;&#xff0c;引入了一个中间代理的角色来完成消息的路由和分发。发布者和订阅者不需要知道彼此的存在&#xff0c;他们…

IIS上部署.netcore WebApi项目及swagger

.netcore项目一般是直接双击exe文件&#xff0c;运行服务&#xff0c;今天有个需求&#xff0c;需要把.netcore项目运行在IIS上&#xff0c;遇到了一个小坑&#xff0c;在这里记录一下。 安装IIS&#xff0c;怎么部署站点&#xff0c;这些过于简单就不细说了&#xff0c;不知道…

java学习之路-方法讲解

目录 1.方法概念及使用 1.1什么是方法 1.2方法定义 1.3 方法调用的执行过程 1.4 实参和形参的关系(重要) 1.5 没有返回值的方法 2.方法重载 3.方法递归 3.1递归概念 3.2递归执行过程分析 3.3递归练习 代码示例1 代码示例2 1.方法概念及使用 1.1什么是方法 方法就是…

ipad电容笔有必要买吗?怎么选?四大缺陷弊端要严防!

电容笔有没有必要买还是得看我们个人的使用需求&#xff0c;如果平时做笔记、画画比较多的话&#xff0c;还是值得入手的&#xff0c;原装笔是好&#xff0c;但对于一些预算不多的朋友来说&#xff0c;价格还是过于高了&#xff0c;不是很划算。而且我们国内市场的平替电容笔也…

【Linux】基础 IO(文件系统 inode 软硬链接)-- 详解

一、理解文件系统 1、前言 我们一直都在说打开的文件&#xff0c;磁盘中包含了上百万个文件&#xff0c;肯定不可能都是以打开的方式存在。其实文件包含打开的文件和普通的未打开的文件&#xff0c;下面重点谈谈未打开的文件。 我们知道打开的文件是通过操作系统被进程打开&am…

在线BLOG网|基于springboot框架+ Mysql+Java+JSP技术的在线BLOG网设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 前台功能效果图 管理员功能登录前台功能效果图 系统功能设计 数据库E-R图设计 lunwen参考 摘要 研究…

【Oracle篇】一文搞清exp/imp逻辑迁移工具的用法(第一篇,总共四篇)

☘️博主介绍☘️&#xff1a; ✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ ✌✌️擅长Oracle、MySQL、SQLserver、Linux&#xff0c;也在积极的扩展IT方向的其他知识面✌✌️ ❣️❣️❣️大佬们都喜欢静静的看文章&#xff0c;并且也会默默的点赞收藏加关注❣…

{“message“:“Expecting value (near 1:1)“,“status“:400}

按照网页请求数据的方式无法获取数据 {“message”:“Expecting value (near 1:1)”,“status”:400} 将content-type改为以下请求数据方式 content-type: application-json,参考:https://stackoverflow.com/questions/72333040/why-400-response-status-code-when-send-post…

组建对等网

一、概念 对等网络&#xff08;Peer-to-Peer, P2P&#xff09;是一种分布式网络架构&#xff0c;其中每个参与节点&#xff08;称为"对等体"或"节点"&#xff09;既可以作为客户端也可以作为服务器&#xff0c;直接与网络中的其他节点分享资源&#xff08…

【Ubuntu20.04】Clion 配置 Libtorch + OpenCV

首先根据自己的CUDA版本安装正确对应的cuda和cudnn并进行配置。 这里安装的是cuda-11.3版本&#xff0c;以下基于这个版本进行安装。 1. 安装 Clion 因为Clion更容易直接编写CMakelists.txt&#xff0c;所以使用Clion作为IDE。 需要在File -> Setting -> CMake的CMake…

汽车电子零部件(6):DMS/OMS、CMS

前言: 有一个部件过去不曾有,而如今有可能要标准化标配化,那就是Driver Monitoring System (DMS)驾驶员监控系统、Occupant Monitoring System (OMS)乘客监控系统和Camera Monitor System(CMS)摄像头监控系统。 汽车视觉技术的创新推动先进驾驶辅助系统的变革(ADAS),并…

ssh 下连接Mysql 查看数据库数据表的内容的方法及步骤

要通过SSH连接到MySQL数据库&#xff0c;可以按照以下步骤进行操作&#xff1a; 在本地计算机上打开终端或命令提示符。 使用SSH命令连接到远程服务器。命令的格式如下&#xff1a; ssh usernameserver_ip其中&#xff0c;username是指在远程服务器上的用户名&#xff0c;serv…