Swagger使用详解
目录
一、简介
二、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 {@Beanpublic 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 相关的接口,或者有其他需求,可以看以下代码和注释理解运用
@Beanpublic 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 分组名修改
@Beanpublic 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 {@Beanpublic 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();}@Beanpublic 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 配置中添加请求头的配置。
@Beanpublic 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的信息
相关文章:

Swagger使用详解
目录 一、简介 二、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.A…...

ToBeWritten之车联网安全中常见的TOP 10漏洞
也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 转移发布平台通知:将不再在CSDN博客发布新文章,敬…...
软考-密码学概述
本文为作者学习文章,按作者习惯写成,如有错误或需要追加内容请留言(不喜勿喷) 本文为追加文章,后期慢慢追加 by 2023年10月 密码学基本概念 密码学的主要目的是保持明文的秘密以防止攻击者获知,而密码分…...

windows 2003、2008远程直接关闭远程后设置自动注销会话
1、2003系统: 按开始—运行—输入“tscc.msc”,打开“终端服务配置”。 单击左边窗口的“连接”项,右边窗口中右击“RDP-TCP”,选择“属性”。 单击“会话”项,勾选“替代用户设置”,在“结束已断开的会话”…...
iOS BUG UIView转UIImage模糊失真
iOS BUG UIView转UIImage模糊失真 ##UIView转成Image - (UIImage *)capture {UIGraphicsBeginImageContextWithOptions(self.bounds.size, YES, 0.0);[self.layer renderInContext:UIGraphicsGetCurrentContext()];UIImage *img UIGraphicsGetImageFromCurrentImageContext(…...

如何在10分钟内让Android应用大小减少 60%?
一个APP的包之所以大,主要包括一下文件 代码libso本地库资源文件(图片,音频,字体等) 瘦身就主要瘦这些。 一、打包的時候刪除不用的代码 buildTypes {debug {...shrinkResources true // 是否去除无效的资源文件(如…...
网络代理技术:保障隐私与增强安全
在当今数字化的世界中,网络代理技术的重要性日益凸显。无论您是普通用户还是网络工程师,了解如何使用代理技术来保护隐私和增强网络安全都是至关重要的。本文将深入探讨Socks5代理、IP代理以及它们在网络安全和隐私保护中的关键作用。 1. Socks5代理&am…...

数据结构 | (二) List
什么是 List 在集合框架中, List 是一个接口,继承自 Collection 。 Collection 也是一个接口 ,该接口中规范了后序容器中常用的一些方法,具体如下所示: Iterable 也是一个接口,表示实现该接口的类是可以逐个…...

[NewStarCTF 2023 公开赛道] week1 Crypto
brainfuck 题目描述: [>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<-]>>>>>>>.>----.<-----.>-----.>-----.<<<-.>>..…...
C语言中文网 - Shell脚本 - 0
教程目录如下: 第1章 Shell基础(开胃菜) 1. Shell是什么?1分钟理解Shell的概念! 2. Shell是运维人员必须掌握的技能 3. 常用的Shell有哪些? 4. 进入Shell的两种方式 5. Linux Shell命令的基本格式 6.…...

Transformer预测 | Pytorch实现基于Transformer 的锂电池寿命预测(CALCE数据集)
文章目录 效果一览文章概述模型描述程序设计参考资料效果一览 文章概述 Pytorch实现基于Transformer 的锂电池寿命预测,环境为pytorch 1.8.0,pandas 0.24.2 随着充放电次数的增加,锂电池的性能逐渐下降。电池的性能可以用容量来表示,故寿命预测 (RUL) 可以定义如下: SOH(t…...

2023年【通信安全员ABC证】找解析及通信安全员ABC证考试总结
题库来源:安全生产模拟考试一点通公众号小程序 通信安全员ABC证找解析参考答案及通信安全员ABC证考试试题解析是安全生产模拟考试一点通题库老师及通信安全员ABC证操作证已考过的学员汇总,相对有效帮助通信安全员ABC证考试总结学员顺利通过考试。 1、【…...
前端框架Vue2.0+Vue3.0学习笔记01
一、Vue技术_课程简介 1、前端框架小白 2、熟练掌握Vue2 3、轻松玩转Vue3 ①、vue基础 ②、vue-cli ③、vue-router ④、vuex ⑤、element-ui ⑥、vue3 二、Vue技术_Vue简介 1、Vue是什么? 一套用于构建用户界面(把你拿到手里的数据…...

iOS App上架全流程及相关处理
iOS app上架总体流程: 一、IOS上架整个流程 1、申请开发者账号 2、创建APP ID及申请证书 3、itunes connect 创建APP 4、打包 上传APP 5、提交APP,上线成功 1、申请开发者账号 苹果开发者账号主要分为三种:个人账号、公司账号、企业账…...

解决WordPress升级后提示:无需升级,您的WordPress数据库已经是最新的了
问题描述 当升级了 WordPress 6.3 后,登录后台出现了提示:无需升级,您的WordPress 数据库已经是最新的了。并且无法进入后台了。 出现这个问题的原因可能是你网站开启了 Memcached 缓存。 如何验证是否开启了 Memcached 缓存?检…...

springcloud之项目实战搭建单体
写在前面 在上篇文章 中我们介绍了项目的整体内容以及架构,本文就开始实现一个单体的版本,在之后的文章中,在使用springcloud相关组件将这个单体的版本一步步的拆分为微服务的版本,在开始之前再贴下组件图: 本文我们分…...

Mac 点击桌面 出现黑边框 解决
1、桌面黑框效果 2、解决:设置为 仅在台前调度中...

深度学习(2)---循环神经网络(RNN)
文章目录 一、序列数据和语言模型1.1 序列数据1.2 语言模型 二、循环神经网络(RNN)2.1 概述2.2 门控循环单元(GRU)2.3 长短期记忆网络(LSTM) 一、序列数据和语言模型 1.1 序列数据 1. 在深度学习中,序列数据(Sequence data)是指具有前后顺序…...
[NOIP2010 提高组] 机器翻译
[NOIP2010 提高组] 机器翻译 题目背景 小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章。 题目描述 这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义来替换。对于每个英文单词…...

配置文件生成器-秒杀SSM的xml整合
配置文件生成器-秒杀SSM的xml整合 思路: 通过简单的配置,直接生成对应配置文件。 maven坐标 <dependencies><!-- 配置文件生成 --><dependency><groupId>org.freemarker</groupId><artifactId>freemarker<…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...

家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...

微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
GitHub 趋势日报 (2025年06月06日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关
在水泥厂的生产流程中,工业自动化网关起着至关重要的作用,尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关,为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多,其中不少设备采用Devicenet协议。Devicen…...
0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化
是不是受够了安装了oracle database之后sqlplus的简陋,无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话,配置.bahs_profile后也能解决上下翻页这些,但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可,…...