当前位置: 首页 > news >正文

【GO基础学习】gin的使用

文章目录

  • 模版使用流程
  • 参数传递
  • 路由分组
  • 数据解析和绑定
  • gin中间件


模版使用流程

package mainimport ("net/http""github.com/gin-gonic/gin"
)func main() {// 1.创建路由r := gin.Default()// 2.绑定路由规则,执行的函数// gin.Context,封装了request和responser.GET("/", func(c *gin.Context) {c.String(http.StatusOK, "hello World!")})// 3.监听端口,默认在8080// Run("里面不指定端口号默认为8080") r.Run(":8000")
}

运行,访问:http://localhost:8000/

在这里插入图片描述
后面为了减少累赘代码,只展示路由规则部分代码编写,创建路由,以及端口监听部分代码保存相同。


参数传递

  1. API传参:可以通过Context的Param方法来获取API参数。
r.GET("/user/:name", func(c *gin.Context) {name := c.Param("name")c.String(http.StatusOK, "Hello "+name+"!")})

在这里插入图片描述

r.GET("/user/:name/*action", func(c *gin.Context) {name := c.Param("name")action := c.Param("action")c.String(http.StatusOK, "Hello "+name+"!"+"Action "+action)})

在这里插入图片描述

*action 表示一个通配路径参数,可以匹配 URL 剩余部分的路径,并且会包含匹配部分的斜杠 /

  1. URL传参:URL参数可以通过DefaultQuery()Query()方法获取,DefaultQuery()若参数不存在,返回默认值,Query()若不存在,返回空串。

DefaultQuery默认值只支持string类型:

func (c *Context) DefaultQuery(key, defaultValue string) string {if value, ok := c.GetQuery(key); ok {return value}return defaultValue
}
r.GET("/user", func(c *gin.Context) {name := c.DefaultQuery("name", "Test")ageStr := c.DefaultQuery("age", "18")age, err := strconv.Atoi(ageStr)if err != nil {c.String(http.StatusBadRequest, "Invalid age")return}c.String(http.StatusOK, fmt.Sprintf("%s is %d years old", name, age))})

在这里插入图片描述

  1. 表单传值
<form action="http://localhost:8000/form" method="post" action="application/x-www-form-urlencoded">用户名:<input type="text" name="username" placeholder="请输入你的用户名">  <br>&nbsp;&nbsp;&nbsp;码:<input type="password" name="userpassword" placeholder="请输入你的密码">  <br><input type="submit" value="提交"></form>
r.POST("/form", func(c *gin.Context) {types := c.DefaultPostForm("type", "post")username := c.PostForm("username")password := c.PostForm("userpassword")c.String(http.StatusOK, fmt.Sprintf("username:%s,password:%s,type:%s", username, password, types))})
  1. 文件上传

单个文件:

<form action="http://localhost:8000/upload" method="post" enctype="multipart/form-data">上传文件:<input type="file" name="file" ><input type="submit" value="提交"></form>
// 限制上传文件大小 (10 MiB)r.MaxMultipartMemory = 10 << 20 // 10 MiB// 文件上传路由r.POST("/upload", func(c *gin.Context) {// 获取文件file, err := c.FormFile("file")if err != nil {c.String(http.StatusBadRequest, "File upload error: %s", err.Error())return}// 检查文件类型 (仅允许 image/png)mimeType := file.Header.Get("Content-Type")if mimeType != "image/png" {c.String(http.StatusBadRequest, "Invalid file type: %s. Only PNG images are allowed.", mimeType)return}// 保存文件到目标路径dst := filepath.Join("./uploads", file.Filename)if err := c.SaveUploadedFile(file, dst); err != nil {c.String(http.StatusInternalServerError, "Could not save file: %s", err.Error())return}c.String(http.StatusOK, "File uploaded successfully: %s", file.Filename)})

多个文件:

// 限制上传文件大小 (10 MiB)r.MaxMultipartMemory = 10 << 20 // 10 MiB// 多文件上传路由r.POST("/upload/multiple", func(c *gin.Context) {// 获取表单文件 (key 为 "files")form, err := c.MultipartForm()if err != nil {c.String(http.StatusBadRequest, "Form error: %s", err.Error())return}files := form.File["files"] // 获取多个文件for _, file := range files {// 检查文件类型 (仅允许 image/png)mimeType := file.Header.Get("Content-Type")if mimeType != "image/png" {c.String(http.StatusBadRequest, "Invalid file type: %s for file: %s. Only PNG images are allowed.", mimeType, file.Filename)return}// 保存文件到目标路径dst := filepath.Join("./uploads", file.Filename)if err := c.SaveUploadedFile(file, dst); err != nil {c.String(http.StatusInternalServerError, "Could not save file: %s. Error: %s", file.Filename, err.Error())return}fmt.Printf("Uploaded file: %s\n", file.Filename)}c.String(http.StatusOK, "All files uploaded successfully")})

路由分组

在 Gin 框架中,路由分组(Route Group)是用于组织和管理路由的功能。通过路由分组,可以为一组路由添加公共的前缀、中间件或配置,从而提高代码的可读性和可维护性。

package mainimport ("github.com/gin-gonic/gin""net/http"
)func main() {// 1.创建路由r := gin.Default()// 2.绑定路由规则,执行的函数// gin.Context,封装了request和response// 用户路由组userGroup := r.Group("/user"){userGroup.GET("/login", login)userGroup.GET("/settings", func(c *gin.Context) {c.JSON(200, gin.H{"message": "User Settings"})})}// 管理员路由组adminGroup := r.Group("/admin"){adminGroup.GET("/dashboard", func(c *gin.Context) {c.JSON(200, gin.H{"message": "Admin Dashboard"})})adminGroup.GET("/reports", func(c *gin.Context) {c.JSON(200, gin.H{"message": "Admin Reports"})})}// 404r.NoRoute(func(c *gin.Context) {c.String(http.StatusNotFound, "404 not found !!!!")})// 3.监听端口,默认在8080// Run("里面不指定端口号默认为8080")r.Run(":8000")
}func login(c *gin.Context) {name := c.DefaultQuery("name", "jack")c.JSON(200, gin.H{"name": name})
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


数据解析和绑定

  1. JSON数据解析和绑定的基本步骤

(1) 定义结构体

定义一个与 JSON 数据格式匹配的 Go 结构体。

(2) 使用 c.BindJSONc.ShouldBindJSON

  • c.BindJSON 会在绑定失败时返回错误并终止请求。
  • c.ShouldBindJSON 返回错误但不会中断后续处理,适合灵活的错误处理场景。

(3) 使用结构体处理数据

通过绑定的结构体直接访问解析后的字段。

package mainimport ("net/http""github.com/gin-gonic/gin"
)type User struct {Name  string `json:"name" binding:"required"` // 必填字段Age   int    `json:"age" binding:"required"`  // 必填字段Email string `json:"email"`                  // 可选字段
}func main() {r := gin.Default()r.POST("/user", func(c *gin.Context) {var user Userif err := c.ShouldBindJSON(&user); err != nil {c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})return}c.JSON(http.StatusOK, gin.H{"message": "User data received","user":    user,})})r.Run(":8080")
}

在这里插入图片描述

Gin 提供了 binding 标签,用于对字段进行验证。支持多种验证规则。

type User struct {Name  string `json:"name" binding:"required,min=3"` // 必填,最小长度 3Age   int    `json:"age" binding:"required,gte=1"`  // 必填,必须大于等于 1Email string `json:"email" binding:"required,email"` // 必填,必须是合法邮箱
}
验证规则含义
required必须提供该字段
min字符串或切片的最小长度
max字符串或切片的最大长度
gte数字或时间的值必须大于等于指定值
lte数字或时间的值必须小于等于指定值
email必须是有效的邮箱地址

  1. 表单数据:
    为字段添加多种绑定方式的标签,例如 jsonform 标签。

Gin 会根据 Content-Type 自动选择适合的绑定方式:

  • 如果是 application/json,则绑定 JSON 数据。
  • 如果是 application/x-www-form-urlencodedmultipart/form-data,则绑定表单数据。
type User struct {Name  string `json:"name" form:"name" binding:"required"` // 必填字段Age   int    `json:"age" form:"age" binding:"required,gte=0"`Email string `json:"email" form:"email"`
}
  1. URI数据

通过 c.Param 获取路径参数的值

package mainimport ("net/http""github.com/gin-gonic/gin"
)func main() {r := gin.Default()r.GET("/user/:id", func(c *gin.Context) {id := c.Param("id") // 提取路径参数c.JSON(http.StatusOK, gin.H{"user_id": id,})})r.Run(":8080")
}

Gin 提供了 ShouldBindUri 方法,可以将路径参数直接绑定到结构体中,方便处理和验证。

package mainimport ("net/http""github.com/gin-gonic/gin"
)type UserRequest struct {ID string `uri:"id" binding:"required"` // 使用 `uri` 标签定义路径参数
}func main() {r := gin.Default()r.GET("/user/:id", func(c *gin.Context) {var req UserRequest// 将路径参数绑定到结构体if err := c.ShouldBindUri(&req); err != nil {c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})return}c.JSON(http.StatusOK, gin.H{"user_id": req.ID,})})r.Run(":8080")
}
  1. 路径参数可以和查询参数或表单参数结合使用。Gin 支持同时解析这些参数。
package mainimport ("net/http""github.com/gin-gonic/gin"
)type UserRequest struct {ID   string `uri:"id" binding:"required"`  // 路径参数Name string `form:"name"`                 // 查询参数或表单参数
}func main() {r := gin.Default()r.GET("/user/:id", func(c *gin.Context) {var req UserRequest// 绑定路径参数if err := c.ShouldBindUri(&req); err != nil {c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})return}// 绑定查询参数if err := c.ShouldBindQuery(&req); err != nil {c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})return}c.JSON(http.StatusOK, gin.H{"user_id": req.ID,"name":    req.Name,})})r.Run(":8080")
}
GET /user/123?name=Alice

gin中间件

在 Gin 中,中间件是一个可以插入到请求处理流程中的函数,用于实现请求前后的通用逻辑。例如,认证、日志记录、跨域处理等都可以通过中间件实现。

  1. 中间件定义
func(c *gin.Context) {// 执行逻辑c.Next() // 调用后续处理函数// 执行逻辑
}

c.Next():调用下一个中间件或处理程序。
c.Abort():停止执行后续的中间件和处理程序。

  1. 全局中间件

全局中间件会应用到所有路由,使用 r.Use() 注册。

package mainimport ("fmt""github.com/gin-gonic/gin"
)func Logger() gin.HandlerFunc {return func(c *gin.Context) {// 请求前逻辑fmt.Println("Request URL:", c.Request.URL.Path)c.Next() // 执行后续处理// 请求后逻辑fmt.Println("Response Status:", c.Writer.Status())}
}func main() {r := gin.Default()// 注册全局中间件r.Use(Logger())r.GET("/ping", func(c *gin.Context) {fmt.Println("=======11111111")c.String(200, "pong")})r.Run(":8080")
}

控制台输出:

Request URL: /ping
=======11111111
Response Status: 200

流程:中间件逻辑=》遇到next方法后,执行路由func=》中间件后面的逻辑。

  1. 局部中间件

局部中间件只应用于特定路由或路由组。

package mainimport ("github.com/gin-gonic/gin"
)func AuthRequired() gin.HandlerFunc {return func(c *gin.Context) {token := c.GetHeader("Authorization")if token != "valid-token" {c.AbortWithStatusJSON(401, gin.H{"error": "unauthorized"})return}c.Next()}
}func main() {r := gin.Default()// 局部中间件r.GET("/secure", AuthRequired(), func(c *gin.Context) {c.JSON(200, gin.H{"message": "Authorized"})})r.Run(":8080")
}

相关文章:

【GO基础学习】gin的使用

文章目录 模版使用流程参数传递路由分组数据解析和绑定gin中间件 模版使用流程 package mainimport ("net/http""github.com/gin-gonic/gin" )func main() {// 1.创建路由r : gin.Default()// 2.绑定路由规则&#xff0c;执行的函数// gin.Context&#x…...

【PCIe 总线及设备入门学习专栏 4.5 -- PCIe Message and PCIe MSI】

文章目录 PCIe Message 与 MSIPCIe Message 和 MSI 的作用与关系MSI 的配置与寄存器MSI 和 ARM GIC 的关系示例&#xff1a;MSI 在 ARM GIC 的实际应用总结 PCIe Message 与 MSI 本文将介绍 PCIe message 的作用以及message 与 MSI 的关系&#xff0c;再介绍 MSI 如何配置以及…...

sklearn_pandas.DataFrameMapper的用法

文章目录 介绍主要作用基本用法示例对不同列应用不同的转换器对多列应用相同的转换器输出为 Pandas DataFrame 注意事项转换器的适用性&#xff1a;输出格式&#xff1a;与 scikit-learn 的兼容性&#xff1a; 介绍 DataFrameMapper 是 sklearn-pandas 库中的一个工具&#xf…...

【2024年-7月-27日-开源社区openEuler实践记录】剖析 elease - management:优化软件发布流程的开源方案

开篇介绍 大家好&#xff0c;我是 fzr123&#xff0c;在软件开发流程管控领域探索许久&#xff0c;今天要给大家详细说说release - management这个极具价值的开源项目。在软件开发的生命周期里&#xff0c;发布管理至关重要&#xff0c;它关乎着软件能否稳定、高效且按时交付&…...

CPT203 Software Engineering 软件工程 Pt.1 概论和软件过程(中英双语)

文章目录 1.Introduction1.1 What software engineering is and why it is important&#xff08;什么是软件工程&#xff0c;为什么它很重要&#xff09;1.1 We can’t run the modern world without software&#xff08;我们的世界离不开软件&#xff09;1.1.1 What is Soft…...

Mysql数据库Redo日志和Undo日志的理解

数据库redo日志和undo日志 1、redo日志1.1 redo日志的作用1.1.1 不使用redo日志的问题1.1.2 使用redo日志的好处 1.2 redo日志刷盘策略 2、undo日志2.1 undo日志的作用2.2 undo日志的简要生成过程 1、redo日志 事务的4大特性&#xff08;ACID&#xff09;&#xff1a;原子性、…...

大厂高频总线协议面试题及参考答案(几百家面试题挑选最高频精华)

目录 请介绍一下 SPI 总线协议及其工作原理,包括 SPI 有哪四种模式以及四根线的电气特性是什么? SPI 通信的波特率是多少,时钟来源是什么?SPI 的帧长度和数据格式是怎样的? 请简述 IIC 协议及其工作原理,包括 IIC 协议最多能挂载多少个从设备? IIC 总线上挂不同的设备…...

使用策略模式时的一个生效问题

策略模式的替换场景&#xff1a; 1&#xff1a;产品有默认策略A,B,项目扩展策略C&#xff0c;此为正常扩展。 2&#xff1a;产品有默认策略A,B,项目需要改写策略B&#xff0c;此为项目替换默认策略。 3&#xff1a;产品有默认策略A,B,项目扩展策略C&#xff0c;产品需要反向扩展…...

活动预告 |【Part2】 Azure 在线技术公开课:迁移和保护 Windows Server 和 SQL Server 工作负载

课程介绍 通过 Microsoft Learn 免费参加 Microsoft Azure 在线技术公开课&#xff0c;掌握创造新机遇所需的技能&#xff0c;加快对 Microsoft 云技术的了解。参加我们举办的“迁移和保护 Windows Server 和 SQL Server 工作负载”活动&#xff0c;了解 Azure 如何为将工作负载…...

关于 PCB线路板细节锣槽问题 的解决方法

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/144783817 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…...

机器学习特征选择

一、特征选择概述 在实际的数据集中&#xff0c;往往包含了大量的特征&#xff0c;但并非所有特征都对我们要预测的目标变量&#xff08;如分类任务中的类别标签&#xff0c;回归任务中的数值目标&#xff09;有积极作用。有些特征可能携带的信息量极少&#xff0c;甚至会引入…...

第R5周:天气预测

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 任务说明&#xff1a;该数据集提供了来自澳大利亚许多地点的大约 10 年的每日天气观测数据。你需要做的是根据这些数据对RainTomorrow进行一个预测&#xff0c…...

【每日学点鸿蒙知识】ets匿名类、获取控件坐标、Web显示iframe标签、软键盘导致上移、改变Text的背景色

1、HarmonyOS ets不支持匿名类吗&#xff1f; 不支持&#xff0c;需要显式标注对象字面量的类型&#xff0c;可以参考以下文档&#xff1a;https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/typescript-to-arkts-migration-guide-V5#%E9%9C%80%E8%A6%81%E6%…...

【Vim Masterclass 笔记02】第3章:Vim 核心知识 + L08:Vim 核心浏览命令 + L09:Vim 核心浏览命令同步练习

文章目录 Section 3&#xff1a;Vim Essentials&#xff08;Vim 核心知识&#xff09;S03L08 Essential Navigation Commands1 光标的上下左右移动2 上 / 下翻页3 基于单词前移4 基于单词后移5 重新定位视图中的文本&#xff08;页面重绘&#xff09;6 定位到所在行的行首7 光标…...

Spring Boot教程之四十:使用 Jasypt 加密 Spring Boot 项目中的密码

如何使用 Jasypt 加密 Spring Boot 项目中的密码 在本文中&#xff0c;我们将学习如何加密 Spring Boot 应用程序配置文件&#xff08;如 application.properties 或 application.yml&#xff09;中的数据。在这些文件中&#xff0c;我们可以加密用户名、密码等。 您经常会遇到…...

unity 按钮发送数据到服务器端

1. canvas 明显大于 main camera显示范围 按钮设置 reset 2 设置场景背景图片 2. 如何设置 sense 与背景图大小一致 stretch 没有生效 手动拖拽到 camera 大小 3 将button 按钮拖拽到背景image 中...

【TG\SE二次开发】天工CAD二次开发-c++模板介绍

VS的安装的环境&#xff1a; 1. Visual Studio EnterPrise 2022版本 2. 涉及到的工作负荷&#xff1a; 使用C的桌面开发、通用Windows平台开发 3. 特别要求的单个组件&#xff1a; 适用于最新的v143生成工具的CATL&#xff08;x86和x64&#xff09;组件、适用于最新的v143生…...

C语言预处理

预处理 C语言的编译步骤 预处理编译汇编链接 C语言的预处理 预处理就是在源文件编译之前&#xff0c;所进行的一部分预备操作&#xff0c;这部分操作是由预处理程序自动完成&#xff1b;当源文件在编译时&#xff0c;编译器会自动调用预处理程序来完成预处理操作执行的解析…...

DPIN基金会在曼谷发布全球去中心化GPU算力网络计划

12月12日&#xff0c;DPIN基金会在泰国曼谷举行的“DPIN—AIDePIN全球共识发布会”上&#xff0c;展示了其构建全球去中心化GPU算力网络的宏伟蓝图与愿景。DPIN基金会致力于开发一个基于人工智能与去中心化物理基础设施网络&#xff08;DePIN&#xff09;的高性能计算平台&…...

ONNX Runtime gpu版本安装

ONNX Runtime版本与cudatoolkit版本对应关系&#xff1a;NVIDIA - CUDA | onnxruntime onnx runtime发的版本&#xff1a;Releases microsoft/onnxruntime onnx runtime 官网&#xff1a;ONNX Runtime | Home onnx和onnx runtime版本对应关系&#xff1a;Compatibility | o…...

深入理解 MVCC 与 BufferPool 缓存机制

深入理解 MVCC 与 BufferPool 缓存机制 在 MySQL 数据库中&#xff0c;MVCC&#xff08;Multi-Version Concurrency Control&#xff09;多版本并发控制机制和 BufferPool 缓存机制是非常重要的概念&#xff0c;它们对于保证数据的一致性、并发性以及提升数据库性能起着关键作用…...

RockyLinux介绍及初始化

文章目录 一、背景二、下载 RockyLinux9 镜像三、环境初始化四、安装 Docker 环境 一、背景 这里讲一个小故事&#xff1a; 我们都知道Linux 内核是由芬兰计算机科学家林纳斯托瓦兹 (Linus Torvalds) 于 1991 年首次开发的&#xff0c;随后有一个非常重要的公司RetHat成立&am…...

Python中切片操作符

在Python中&#xff0c;切片是一种操作符&#xff0c;允许你获取序列&#xff08;如列表、元组、字符串&#xff09;的一部分。切片操作返回序列的一个子集&#xff0c;这个子集是一个新的对象&#xff0c;与原始序列是独立的。切片操作通常用于列表、元组、字符串等。 切片语…...

python -【es】基本使用

一. 前言 在Python中使用Elasticsearch&#xff08;ES&#xff09;通常涉及安装Elasticsearch的Python客户端库&#xff0c;然后通过该库与Elasticsearch集群进行交互。 二. 基本使用 1. 安装Elasticsearch Python客户端库 首先&#xff0c;你需要安装elasticsearch库。你可…...

JVM实战—5.G1垃圾回收器的原理和调优

大纲 1.G1垃圾回收器的工作原理 2.G1分代回收原理—性能为何比传统GC好 3.使用G1垃圾回收器时应如何设置参数 4.如何基于G1垃圾回收器优化性能 5.问题汇总 1.G1垃圾回收器的工作原理 (1)ParNew CMS的组合有哪些痛点 (2)G1垃圾回收器 (3)G1如何实现垃圾回收的停顿时间是…...

Python爬虫(selenium)从网站获取信息并存入数据库(mysql)

简介&#xff1a; 在本篇博客中&#xff0c;我们将介绍如何使用Python编写一个简单的网络爬虫&#xff0c;从指定网站上获取图书信息&#xff0c;并将这些信息存入数据库。这个项目涉及到Python编程、selenium爬虫技术以及数据库操作等内容&#xff0c;适合对这些领域感兴趣的初…...

spring中使用@Validated,什么是JSR 303数据校验,spring boot中怎么使用数据校验

文章目录 一、JSR 303后台数据校验1.1 什么是 JSR303&#xff1f;1.2 为什么使用 JSR 303&#xff1f; 二、Spring Boot 中使用数据校验2.1 基本注解校验2.1.1 使用步骤2.1.2 举例Valid注解全局统一异常处理 2.2 分组校验2.2.1 使用步骤2.2.2 举例Validated注解Validated和Vali…...

RabbitMQ中的异步Confirm模式:提升消息可靠性的利器

在现代分布式系统中&#xff0c;消息队列&#xff08;Message Queue&#xff09;扮演着至关重要的角色&#xff0c;它能够解耦系统组件、提高系统的可扩展性和可靠性。RabbitMQ作为一款广泛使用的消息队列中间件&#xff0c;提供了多种机制来确保消息的可靠传递。其中&#xff…...

C++ 设计模式:代理模式(Proxy Pattern)

链接&#xff1a;C 设计模式 链接&#xff1a;C 设计模式 - 门面模式 链接&#xff1a;C 设计模式 - 中介者 链接&#xff1a;C 设计模式 - 适配器 代理模式&#xff08;Proxy Pattern&#xff09;是一种结构型设计模式&#xff0c;它为其他对象提供一种代理以控制&#xff08…...

41.1 预聚合提速实战项目之需求分析和架构设计

本节重点介绍 : 需求分析架构设计 需求分析 使用预聚合提速查询并且降低高基数查询对后端的压力用户无需变更grafana上的查询语句&#xff0c;后端自动替换效果图 架构设计 架构图 解决方案说明 heavy_query对用户侧表现为查询速度慢在服务端会导致资源占用过多甚至打挂…...

学习路之VScode--自定义按键写注释(插件)

1. 安装 "KoroFileHeader" 插件 首先&#xff0c;在 VScode 中搜索并安装名为 "KoroFileHeader" 的插件。你可以通过在扩展商店中搜索插件名称来找到并安装它。 2. 进入 VScode 设置页面 点击 VScode 左下角的设置图标&#xff0c;然后选择 "设置&q…...

Web安全 - “Referrer Policy“ Security 头值不安全

文章目录 概述原因分析风险说明Referrer-Policy 头配置选项1. 不安全的策略no-referrer-when-downgradeunsafe-url 2. 安全的策略no-referreroriginorigin-when-cross-originsame-originstrict-originstrict-origin-when-cross-origin 推荐配置Nginx 配置示例 在 Nginx 中配置 …...

Milvus×EasyAi:如何用java从零搭建人脸识别应用

如何从零搭建一个人脸识别应用&#xff1f;不妨试试原生Java人工智能算法&#xff1a;EasyAi Milvus 的组合拳。 本文将使用到的软件和工具包括&#xff1a; EasyAi&#xff1a;人脸特征向量提取Milvus&#xff1a;向量数据库用于高效存储和检索数据。 01. EasyAi&#xff1a;…...

CGAL windows 安装教程

1.下载源代码 CGAL官网下载https://github.com/CGAL/cgal/releases 2.下载boost库 BOOST官网下载https://www.boost.org/ 3.下载 GMP and MPFR 4.配置VS2022 头文件&#xff1a; 库路径 做完以上步骤&#xff0c;可以使用CGAL了&#xff01;...

低代码开源项目Joget的研究——Joget8社区版安装部署

大纲 环境准备安装必要软件配置Java配置JAVA_HOME配置Java软链安装三方库 获取源码配置MySql数据库创建用户创建数据库导入初始数据 配置数据库连接配置sessionFactory&#xff08;非必须&#xff0c;如果后续保存再配置&#xff09;编译下载tomcat启动下载aspectjweaver移动jw…...

【Ubuntu 20.4安装截图软件 flameshot 】

步骤一&#xff1a; 安装命令&#xff1a; sudo apt-get install flameshot 步骤二&#xff1a; 设置快捷方式&#xff1a; Ubuntu20.4 设置菜单&#xff0c;点击 号 步骤三&#xff1a; 输入软件名称&#xff0c; 软件快捷命令&#xff08;flameshot gui&#xff09;&am…...

AUTOSAR 平台介绍 (R24-11新标准发布!)

AUTOSAR 平台介绍——R24-11 0引言 随着技术的不断进步和市场需求的变化,AUTOSAR在汽车行业中的重要性日益增强。R24-11版本作为AUTOSAR平台的重要更新,旨在提升系统性能、安全性和用户体验。本文将详细介绍R24-11版本的主要更新内容 1 AUTOSAR介绍 AUTOSAR汽车软件架构,旨…...

Framework开发入门(一)之源码下载

一、使用Linux操作系统的小伙伴可以跳转到官网链接按提示操作 官网源码地址&#xff1a;下载源代码 | Android Open Source Project 1.创建一个空目录来存放您的工作文件。为其指定一个您喜欢的任意名称&#xff1a; mkdir WORKING_DIRECTORYcdWORKING_DIRECTORY …...

CentOS7下的 OpenSSH 服务器和客户端

目录 1. 在 IP 地址为 192.168.98.11 的 Linux 主机上安装 OpenSSH 服务器&#xff1b; 2. 激活 OpenSSH 服务&#xff0c;并设置开机启动&#xff1b; 3. 在 IP 地址为 192.168.98.22 的 Linux 主机上安装 OpenSSH 客户端&#xff0c;使用客户端命令&#xff08;ssh、 scp、…...

rocketmq5--(三)--broker发送消息给消费者

202412/30回过头来记录一下&#xff1a;之前一直找不到在哪里把消息丢给消费者&#xff08;2024/11/23&#xff09;&#xff0c;找了很久都没找到&#xff0c;就放弃了&#xff0c;然后发现&#xff0c;我靠原来是在poplongpollingservice里。。。。还是乱打断点&#xff0c;偶…...

QComboBox中使用树形控件进行选择

事情是这样的&#xff0c;要在一个ComboBox中通过树形结构进行内容的选择。 默认的QComboBox展开是下拉的列表。因此需要定制一下。 效果就是这样的 实现上面效果的核心代码就是下面这样的 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { treenew…...

单片机中运行多个定时器

在单片机的裸机编程环境中&#xff0c;同时运行多个定时器是完全可行的&#xff0c;但需要注意一些关键点以确保系统的稳定性和效率。以下是一些考虑因素和实现方法&#xff1a; 1. 硬件支持 定时器数量&#xff1a;首先确认您的单片机是否具备足够的定时器资源。大多数现代…...

go 模拟TCP粘包和拆包,及解决方法

1. 什么是 TCP 粘包与拆包&#xff1f; 粘包&#xff08;Sticky Packet&#xff09; 粘包是指在发送多个小的数据包时&#xff0c;接收端会将这些数据包合并成一个数据包接收。由于 TCP 是面向流的协议&#xff0c;它并不会在每次数据发送时附加边界信息。所以当多个数据包按顺…...

论文笔记PhotoReg: Photometrically Registering 3D Gaussian Splatting Models

1.abstract 最近推出的3D高斯飞溅(3DGS)&#xff0c;它用多达数百万个原始椭球体来描述场景&#xff0c;可以实时渲染。3DGS迅速声名鹊起。然而&#xff0c;一个关键的悬而未决的问题仍然存在&#xff1a;我们如何将多个3DG融合到一个连贯的模型中&#xff1f;解决这个问题将使…...

宝塔服务器安装备份配置

1.服务器下载安装宝塔功能 if [ -f /usr/bin/curl ];then curl -sSO https://download.bt.cn/install/install_panel.sh;else wget -O install_panel.sh https://download.bt.cn/install/install_panel.sh;fi;bash install_panel.sh ed8484bec执行后选择y 等待下载完成会给出…...

ubuntu22 安装CUDA

在Ubuntu系统中&#xff0c;使用nvidia-smi命令可以看到当前GPU信息&#xff0c;在右上角可以看到CUDA Version&#xff0c;意思是最大支持的CUDA版本号。 安装下载 CUDA Toolkit 11.6 Downloads | NVIDIA Developer https://developer.nvidia.com/cuda-downloads?target_osL…...

LabVIEW故障诊断中的无故障数据怎么办

在使用LabVIEW进行故障诊断时&#xff0c;可能会面临“无故障数据”的情况。这种情况下&#xff0c;缺乏明确的故障参考&#xff0c;使得系统难以通过传统对比法进行故障识别。本文将介绍应对无故障数据的关键策略&#xff0c;包括数据模拟、特征提取和基于机器学习的方法&…...

开发模式选择与最佳实践指南20241230

开发模式选择与最佳实践指南 引言 在现代软件开发中&#xff0c;选择合适的开发模式直接影响项目的开发效率和质量。本文将帮助您&#xff1a; &#x1f3af; 了解三种主流开发模式的优缺点&#x1f4a1; 根据项目特点选择最适合的开发模式&#x1f527; 掌握混合开发模式的…...

超详细!一文搞定PID!嵌入式STM32-PID位置环和速度环

本文目录 一、知识点1. PID是什么&#xff1f;2. 积分限幅--用于限制无限累加的积分项3. 输出值限幅--用于任何pid的输出4. PID工程 二、各类PID1. 位置式PID&#xff08;用于位置环&#xff09;&#xff08;1&#xff09;公式&#xff08;2&#xff09;代码使用代码 2. 增量式…...

Redhat7 PCS建立无共享存储浮动地址集群

更新记录 日期版本号内容9/22/2024Ver 1.0重新排版修正 0写在前面 0.1 简述 时间有限使用VMware6.7环境使用Centos7.8最小化安装方式&#xff08;不用配置本地yum仓库&#xff09;注意查看主机名&#xff08;主机双机操作&#xff0c;部分单机操作&#xff09; 序号HostIPAd…...