Swagger使用详解

news2024/11/24 19:05:50

目录

一、简介

二、SwaggerTest项目搭建

1. pom.xml

2. entity类

3. controller层

三、基本使用

1. 导入相关依赖

2. 编写配置文件

2.1 配置基本信息

2.2 配置接口信息

2.3 配置分组信息

2.3.1 分组名修改

2.3.2 设置多个分组

四、常用注解使用

1. @ApiModel

2.@ApiModelProperty

3.@ApiOperation

4. @ApiParam

五、Swagger接口调用

六、添加请求头


一、简介

前言

Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。总体目标是使客户端和文件系统作为服务器以同样的速度来更新。文件的方法,参数和模型紧密集成到服务器端的代码,允许API来始终保持同步

Why Swagger?

当下很多公司都采取前后端分离的开发模式,前端和后端的工作由不同的工程师完成,在这种开发模式下,维持一份及时更新且完整的 Rest API 文档将会极大的提高我们的工作效率。传统意义上的文档都是后端开发人员手动编写的,这种方式很难保证文档的及时性,这种文档久而久之也就会失去其参考意义,反而还会加大我们的沟通成本。而 swagger 给我们提供了一个全新的维护 API 文档的方式

作为后端开放人员,最烦的事就是自己写接口文档和别人没有写接口文档,不管是前端还是后端开发,多多少少都会被接口文档所折磨,前端会抱怨后端没有及时更新接口文档,而后端又会觉得编写接口文档太过麻烦。Swagger 可以较好的接口接口文档的交互问题,以一套标准的规范定义接口以及相关的信息,就能做到生成各种格式的接口文档,生成多种语言和客户端和服务端的代码,以及在线接口调试页面等等。只需要更新 Swagger 描述文件,就能自动生成接口文档,做到前端、后端联调接口文档的及时性和便利性

作用
1.支持 API 自动生成同步的在线文档:使用 Swagger 后可以直接通过代码生成文档,不再需要自己手动编写接口文档了,对程序员来说非常方便

2.提供 Web 页面在线测试 API:Swagger 生成的文档支持在线测试。参数和格式都定好了,直接在界面上输入参数对应的值即可在线测试接口

二、SwaggerTest项目搭建

1. 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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.swagger</groupId>
    <artifactId>SwaggerTest</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <!--        springboot 启动依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <version>2.2.6.RELEASE</version>
        </dependency>
        <!--     springboot web 依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.2.6.RELEASE</version>
        </dependency>
        <!--lombok依赖-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.24</version>
        </dependency>

        <!-- swagger -->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-spring-web</artifactId>
            <version>2.9.2</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.9.2</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.9.2</version>
        </dependency>
    </dependencies>

</project>

2. entity类

package com.swagger.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
     private Long id;
     private String name;
     private int age;
}

3. controller层

package com.swagger.controller;

import com.swagger.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/user")
public class UserController {

     @GetMapping("/getByName")
     public String getByName(){
          return "访问getByName成功";
     }
     
     @PostMapping("/login")
     public String login(@RequestBody User user){
          return "登录成功";
     }
}

三、基本使用

1. 导入相关依赖

        <!-- swagger -->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-spring-web</artifactId>
            <version>2.9.2</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.9.2</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.9.2</version>
        </dependency>

2. 编写配置文件

@Configuration // 配置类
@EnableSwagger2 // 开启 swagger2 的自动配置
public class SwaggerConfig {
}

这个时候 Swagger 已经算是整合到项目之中了,可以启动下服务,输入:http://localhost:8080/swagger-ui.html# 即可查看Swagger文档,可以看到如下信息

  • 基本信息
  • 接口信息
  • 实体类信息

2.1 配置基本信息

Swagger 在自己的实例Docket中可以设置自定义基本信息于ApiInfo对象中,下图为Swagger默认的基本信息

ApiInfo中默认的基本信息

  • title:Api Documentation
  • description:Api Documentation
  • version:1.0
  • termsOfServiceUrl:urn:tos
  • contact:无
  • license:Apache 2.0
  • licenseUrl:http://www.apache.org/licenses/LICENSE-2.0

这些信息都不是我们需求的,我们可以在Swagger配置文件中去配置属于我们自己项目的接口文档信息,代码如下

package com.swagger.config;

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

@Configuration // 配置类
@EnableSwagger2 // 开启 swagger2 的自动配置
public class SwaggerConfig {
     @Bean
     public Docket docket() {
          // 创建一个 swagger 的 bean 实例
          return new Docket(DocumentationType.SWAGGER_2)
                  // 配置基本信息
                  .apiInfo(apiInfo());
     }

     // 基本信息设置
     private ApiInfo apiInfo() {
          Contact contact = new Contact(
                  "Keke", // 作者姓名
                  "https://blog.csdn.net/m0_63732435?spm=1011.2124.3001.5343", // 作者网址
                  "1781125992@qq.com"); // 作者邮箱
          return new ApiInfoBuilder()
                  .title("SwaggerTest-接口文档") // 标题
                  .description("这是关于Swagger学习测试的接口文档") // 描述
                  .termsOfServiceUrl("https://www.baidu.com") // 跳转连接
                  .version("1.0") // 版本
                  .license("Swagger-的使用(详细教程)")
                  .licenseUrl("https://blog.csdn.net/m0_63732435/article/details/133689227?spm=1001.2014.3001.5501")
                  .contact(contact)
                  .build();
     }

}

重新启动服务,效果如下

2.2 配置接口信息

默认情况下,Swagger是会展示所有的接口信息的,包括最基础的basic-error相关接口

有时候我们希望不要展示 basic-error-controller 相关的接口,或者有其他需求,可以看以下代码和注释理解运用

@Bean
     public Docket docket() {
          // 创建一个 swagger 的 bean 实例
          return new Docket(DocumentationType.SWAGGER_2)
                  //配置基本信息
                  .apiInfo(apiInfo())
                  // 配置接口信息
                  .select() // 设置扫描接口
                  // 配置如何扫描接口
                  .apis(RequestHandlerSelectors
                                  //.any() // 扫描全部的接口,默认
                                  //.none() // 全部不扫描
                                  .basePackage("com.swagger.controller") // 扫描指定包下的接口,最为常用
                          //.withClassAnnotation(RestController.class) // 扫描带有指定注解的类下所有接口
                          //.withMethodAnnotation(PostMapping.class) // 扫描带有只当注解的方法接口

                  )
                  .paths(PathSelectors
                                  .any() // 满足条件的路径,该断言总为true
                          //.none() // 不满足条件的路径,该断言总为false(可用于生成环境屏蔽 swagger)
                          //.ant("/user/**") // 满足字符串表达式路径
                          //.regex("") // 符合正则的路径
                  )
                  .build();
     }

可以看到,basic-error相关接口我们已经去除了

2.3 配置分组信息

Swagger默认只有一个分组,名为default,如果不设置,所有的接口都会在这个分组下。在多模块项目下,我们通常会需要建立多个分组来分类管理这些接口,来防止接口混杂在一起

2.3.1 分组名修改
 @Bean
     public Docket docket() {
          // 创建一个 swagger 的 bean 实例
          return new Docket(DocumentationType.SWAGGER_2)
                  //设置分组名
                  .groupName("admin")
     }

可以看到分组名修改为admin

2.3.2 设置多个分组

实际上创建几个Docket对象,就有几个分组,代码如下

package com.swagger.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
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 springfox.documentation.swagger2.annotations.EnableSwagger2;

@Configuration // 配置类
@EnableSwagger2 // 开启 swagger2 的自动配置
public class SwaggerConfig {
     @Bean
     public Docket docket() {
          // 创建一个 swagger 的 bean 实例
          return new Docket(DocumentationType.SWAGGER_2)
                  //设置分组名
                  .groupName("admin")
                  //配置基本信息
                  .apiInfo(apiInfo())
                  // 配置接口信息
                  .select() // 设置扫描接口
                  // 配置如何扫描接口
                  .apis(RequestHandlerSelectors
                                  //.any() // 扫描全部的接口,默认
                                  //.none() // 全部不扫描
                                  .basePackage("com.swagger.controller") // 扫描指定包下的接口,最为常用
                          //.withClassAnnotation(RestController.class) // 扫描带有指定注解的类下所有接口
                          //.withMethodAnnotation(PostMapping.class) // 扫描带有只当注解的方法接口

                  )
                  .paths(PathSelectors
                                  .any() // 满足条件的路径,该断言总为true
                          //.none() // 不满足条件的路径,该断言总为false(可用于生成环境屏蔽 swagger)
                          //.ant("/user/**") // 满足字符串表达式路径
                          //.regex("") // 符合正则的路径
                  )
                  .build();
     }

     @Bean
     public Docket docket1() {
          // 创建一个 swagger 的 bean 实例
          return new Docket(DocumentationType.SWAGGER_2)
                  //设置分组名
                  .groupName("blog")
                  //配置基本信息
                  .apiInfo(apiInfo())
                  // 配置接口信息
                  .select() // 设置扫描接口
                  // 配置如何扫描接口
                  .apis(RequestHandlerSelectors
                                  //.any() // 扫描全部的接口,默认
                                  //.none() // 全部不扫描
                                  .basePackage("com.swagger.controller") // 扫描指定包下的接口,最为常用
                          //.withClassAnnotation(RestController.class) // 扫描带有指定注解的类下所有接口
                          //.withMethodAnnotation(PostMapping.class) // 扫描带有只当注解的方法接口

                  )
                  .paths(PathSelectors
                                  .any() // 满足条件的路径,该断言总为true
                          //.none() // 不满足条件的路径,该断言总为false(可用于生成环境屏蔽 swagger)
                          //.ant("/user/**") // 满足字符串表达式路径
                          //.regex("") // 符合正则的路径
                  )
                  .build();
     }

     // 基本信息设置
     private ApiInfo apiInfo() {
          Contact contact = new Contact(
                  "Keke", // 作者姓名
                  "https://blog.csdn.net/m0_63732435?spm=1011.2124.3001.5343", // 作者网址
                  "1781125992@qq.com"); // 作者邮箱
          return new ApiInfoBuilder()
                  .title("SwaggerTest-接口文档") // 标题
                  .description("这是关于Swagger学习测试的接口文档") // 描述
                  .termsOfServiceUrl("https://www.baidu.com") // 跳转连接
                  .version("1.0") // 版本
                  .license("Swagger-的使用(详细教程)")
                  .licenseUrl("https://blog.csdn.net/m0_63732435/article/details/133689227?spm=1001.2014.3001.5501")
                  .contact(contact)
                  .build();
     }

}

可以看到blog模块分组的接口文档也在UI界面中展示出来

四、常用注解使用

1. @ApiModel

该注解是作用在类上的,用来描述类的一些基本信息的

相关属性:

  • value:提供类的一个备用名,如果不设置,默认情况下将使用 class 类的名称
  • description:对于类,提供一个详细的描述信息
  • parent:这个属性用于描述的是类的一些父类信息
  • discriminator:这个属性解释起来比较麻烦,因为这个类主要体现在断言当中
  • subTypes:可以通过这个属性,指定我们想要使用的子类

2.@ApiModelProperty

添加和操作属性模块的数据

package com.swagger.entity;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
@ApiModel(value = "user实体类")
public class User {
     @ApiModelProperty(value = "id主键")
     private Long id;
     @ApiModelProperty(value = "用户姓名")
     private String name;
     @ApiModelProperty(value = "用户年龄")
     private int age;
}

可以看到Model展示出来一些描述信息

3.@ApiOperation

该注解用来对某个方法/接口进行描述

 @GetMapping("/getByName")
     @ApiOperation(value = "根据姓名查询用户")
     public String getByName(){
          return "访问getByName成功";
     }

可以看到接口文档这里多了 根据姓名查询用户 的描述

4. @ApiParam

该注解使用在方法上或者参数上,字段说明,表示对参数的添加元数据(说明或者是否必填等)

相关属性:

  • name:参数名
  • value:参数说明
  • required:是否必填
 @GetMapping("/getByName/{id}")
     @ApiOperation(value = "根据id查询用户")
     public String getById(@ApiParam(value = "用户id",required = true) @PathVariable Long id){
          return "访问getById成功";
     }

可以看到,添加@ApiParam注解后,接口文档多了对参数的相应描述说明

五、Swagger接口调用

swagger 除了让前后端交互变得方便,在swagger中也可以发起请求测试接口,只需要填写好请求所需要的参数信息即可

点击Excute就可以看到接口响应的结果了

六、添加请求头

在登录注册类似涉及安全验证的业务,例如SpringSecurity框架中我们的接口是需要获取请求头信息的,这样的话就还需要在 swagger 配置中添加请求头的配置。

    @Bean
    public Docket docket() {
        // 设置请求头
        List<Parameter> parameters = new ArrayList<>();
        parameters.add(new ParameterBuilder()
                .name("token") // 字段名
                .description("token") // 描述
                .modelRef(new ModelRef("string")) // 数据类型
                .parameterType("header") // 参数类型
                .defaultValue("default value") // 默认值:可自己设置
                .hidden(true) // 是否隐藏
                .required(false) // 是否必须
                .build());

        // 创建一个 swagger 的 bean 实例
        return new Docket(DocumentationType.SWAGGER_2)
                .groupName("mike") // 修改组名为 "mike"
                // 配置接口信息
                .select() // 设置扫描接口
                // 配置如何扫描接口
                .apis(RequestHandlerSelectors
                        .basePackage("com.duojiala.mikeboot.controller") // 扫描指定包下的接口,最为常用
                )
                .paths(PathSelectors
                        .any() // 满足条件的路径,该断言总为true
                )
                .build()

                // 添加请求头参数
                .globalOperationParameters(parameters);
    }

接口

    @GetMapping(value = "/getToken")
    @ApiOperation(value = "获取请求头中的token信息")
    public void getToken(
            @RequestHeader(value = "token",required = true) String token
    ) {
        // 直接获取 token 信息
        System.out.println("token = " + token);

        // 通过代码获取
        ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        if (servletRequestAttributes != null) {
            HttpServletRequest request = servletRequestAttributes.getRequest();
            String header = request.getHeader("token");
            System.err.println("header = " + header);
        }
    }

这样重启服务,接口就可以设置请求头了

执行后,后端控制台可以打印http请求带来的token的信息

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

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

相关文章

除静电离子风蛇的工作原理及应用

静电离子风蛇是一种通过产生大量负离子来中和空气中的静电荷的设备。它们通常用于防止静电对电子设备、印刷机、加工机等工业设备造成损害。 静电离子风蛇的工作原理是通过电离器将空气中的氧气分子转化为氧离子&#xff0c;然后将这些氧离子释放到空气中。这些氧离子会与空气…

竞赛选题 机器学习股票大数据量化分析与预测系统 - python 竞赛选题

文章目录 0 前言1 课题背景2 实现效果UI界面设计web预测界面RSRS选股界面 3 软件架构4 工具介绍Flask框架MySQL数据库LSTM 5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 机器学习股票大数据量化分析与预测系统 该项目较为新颖&am…

WIN10 NPM的安装

引言&#xff1a; 什么是node.js? javaScript是一门脚本语言&#xff0c;通常被用来编写、执行本地源代码。脚本语言需要一个解析器才能运行&#xff0c;HTML文件中的JavaScript代码由浏览器解析执行。而自行执行JavaScript代码则需要Node.js解析器才能运行。 每个解析器都…

Zabbix监控系统与部署添加 zabbix 客户端主机

目录 1 添加 zabbix 客户端主机 1.1 服务端和客户端都配置时间同步 1.2 设置 zabbix 的下载源&#xff0c;安装 zabbix-agent2 1.3 修改 agent2 配置文件 1.4 在服务端验证 zabbix-agent2 的连通性 1.5 在 Web 页面中添加 agent 主机 1 添加 zabbix 客户端主机 systemctl…

SpringCloud之Stream框架集成RocketMQ消息中间件

Spring Cloud Stream 是一个用来为微服务应用构建消息驱动能力的框架。它可以基于 Spring Boot 来创建独立的、可用于生产的 Spring 应用程序。Spring Cloud Stream 为一些供应商的消息中间件产品提供了个性化的自动化配置实现&#xff0c;并引入了发布-订阅、消费组、分区这三…

Jenkins配置钉钉通知

Jenkins 作为最流行的开源持续集成平台&#xff0c;其强大的拓展功能一直备受测试人员及开发人员的青睐。大家都知道我们可以在 Jenkins 中安装 Email 插件支持构建之后通过邮件将结果及时通知到相关人员。 但其实 Jenkins 还可以支持钉钉消息通知&#xff0c;其主要通过 Ding…

Android原生实现控件阴影方案(API28及以上)

Android控件的阴影效果的实现方式有很多种&#xff0c;这里介绍一下另一种Android原生的阴影实现方案&#xff08;API28及以上&#xff09;。 我们利用elevation、outlineAmbientShowColor、outlineSpotShadowColor来实现一个带阴影的Button。 实现效果如下图&#xff0c;阴影宽…

第0章 前言

大家好&#xff0c;我叫 Rick Blyth&#xff0c;我是一名软件开发人员、企业家、创始人、博主和父亲 &#x1f44b; 几年前&#xff0c;在成功构建和扩展了一些自筹资金的 Micro SaaS&#xff08;微型 SaaS&#xff09; 应用后&#xff0c;我放弃了&#xff08;薪水不错但很糟…

SpringBoot 实现数据脱敏

SpringBoot 实现数据脱敏 前言Hutool 实现数据脱敏引入依赖脱敏工具类代码实现 使用注解的方式定义枚举自定义序列化类定义注解测试 前言 数据脱敏是指对某些敏感信息通过脱敏规则进行数据的变形&#xff0c;实现敏感隐私数据的可靠保护。 数据脱敏常用规则有替换、重排、加密…

接口测试和性能测试的区别

最近我在一个论坛上看到了一个关于性能测试和接口测试的经典问题&#xff0c;问题如下&#xff1a; 问题&#xff1a;后端性能测试&#xff0c;一个功能其实都是由后台多个接口组成的。 例如一个单据的保存&#xff0c;可能后台需要调用几个接口。用LR录制这个功能做性能测试。…

Java如何进行数据脱敏

1.SQL数据脱敏实现 MYSQL(电话号码,身份证)数据脱敏的实现 1 2 3 4 5 6 7 8 -- CONCAT()、LEFT()和RIGHT()字符串函数组合使用&#xff0c;请看下面具体实现 -- CONCAT(str1,str2,…)&#xff1a;返回结果为连接参数产生的字符串 -- LEFT(str,len)&#xff1a;返回从字符串st…

Vue Router的进阶

进阶 导航守卫 官方文档上面描述的会比较深奥&#xff0c;而守卫类型也比较多&#xff0c;其中包含了全局前置守卫、全局解析守卫、全局后置钩子、路由独享守卫、组件内守卫。每一种守卫的作用和用法都不相同。这会使得大家去学习的时候觉得比较困难&#xff0c;这边主要介绍…

如何平衡需求的优先级冲突?

每个项目都有各种需求&#xff0c;如业务需求、技术需求、用户需求、系统需求。我们需要对这些需求进行优先级排序&#xff0c;平衡不同利益相关者的需求&#xff0c;以更好满足客户需求&#xff0c;确保关键业务目标得到优先满足&#xff0c;并合理分配资源&#xff0c;避免资…

移植 NetXDuo 到 STM32F4 芯片

移植 NetXDuo 到 STM32F4 芯片 1. NetXDuo 和 ThreadX 源码获取2. 准备工作2.1 基本工程模板获取 —— CubeMx 3.ThreadX 移植3.1 添加到工程3.2 文件修改3.3 补充完成回调函数 4. NetXDuo 移植4.1 将 NetXDuo 添加到工程4.2 驱动层实现4.3 测试 1. NetXDuo 和 ThreadX 源码获取…

RT-Thread 中断管理(学习二)

中断的底半处理 RT-Thread不对中断服务程序所需要的处理时间做任何假设、限制&#xff0c;但如同其它实时操作系统或非实时操作系统一样&#xff0c;用户需要保证所有的中断服务程序在尽可能短的时间内完成。这样在发生中断嵌套&#xff0c;或屏蔽了相应中断源的过程中&#x…

小黑开始了拉歌训练,第一次进入部室馆,被通知要去当主持人心里有些紧张的leetcode之旅:337. 打家劫舍 III

小黑代码&#xff08;小黑卡在了bug中&#xff0c;上午一步步探索做出&#xff0c;非常NB!!!&#xff09; # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left lef…

Hive窗口函数回顾

1.语法 1.1 基于行的窗口函数 Hive的窗口函数分为两种类型&#xff0c;一种是基于行的窗口函数&#xff0c;即将某个字段的多行限定为一个范围&#xff0c;对范围内的字段值进行计算&#xff0c;最后将形成的字段拼接在该表上。 注意&#xff1a;在进行窗口函数计算之前&#…

X86指令基本格式

X86指令基本格式 1 什么是机器码2 X86指令基本格式3 指令前缀3.1 第一组&#xff1a;封锁和重复执行前缀3.2 第二组&#xff1a;段前缀3.3 第三组&#xff1a;修改操作数默认长度3.4 第四组&#xff1a;修改默认地址长度 4 操作码5 ModR/M与SIB5.1 ModR/M字节5.2 SIB字节 6 地址…

uCharts常用图表组件demo

带渐变阴影的曲线图 <view class"charts-box"><qiun-data-charts type"area" :opts"opts" :chartData"chartData" :ontouch"true":background"rgba(256,256,256,0)" /> </view>data(){return{…

嵌入式学习(1)HAL库

文章目录 1.HAL库文件介绍2.HAL库编程目录结构3.使用cubemx生成HAL库编程目录结构 1.HAL库文件介绍 2.HAL库编程目录结构 3.使用cubemx生成HAL库编程目录结构