Swagger3 API接口文档规范课程(内含教学视频+源代码)

news2025/6/8 22:49:28

Swagger3 API接口文档规范课程(内含教学视频+源代码)

教学视频+源代码下载链接地址:https://download.csdn.net/download/weixin_46411355/87431932

目录

  • Swagger3 API接口文档规范课程(内含教学视频+源代码)
  • `教学视频+源代码下载链接地址:`[https://download.csdn.net/download/weixin_46411355/87431932](https://download.csdn.net/download/weixin_46411355/87431932)
    • 1.Swagger3 简介
    • 2.Swagger3 HelloWorld实现
      • 第一步:我们新建一个SpringBoot项目;
      • 第二步:开启Swagger
      • 第三步:新建HelloWorldController.java控制器类
      • 第四步:访问swagger-ui,查看接口文档
      • 第五步:Swagger注解描述接口
    • 3 Swagger3 常用配置注解讲解
      • 3.1 Swagger3常用配置如下:
      • 3.2 实例一 `@ApiImplicitParams` 和 `@ApiImplicitParam` 参数描述
      • 3.3 实例二 `@ApiModel` , `@ApiModelProperty` 实体参数描述
      • 3.4 实例三 `@ApiResponses` , `@ApiResponse`
    • 4 Swagger3 接口测试
    • 5 Swagger3 API信息配置
    • 6 Swagger3 Docket 开关&过滤&分组 配置详解
      • 6.1 开关设置enable
      • 6.2 设置过滤
      • 6.3 设置分组

1.Swagger3 简介

Swagger(丝袜哥)是一个简单但功能强大的API表达工具。它具有地球上最大的API工具生态系统,数以千计的开发人员,使用几乎所有的现代编程语言,都在支持和使用Swagger。使用Swagger生成API,我们可以得到交互式文档,自动生成代码的SDK以及API的发现特性等。

前后端分离的项目,接口文档的存在十分重要。与手动编写接口文档不同,swagger是一个自动生成接口文档的工具,在需求不断变更的环境下,手动编写文档的效率实在太低。与swagger2相比新版的swagger3配置更少,使用更加方便。

官网 https://swagger.io/

在线编辑器 http://editor.swagger.io/

Swagger作用:

  • 将项目中所有的接口展现在页面上,这样后端程序员就不需要专门为前端使用者编写专门的接口文

档;

  • 当接口更新之后,只需要修改代码中的 Swagger 描述就可以实时生成新的接口文档了,从而规避了接口文档老旧不能使用的问题;
  • 通过 Swagger 页面,我们可以直接进行接口调用,降低了项目开发阶段的调试成本。

现在SWAGGER官网主要提供了几种开源工具,提供相应的功能。可以通过配置甚至是修改源码以达到你想要的效果

Swagger Codegen: 通过Codegen 可以将描述文件生成html格式和cwiki形式的接口文档,同时也能生成多钟语言的服务端和客户端的代码。支持通过jar包,docker,node等方式在本地化执行生成。也可以在后面的Swagger Editor中在线生成。

Swagger UI:提供了一个可视化的UI页面展示描述文件。接口的调用方、测试、项目经理等都可以在该页面中对相关接口进行查阅和做一些简单的接口请求。该项目支持在线导入描述文件和本地部署UI项目。

Swagger Editor: 类似于markendown编辑器的编辑Swagger描述文件的编辑器,该编辑支持实时预览描述文件的更新效果。也提供了在线编辑器和本地部署编辑器两种方式。

Swagger Inspector: 感觉和postman差不多,是一个可以对接口进行测试的在线版的postman。比在 Swagger UI里面做接口请求,会返回更多的信息,也会保存你请求的实际请求参数等数据。

Swagger Hub:集成了上面所有项目的各个功能,你可以以项目和版本为单位,将你的描述文件上传到 Swagger Hub中。在Swagger Hub中可以完成上面项目的所有工作,需要注册账号,分免费版和收费版。

2.Swagger3 HelloWorld实现

第一步:我们新建一个SpringBoot项目;

在这里插入图片描述
加一个Spring Web依赖
在这里插入图片描述

加下Swagger依赖:

<dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-boot-starter</artifactId>
            <version>3.0.0</version>
        </dependency>

这里用的是 springfox,Swagger 可以看作是一个遵循了 OpenAPI 规范的一项技术,而 springfox 则是这项技术的具体实现。

类似 JDBC是一套技术规范,各大数据库都有JDBC的实现;

最终项目pom.xml

<?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>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.8</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.java1234</groupId>
    <artifactId>swagger-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>swagger-demo</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>

        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-boot-starter</artifactId>
            <version>3.0.0</version>
        </dependency>


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

第二步:开启Swagger

在Spring Boot 的启动类添加 @EnableOpenApi 注解,开启 Swagger支持;
在这里插入图片描述

package com.java1234.swaggerdemo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import springfox.documentation.oas.annotations.EnableOpenApi;



public class SwaggerDemoApplication {

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

}

第三步:新建HelloWorldController.java控制器类

package com.java1234.swaggerdemo.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


public class HelloWorldController {
    ("/helloWorld")
    public String helloWorld() {
        return "helloWorld";
    }
}

运行启动类

================================================================
如果报错
报错信息如下:

Failed to start bean ‘documentationPluginsBootstrapper‘; nested exception is java.lang.NullPoint

可以查看笔者的另一篇博文:《解决报错Failed to start bean ‘documentationPluginsBootstrapper‘; nested exception is java.lang.NullPoint》————https://huanghaoheng.blog.csdn.net/article/details/128884811

================================================================

再次运行启动类
浏览器访问:http://localhost:8080/helloWorld
在这里插入图片描述
没问题;

第四步:访问swagger-ui,查看接口文档

浏览器访问:http://localhost:8080/swagger-ui/

显示如下图:主要三大区域,分组定义信息区块,API文档上信息区块以及最重要的接口定义信息区块;

在这里插入图片描述
展开HelloWorldController接口定义:
在这里插入图片描述
这里我们能看到枚举了所有可能的请求类型,因为我们用了 @RequestMapping ,以及请求地址 /helloWorld ,我们再点开任意一个请求,
在这里插入图片描述
我们可以看到,接口没有参数,返回值是 String 类型;

这里描述了完整的接口定义信息;前端开发人员一目了然,假如接口定义变化,前端开发人员刷新下swagger-ui就能及时看到,比起以往的人工编写接口文档方便很多;

第五步:Swagger注解描述接口

在接口描述的时候,控制器类,以及方法,参数,返回值等,默认的话,是英文无备注信息,可能会让前端开发人员看起来吃力,会增加沟通成本;

Swagger提供一套注解,我们给接口添加中文注释;

我们在类上添加 @API 注解,以及在方法上添加 @ApiOperation 注解

在这里插入图片描述

package com.java1234.swaggerdemo.controller;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

(tags = "helloworld测试类")

public class HelloController {

    ("测试方法")
    ("/helloWorld")
    public String helloWorld() {
        return "helloWorld";
    }
}


在这里插入图片描述
重启项目,刷新swagger-ui,发现已经以后中文注释了;

3 Swagger3 常用配置注解讲解

3.1 Swagger3常用配置如下:

swagger提供了一些配置用来描述接口,下面是一些常用的注解,必须掌握;
在这里插入图片描述

3.2 实例一 @ApiImplicitParams@ApiImplicitParam 参数描述

post方式,根据name和age两个参数查询数据,返回信息;

我们用 @ApiImplicitParams@ApiImplicitParam ,描述请求参数

    /**
     *@param name
     *@param age
     *@return

     */
    @ApiOperation("测试查询")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "name",value = "姓名",required = true,paramType = "query"),
            @ApiImplicitParam(name = "age",value = "年龄",required = true,paramType = "query",dataType = "Integer")
    })
    
    @PostMapping("/search")
    public String search(String name, Integer age){
        return name+":"+age;
    }

swagger控制台显示:
点击Try it out
在这里插入图片描述
在这里插入图片描述

3.3 实例二 @ApiModel , @ApiModelProperty 实体参数描述

我们搞一个用户信息添加,使用 @ApiModel , @ApiModelProperty 注解来描述输入参数;

先搞一个用户信息实体User.java

package com.java1234.swaggerdemo.entity;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.models.auth.In;

@ApiModel("用户实体类")
public class User {

    @ApiModelProperty("编号")
    private Integer id;
    @ApiModelProperty("姓名")
    private String name;
    @ApiModelProperty("年龄")
    private Integer age;

    public User() {
    }

    public User(Integer id, String name, Integer age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

参数上,直接用 User user

 /**
     * 添加测试
     * @param user
     * @return
     */
    @ApiOperation("测试添加")
    @PostMapping("/add")
    public String add(User user){
            return user.getName()+":"+user.getAge();    
    }

swagger控制台显示:
点击Try it out
在这里插入图片描述
在这里插入图片描述

3.4 实例三 @ApiResponses@ApiResponse

我们搞一个根据id获取用户信息案例,通过 @PathVariable 获取id,返回User对象,以及通过 @ApiResponses@ApiResponse ,描述响应码对应的描述信息

 /**
     * @ApiImplicitParam
     *      paramType : 参数放在哪个地方
     *          path(用于restful接口) : 请求参数的获取:@PathVariable
     * @param id
     * @return
     */
    @ApiOperation("根据ID获取用户信息")
    @ApiImplicitParams({
            @ApiImplicitParam(name="id",value = "用户编号",required = true,paramType = "path")
    })
    @ApiResponses({
            @ApiResponse(code = 408,message = "指定业务的报错信息,返回客户端"),
            @ApiResponse(code = 400,message = "请求参数没填好"),
            @ApiResponse(code = 404,message = "请求路径没有或页面跳转路径不对")
    })
    @GetMapping("/user/{id}")
    public User load(@PathVariable("id") Integer id){
        return new User(id,"jack",32);
    }

swagger控制台显示:
点击Try it out
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Schemas也对应有视图用户实体描述信息显示:
在这里插入图片描述

4 Swagger3 接口测试

swagger-ui图形客户端提供了接口测试功能;
在这里插入图片描述

5 Swagger3 API信息配置
默认情况,显示的API信息如下:
在这里插入图片描述
默认情况下,这些参数都不能填写,禁用的;
在这里插入图片描述
我们点击“Try it out”按钮;即可开启接口测试功能;
在这里插入图片描述
输入请求参数后,点击“Execute‘按钮,即可执行,下方是后端返回信息;

类似的,我们可以测试添加功能;
在这里插入图片描述
说明:很多时候,前后端分离,传的是json,键值对,用swagger-ui提供的简陋接口测试工具很难用,所以接口测试我们还是用专业的 postman

5 Swagger3 API信息配置

默认情况,显示的API信息如下:
在这里插入图片描述
通过源码,我们可以看到:这个信息是通过springfox.documentation.service.ApiInfo.java 类来构造的
在这里插入图片描述
最终通过 springfox.documentation.spring.web.plugins.Docket.java 类的构造方法传入 ApiInfo 类来最终构造;
在这里插入图片描述
我们要修改API信息默认配置的话,可以通过新建一个 com.java1234.config.Swagger3Config.java 配置类,重写 ApiInfo 实现,以及重写 Docket 实现并且设置apiInfo;

源码:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

package com.java1234.swaggerdemo.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;

import java.util.ArrayList;

@Configuration
public class Swagger3Config {

    /**
     * 配置swagger的Docket bean
     * @return
     */
    @Bean
    public Docket createRestApi(){
        return new Docket(DocumentationType.OAS_30)//指定swagger3.0版本
        .apiInfo(creareApiInfo());
    }

    /**
     * 配置swagger的ApiInfo bean
     * @return
     */
    private ApiInfo creareApiInfo() {
        return new ApiInfo("Java1234 Swagger",
                "Java1234 Api Documentation",
                "3.0",
                "http://www.java1234.vip",
                new Contact("小锋","http://www.java1234.vip","caofeng2012@126.com"),
                "Apache 2.0",
                "http://www.apache.org/licenses/LICENSE-2.0",
                new ArrayList<>()
        );
    }

}

重启项目,我们发现,APIInfo信息变了;
在这里插入图片描述
这个API信息主要作用是让前端开发人员看的,谁开发的接口,或者哪个小组负责,有问题方便联系沟通;

6 Swagger3 Docket 开关&过滤&分组 配置详解

我们可以通过设置Docket,可以配置很多功能,比如是否开启swagger,过滤,分组等;

6.1 开关设置enable

一般情况,我们只有在开发环境才会用到swagger正式环境需要关闭swagger一个是安全问题,还有一个是用了swagger会影响系统运行速度

我们通过设置Docket对象的enable即可;

/**
     * 配置swagger的Docket bean
     *
     * @return
     */
    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.OAS_30)//指定swagger3.0版本
                .apiInfo(creareApiInfo())
                .enable(false);
    }

在这里插入图片描述
设置后,重启项目,发现已经看不到API信息了;

6.2 设置过滤

有些情况,我们需要指定固定包路径下的类生成API,或者根据前端用户路径请求过滤;
使用过滤,必须先调用 select 方法
通过apis方法basePackage 可以根据包路径来生成特定类的API,
any 方法是默认所有都有效, none 方法都无效;
withClassAnnotation 根据类注解, withMethodAnnotation 是根据方法注解;一般我们用的是 basePackage 方法;
在这里插入图片描述
具体实例:

  /**
     * 配置swagger的Docket bean
     *
     * @return
     */
    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.OAS_30)//指定swagger3.0版本
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.java1234.swaggerdemo.controller"))//指定扫描的包 常用方式
                .build()

                .apiInfo(creareApiInfo())
                .enable(true);//开关
    }

最后要加 build() 方法;

类似的还有一个根据请求路径的 paths 方法;
一般用 ant 匹配路径;
any 是匹配任意路径, none 是都不匹配, regex 是正则匹配;
在这里插入图片描述
具体实例:

 /**
     * 配置swagger的Docket bean
     *
     * @return
     */
    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.OAS_30)//指定swagger3.0版本
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.java1234.swaggerdemo.controller"))//指定扫描的包 常用方式
                .paths(PathSelectors.ant("/java1234/**"))//匹配 /java1234/**请求路径
                .build()

                .apiInfo(creareApiInfo())
                .enable(true);//开关
    }

在controller层家一个方法

 @GetMapping("/java1234/testPathMethod")
    public String testPathMethod(){
        return "testPathMethod";
    }

重启访问
swagger-ui视图只显示过滤后的API接口信息;
在这里插入图片描述

6.3 设置分组

在实际项目开发中,把复杂项目划分多模块给多个小组或者多个人负责开发,所以每个小组或者个人要实现自己的分组,方便查找到API接口开发负责人,沟通和处理问题;

我们通过 groupName 方法可以设置组名;
实例:

 /**
     * 配置swagger的Docket bean
     *
     * @return
     */
    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.OAS_30)//指定swagger3.0版本
                .groupName("开发组001")
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.java1234.swaggerdemo.controller"))//指定扫描的包 常用方式
                .paths(PathSelectors.ant("/java1234/**"))//匹配 /java1234/**请求路径
                .build()

                .apiInfo(creareApiInfo())
                .enable(true);//开关

    }

刷新界面:
在这里插入图片描述
发现组名变了;

现在的话,我们结合前面学过的过滤,通过apisbasePackage方法,搞两个组,分别扫描不同的包路径;

模拟分组开发,controller包下建两个子包,分别是one和two包,用来模拟两个业务模块;将HelloWorldController移入到one包下
在这里插入图片描述

简单搞个 HelloWorldController2

package com.java1234.swaggerdemo.controller.two;

import com.java1234.swaggerdemo.entity.User;
import io.swagger.annotations.*;
import org.springframework.web.bind.annotation.*;

@Api(tags = "helloworld测试类2")
@RequestMapping("/java1234/")
@RestController
public class HelloWorldController2 {

    @ApiOperation("测试方法2")
    @GetMapping("/helloWorld2")
    public String helloWorld2(){
        return "helloWorld2";
    }

}


我们搞两个 Docket 和两个 ApiInfo

package com.java1234.swaggerdemo.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;

import java.util.ArrayList;

@Configuration
public class Swagger3Config {

    /**
     * 配置swagger的Docket bean
     *
     * @return
     */
    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.OAS_30)//指定swagger3.0版本
                .groupName("开发组001")
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.java1234.swaggerdemo.controller.one"))//指定扫描的包 常用方式
                .paths(PathSelectors.ant("/java1234/**"))//匹配 /java1234/**请求路径
                .build()

                .apiInfo(creareApiInfo())
                .enable(true);//开关

    }

    /**
     * 配置swagger的ApiInfo bean
     *
     * @return
     */
    private ApiInfo creareApiInfo() {
        return new ApiInfo("Java1234 Swagger",
                "Java1234 Api Documentation",
                "3.0",
                "http://www.java1234.vip",
                new Contact("小锋", "http://www.java1234.vip", "caofeng2012@126.com"),
                "Apache 2.0",
                "http://www.apache.org/licenses/LICENSE-2.0",
                new ArrayList<>()
        );
    }


    /**
     * 配置swagger的Docket bean
     *
     * @return
     */
    @Bean
    public Docket createRestApi2() {
        return new Docket(DocumentationType.OAS_30)//指定swagger3.0版本
                .groupName("开发组002")
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.java1234.swaggerdemo.controller.two"))//指定扫描的包 常用方式
                .paths(PathSelectors.ant("/java1234/**"))//匹配 /java1234/**请求路径
                .build()

                .apiInfo(creareApiInfo2())
                .enable(true);//开关

    }

    /**
     * 配置swagger的ApiInfo bean
     *
     * @return
     */
    private ApiInfo creareApiInfo2() {
        return new ApiInfo("Java1234 Swagger",
                "Java1234 Api Documentation",
                "3.0",
                "http://www.java1234.vip",
                new Contact("小丽", "http://www.java1234.vip", "caofeng2012@126.com"),
                "Apache 2.0",
                "http://www.apache.org/licenses/LICENSE-2.0",
                new ArrayList<>()
        );
    }

}


启动项目运行;

开发组001
在这里插入图片描述
开发组002
在这里插入图片描述
在这里插入图片描述
测试OK;

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

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

相关文章

aws cloudformation 使用CommandRunner在堆栈中运行脚本

参考资料 Running bash commands in AWS CloudFormation templates 如何使用 AWSUtility::CloudFormation::CommandRunner 在 CloudFormation 堆栈中的资源之前或之后运行命令&#xff1f; 由于cloudformation语法和资源的限制&#xff0c;有些场景下我们可能会希望执行一些…

Mysql安装前的脚本准备

文章目录1. 将modules解压后放到Share共享文件夹中&#xff0c;将Share下的modules移动到根目录2. 将setup.sh放到Share共享文件夹中&#xff0c;通过共享将Share下的setup.sh移动到/Desktop3. 到/根目录下查看modules是否移动成功4. 到/root/Desktop下查看setup.sh5. 执行 ./s…

计算系统概论实验Lab 6——C重写Lab1-5

Lab 6 C重写Lab1-5 Purpose 使用高级编程语言&#xff08;例如C / C&#xff09;来实现以前编写的所有代码。请注意&#xff0c;该算法需要与之前使用的算法一致 condition&#xff1a; 明确禁止使用LC3不直接支持的*、/、%>><<等操作及等效库函数;可以使用&am…

Cypress简介及在Windows下安装

cypress 简单介绍 Cypress 是基于 JavaScript 的前端测试工具&#xff0c;它是自集成的&#xff0c;提供了一套完整的端到端测试&#xff0c;无须借助其他外部工具&#xff0c;安装后即可快速地创建、编写、运行测试用例&#xff0c;可以对浏览器中运行的任何内容进行快速、简…

springboot 针对rabbitmq多vhost情况处理

目录说明代码自定义rabbitmq的pom信息&#xff1a;重写one的连接工厂重写two的连接工厂&#xff1a;创建队列、交换机并绑定&#xff1a;消费者消费消息生产者发送消息说明 需求场景&#xff1a; 项目中在已接入rabbitmq一个vhost的基础上&#xff0c;需要再引入多个vhost进行…

线性杂双功能peg化试剂——HS-PEG-COOH,Thiol-PEG-Acid

英文名称&#xff1a;HS-PEG-COOH&#xff0c;Thiol-PEG-Acid 中文名称&#xff1a;巯基-聚乙二醇-羧基 HS-PEG-COOH是一种含有硫醇和羧酸的线性杂双功能聚乙二醇化试剂。它是一种有用的带有PEG间隔基的交联或生物结合试剂。巯基或SH、巯基或巯基选择性地与马来酰亚胺、OPSS、…

基于“python+”潮汐、风驱动循环、风暴潮等海洋水动力模拟实践技术

ADCIRC是新一代海洋水动力计算模型&#xff0c;它采用了非结构三角形网格广义波动连续方程的设计&#xff0c;在提高计算精确度的同时还减小了计算时间。被广泛应用于&#xff1a;模拟潮汐和风驱动的循环、预测风暴潮和洪水和近岸海上作业等。除此之外&#xff0c;ADCIRC也是我…

MySQL 存储引擎

MySQL内部展示图 分为三个层次 客户端 mysqlserver 存储引擎 我认为与之前先的UBD三层相类似 UI端传数据 B端逻辑处理 数据库端进行执行方面进行类似 存储引擎的分类 mySQL 5.5 版本采用InnoDB 为默认引擎&#xff08;生成.frm和.ibd文件&#xff09; 给大家介绍其他存储引…

I/O多路复用

基础概念 Socket 套接字。百科&#xff1a;对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。 例子1&#xff1a;客户端将数据通过网线发送到服务端&#xff0c;客户端发送数据需要一个出口&#xff0c;服务端接收数据需要一个入口&#xff0c;这两个“口子”就是…

【面试题】2023 Vue面试题 高频考题

大厂面试题分享 面试题库 后端面试题库 (面试必备) 推荐:★★★★★ 地址:

【微服务】Elasticsearch数据聚合自动补全数据同步(四)

&#x1f697;Es学习第四站~ &#x1f6a9;Es学习起始站&#xff1a;【微服务】Elasticsearch概述&环境搭建(一) &#x1f6a9;本文已收录至专栏&#xff1a;微服务探索之旅 &#x1f44d;希望您能有所收获 在第二站的学习中&#xff0c;我们已经导入了大量数据到es中&…

IBM AIX 升级Openssh 实现篇(编译安装)

升级成功佐证 !!!本文所有内容仅作参考,请在测试环境中具体测试完毕后才能应用于生产环境!!! [1]备份和恢复方案 开启telnet 服务,防止ssh 掉线后无法重连维护。在修复漏洞后关闭telnet。 备份该服务相关的所有文件,以便恢复。 root@TEST:/etc# vi inetd.conf #ftp…

原型图设计软件哪个好用?6款好用软件推荐

原型图软件列表 1、墨刀-极简超快的移动应用原型工具 2、ProcessOn-在线作图工具&#xff0c;你不用装 Visio 了 3、摩客-简洁高效的原型图设计工具 4、xiaopiu-国内优雅高效的在线 APP 原型工具 5、Axure-老牌原型工具&#xff0c;8.0 开始对响应式设计做了更好的支持&…

ONES 支持多项信创适配,打造自主可控的国产化平台

近日&#xff0c;ONES 顺利通过麒麟软件 NeoCertify、华为鲲鹏技术、达梦数据库的兼容性测试认证&#xff0c;至此&#xff0c;ONES 已完成国产操作系统、国产 CPU、国产数据库的多维度适配&#xff0c;成为目前唯一支持信创的研发管理平台&#xff0c;这标志着 ONES 在自主可控…

聚类分析--基本原理、方法(Kmeans,层次聚类)

文章目录聚类分析的定义基本原理商业应用场景聚类分析步骤聚类分析方法层次分析法/系统聚类法&#xff08;小样本&#xff09;提问&#xff1a;如何选择合适的分类结果K-means疑问&#xff1a;聚类分析的定义 聚类分析就是将研究对象根据一些特征指标&#xff0c;把比较相似的…

ubuntu qt程序无法输入中文 QLineEdit输入框无法切换输入法

目录一、问题描述二、解决思路三、步骤描述一、问题描述 测试软件在运行时无法通过键盘快捷键切换中文输入法&#xff0c;主要原因为qt应用程序没成功加载到输入法插件。 本文的以测试程序demo为例&#xff0c;进行过程展示&#xff0c;demo名字为“test-chinese-lineedit”。…

stream流处理初识

stream流处理初识 java8中的集合支持stream方法, 它会返回一个流(java.util.stream.Stream)IDEA集成的工具查看流式链过程&#xff1a; 流的操作 &#xff1a; 流的概念&#xff1a; java8中的集合支持stream方法,它会返回一个流(java.util.stream.Stream) 元素序列: 就像集…

【数据结构】优先级队列----堆

优先级队列----堆优先级队列堆堆的创建堆的插入&#xff1a;堆的删除&#xff1a;PriorityQueue的特性PriorityQueue的构造与方法优先级队列 优先级队列&#xff1a; 不同于先进先出的普通队列&#xff0c;在一些情况下&#xff0c;优先级高的元素要先出队列。而这种队列需要提…

开启Openharmony 开发之旅

之前因为太懒&#xff0c;所以很少写博客。最近做了一年的鸿蒙开发。想记录下&#xff0c;故开始写点东西&#xff0c;作为学习和开发笔记吧&#xff01;先分享几个开源鸿蒙的学习网站。 1.开源鸿蒙官网 OpenAtom OpenHarmonyhttps://docs.openharmony.cn/pages/v3.1/zh-cn/a…

《MySQL系列-InnoDB引擎19》文件-日志文件-二进制日志

日志文件 日志文件记录了影响MySQL数据库的各种类型活动。MySQL数据库中常见的日志文件有&#xff1a; 错误日志(error log)二进制日志(bilog)慢查询日志(slow query log)查询日志(log) 这些日志文件可以帮助DBA对MySQL数据库的运行状态进行诊断&#xff0c;从而更好的进行数…