Spring Boot 集成 Knife4j 的 Swagger 文档
在开发微服务应用时,API 文档的生成和维护是非常重要的一环。Swagger 是一个非常流行的 API 文档工具,可以帮助我们自动生成 RESTful API 的文档,并提供了一个友好的界面供开发者测试 API。本文将介绍如何在 Spring Boot 项目中集成 Knife4j 的 Swagger,以实现 API 文档的自动生成和展示。
官网:Knife4j · 集Swagger2及OpenAPI3为一体的增强解决方案. | Knife4j
源码:knife4j: Knife4j是一个集Swagger2 和 OpenAPI3为一体的增强解决方案
1. UI 界面配置步骤
1.1. 添加依赖
<dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>3.0.2</version>
</dependency>
1.2. 添加配置文件
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.core.env.Profiles;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
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;@Configuration
@Slf4j
public class WebMvcConfiguration extends WebMvcConfigurationSupport {/*** 该方法的主要作用是通过knife4j生成接口文档,若想要多个分组,则需要配置多个Docket实例** @return Docket 实例,用于Swagger接口文档的配置和生成*/@Beanpublic Docket docket(Environment environment) {// 构建API信息,用于Swagger文档的元数据ApiInfo apiInfo = new ApiInfoBuilder().title("swagger测试项目接口文档") // 设置API的标题.contact(new Contact("zjp", "http://termurl.com", "zjp@email.com")).version("1.0") // 设置API的版本.description("swagger测试项目接口文档") // 设置API的描述信息.termsOfServiceUrl("http://termurl.com") // 设置服务条款URL,非必要.license("Apache 2.0") // 设置API的授权协议,非必要.licenseUrl("http://www.apache.org/licenses/LICENSE-2.0") // 设置授权协议的URL,非必要.build();// 创建Docket实例并进行配置Docket docket = new Docket(DocumentationType.SWAGGER_2) // 指定文档类型为Swagger2。支持SWAGGER_12(1.2版本)、SWAGGER_2(2.0版本)、OAS_30(3.0版本)等。多个实例版本不同会在各个版本中各生成一个文档.enable(environment.acceptsProfiles(Profiles.of("dev", "test"))) // 设置是否启用Swagger,默认为true,也可以通过环境变量或配置文件来动态控制.apiInfo(apiInfo) // 设置API信息.select() // 进入配置选择器// 若需要匹配指定包路径的控制器,可以使用basePackage()方法,可以是包名或类名,支持通配符*;// 若需要匹配所有路径,可以使用any()方法,例如:any();// 若需要匹配指定注解的控制器,可以使用withClassAnnotation()方法,例如:withClassAnnotation(RestController.class);// 若需要匹配指定方法注解的控制器,可以使用withMethodAnnotation()方法,例如:withMethodAnnotation(ApiOperation.class);// 若不需要匹配任何注解的控制器,可以使用none()方法,例如:none();.apis(RequestHandlerSelectors.basePackage("com.zjp.knife4jswaggerdemo.controller"))// 若需要匹配指定类,可以使用any()方法,例如:any();// 若需要匹配指定路径,可以使用ant()方法,例如:ant("/api/**");// 若需要排除某些路径,可以使用ant()方法,例如:ant("!/api/**");// 若需要匹配以指定字符串结尾的路径,可以使用ant()方法,例如:ant("/**/api");// 若需要匹配以指定字符串开头的路径,可以使用regex()方法,例如:regex("/api/.*");// 若不需要匹配任何路径,可以使用none()方法,例如:none().paths(PathSelectors.any()).build() // 结束配置并构建Docket实例.groupName("default"); // 设置分组名称,多个分组名称不能重名
// .pathMapping("/") // 设置路径映射,用于指定Swagger UI的根路径,默认为/。
// .protocols(new HashSet<>(Arrays.asList("http", "https"))) // 设置支持的协议
// .securitySchemes(Collections.singletonList(new ApiKey("token", HttpHeaders.AUTHORIZATION, In.HEADER.toValue()))) // 授权信息设置,必要的header token等认证信息
// .securityContexts(Collections.singletonList(
// SecurityContext.builder()
// .securityReferences(Collections.singletonList(new SecurityReference("token", new AuthorizationScope[]{new AuthorizationScope("global", "")})))
// .build())); // 设置全局安全上下文,用于指定全局的授权信息return docket;}/*** 该方法的主要作用是通过knife4j生成接口文档,若想要多个分组,则需要配置多个Docket实例* 例如配置第二个Docket实例,分组名称为api** @return Docket 实例,用于Swagger接口文档的配置和生成*/@Beanpublic Docket docket1() {// 构建API信息,用于Swagger文档的元数据ApiInfo apiInfo = new ApiInfoBuilder().title("swagger测试项目接口文档").version("1.0").description("swagger测试项目接口文档").build();// 创建Docket实例并进行配置Docket docket = new Docket(DocumentationType.SWAGGER_2).enable(true).apiInfo(apiInfo) // 设置API信息.select() // 进入配置选择器.apis(RequestHandlerSelectors.withClassAnnotation(RestController.class)).paths(PathSelectors.ant("/api/**")).build().groupName("api");return docket;}/*** 该方法用于在Spring MVC中配置静态资源的访问路径和位置* 它通过ResourceHandlerRegistry对象来注册资源处理器,* 从而使得特定URL路径下的请求能够映射到应用程序的静态资源上** @param registry ResourceHandlerRegistry实例,用于注册资源处理器*/protected void addResourceHandlers(ResourceHandlerRegistry registry) {// 映射/doc.html到classpath:/META-INF/resources/,以便访问该路径时能够获取到相应的静态文件registry.addResourceHandler("/doc.html").addResourceLocations("classpath:/META-INF/resources/");// 映射/webjars/**到classpath:/META-INF/resources/webjars/,用于支持webjars资源的访问registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");}
}
1.3. 启动测试
浏览器访问 http://localhost:8080/doc.html ,访问结果如下图:
界面说明:
左上角的下拉框对应的分组,如下图所示:
主页对应的是 ApiInfo 里的信息及 Docket 里的 groupName 。
在文档管理-全局参数设置可以设置全局请求头和参数。
2. 使用swagger
2.1. 常用注解
注解 | 用途 | 示例 |
@Api | 标记一个控制器类,描述该类的功能 | @Api(value = "用户管理相关接口", tags = {"用户管理"}) |
@ApiOperation | 描述一个 API 接口的方法 | @ApiOperation(value = "获取用户信息", notes = "根据用户ID获取用户信息") |
@ApiParam | 描述方法参数 | @ApiParam(name = "id", value = "用户ID", required = true) |
@ApiImplicitParam | 描述隐式参数,常用于 GET 请求的查询参数 | @ApiImplicitParam(name = "token", value = "访问令牌", required = true, dataType = "string", paramType = "header") |
@ApiImplicitParams | 描述多个隐式参数 | @ApiImplicitParams({ @ApiImplicitParam(name = "token", value = "访问令牌", required = true, dataType = "string", paramType = "header"), @ApiImplicitParam(name = "page", value = "页码", required = false, dataType = "integer", paramType = "query") }) |
@ApiResponse | 描述方法的响应信息 | @ApiResponse(code = 200, message = "成功返回用户信息") |
@ApiResponses | 描述多个响应信息 | @ApiResponses({ @ApiResponse(code = 200, message = "成功返回用户信息"), @ApiResponse(code = 404, message = "用户不存在") }) |
@ApiModel | 描述一个模型类 | @ApiModel(description = "用户信息") |
@ApiModelProperty | 描述模型类的属性 | @ApiModelProperty("主键值") |
@ApiIgnore | 忽略某个方法或类,不生成 API 文档 | @ApiIgnore |
@ApiExample | 描述 API 示例请求 | @ApiExample(value = "获取用户信息示例", source = "GET /users/{id}") |
2.2. 使用示例
controller层使用示例:
import com.zjp.knife4jswaggerdemo.pojo.User;
import io.swagger.annotations.*;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
@Api(value = "用户管理相关接口", tags = {"用户管理"})
public class UserController {@GetMapping("/getUser")@ApiOperation(value = "获取用户信息", notes = "根据用户ID获取用户信息")@ApiImplicitParams({@ApiImplicitParam(name = "token", value = "访问令牌", required = true, dataType = "string", paramType = "header"),@ApiImplicitParam(name = "page", value = "页码", required = false, dataType = "integer", paramType = "query")})@ApiResponses({@ApiResponse(code = 200, message = "成功返回用户信息"),@ApiResponse(code = 404, message = "用户不存在")})public User getUser(@ApiParam(name = "id", value = "用户ID", required = true) @RequestParam Integer id) {User user = new User();user.setId(1);user.setName("Alice");user.setAge(18);user.setSex("female");return user;}
}
实体类使用示例:
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;@Data
@ApiModel(value = "用户信息", description = "用户信息实体类")
public class User {@ApiModelProperty(value = "主键值", example = "1001")private Integer id;@ApiModelProperty(value = "名称", example = "Bob")private String name;@ApiModelProperty(value = "年龄", example = "32")private Integer age;@ApiModelProperty(value = "性别", example = "male")private String sex;
}
2.3. 启动测试
浏览器访问 http://localhost:8080/doc.html ,访问结果如下图:
实体类信息如下(不调用实体类这里不会展示实体类信息):
接口文档:
测试接口:
3. 其他配置
属性 | 默认值 | 说明值 |
---|---|---|
knife4j.enable | false | 是否开启Knife4j增强模式 |
knife4j.cors | false | 是否开启一个默认的跨域配置,该功能配合自定义Host使用 |
knife4j.production | false | 是否开启生产环境保护策略,详情参考文档 |
knife4j.basic | 对Knife4j提供的资源提供BasicHttp校验,保护文档 | |
knife4j.basic.enable | false | 关闭BasicHttp功能 |
knife4j.basic.username | basic用户名 | |
knife4j.basic.password | basic密码 | |
knife4j.documents | 自定义文档集合,该属性是数组 | |
knife4j.documents.group | 所属分组 | |
knife4j.documents.name | 类似于接口中的tag,对于自定义文档的分组 | |
knife4j.documents.locations | markdown文件路径,可以是一个文件夹(classpath:markdowns/* ),也可以是单个文件(classpath:md/sign.md ) | |
knife4j.setting | 前端Ui的个性化配置属性 | |
knife4j.setting.enable-after-script | true | 调试Tab是否显示AfterScript功能,默认开启 |
knife4j.setting.language | zh-CN | Ui默认显示语言,目前主要有两种:中文(zh-CN)、英文(en-US) |
knife4j.setting.enable-swagger-models | true | 是否显示界面中SwaggerModel功能 |
knife4j.setting.swagger-model-name | Swagger Models | 重命名SwaggerModel名称,默认 |
knife4j.setting.enable-document-manage | true | 是否显示界面中"文档管理"功能 |
knife4j.setting.enable-reload-cache-parameter | false | 是否在每个Debug调试栏后显示刷新变量按钮,默认不显示 |
knife4j.setting.enable-version | false | 是否开启界面中对某接口的版本控制,如果开启,后端变化后Ui界面会存在小蓝点 |
knife4j.setting.enable-request-cache | true | 是否开启请求参数缓存 |
knife4j.setting.enable-filter-multipart-apis | false | 针对RequestMapping的接口请求类型,在不指定参数类型的情况下,如果不过滤,默认会显示7个类型的接口地址参数,如果开启此配置,默认展示一个Post类型的接口地址 |
knife4j.setting.enable-filter-multipart-api-method-type | POST | 具体接口的过滤类型 |
knife4j.setting.enable-host | false | 是否启用Host |
knife4j.setting.enable-host-text | false | HOST地址 |
knife4j.setting.enable-home-custom | false | 是否开启自定义主页内容 |
knife4j.setting.home-custom-path | 主页内容Markdown文件路径 | |
knife4j.setting.enable-search | false | 是否禁用Ui界面中的搜索框 |
knife4j.setting.enable-footer | true | 是否显示Footer |
knife4j.setting.enable-footer-custom | false | 是否开启自定义Footer |
knife4j.setting.footer-custom-content | false | 自定义Footer内容 |
knife4j.setting.enable-dynamic-parameter | false | 是否开启动态参数调试功能 |
knife4j.setting.enable-debug | true | 启用调试 |
knife4j.setting.enable-open-api | true | 显示OpenAPI规范 |
knife4j.setting.enable-group | true | 显示服务分组 |
3.1. 访问权限控制
对应官网原文:3.5 访问权限控制 | Knife4j
3.1.1. 生产环境禁用
目前Springfox-Swagger以及Knife4j提供的资源接口包括如下:
资源 | 说明 |
---|---|
/doc.html | Knife4j提供的文档访问地址 |
/v2/api-docs-ext | Knife4j提供的增强接口地址,自2.0.6 版本后删除 |
/swagger-resources | Springfox-Swagger提供的分组接口 |
/v2/api-docs | Springfox-Swagger提供的分组实例详情接口 |
/swagger-ui.html | Springfox-Swagger提供的文档访问地址 |
/swagger-resources/configuration/ui | Springfox-Swagger提供 |
/swagger-resources/configuration/security | Springfox-Swagger提供 |
springdoc以及Knife4j提供的资源接口包括如下:
资源 | 说明 |
---|---|
/doc.html | Knife4j提供的文档访问地址 |
/v3/api-docs | springdoc提供的实例接口 |
/v3/api-docs/swagger-config | springdoc提供的分组接口 |
/v3/api-docs/** | 分组 |
/swagger-ui/index.html | springdoc提供的文档访问地址 |
当我们部署系统到生产系统,为了接口安全,需要屏蔽所有Swagger的相关资源
如果使用SpringBoot框架,只需在application.properties
或者application.yml
配置文件中配置:
knife4j:# 开启增强配置 enable: true# 开启生产环境屏蔽production: true
配置此属性后,所有资源都会屏蔽输出.
效果图如下:
3.1.2. 登录认证
不管是官方的swagger-ui.html
或者doc.html
,目前接口访问都是无需权限即可访问接口文档的,很多朋友以前问我能不能提供一个登陆界面的功能,开发者输入用户名和密码来控制界面的访问,只有知道用户名和密码的人才能访问此文档
做登录页控制需要有用户的概念,所以相当长一段时间都没有提供此功能
针对Swagger的资源接口,Knife4j
提供了简单的Basic认证功能
效果图如下:
允许开发者在配置文件中配置一个静态的用户名和密码,当对接者访问Swagger页面时,输入此配置的用户名和密码后才能访问Swagger文档页面,如果您使用SpringBoot开发,则只需在相应的application.properties
或者application.yml
中配置如下:
knife4j:# 开启增强配置 enable: true# 开启Swagger的Basic认证功能,默认是falsebasic:enable: true# Basic认证用户名username: test# Basic认证密码password: 123
如果用户开启了basic认证功能,但是并未配置用户名及密码,Knife4j
提供了默认的用户名和密码:
admin/123321
3.2. 请求参数缓存
在默认情况下,在接口调试的情况下,Knifetj对于接口的请求参数都会缓存起来,该配置可以在前端界面中的个性化设置中看到,如下图:
缓存的情况只会在后端没有给属性example
的情况下产生,如果后端在写Swagger的注解的时候,给每个字段赋予了example的值,那么,Knife4j
不会使用调试时缓存的值,而是会一直使用后端的example值。
当然,开发者也可以在后端控制文档的接口调试功能,针对请求后的参数是否需要缓存(自2.0.6版本开始)
yml配置如下:
knife4j:enable: truesetting:# 对于调试中的请求参数是否缓存进行开启配置,该参数默认为trueenable-request-cache: true
也可以手动清理缓存:
3.3. 动态请求参数
方式一:后台开启
开发者也可以通过开启Knife4j的增强配置,进行默认开启,配置如下:
knife4j:enable: truesetting:# 开启动态请求参数,true-开启,false-关闭enable-dynamic-parameter: true
方式二:界面开启
当在配置中勾选该选项后,我们的接口栏会有变化,如下图:
在原本已存在的参数栏下会出现一栏空的参数栏,开发者可以输入参数名称、参数值对参数进行添加
不管是参数名称的变化还是参数值的变化,变化后会自动追加一行新的调试栏参数,效果图如下:
相关文章:
Spring Boot 集成 Knife4j 的 Swagger 文档
在开发微服务应用时,API 文档的生成和维护是非常重要的一环。Swagger 是一个非常流行的 API 文档工具,可以帮助我们自动生成 RESTful API 的文档,并提供了一个友好的界面供开发者测试 API。本文将介绍如何在 Spring Boot 项目中集成 Knife4j …...
C# 创建快捷方式文件和硬链接文件
C# 创建快捷方式文件和硬链接文件 引言什么是快捷方式什么是硬链接文件硬链接与快捷方式不同 实现创建快捷方式文件实现创建硬链接文件小结 引言 什么是快捷方式 平常我们最常window桌面上点击的左下角带小箭头的文件就是快捷方式了,大家都很熟悉它。快捷方式是Wi…...
Linux高阶——1123—服务器基础服务器设备服务器基础能力
目录 1、服务器基础 1、服务器基本概述 2、服务器设计之初解决的问题 网络穿透 网络数据设备间的收发 3、服务器的类型C/S、B/S 2、服务器设备 将自己的服务器软件部署上线 3、代理服务器负载均衡,以及地址绑定方式 4、服务器的基础能力 1、服务器基础 1…...
LabVIEW串口通讯速度
LabVIEW串口通讯能达到的速度 LabVIEW支持高效的串口通讯,通过优化设置,理论上可以实现每次接收一个字节时达到1ms甚至更短的周期。不过,实际性能会受到以下因素的限制: 波特率(Baud Rate):…...
Jmeter中的监听器
3)监听器 1--查看结果树 用途 调试测试计划:查看每个请求的详细信息,帮助调试和修正测试计划。分析响应数据:查看服务器返回的响应数据,验证请求是否成功。检查错误:识别和分析请求失败的原因。 配置步骤…...
缺失的第一个正数(java)
题目描述: 给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。 示例 1: 输入:nums [1,2,0] 输出:3 解释:范围 […...
跨部门文件共享安全:平衡协作与风险的关键策略
在现代企业中,跨部门协作已成为推动业务发展的关键因素。然而,随着信息的自由流动和共享,文件安全风险也随之增加。如何在促进跨部门协作的同时,确保文件共享的安全性,成为了一个亟待解决的问题。 一、明确文件分类与…...
一键AI换脸软件,支持表情控制,唇形同步Facefusion-3.0.0发布!支持N卡和CPU,一键启动包
嗨,小伙伴们!还记得小编之前介绍的FaceFusion 2.6.1吗?今天给大家带来超级exciting的消息 —— FaceFusion 3.0.0闪亮登场啦! 🌟 3.0.0版本更新 🏗️ 全面重构:修复了不少小虫子,运行更稳定,再也不怕突然罢工啦! 😀 Live Portrait功能:新增…...
我要成为算法高手-递归篇
目录 题目1:汉诺塔题目2:合并两个有序链表题目3:反转链表题目4:两两交换链表中的结点题目5:Pow(x,n) 题目1:汉诺塔 面试题 08.06. 汉诺塔问题 - 力扣(LeetCode) 解题思路࿱…...
Git 提交的相对引用
Git 提交的相对引用 在 Git 中,使用 ~ 和 ^ 符号可以帮助你更灵活地引用提交历史中的特定提交。以下是这些符号的具体用法和示例: 1. ~(波浪号) ~ 符号用于指向上一个或多个父提交。它总是沿着第一个父提交的链向上追溯。 HEA…...
国内首家! 阿里云人工智能平台 PAI 通过 ITU 国际标准测评
近日,阿里云人工智能平台 PAI 顺利通过中国信通院组织的 ITU-T AICP-GA(Technical Specification for Artificial Intelligence Cloud Platform:General Architecture)国际标准和《智算工程平台能力要求》国内标准一致性测评&…...
CDAF / PDAF 原理 | PDAF、CDAF 和 LAAF 对比 | 图像清晰度评价指标
注:本文为 “CDAF / PDAF 原理 | PDAF、CDAF 和 LAAF 对比 | 图像清晰度评价指标” 几篇相关文章合辑。 文章中部分超链接、图片异常受引用之前的原文所限。 相机自动对焦原理 TriumphRay 于 2020-01-16 18:59:41 发布 凸透镜成像原理 这一部分大家中学应该就学过…...
小米C++ 面试题及参考答案下(120道面试题覆盖各种类型八股文)
指针和引用的区别?怎么实现的? 指针和引用有以下一些主要区别。 从概念上来说,指针是一个变量,它存储的是另一个变量的地址。可以通过指针来间接访问所指向的变量。例如,我们定义一个整型指针int *p;,它可以指向一个整型变量的内存地址。而引用是一个别名,它必须在定义的…...
WPF异步UI交互功能的实现方法
前面的文章我们提及过,异步UI的基础实现。基本思路主要是开启新的UI线程,并通过VisualTarget将UI线程上的Visual(即RootVisual)连接到主线程上的UI上即可渲染显示。 但是,之前的实现访问是没有交互能力的,视觉树上的UI并不能实现…...
2024 java大厂面试复习总结(一)(持续更新)
10年java程序员,2024年正好35岁,2024年11月公司裁员,记录自己找工作时候复习的一些要点。 java基础 hashCode()与equals()的相关规定 如果两个对象相等,则hashcode一定也是相同的两个对象相等,对两个对象分别调用eq…...
TCP/IP学习笔记
TCP\IP从实际应用的五层结构开始,自顶而下的去分析每一层。 TCP/IP五层架构概述 学术上面是TCP/IP四层架构,OSI/ISO是七层架构,实际中使用的是TCP/IP五层架构。 数据链路层 ICMP数据包分析 Wireshark抓包分析ICMP协议_wireshark抓ping包分析…...
基于IPMI的服务器硬件监控指标解读
在现代化数据中心中,服务器的稳定运行对于保障业务连续性至关重要。为了实时掌握服务器的健康状况,运维团队需要借助高效的监控工具。监控易作为一款功能强大的监控软件,支持使用IPMI(Intelligent Platform Management Interface&…...
相亲交友小程序项目介绍
一、项目背景 在当今快节奏的社会生活中,人们忙于工作和事业,社交圈子相对狭窄,寻找合适的恋爱对象变得愈发困难。相亲交友作为一种传统而有效的社交方式,在现代社会依然有着巨大的需求。我们的相亲交友项目旨在为广大单身人士提…...
Day3 洛谷Day3 1161+1179+1200+1304
零基础洛谷刷题记录 Day1 2024.11.18 Day2 2024.11.25 Day3 2024.11.26 文章目录 零基础洛谷刷题记录1161:题目描述1161:解题代码1161:学习成果1179:题目描述(成功写出)1179:解题代码1179&…...
【通俗理解】ELBO(证据下界)——机器学习中的“情感纽带”
【通俗理解】ELBO(证据下界)——机器学习中的“情感纽带” 关键词提炼 #ELBO #证据下界 #变分推断 #机器学习 #潜变量模型 #KL散度 #期望 #对数似然 第一节:ELBO的类比与核心概念【尽可能通俗】 ELBO,即证据下界,在…...
Vue: computed 计算属性
在Vue中,computed属性是用于计算和返回基于其他响应式数据的值的功能。 适合在模板中使用,因为能够根据依赖的数据自动更新。 当依赖的数据变化时,computed属性会重新计算,并且会将结果缓存,以提高性能。 computed的…...
【自动化Selenium】Python 网页自动化测试脚本(上)
目录 1、Selenium介绍 2、Selenium环境安装 3、创建浏览器、设置、打开 4、打开网页、关闭网页、浏览器 5、浏览器最大化、最小化 6、浏览器的打开位置、尺寸 7、浏览器截图、网页刷新 8、元素定位 9、元素交互操作 10、元素定位 (1)ID定位 &…...
数据库命令规范、数据库基本设计规范
所有数据库对象名称必须使用小写字母并用下划线分割 所有数据库对象名称禁止使用mysql保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来) 数据库对象的命名要能做到见名识意,并且最后不要超过32个字符 临时库表必…...
php常用伪协议整理
前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文整理php常见的伪协议 php伪协议介绍 直观点,就是php可以识别的协议。 类似于我们访问网站的http协议,我们用浏览器访问我们自己本地文件的file协议等。 php可以识别这些协议…...
Redis与MySQL如何保证数据一致性
Redis与MySQL如何保证数据一致性 简单来说 该场景主要发生在读写并发进行时,才会发生数据不一致。 主要流程就是要么先操作缓存,要么先操作Redis,操作也分修改和删除。 一般修改要执行一系列业务代码,所以一般直接删除成本较低…...
NIO三大组件
现在互联网环境下,分布式系统大相径庭,而分布式系统的根基在于网络编程,而netty恰恰是java领域的网络编程的王者,如果要致力于并发高性能的服务器程序、高性能的客户端程序,必须掌握netty网络编程。 NIO基础 NIO是从ja…...
智能呼叫中心是什么?
智能呼叫中心是什么? 作者:开源智能呼叫中心系统 FreeIPCC,Github地址:https://github.com/lihaiya/freeipcc 智能呼叫中心是指运用人工智能、大数据分析等技术,对来电进行智能分析和处理的客户服务中心。以下是对智能…...
LSTM原理解读与实战
在RNN详解及其实战中,简单讨论了为什么需要RNN这类模型、RNN的具体思路、RNN的简单实现等问题。同时,在文章结尾部分我们提到了RNN存在的梯度消失问题,及之后的一个解决方案:LSTM。因此,本篇文章主要结构如下ÿ…...
24.11.26 神经网络 参数初始化
神经网络 感知神经网络 神经网络(Neural Networks)是一种模拟人脑神经元网络结构的计算模型,用于处理复杂的模式识别、分类和预测等任务 生物学: 人脑可以看做是一个生物神经网络,由众多的神经元连接而成 树突&#…...
51单片机从入门到精通:理论与实践指南(一)
单片机在智能控制领域的应用已非常普遍,发展也很迅猛,学习和使用单片机的人员越来越多。虽然新型微控制器在不断推出,但51单片机价格低廉、易学易用、性能成熟,在家电和工业控制中有一定的应用,而且学好了51单片机&…...
wordpress获取文章总数、分类总数、tag总数等
在制作wordpress模板的时候会要调用网站的文章总数分类总数tag总数等这个数值,如果直接用count查询数据库那就太过分了。好在wordpress内置了一些标签可以直接获取到这些数值,本文整理了一些常用的wordpress网站总数标签。 文章总数 <?php $count_…...
Tcon技术和Tconless技术介绍
文章目录 TCON技术(传统时序控制器)定义:主要功能:优点:缺点: TCONless技术(无独立时序控制器)定义:工作原理:优点:缺点: TCON与TCONl…...
WinFrom调用webapi接口另一个方法及其应用实例
1.调用接口方法 代码如下: public class WebAPI{#region WebAPI调用 public async Task<string> Call_Webapi(string Url, string Json) //url传入的是接口名称,json传入的是接口参数{string responseBody string.Empty; //responseBod…...
上海乐鑫科技一级代理商飞睿科技,ESP32-C61高性价比WiFi6芯片高性能、大容量
在当今快速发展的物联网市场中,无线连接技术的不断进步对智能设备的性能和能效提出了更高要求。为了满足这一需求,乐鑫科技推出了ESP32-C61——一款高性价比的Wi-Fi 6芯片,旨在为用户设备提供更出色的物联网性能,并满足智能设备连…...
【机器学习】数据集合集!
本文将为您介绍经典、热门的数据集,希望对您在选择适合的数据集时有所帮助。 1 privacy 更新时间:2024-11-26 访问地址: GitHub 描述: 此存储库包含 TensorFlow Privacy(一种 Python)的源代码 库,其中包…...
GitLab使用操作v1.0
1.前置条件 Gitlab 项目地址:http://******/req Gitlab账户信息:例如 001/******自己的分支名称:例如 001-master(注:master只有项目创建者有权限更新,我们只能更新自己分支,然后创建合并请求&…...
企业后端多租户管理平台
1 简介 此系统在企业后端管理系统上进行的更改,用于快速开发租户管理平台。项目中详细的功能请查看文章:企业后端系统通用模版_后端模板-CSDN博客 支持多租户,支持多租户切换,支持多租户数据隔离,支持多租户数据同步等…...
【模型学习之路】PyG的使用+基于点的任务
这一篇是关于PyG的基本使用 目录 前言 PyG的数据结构 演示 图的可视化 基于点的任务 任务分析 MLP GCN 前言 对图结构感兴趣的朋友可以学一下常用的有关图结构的库:networkx详细介绍 networkx 库,探讨它的基本功能、如何创建图、操作图以及其常…...
【ubuntu】数学人的环境搭建
Python 语言环境 python 的 pip 第三方库管理 sudo apt install python3-pippython 的 idle 界面 sudo apt install idle3R 语言环境 sudo apt install r-cran-zoo### RStudio 界面 ubuntu sudo snap install rstudio --classicJulia 语言环境 sudo snap install julia --…...
Android 常用命令和工具解析之Trace相关
目录 1、Perfetto基本用法 1.1 perfetto抓取命令 1.2 Perfetto主界面 1.3 Perfetto常用技巧 1.3.1 CPU的运行状态 1.3.2 CPU的频率 1.3.3 CPU的所有任务 1.3.4 判断是否低内存 1.3.5 CPU的负载计算 1.3.6 查看某进程是否运行在大核 1.3.7 CPU的大核占用率计算 2、应…...
使用IDEA构建springboot项目+整合Mybatis
目录 目录 1.Springboot简介 2.SpringBoot的工作流程 3.SpringBoot框架的搭建和配置 4.用Springboot实现一个基本的select操作 5.SpringBoot项目部署非常简单,springBoot内嵌了 Tomcat、Jetty、Undertow 三种容器,其默认嵌入的容器是 Tomcat,…...
Python学习34天
import random class Game: peo0 rob0 # # def __init__(self,peo,rob): # self.peopeo # self.robrob def Play(self): """ 石头剪刀布游戏,0代表石头,1代见到,2代表石头 …...
leetcode hot100【LeetCode 215.数组中的第K个最大元素】java实现
LeetCode 215.数组中的第K个最大元素 题目描述 给定一个整数数组 nums 和一个整数 k,请返回数组中第 k 个最大的元素。 请注意,要求排名是从大到小的,因此第 k 个最大元素是排序后的第 k 个元素。你需要设计一个高效的算法来解决这个问题。…...
科技赋能:企业如何通过新技术提升竞争力的策略与实践
引言 在当今瞬息万变的商业环境中,科技的迅猛发展正在重新定义行业的游戏规则。无论是小型企业还是跨国巨头,都感受到数字化转型的迫切需求。过去,企业竞争力更多依赖于成本控制、资源调配或市场覆盖,而如今,新技术的引…...
SAP开发语言ABAP开发入门
1. 了解ABAP开发环境和基础知识 - ABAP简介 - ABAP(Advanced Business Application Programming)是SAP系统中的编程语言,主要用于开发企业级的业务应用程序,如财务、物流、人力资源等模块的定制开发。 - 开发环境搭建 - 首先需…...
快速理解微服务中Ribbon的概念
一.基本概念 1.在微服务架构中,Ribbon 是一个客户端负载均衡器,用于控制服务间的通信方式。 2.Ribbon 是一个开源的库,最早由 Netflix 开发,用于实现客户端负载均衡。 3.Ribbon 主要解决的是在微服务架构中,多个服务…...
MTK主板_安卓主板方案_MTK联发科主板定制开发
联发科(MTK)主板以其强大的性能和多样化的功能而受到广泛关注。该平台包括多个型号,例如MT6761、MT8766、MT6762、MT6765、MT8768和MT8788等,均配置了四核或八核64位处理器,主频可高达2.0GHz。采用先进的12nm工艺,搭载Android 11.…...
Linux:文件管理(一)——文件描述符fd
目录 一、文件基础认识 二、C语言操作文件的接口 1.> 和 >> 2.理解“当前路径” 三、相关系统调用 1.open 2.文件描述符 3.一切皆文件 4.再次理解重定向 一、文件基础认识 文件 内容 属性。换句话说,如果在电脑上新建了一个空白文档࿰…...
Excel的图表使用和导出准备
目的 导出Excel图表是很多软件要求的功能之一,那如何导出Excel图表呢?或者说如何使用Excel图表。 一种方法是软件生成图片,然后把图片写到Excel上,这种方式,因为格式种种原因,导出的图片不漂亮,…...
Python + 深度学习从 0 到 1(00 / 99)
希望对你有帮助呀!!💜💜 如有更好理解的思路,欢迎大家留言补充 ~ 一起加油叭 💦 欢迎关注、订阅专栏 【深度学习从 0 到 1】谢谢你的支持! ⭐ 什么是深度学习? 人工智能、机器学习与…...