Go项目快速集成Swagger UI

swag

Swag将Go的注释转换为Swagger2.0文档。我们为流行的 Go Web Framework 创建了各种插件,这样可以与现有Go项目快速集成(使用Swagger UI)。

目录

  • 快速开始
  • 支持的Web框架
  • 如何与Gin集成
  • 格式化说明
  • 开发现状
  • 声明式注释格式
    • 通用API信息
    • API操作
    • 安全性
  • 样例
    • 多行的描述
    • 用户自定义的具有数组类型的结构
    • 响应对象中的模型组合
    • 在响应中增加头字段
    • 使用多路径参数
    • 结构体的示例值
    • 结构体描述
    • 使用swaggertype标签更改字段类型
    • 使用swaggerignore标签排除字段
    • 将扩展信息添加到结构字段
    • 对展示的模型重命名
    • 如何使用安全性注释
  • 项目相关

快速开始

  1. 将注释添加到API源代码中,请参阅声明性注释格式。
  2. 使用如下命令下载swag:
go install github.com/swaggo/swag/cmd/swag@latest

从源码开始构建的话,需要有Go环境(1.18及以上版本)。

或者从github的release页面下载预编译好的二进制文件。

  1. 在包含main.go文件的项目根目录运行swag init。这将会解析注释并生成需要的文件(docs文件夹和docs/docs.go)。
swag init

确保导入了生成的docs/docs.go文件,这样特定的配置文件才会被初始化。如果通用API注释没有写在main.go中,可以使用-g标识符来告知swag。

swag init -g http/api.go
  1. (可选) 使用fmt格式化 SWAG 注释。(请先升级到最新版本)
swag fmt

swag cli

swag init -h
NAME:swag init - Create docs.goUSAGE:swag init [command options] [arguments...]OPTIONS:--generalInfo value, -g value          API通用信息所在的go源文件路径,如果是相对路径则基于API解析目录 (默认: "main.go")--dir value, -d value                  API解析目录 (默认: "./")--exclude value                        解析扫描时排除的目录,多个目录可用逗号分隔(默认:空)--propertyStrategy value, -p value     结构体字段命名规则,三种:snakecase,camelcase,pascalcase (默认: "camelcase")--output value, -o value               文件(swagger.json, swagger.yaml and doc.go)输出目录 (默认: "./docs")--parseVendor                          是否解析vendor目录里的go源文件,默认不--parseDependency                      是否解析依赖目录中的go源文件,默认不--markdownFiles value, --md value      指定API的描述信息所使用的markdown文件所在的目录--generatedTime                        是否输出时间到输出文件docs.go的顶部,默认是--codeExampleFiles value, --cef value  解析包含用于 x-codeSamples 扩展的代码示例文件的文件夹,默认禁用--parseInternal                        解析 internal 包中的go文件,默认禁用--parseDepth value                     依赖解析深度 (默认: 100)--instanceName value                   设置文档实例名 (默认: "swagger")
swag fmt -h
NAME:swag fmt - format swag commentsUSAGE:swag fmt [command options] [arguments...]OPTIONS:--dir value, -d value          API解析目录 (默认: "./")--exclude value                解析扫描时排除的目录,多个目录可用逗号分隔(默认:空)--generalInfo value, -g value  API通用信息所在的go源文件路径,如果是相对路径则基于API解析目录 (默认: "main.go")--help, -h                     show help (default: false)

支持的Web框架

  • gin
  • echo
  • buffalo
  • net/http
  • gorilla/mux
  • go-chi/chi
  • flamingo
  • fiber
  • atreugo
  • hertz

如何与Gin集成

点击此处查看示例源代码。

  1. 使用swag init生成Swagger2.0文档后,导入如下代码包:
import "github.com/swaggo/gin-swagger" // gin-swagger middleware
import "github.com/swaggo/files" // swagger embed files
  1. main.go源代码中添加通用的API注释:
// @title           Swagger Example API
// @version         1.0
// @description     This is a sample server celler server.
// @termsOfService  http://swagger.io/terms/// @contact.name   API Support
// @contact.url    http://www.swagger.io/support
// @contact.email  support@swagger.io// @license.name  Apache 2.0
// @license.url   http://www.apache.org/licenses/LICENSE-2.0.html// @host      localhost:8080
// @BasePath  /api/v1// @securityDefinitions.basic  BasicAuth// @externalDocs.description  OpenAPI
// @externalDocs.url          https://swagger.io/resources/open-api/
func main() {r := gin.Default()c := controller.NewController()v1 := r.Group("/api/v1"){accounts := v1.Group("/accounts"){accounts.GET(":id", c.ShowAccount)accounts.GET("", c.ListAccounts)accounts.POST("", c.AddAccount)accounts.DELETE(":id", c.DeleteAccount)accounts.PATCH(":id", c.UpdateAccount)accounts.POST(":id/images", c.UploadAccountImage)}//...}r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))r.Run(":8080")
}
//...

此外,可以动态设置一些通用的API信息。生成的代码包docs导出SwaggerInfo变量,使用该变量可以通过编码的方式设置标题、描述、版本、主机和基础路径。使用Gin的示例:

package mainimport ("github.com/gin-gonic/gin""github.com/swaggo/files""github.com/swaggo/gin-swagger""./docs" // docs is generated by Swag CLI, you have to import it.
)// @contact.name   API Support
// @contact.url    http://www.swagger.io/support
// @contact.email  support@swagger.io// @license.name  Apache 2.0
// @license.url   http://www.apache.org/licenses/LICENSE-2.0.html
func main() {// programatically set swagger infodocs.SwaggerInfo.Title = "Swagger Example API"docs.SwaggerInfo.Description = "This is a sample server Petstore server."docs.SwaggerInfo.Version = "1.0"docs.SwaggerInfo.Host = "petstore.swagger.io"docs.SwaggerInfo.BasePath = "/v2"docs.SwaggerInfo.Schemes = []string{"http", "https"}r := gin.New()// use ginSwagger middleware to serve the API docsr.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))r.Run()
}
  1. controller代码中添加API操作注释:
package controllerimport ("fmt""net/http""strconv""github.com/gin-gonic/gin""github.com/swaggo/swag/example/celler/httputil""github.com/swaggo/swag/example/celler/model"
)// ShowAccount godoc
// @Summary      Show an account
// @Description  get string by ID
// @Tags         accounts
// @Accept       json
// @Produce      json
// @Param        id   path      int  true  "Account ID"
// @Success      200  {object}  model.Account
// @Failure      400  {object}  httputil.HTTPError
// @Failure      404  {object}  httputil.HTTPError
// @Failure      500  {object}  httputil.HTTPError
// @Router       /accounts/{id} [get]
func (c *Controller) ShowAccount(ctx *gin.Context) {id := ctx.Param("id")aid, err := strconv.Atoi(id)if err != nil {httputil.NewError(ctx, http.StatusBadRequest, err)return}account, err := model.AccountOne(aid)if err != nil {httputil.NewError(ctx, http.StatusNotFound, err)return}ctx.JSON(http.StatusOK, account)
}// ListAccounts godoc
// @Summary      List accounts
// @Description  get accounts
// @Tags         accounts
// @Accept       json
// @Produce      json
// @Param        q    query     string  false  "name search by q"  Format(email)
// @Success      200  {array}   model.Account
// @Failure      400  {object}  httputil.HTTPError
// @Failure      404  {object}  httputil.HTTPError
// @Failure      500  {object}  httputil.HTTPError
// @Router       /accounts [get]
func (c *Controller) ListAccounts(ctx *gin.Context) {q := ctx.Request.URL.Query().Get("q")accounts, err := model.AccountsAll(q)if err != nil {httputil.NewError(ctx, http.StatusNotFound, err)return}ctx.JSON(http.StatusOK, accounts)
}
//...
swag init
  1. 运行程序,然后在浏览器中访问 http://localhost:8080/swagger/index.html 。将看到Swagger 2.0 Api文档,如下所示:

swagger_index.html

格式化说明

可以针对Swag的注释自动格式化,就像go fmt
此处查看格式化结果 here.

示例:

swag fmt

排除目录(不扫描)示例:

swag fmt -d ./ --exclude ./internal

开发现状

Swagger 2.0 文档

  • Basic Structure
  • API Host and Base Path
  • Paths and Operations
  • Describing Parameters
  • Describing Request Body
  • Describing Responses
  • MIME Types
  • Authentication
    • Basic Authentication
    • API Keys
  • Adding Examples
  • File Upload
  • Enums
  • Grouping Operations With Tags
  • Swagger Extensions

声明式注释格式

通用API信息

示例 celler/main.go

注释说明示例
title必填 应用程序的名称。// @title Swagger Example API
version必填 提供应用程序API的版本。// @version 1.0
description应用程序的简短描述。// @description This is a sample server celler server.
tag.name标签的名称。// @tag.name This is the name of the tag
tag.description标签的描述。// @tag.description Cool Description
tag.docs.url标签的外部文档的URL。// @tag.docs.url https://example.com
tag.docs.description标签的外部文档说明。// @tag.docs.description Best example documentation
termsOfServiceAPI的服务条款。// @termsOfService http://swagger.io/terms/
contact.name公开的API的联系信息。// @contact.name API Support
contact.url联系信息的URL。 必须采用网址格式。// @contact.url http://www.swagger.io/support
contact.email联系人/组织的电子邮件地址。 必须采用电子邮件地址的格式。// @contact.email support@swagger.io
license.name必填 用于API的许可证名称。// @license.name Apache 2.0
license.url用于API的许可证的URL。 必须采用网址格式。// @license.url http://www.apache.org/licenses/LICENSE-2.0.html
host运行API的主机(主机名或IP地址)。// @host localhost:8080
BasePath运行API的基本路径。// @BasePath /api/v1
acceptAPI 可以使用的 MIME 类型列表。 请注意,Accept 仅影响具有请求正文的操作,例如 POST、PUT 和 PATCH。 值必须如“Mime类型”中所述。// @accept json
produceAPI可以生成的MIME类型的列表。值必须如“Mime类型”中所述。// @produce json
query.collection.format请求URI query里数组参数的默认格式:csv,multi,pipes,tsv,ssv。 如果未设置,则默认为csv。// @query.collection.format multi
schemes用空格分隔的请求的传输协议。// @schemes http https
externalDocs.descriptionDescription of the external document.// @externalDocs.description OpenAPI
externalDocs.urlURL of the external document.// @externalDocs.url https://swagger.io/resources/open-api/
x-name扩展的键必须以x-开头,并且只能使用json值// @x-example-key {“key”: “value”}

使用Markdown描述

如果文档中的短字符串不足以完整表达,或者需要展示图片,代码示例等类似的内容,则可能需要使用Markdown描述。要使用Markdown描述,请使用一下注释。

注释说明示例
title必填 应用程序的名称。// @title Swagger Example API
version必填 提供应用程序API的版本。// @version 1.0
description.markdown应用程序的简短描述。 从api.md文件中解析。 这是@description的替代用法。// @description.markdown No value needed, this parses the description from api.md
tag.name标签的名称。// @tag.name This is the name of the tag
tag.description.markdown标签说明,这是tag.description的替代用法。 该描述将从名为tagname.md的文件中读取。// @tag.description.markdown

API操作

Example celler/controller

注释描述
description操作行为的详细说明。
description.markdown应用程序的简短描述。该描述将从名为endpointname.md的文件中读取。
id用于标识操作的唯一字符串。在所有API操作中必须唯一。
tags每个API操作的标签列表,以逗号分隔。
summary该操作的简短摘要。
acceptAPI 可以使用的 MIME 类型列表。 请注意,Accept 仅影响具有请求正文的操作,例如 POST、PUT 和 PATCH。 值必须如“Mime类型”中所述。
produceAPI可以生成的MIME类型的列表。值必须如“Mime类型”中所述。
param用空格分隔的参数。param name,param type,data type,is mandatory?,comment attribute(optional)
security每个API操作的安全性。
success以空格分隔的成功响应。return code,{param type},data type,comment
failure以空格分隔的故障响应。return code,{param type},data type,comment
response与success、failure作用相同
header以空格分隔的头字段。 return code,{param type},data type,comment
router以空格分隔的路径定义。 path,[httpMethod]
x-name扩展字段必须以x-开头,并且只能使用json值。

Mime类型

swag 接受所有格式正确的MIME类型, 即使匹配 */*。除此之外,swag还接受某些MIME类型的别名,如下所示:

AliasMIME Type
jsonapplication/json
xmltext/xml
plaintext/plain
htmltext/html
mpfdmultipart/form-data
x-www-form-urlencodedapplication/x-www-form-urlencoded
json-apiapplication/vnd.api+json
json-streamapplication/x-json-stream
octet-streamapplication/octet-stream
pngimage/png
jpegimage/jpeg
gifimage/gif

参数类型

  • query
  • path
  • header
  • body
  • formData

数据类型

  • string (string)
  • integer (int, uint, uint32, uint64)
  • number (float32)
  • boolean (bool)
  • user defined struct

安全性

注释描述参数示例
securitydefinitions.basicBasic auth.// @securityDefinitions.basic BasicAuth
securitydefinitions.apikeyAPI key auth.in, name// @securityDefinitions.apikey ApiKeyAuth
securitydefinitions.oauth2.applicationOAuth2 application auth.tokenUrl, scope// @securitydefinitions.oauth2.application OAuth2Application
securitydefinitions.oauth2.implicitOAuth2 implicit auth.authorizationUrl, scope// @securitydefinitions.oauth2.implicit OAuth2Implicit
securitydefinitions.oauth2.passwordOAuth2 password auth.tokenUrl, scope// @securitydefinitions.oauth2.password OAuth2Password
securitydefinitions.oauth2.accessCodeOAuth2 access code auth.tokenUrl, authorizationUrl, scope// @securitydefinitions.oauth2.accessCode OAuth2AccessCode
参数注释示例
in// @in header
name// @name Authorization
tokenUrl// @tokenUrl https://example.com/oauth/token
authorizationurl// @authorizationurl https://example.com/oauth/authorize
scope.hoge// @scope.write Grants write access

属性

// @Param   enumstring  query     string     false  "string enums"       Enums(A, B, C)
// @Param   enumint     query     int        false  "int enums"          Enums(1, 2, 3)
// @Param   enumnumber  query     number     false  "int enums"          Enums(1.1, 1.2, 1.3)
// @Param   string      query     string     false  "string valid"       minlength(5)  maxlength(10)
// @Param   int         query     int        false  "int valid"          minimum(1)    maximum(10)
// @Param   default     query     string     false  "string default"     default(A)
// @Param   collection  query     []string   false  "string collection"  collectionFormat(multi)
// @Param   extensions  query     []string   false  "string collection"  extensions(x-example=test,x-nullable)

也适用于结构体字段:

type Foo struct {Bar string `minLength:"4" maxLength:"16"`Baz int `minimum:"10" maximum:"20" default:"15"`Qux []string `enums:"foo,bar,baz"`
}

当前可用的

字段名类型描述
default*声明如果未提供任何参数,则服务器将使用的默认参数值,例如,如果请求中的客户端未提供该参数,则用于控制每页结果数的“计数”可能默认为100。 (注意:“default”对于必需的参数没有意义)。参看 https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-6.2。 与JSON模式不同,此值务必符合此参数的定义类型。
maximumnumber参看 https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.1.2.
minimumnumber参看 https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.1.3.
maxLengthinteger参看 https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.2.1.
minLengthinteger参看 https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.2.2.
enums[*]参看 https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.5.1.
formatstring上面提到的类型的扩展格式。有关更多详细信息,请参见数据类型格式。
collectionFormatstring指定query数组参数的格式。 可能的值为:
  • csv - 逗号分隔值 foo,bar.
  • ssv - 空格分隔值 foo bar.
  • tsv - 制表符分隔值 foo\tbar.
  • pipes - 管道符分隔值 foo|bar.
  • multi - 对应于多个参数实例,而不是单个实例 foo=bar&foo=baz 的多个值。这仅对“query”或“formData”中的参数有效。
默认值是 csv

进一步的

字段名类型描述
multipleOfnumberSee https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.1.1.
patternstringSee https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.2.3.
maxItemsintegerSee https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.3.2.
minItemsintegerSee https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.3.3.
uniqueItemsbooleanSee https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.3.4.

样例

多行的描述

可以在常规api描述或路由定义中添加跨越多行的描述,如下所示:

// @description This is the first line
// @description This is the second line
// @description And so forth.

用户自定义的具有数组类型的结构

// @Success 200 {array} model.Account <-- This is a user defined struct.
package modeltype Account struct {ID   int    `json:"id" example:"1"`Name string `json:"name" example:"account name"`
}

响应对象中的模型组合

// JSONResult的data字段类型将被proto.Order类型替换
@success 200 {object} jsonresult.JSONResult{data=proto.Order} "desc"
type JSONResult struct {Code    int          `json:"code" `Message string       `json:"message"`Data    interface{}  `json:"data"`
}type Order struct { //in `proto` package...
}
  • 还支持对象数组和原始类型作为嵌套响应
@success 200 {object} jsonresult.JSONResult{data=[]proto.Order} "desc"
@success 200 {object} jsonresult.JSONResult{data=string} "desc"
@success 200 {object} jsonresult.JSONResult{data=[]string} "desc"
  • 替换多个字段的类型。如果某字段不存在,将添加该字段。
@success 200 {object} jsonresult.JSONResult{data1=string,data2=[]string,data3=proto.Order,data4=[]proto.Order} "desc"

在响应中增加头字段

// @Success      200              {string}  string    "ok"
// @failure      400              {string}  string    "error"
// @response     default          {string}  string    "other error"
// @Header       200              {string}  Location  "/entity/1"
// @Header       200,400,default  {string}  Token     "token"
// @Header       all              {string}  Token2    "token2"

使用多路径参数

/// ...
// @Param  group_id    path  int  true  "Group ID"
// @Param  account_id  path  int  true  "Account ID"
// ...
// @Router /examples/groups/{group_id}/accounts/{account_id} [get]

结构体的示例值

type Account struct {ID   int    `json:"id" example:"1"`Name string `json:"name" example:"account name"`PhotoUrls []string `json:"photo_urls" example:"http://test/image/1.jpg,http://test/image/2.jpg"`
}

结构体描述

type Account struct {// ID this is useridID   int    `json:"id"`Name string `json:"name"` // This is Name
}

使用swaggertype标签更改字段类型

#201

type TimestampTime struct {time.Time
}///实现encoding.JSON.Marshaler接口
func (t *TimestampTime) MarshalJSON() ([]byte, error) {bin := make([]byte, 16)bin = strconv.AppendInt(bin[:0], t.Time.Unix(), 10)return bin, nil
}///实现encoding.JSON.Unmarshaler接口
func (t *TimestampTime) UnmarshalJSON(bin []byte) error {v, err := strconv.ParseInt(string(bin), 10, 64)if err != nil {return err}t.Time = time.Unix(v, 0)return nil
}
///type Account struct {// 使用`swaggertype`标签将别名类型更改为内置类型integerID     sql.NullInt64 `json:"id" swaggertype:"integer"`// 使用`swaggertype`标签更改struct类型为内置类型integerRegisterTime TimestampTime `json:"register_time" swaggertype:"primitive,integer"`// Array types can be overridden using "array,<prim_type>" formatCoeffs []big.Float `json:"coeffs" swaggertype:"array,number"`
}

#379

type CerticateKeyPair struct {Crt []byte `json:"crt" swaggertype:"string" format:"base64" example:"U3dhZ2dlciByb2Nrcw=="`Key []byte `json:"key" swaggertype:"string" format:"base64" example:"U3dhZ2dlciByb2Nrcw=="`
}

生成的swagger文档如下:

"api.MyBinding": {"type":"object","properties":{"crt":{"type":"string","format":"base64","example":"U3dhZ2dlciByb2Nrcw=="},"key":{"type":"string","format":"base64","example":"U3dhZ2dlciByb2Nrcw=="}}
}

使用swaggerignore标签排除字段

type Account struct {ID   string    `json:"id"`Name string     `json:"name"`Ignored int     `swaggerignore:"true"`
}

将扩展信息添加到结构字段

type Account struct {ID   string    `json:"id"   extensions:"x-nullable,x-abc=def,!x-omitempty"` // 扩展字段必须以"x-"开头
}

生成swagger文档,如下所示:

"Account": {"type": "object","properties": {"id": {"type": "string","x-nullable": true,"x-abc": "def","x-omitempty": false}}
}

对展示的模型重命名

type Resp struct {Code int
}//@name Response

如何使用安全性注释

通用API信息。

// @securityDefinitions.basic BasicAuth// @securitydefinitions.oauth2.application OAuth2Application
// @tokenUrl https://example.com/oauth/token
// @scope.write Grants write access
// @scope.admin Grants read and write access to administrative information

每个API操作。

// @Security ApiKeyAuth

使用AND条件。

// @Security ApiKeyAuth
// @Security OAuth2Application[write, admin]

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

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

相关文章

MySQL实战45讲课后问题

1、第一章 如果表T中没有字段k&#xff0c;而你执行了这个语句 select *fromTwhere k1, 那肯定是会报“不存在这个列”的错误&#xff1a; “Unknown column ‘k’ in ‘where clause’”。你觉得这个错误是在我们上面提到的哪个阶段报出来的呢&#xff1f; 解答&#xff1a;…

网线的制作集线器交换机路由器的配置--含思维导图

&#x1f3ac; 艳艳耶✌️&#xff1a;个人主页 &#x1f525; 个人专栏 &#xff1a;《产品经理如何画泳道图&流程图》 ⛺️ 越努力 &#xff0c;越幸运 一、网线的制作 1、网线的材料有哪些&#xff1f; 网线 网线是一种用于传输数据信号的电缆&#xff0c;广泛应…

学生党评测FreeBuds SE 2,华为最便宜的TWS耳机体验如何?

华为最便宜的百元价位TWS耳机——FreeBuds SE 2值得入手吗&#xff1f;学生党实际使用一个多月&#xff0c;今天从个人主观使用感受来展开说说它的优缺点&#xff0c;如果说你正在观望要不要入手这款耳机&#xff0c;希望可以帮到你。 优点一&#xff1a;超长续航 对于我这种…

JMM的内存可见性保证

Java程序的 内存可见性保证 可以分为下列3类 1&#xff09;单线程程序 单线程程序不会出现内存可见性问题。 编译器、runtime、处理器会共同确保单线程程序的执行结果与该程序在顺序一致性模型中的执行结果相同。 2&#xff09;正确同步的多线程程序 Further Reading &…

YOLOv8改进 | 2023注意力篇 | HAttention(HAT)超分辨率重建助力小目标检测 (全网首发)

一、本文介绍 本文给大家带来的改进机制是HAttention注意力机制&#xff0c;混合注意力变换器&#xff08;HAT&#xff09;的设计理念是通过融合通道注意力和自注意力机制来提升单图像超分辨率重建的性能。通道注意力关注于识别哪些通道更重要&#xff0c;而自注意力则关注于图…

C : DS二叉排序树之删除

Description 给出一个数据序列&#xff0c;建立二叉排序树&#xff0c;并实现删除功能 对二叉排序树进行中序遍历&#xff0c;可以得到有序的数据序列 Input 第一行输入t&#xff0c;表示有t个数据序列 第二行输入n&#xff0c;表示首个序列包含n个数据 第三行输入n个数据…

cpulimit设计理念及其思考

背景 前几天&#xff0c;同事咨询了我一个问题&#xff1a;IO占用能和cpu使用率那样&#xff0c;有方法来控制吗&#xff1f;这个问题的背景是因为客户提了两个需求&#xff0c;如下&#xff1a; 说实话&#xff0c;针对这两点需求&#xff0c;我的第一反应是有一点思路&#…

PIC单片机项目(5)——基于PIC16F877A的多功能防盗门

1.功能设计 本次设计的功能如下&#xff1a;如果红外对管检测到有人经过&#xff0c;LCD1602可以显示&#xff0c;我设计的是显示字符串“someone”。 如果有人强行破门&#xff0c;FSR402压力传感器会检测到压力过大&#xff0c;然后触发蜂鸣器报警&#xff0c;LCD1602也显示“…

物奇平台消息发收功能实现

物奇平台消息发收功能实现 是否需要申请加入数字音频系统研究开发交流答疑群(课题组)?可加我微信hezkz17, 本群提供音频技术答疑服务,+群赠送语音信号处理降噪算法,蓝牙耳机音频,DSP音频项目核心开发资料, 1 外设中断消息发送方法

实验4.2 默认路由和浮动静态路由的配置

实验4.2 默认路由和浮动静态路由的配置 一、任务描述二、任务分析三、具体要求四、实验拓扑五、任务实施1.路由器的基本配置。2.配置默认路由&#xff0c;实现全网互通。3.配置浮动静态路由&#xff0c;实现链路备份。 六、任务验收七、任务小结八、知识链接1&#xff0e;默认路…

2023 英特尔On技术创新大会直播 |AI小模型更有性价比

前言&#xff1a; 今年是引爆AI的一年&#xff0c;从幼儿园的小朋友到80岁的老奶奶都认识AI&#xff0c;享受AI带来的便捷&#xff0c;都在向市场要智能&#xff0c;但AI的快速发展离不开底层硬件设施的革新。 英特尔是全球知名的半导体公司&#xff0c;专注于计算机处理器和芯…

Goby 漏洞发布| Apusic 应用服务器 createDataSource 远程代码执行漏洞

漏洞名称&#xff1a;Apusic 应用服务器 createDataSource 远程代码执行漏洞 English Name&#xff1a;Apusic Application Server loadTree Remote Code Execution Vulnerability CVSS core: 9.8 影响资产数&#xff1a; 31410 漏洞描述&#xff1a; 金蝶 Apusic 应用服务…

第三节TypeScript 基础类型

1、typescript的基础类型 如下表&#xff1a; 数据类型 关键字 描述 任意类型 any 生命any的变量可以赋值任意类型的值 数字类型 number 整数或分数 字符串类型 string 使用单引号&#xff08;‘’&#xff09;或者双引号&#xff08;“”&#xff09;来表示字符串…

企业数字化转型如何影响企业 ESG 表现 —来自中国上市公司的证据(数据复现+代码)

数据来源&#xff1a;自主整理 时间跨度&#xff1a;2010-2020年 数据范围&#xff1a;中国沪深 A 股上市公司 数据指标&#xff1a; 类型 变量 符号 变量定义 证券代码 stkcd 年份 year 股票简称 name 被解释变量 ESG ESG 华证ESG季度评级赋值1-9分&#xff0c;取…

xxl-job 分布式调度学习笔记

1.概述 1.1什么是任务调度 业务场景&#xff1a; 上午10点&#xff0c;下午2点发放一批优惠券 银行系统需要在信用卡到期还款日的前三天进行短信提醒 财务系统需要在每天凌晨0:10分结算前一天的财务数据&#xff0c;统计汇总 不同系统间的数据需要保持一致&#xff0c;这时…

flask 之上传与下载

from flask import Flask, render_template, request, send_from_directory, redirect, url_for import osapp Flask(__name__)# 上传文件存储路径 UPLOAD_FOLDER uploads app.config[UPLOAD_FOLDER] UPLOAD_FOLDERapp.route(/) def index():# 确保上传文件夹存在if not os.…

牛客BC115 超级圣诞树

万众瞩目 在上一篇我们介绍了一个圣诞树的打印&#xff0c;而这道题与上次不同的是他的基本单位是一直在变的 我建议先把上一个搞懂在写这道题这个。 牛客网BC114 圣诞树-CSDN博客 ok那么正文开始 题目如下 今天是圣诞节&#xff0c;牛牛要打印一个漂亮的圣诞树送给想象中…

Unity 通过代码将一张大图切成多个小图的方法

在Unity 中要通过代码将一张贴图切割成多张小图&#xff0c;可以使用以下方法&#xff1a; /// <summary>/// 把一张图片切割成多张使用/// </summary>/// <param name"texture">原图</param>/// <param name"rows">切割的行…

[DNS网络] 网页无法打开、显示不全、加载卡顿缓慢 | 解决方案

[网络故障] 网页无法打开、显示不全、加载卡顿缓慢 | 解决方案 问题描述 最近&#xff0c;我在使用CSDN插件浏览 MOOC 网站时&#xff0c;遇到了一些网络故障。具体表现为&#xff1a; MOOC 中国大学慕课网&#xff1a;www.icourse163.org点击CSDN插件首页的 MOOC&#xff08…

VSCode调试Vue项目

前言 代码在某个平台运行时&#xff0c;会将运行时的状态通过某种方式暴露出来。这些状态信息可以通过某种方式传递给开发工具&#xff0c;以便进行UI的展示和交互。这样的交互可以辅助开发者排查问题、梳理流程&#xff0c;并更好地了解代码的运行状态。这就是我们通常所说的调…