Spring Cloud Gateway 网关整合 Knife4j

news/2024/5/20 2:06:35/文章来源:https://blog.csdn.net/qq_41694906/article/details/126666731

文章目录

  • 1:环境准备
  • 2:gateway服务设置
    • 1:导包
    • 2:yml配置
    • 3:添加配置类,从网关服务中获取服务列表
    • 4:重写并覆盖/swagger-resources接口
  • 3:其他业务逻辑服务设置
    • 1:其他服务导包
    • 2:其他服务配置yml
    • 3:其他服务设置swagger配置类
  • 4:优化:将swagger配置作为一个微服务
    • 1:创建code-swagger服务
    • 2:导包
    • 3:写配置文件
      • 配置1:swagger的实体类,这个是对应在配置文件中写的
      • 配置二:swagger的配置类
    • 4:在 META-INF 添加spring配置
    • 5:其他服务引用这个swagger微服务
      • 6:各模块的配置参数

当我们使用Knife4j来对服务的接口文档进行管理时是非常美观和舒服的;但是当系统中的微服务越来越多的时候,我们需要访问十几个端口,这是非常痛苦的;
有没有一种办法可以将所有微服务的接口文档在同一个可视化页面进行展示,这样我们就可以统一管理了;为此我们可以通过SpringCloudGateway网关+注册中心nacos+Knige4j对所有微服务的接口文档进行统一管理

1:环境准备

本文章的前置基础是默认大家已经会了Gateway网关,Nacos注册中心,swagger和Knife4j配置,如果不太清楚,环境阅读这些文章:

Gateway-02-gateway路由规则和过滤器
Nacos-02-Nacos的配置中心和服务发现
swagger-springboot详解
swagger-优美的Knife4j文档

2:gateway服务设置

1:导包

 <dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><!--在引用时请在maven中央仓库搜索3.X最新版本号--><version>3.0.2</version></dependency>

2:yml配置

server:port: 18080spring:application:name: code-gatewaycloud:nacos:discovery:server-addr: ip:8848namespace: 61f8c730-8be2-4caf-967f-9950107f8e66config:server-addr: ip:8848namespace: 61f8c730-8be2-4caf-967f-9950107f8e66name: dev.ymlfile-extension: ymlgateway:discovery:locator:# enabled:默认为false,设置为true表明spring cloud gateway开启服务发现和路由的功能,网关自动根据注册中心的服务名为每个服务创建一个router,将以服务名开头的请求路径转发到对应的服务enabled: true# lowerCaseServiceId:启动 locator.enabled=true 自动路由时,路由的路径默认会使用大写ID,若想要使用小写ID,可将lowerCaseServiceId设置为truelower-case-service-id: trueroutes:- id: code-orderuri: lb://code-orderpredicates:- Path=/code-order/**filters:- StripPrefix=1- id: code-useruri: lb://code-userpredicates:- Path=/code-user/**filters:- StripPrefix=1

3:添加配置类,从网关服务中获取服务列表

在使用 SpringBoot 等单体架构集成 swagger 时,我们是基于包路径进行业务分组,然后在前端进行不同模块的展示,而在微服务架构下,一个服务就类似于原来我们写的一个业务组。springfox-swagger 提供的分组接口是 swagger-resource,返回的是分组接口名称、地址等信息,而在Spring Cloud微服务架构下,我们需要重写该接口,改由通过网关的注册中心动态发现所有的微服务文档,
在这里插入图片描述

package com.wkl.codegateway.config;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import springfox.documentation.swagger.web.SwaggerResource;
import springfox.documentation.swagger.web.SwaggerResourcesProvider;import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;/*** 使用Spring Boot单体架构集成swagger时,是通过包路径进行业务分组,然后在前端进行不同模块的展示,而在微服务架构下,单个服务类似于原来业务组;* springfox-swagger提供的分组接口是swagger-resource,返回的是分组接口名称、地址等信息;* 在Spring Cloud微服务架构下,需要swagger-resource重写接口,由网关的注册中心动态发现所有的微服务文档*/
@Primary
@Configuration
public class SwaggerResourceConfig implements SwaggerResourcesProvider
{/*** swagger2默认的url后缀*/private static final String SWAGGER2_URL = "/v2/api-docs";/*** 路由定位器*/@Autowiredprivate RouteLocator routeLocator;/*** 网关应用名称*/@Value("${spring.application.name}")private String gatewayName;/*** 获取 Swagger 资源*/@Overridepublic List<SwaggerResource> get() {//接口资源列表List<SwaggerResource> resources = new ArrayList<>();//服务名称列表List<String> routeHosts = new ArrayList<>();// 1. 获取路由Uri 中的Host=> 服务注册则为服务名=》app-service001routeLocator.getRoutes().filter(route -> route.getUri().getHost() != null).filter(route -> !gatewayName.equals(route.getUri().getHost())).subscribe(route -> routeHosts.add(route.getUri().getHost()));// 2. 创建自定义资源Set<String> existsServer = new HashSet<>();     // 去重,多负载服务只添加一次for (String routeHost : routeHosts) {String serviceUrl = "/" + routeHost + SWAGGER2_URL; // 后台访问添加服务名前缀if(!existsServer.contains(serviceUrl)){existsServer.add(serviceUrl); //加过的放在set中SwaggerResource swaggerResource = new SwaggerResource(); // 创建Swagger 资源swaggerResource.setUrl(serviceUrl); // 设置访问地址swaggerResource.setName(routeHost); // 设置名称swaggerResource.setSwaggerVersion("2.0");resources.add(swaggerResource);}}return resources;}
}

4:重写并覆盖/swagger-resources接口

  • 使用Spring Boot单体架构集成swagger时,是通过包路径进行业务分组,然后在前端进行不同模块的展示,而在微服务架构下,单个服务类似于原来业务组;
  • springfox-swagger提供的分组接口是swagger-resource,返回的是分组接口名称、地址等信息;
  • 在Spring Cloud微服务架构下,需要swagger-resource重写接口,由网关的注册中心动态发现所有的微服务文档
package com.wkl.codegateway.handle;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Mono;
import springfox.documentation.swagger.web.*;import java.util.Optional;/*** 获取api接口信息*/
@RestController
@RequestMapping ("/swagger-resources")
public class SwaggerHandler
{@Autowired(required = false)private SecurityConfiguration securityConfiguration;@Autowired(required = false)private UiConfiguration uiConfiguration;private final SwaggerResourcesProvider swaggerResources;@Autowiredpublic SwaggerHandler(SwaggerResourcesProvider swaggerResources) {this.swaggerResources = swaggerResources;}@GetMapping("/configuration/security")public Mono<ResponseEntity<SecurityConfiguration>> securityConfiguration(){return Mono.just(new ResponseEntity<>(Optional.ofNullable(securityConfiguration).orElse(SecurityConfigurationBuilder.builder().build()), HttpStatus.OK));}@GetMapping ("/configuration/ui")public Mono<ResponseEntity<UiConfiguration>> uiConfiguration(){return Mono.just(new ResponseEntity<>(Optional.ofNullable(uiConfiguration).orElse(UiConfigurationBuilder.builder().build()), HttpStatus.OK));}@GetMapping("")public Mono<ResponseEntity> swaggerResources(){return Mono.just((new ResponseEntity<>(swaggerResources.get(), HttpStatus.OK)));}
}

至此gateway服务方面的配置结束

3:其他业务逻辑服务设置

当我们设置好gateway服务后,其他配置服务无非就是配置一下Knige4j原本的信息,比如我有两个服务一个是user(人员)模块,一个是order(订单)模块

1:其他服务导包

<dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><!--在引用时请在maven中央仓库搜索3.X最新版本号--><version>3.0.2</version></dependency>

2:其他服务配置yml

其他服务的yml配置跟gateway无关,只需要配置正常的nacos注册中心即可;保证服务注册到nacos,可以被网关gateway读取到。

server:port: 18081
spring:application:name: code-ordercloud:nacos:#注册中心discovery:server-addr: ip:8848namespace: 61f8c730-8be2-4caf-967f-9950107f8e66config:server-addr: ip:8848namespace: 61f8c730-8be2-4caf-967f-9950107f8e66name: dev.ymlfile-extension: yml

3:其他服务设置swagger配置类

package com.example.codeorder.config;import org.springframework.beans.factory.annotation.Value;
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.service.VendorExtension;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc;import java.util.ArrayList;/*** @author Boss* ip:port/doc.html*/
@Configuration
@EnableSwagger2
public class SwaggerConfig {@Value("${spring.application.name}")private String serviceName;//配置swagger的Docket的bean实例@Beanpublic Docket docket() {return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select()//注意basePackage改成自己每个项目的路径.apis(RequestHandlerSelectors.basePackage("com.example.codeorder.controller")).paths(PathSelectors.any()).build();}//配置swagger信息private ApiInfo apiInfo() {Contact contact = new Contact("作者姓名", "", "");return new ApiInfo(serviceName+"接口文档","Api Documentation","1.0","urn:tos",contact,"Apache 2.0","http://www.apache.org/licenses/LICENSE-2.0",new ArrayList<VendorExtension>());}
}

4:优化:将swagger配置作为一个微服务

按照上述的方法,我需要每个微服务都创建一个swaggerconfig类,那么当微服务特别多的时候,这样就不合适了;
我们可以将swagger这个配置,抽取成一个微服务,其他服务引入他即可

1:创建code-swagger服务

在这里插入图片描述

2:导包

<?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.wkl</groupId><artifactId>gateway-nacos-knife4j</artifactId><version>1.0-SNAPSHOT</version></parent><groupId>com.wkl</groupId><artifactId>code-swagger</artifactId><version>0.0.1-SNAPSHOT</version><name>code-swagger</name><description>code-swagger</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><!--在引用时请在maven中央仓库搜索3.X最新版本号--><version>3.0.2</version></dependency></dependencies></project>

3:写配置文件

配置1:swagger的实体类,这个是对应在配置文件中写的

package com.wkl.codeswagger.config;import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
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.ApiSelectorBuilder;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;/*** @author Boss* ip:port/doc.html*/
//@Configuration
@Configuration
//@EnableSwagger2
@EnableKnife4j
@ConditionalOnProperty(name = "swagger.enabled", matchIfMissing = true)
public class SwaggerConfig {/*** 默认的排除路径,排除Spring Boot默认的错误处理路径和端点*/private static final List<String> DEFAULT_EXCLUDE_PATH = Arrays.asList("/error", "/actuator/**");private static final String BASE_PATH = "/**";@Bean@ConditionalOnMissingBeanpublic SwaggerProperties swaggerProperties() {return new SwaggerProperties();}//配置swagger的Docket的bean实例@Beanpublic Docket docket(SwaggerProperties swaggerProperties) {// base-path处理if (swaggerProperties.getBasePath().isEmpty()) {swaggerProperties.getBasePath().add(BASE_PATH);}// noinspection uncheckedList<Predicate<String>> basePath = new ArrayList<Predicate<String>>();swaggerProperties.getBasePath().forEach(path -> basePath.add(PathSelectors.ant(path)));// exclude-path处理if (swaggerProperties.getExcludePath().isEmpty()) {swaggerProperties.getExcludePath().addAll(DEFAULT_EXCLUDE_PATH);}List<Predicate<String>> excludePath = new ArrayList<>();swaggerProperties.getExcludePath().forEach(path -> excludePath.add(PathSelectors.ant(path)));ApiSelectorBuilder builder = new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo(swaggerProperties)).select().apis(RequestHandlerSelectors.basePackage(swaggerProperties.getBasePackage())).paths(PathSelectors.any());swaggerProperties.getBasePath().forEach(p -> builder.paths(PathSelectors.ant(p)));swaggerProperties.getExcludePath().forEach(p -> builder.paths(PathSelectors.ant(p).negate()));return builder.build();}private ApiInfo apiInfo(SwaggerProperties swaggerProperties) {return new ApiInfoBuilder().title(swaggerProperties.getTitle()).description(swaggerProperties.getDescription()).license(swaggerProperties.getLicense()).licenseUrl(swaggerProperties.getLicenseUrl()).termsOfServiceUrl(swaggerProperties.getTermsOfServiceUrl()).contact(new Contact(swaggerProperties.getContact().getName(), swaggerProperties.getContact().getUrl(), swaggerProperties.getContact().getEmail())).version(swaggerProperties.getVersion()).build();}
}

配置二:swagger的配置类

package com.wkl.codeswagger.config;import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
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.ApiSelectorBuilder;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;/*** @author Boss* ip:port/doc.html*/
//@Configuration
@Configuration
//@EnableSwagger2
@EnableKnife4j
@ConditionalOnProperty(name = "swagger.enabled", matchIfMissing = true)
public class SwaggerConfig {/*** 默认的排除路径,排除Spring Boot默认的错误处理路径和端点*/private static final List<String> DEFAULT_EXCLUDE_PATH = Arrays.asList("/error", "/actuator/**");private static final String BASE_PATH = "/**";@Bean@ConditionalOnMissingBeanpublic SwaggerProperties swaggerProperties() {return new SwaggerProperties();}//配置swagger的Docket的bean实例@Beanpublic Docket docket(SwaggerProperties swaggerProperties) {// base-path处理if (swaggerProperties.getBasePath().isEmpty()) {swaggerProperties.getBasePath().add(BASE_PATH);}// noinspection uncheckedList<Predicate<String>> basePath = new ArrayList<Predicate<String>>();swaggerProperties.getBasePath().forEach(path -> basePath.add(PathSelectors.ant(path)));// exclude-path处理if (swaggerProperties.getExcludePath().isEmpty()) {swaggerProperties.getExcludePath().addAll(DEFAULT_EXCLUDE_PATH);}List<Predicate<String>> excludePath = new ArrayList<>();swaggerProperties.getExcludePath().forEach(path -> excludePath.add(PathSelectors.ant(path)));ApiSelectorBuilder builder = new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo(swaggerProperties)).select().apis(RequestHandlerSelectors.basePackage(swaggerProperties.getBasePackage())).paths(PathSelectors.any());swaggerProperties.getBasePath().forEach(p -> builder.paths(PathSelectors.ant(p)));swaggerProperties.getExcludePath().forEach(p -> builder.paths(PathSelectors.ant(p).negate()));return builder.build();}private ApiInfo apiInfo(SwaggerProperties swaggerProperties) {return new ApiInfoBuilder().title(swaggerProperties.getTitle()).description(swaggerProperties.getDescription()).license(swaggerProperties.getLicense()).licenseUrl(swaggerProperties.getLicenseUrl()).termsOfServiceUrl(swaggerProperties.getTermsOfServiceUrl()).contact(new Contact(swaggerProperties.getContact().getName(), swaggerProperties.getContact().getUrl(), swaggerProperties.getContact().getEmail())).version(swaggerProperties.getVersion()).build();}
}

4:在 META-INF 添加spring配置

因为code-swagger模块时一个公共模块,并且不是一个web工程,想要让模块内的配置类生效并且加入ioc容器中,必须在resources目录下先建文件夹 META-INF,文件夹下创建 spring.factories 文件 ,内容如下

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\com.wkl.codeswagger.config.SwaggerConfig

5:其他服务引用这个swagger微服务

其他服务模块在pom中将swagger服务当做一个微服务进行引用即可

   <!--引入swagger模块配置代码--><dependency><groupId>com.wkl</groupId><artifactId>code-swagger</artifactId><version>0.0.1-SNAPSHOT</version></dependency>

6:各模块的配置参数

因为其他业务模块已经引入了swagger模块的配置类,所以只需要在yml文件中进行配置即可,或者直接在nacos中进行配置,这样后续也方便维护和修改

# swagger配置
swagger:enabled: truetitle: user模块接口文档license: Powered By ruoyilicenseUrl: https://ruoyi.vipbasePackage: com.wkl.codeuser.controller

注:其他配置参数可以参考4.3中配置一的实体类中的参数进行配置,只需要保证参数名和实体类的名称一样即可;
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Unity面试】 Unity基础核心 | 面试真题 | 全面总结 | 建议收藏

你知道的越多&#xff0c;你不知道的越多 &#x1f1e8;&#x1f1f3;&#x1f1e8;&#x1f1f3;&#x1f1e8;&#x1f1f3; 点赞再看&#xff0c;养成习惯&#xff0c;别忘了一键三连哦 &#x1f44d;&#x1f44d;&#x1f44d; 文章持续更新中 &#x1f4dd;&#x1f4dd;…

springboot项目如何打包成.sh脚本形式运行|assemly插件打包自定义脚本参数

0. 引言 springboot作为目前主流的java开发框架&#xff0c;因为便捷和易上手的特性&#xff0c;深受开发者欢迎。springboot默认以jar包形式&#xff0c;通过java -jar指令运行 但这样的启动方式实际上不是很友好&#xff0c;我们常常看到各类组建通过bin目录下的start.sh脚…

阿里、腾讯、百度大厂的程序员编程指南规范

众所周知&#xff0c;现在软件行业不仅要求功能完成&#xff0c;对代码规范也是要求非常高的。一个编程规范不仅是代码美观、易读&#xff0c;在调试bug、程序安全等方面都是有影响的。比如&#xff1a;代码中的魔法数字&#xff0c;要求提取枚举、SQL语句要求不能采用拼接方式…

我开发了一个下载器 带宽拉满

大家好&#xff0c;我是 jonssonyan&#xff0c;一个痴迷软件技术的人。今天和大家分享一个我之前开发的 PC 端下载器。 准确的说是一款基于 AriaNg 和 Aria2 的 PC 端下载器。目前只支持 Windows 平台&#xff0c;我给它取名叫Aria2-X&#xff0c;并且将代码开源在 GitHub 上…

YOLOv7改进之二十五:引入Swin Transformer

​前 言&#xff1a;作为当前先进的深度学习目标检测算法YOLOv7&#xff0c;已经集合了大量的trick&#xff0c;但是还是有提高和改进的空间&#xff0c;针对具体应用场景下的检测难点&#xff0c;可以不同的改进方法。此后的系列文章&#xff0c;将重点对YOLOv7的如何改进进行…

终于拿到了爆火全网的进一线大厂程序员必看的1700道java面试题

爆火全网的进一线大厂程序员必看的1700道java面试题到底有多牛&#xff1f; 牛不牛不敢说&#xff0c;但是有好多程序员是靠这一套1700道高频面试题&#xff0c;顺利收到很多大厂offer&#xff01; 以至于&#xff0c;到现在为止&#xff0c;大厂都开始按照这一套1700道面试题…

北京十大靠谱律师事务所排名(口碑榜单)

律师行业很多人并不太了解&#xff0c;其实简单的案件一般不需要律师有丰富的经验积累&#xff0c;因此委托入行不久的年轻律师&#xff0c;他们能花更多时间去帮你处理&#xff0c;态度好&#xff0c;更重要的是收费低。 复杂的或者涉及金额特别大的案子委托资深律师。当然不是…

【Lua 入门基础篇(十)】文件I/O

文章目录一、文件 I/O二、简单模式1. io.lines([filename])三、完全模式1. file:lines()一、文件 I/O Lua I/O 库用于读取和处理文件。分为简单模式、完全模式。 简单模式&#xff08;simple model&#xff09;&#xff1a;拥有一个当前输入文件和一个当前输出文件&#xff0c…

倾向得分匹配PSM案例分析

倾向得分匹配(PSM)&#xff0c;是一种模仿RCT随机对照试验随机化分组&#xff0c;提高组间均衡性&#xff0c;进而达到降低混杂因素影响目的一种数据处理策略。PSM在计量研究&#xff0c;临床医学等领域有着广泛的应用。 1.案例背景与分析策略 1.1 案例背景介绍 某企业想评价…

IDEA编译项目找不到符号

问题描述 场景: 某个bean添加了一个字段; idea使用Git拉取代码后,新建分支提交,然后修改再切换其他分支,发生了代码冲突; 然后解决代码冲突,开始编译项目,报错找不到符号. 问题分析 1.查看控制台日志输出,找报错代码行。 2.lombok插件注解未生效。 3.编码问题; 4.jdk…

vue基础语法(上)

目录 一、插值 1、文本 2、html 3、属性 4、表达式 5、class绑定 6、style绑定 二、指令 1、核心指令 注&#xff1a;v-show和v-if区别 三、过滤器 1、全局过滤器 2、局部过滤器 四、计算属性与监听属性 1、计算属性 2、监听属性 3、计算属性和监听属性的区别 …

李沐d2l(十一)--锚框

文章目录一、概念二、代码1 生成锚框2 IoU(交互比)3 将真实边界框分配给锚框4 标记类和偏移5 应用逆偏移变换来返回预测的边界框坐标6 nms7 将非极大值抑制应用于预测边界框一、概念 在目标检测算法中&#xff0c;通常会在输入图像中采样大量的区域&#xff08;生成多个边缘框&…

ELASTICSEARCH快速入门

1. ELASTICSEARCH 1、安装elastic searchdokcer中安装elastic search (1)下载ealastic search和kibana docker pull elasticsearch:7.6.2docker pull kibana:7.6.2 (2)配置 mkdir -p /mydata/elasticsearch/config 创建目录mkdir -p /mydata/elasticsearch/dataecho "…

fastapi+mongo+qlib:体系化构建AI量化投研平台

百天计划之第34篇&#xff0c;关于“AI量化投资研究平台”建设。 从今天开始要开始一条主线——就是开始搭建整个投研平台。 如果说8月开始是知识点的梳理&#xff0c;一些基础技术的准备&#xff08;以qlib和机器学习为核心&#xff09;&#xff0c;9月开始重点是“以解决真…

.NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。

更新数据 第一种&#xff1a; 先从数据库中取出数据&#xff0c;然后再更新字段。效率较低&#xff0c;需要2次数据库操作&#xff1b; Entities&#xff1a;就是EF实体数据模型 using (var db new Entities()) { var data db.Member.Find(5); data.Name “new name”; db.…

基于Springboot+vue的玩具销售商城网站 elementui

爱玩儿是所有孩子的天性。尤其是在婴幼儿阶段。选择一个好的玩具&#xff0c;不仅能够让孩子玩儿的开心&#xff0c;而且有助于孩子智力的开发。很多家长在选择玩具的时候&#xff0c;不知道选择什么样的玩具。且当前玩具市场的玩具鱼目混杂&#xff0c;种类繁多&#xff0c;而…

cmake和makefile区别和cmake指定编译器(cmake -G)

一 cmake和makefile区别 要说明区别,我们先要区分下面三类工具: 1.项目构建生成工具 首先cmake是项目构建生成工具,cmake的代码可以与平台系统和编译器无关。类似cmake的工具还有autotools、qmake、GN,其中qmake已基本由cmake替代。cmake下载地址 cmake.org.cn 也就是说cma…

1.初识jQuery

jQuery是JS的库&#xff0c;封装了原生JS的一些DOM方法&#xff0c;使JS用起来更方便 目录 1 下载jQuery 2 jQuery的基本使用方式 3 jQuery入口函数 1 下载jQuery jQuery官网 jQuery 点击这里进入下载页面&#xff0c;我当前的版本为 3.6.1&#xff0c;如果你想下载之…

2022极端高温!人工智能如何预测森林火灾?| 万物AI

&#x1f4a1; 作者&#xff1a;ShowMeAI编辑部 &#x1f4e2; 声明&#xff1a;版权所有&#xff0c;转载请联系平台与作者并注明出处 &#x1f4e2; 收藏ShowMeAI查看更多精彩内容 8月21日晚&#xff0c;重庆北碚区山火一路向国家级自然保护区缙云山方向蔓延。为守护家园&…

LabVIEW通过网络传输数据

LabVIEW通过网络传输数据 选择应用程序的联网功能时&#xff0c;最重要的因素是应用程序使用的通信模型。不同的通信模型具有不同的数据传输要求。下表列出了最常见的几种通信模型以及推荐功能。 通信模型 说明 范例 推荐联网功能 处理数据 传输最新数据&#xff0c;从一…