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

GO语言学习(16)Gin后端框架

目录

☀️前言

1.什么是前端?什么是后端?🌀

2.Gin框架介绍 🌷

3.Gin框架的基本使用 -Hello,World例子🌷

 🌿入门示例 - Hello,World

💻补充(一些常用的网络术语): 

3.1 Get请求与Post请求📞

3.2 状态码 🔧

4.Gin的各类返回方式 🌷

✏️返回字符串:

 ✏️返回xml:

✏️返回文件(如Excel,txt,png等文件):

 ✏️页面重定向:

 5.如何处理前端的请求数据🌷

6.Gin框架实战案例 -表单信息提交处理🌷

4.1 前端JS请求 🔅

4.2 后端Gin编写 🔅 


☀️前言

        通过前面的基本学习,终于开始进入项目学习阶段。本文将主要介绍Go语言官方的后端框架Gin如何与前端数据交互,以及实现最基本的表单数据交互案例,而关于后端操作数据库的部分,将留在下一章进行详细讲解。

1.什么是前端?什么是后端?🌀

        前端和后端是软件开发中的两个重要部分,它们共同协作完成一个完整的产品或系统。通俗来说,前端就像餐厅的前台,负责接待顾客、展示菜单、处理顾客的点餐需求,后端就像餐厅的后厨,负责准备食材、烹饪菜肴、确保菜品按时送到前台,前端是用户看到的“表面”,负责展示和交互。后端是用户看不到的“幕后”,负责处理数据和逻辑。

对比维度前端后端
定义前端是用户直接看到和交互的部分,主要负责展示界面和处理用户操作。后端是运行在服务器上的部分,主要负责数据处理、逻辑运算和存储。
主要功能展示页面、交互设计、响应用户操作(如点击按钮、输入内容)。处理业务逻辑、管理数据库、提供 API 接口给前端调用。
技术栈HTML、CSS、JavaScript、框架(如 React、Vue、Angular)。

服务器语言(如 Python、Java、Node.js、PHP)、

数据库(如 MySQL、MongoDB)。

工作内容设计和实现用户界面、优化用户体验、与后端 API 交互。开发服务器端逻辑、管理数据库、处理数据、提供安全性和性能优化。
用户体验直接影响用户对产品的第一印象,注重界面美观和交互流畅性。间接影响用户体验,主要通过提供稳定、快速的服务来支持前端。
安全性前端代码是公开的,容易被用户查看和篡改,安全性较弱。后端代码运行在服务器上,用户无法直接访问,安全性较高。
开发工具浏览器、代码编辑器(如 VS Code)、前端框架工具。服务器环境、数据库管理工具、API 测试工具(如 Postman)。

2.Gin框架介绍 🌷

        Gin 是一个用 Go 语言编写的高性能 HTTP Web 框架,以轻量级、快速路由和中间件支持著称。Gin的设计目标是帮助开发者快速构建Web应用和RESTful API,同时保持高性能和低资源占用。其主要特点如下:

  1. 高性能:基于Radix树的路由实现,内存占用小,无反射,API性能可预测。
  2. 零分配路由器:路由处理过程中不产生内存分配,确保高效。
  3. 中间件支持:支持链式中间件,可以用于日志记录、认证、GZIP压缩等。
  4. 崩溃恢复:能够捕获HTTP请求中的panic并恢复,确保服务器始终可用。
  5. JSON验证:支持对请求中的JSON数据进行验证,确保数据完整性。
  6. 路由分组:支持路由分组,便于组织不同功能的API版本或权限。
  7. 错误管理:提供方便的方式收集和处理HTTP请求中的错误。
  8. 内置渲染:支持JSON、XML和HTML的渲染。
  9. 可扩展性:易于创建自定义中间件,满足特定需求

同样Go语言的后端框架不止Gin一种,还有其它后端框架,如Beggo,比较结果如下:

框架性能路由中间件适用场景学习曲线
Gin极高基于httprouter丰富且灵活API服务、微服务、高性能后端
Echo自定义实现简洁RESTful API、轻量级应用
Fiber极高类似ExpressExpress风格替代Gin,追求极简语法
Beego中等自带MVC路由全功能全栈开发(含ORM、模板引擎)中高

3.Gin框架的基本使用 -Hello,World例子🌷

        首先我们得先导入Gin的包,熟悉python语言的同学都知道,对于 python 我们可以在终端使用 pip install 命令进行下载所需要的包,而go语言,可以在终端使用 go get 命令来获取第三方包,导入到项目中。我们在项目的终端中,输入如下命令,即可将Gin框架导入到项目中,接下来就可以使用Gin框架进行开发了。

$ go get -u github.com/gin-gonic/gin
 🌿入门示例 - Hello,World
package mainimport "github.com/gin-gonic/gin"   // 导入Gin的包func main() {r := gin.Default()r.GET("/", func(c *gin.Context) {c.JSON(200, gin.H{"message": "Hello, World!"})})r.Run(":8080") // 监听 0.0.0.0:8080
}

 🌳解释🌳:

  • r := gin.Default() 使用gin创建了一个默认的路由器实例,它会自动加载一些中间件,比如日志记录和恢复中间件,接下来由它负责处理网页的HTTP请求并调用相应的处理函数。
  • r.get用于定义一个GET请求的路由。这里定义了一个路径为"/"的GET请求处理函数。当客户端访问应用的根路径"/"时,会调用这个处理函数。cgin.Context类型的参数,它包含了请求和响应的所有信息。c.JSON用于向客户端发送JSON格式的响应。200是HTTP状态码,表示请求成功。gin.H是一个快捷方式,用于创建一个map[string]interface{},这里用于构建JSON响应内容。
  • r.Run()启动HTTP服务器并开始监听请求。":8080"指定了服务器监听的端口号为8080

         通过本次简单的例子,我们可以归纳出更为普遍的Gin后端框架处理流程,如下图所示:

💻补充(一些常用的网络术语): 

3.1 Get请求与Post请求📞

        通俗来说,GET请求就像去图书馆借书,你告诉图书馆员你想借的书名(参数),这个书名会显示在借书单上(URL),别人可以看到。POST请求就像去图书馆还书,你把书交给图书馆员(数据放在请求体中),这个过程是相对私密的,别人不会知道你具体还了什么书。

对比维度GET请求POST请求
用途用于从服务器获取数据,比如访问一个网页或查询信息。用于向服务器提交数据,比如提交表单或上传文件。
数据传递方式参数附加在URL后面,比如http://example.com/search?q=keyword数据放在请求体中,不会显示在URL中。
安全性相对不安全,因为参数会显示在浏览器地址栏中,可能会被保存在浏览器历史记录或服务器日志中。相对更安全,因为数据不会显示在浏览器地址栏中,也不容易被缓存或记录在历史中。
限制URL长度有限制,通常不能超过2048个字符,不适合传递大量数据。没有长度限制,可以传递大量数据。
缓存可以被浏览器缓存,多次访问相同的URL时可能不会每次都向服务器发送请求。通常不会被浏览器缓存,每次提交都会向服务器发送请求。
幂等性是幂等的,多次请求相同URL不会产生不同结果。不是幂等的,多次提交相同数据可能会产生不同结果(如多次提交表单)。
书签可以通过书签保存URL,方便后续访问。不能通过书签保存请求体中的数据。
适用场景适合简单的查询和数据获取,比如搜索、查看页面内容。适合复杂操作和敏感数据的提交,比如登录、文件上传、表单提交等。
3.2 状态码 🔧

        HTTP状态码是服务器对客户端请求的响应状态的三位数字代码,用于表示请求的处理结果。状态码分为以下几类:

  • 1xx(信息性状态码):表示请求已接收,正在处理。

  • 2xx(成功状态码):表示请求已成功处理。

  • 3xx(重定向状态码):表示需要进一步操作才能完成请求。

  • 4xx(客户端错误状态码):表示客户端请求有误,服务器无法处理。

  • 5xx(服务器错误状态码):表示服务器处理请求时发生错误。

状态码描述
100继续,表示服务器已收到请求的初始部分,客户端可以继续发送其余请求。
200请求成功,服务器返回了请求的数据。
201资源已成功创建。
301资源的URL已永久更改。
302资源的URL暂时更改。
400请求有误,服务器无法处理。
401请求未授权。
403请求被拒绝。
404请求的资源不存在。
500服务器内部错误,无法完成请求。
502服务器从上游服务器接收到的响应无效。
503服务不可用,通常是服务器过载或维护

        而在Go语言中,可以使用net/http包来处理HTTP请求和响应,如http.StatusOK代表状态码200http.StatusBadRequest代表状态码400http.StatusInternalServerError代表状态码500

4.Gin的各类返回方式 🌷

        上述基本案例中,Gin返回的数据类型为json格式,下面介绍一些别的格式的数据返回。

✏️返回字符串:

router.GET("/str", func(c *gin.Context) {c.String(http.StatusOK, "返回成功")
})

 ✏️返回xml:

router.GET("/xml", func(c *gin.Context) {c.XML(http.StatusOK, gin.H{"user": "FJNU", "message": "hey", "status": http.StatusOK})
})

✏️返回文件(如Excel,txt,png等文件):

 router.GET("/download/:filename", func(c *gin.Context) {filename := c.Param("filename")           // 获取前端传输的文件名filePath := "./files/" + filename        // 获取本地的文件路径c.File(filePath)              // 将对应的文件传回前端})

        上述方法用于返回单个文件,filename必须包含文件的扩展名(如.png),Gin会自动根据文件扩展名设置正确的MIME类型。

        如果希望文件被浏览器作为附件下载而不是直接显示,可以使用c.FileAttachment()方法。

package mainimport "github.com/gin-gonic/gin"func main() {router := gin.Default()router.GET("/download/:filename", func(c *gin.Context) {filename := c.Param("filename")filePath := "./files/" + filenamec.FileAttachment(filePath, filename)})router.Run(":8080")
}

 ✏️页面重定向:

        如果你希望点击某个按钮后,跳转到另一个页面,可以使用以下方法:

router.GET("/redirect", func(c *gin.Context) {//支持内部和外部的重定向c.Redirect(http.StatusMovedPermanently, "http://www.baidu.com/")
})

 5.如何处理前端的请求数据🌷

        c *gin.Context 是 Gin 框架处理 HTTP 请求的核心对象,封装了请求和响应的所有操作。以下是其核心功能及用法:

功能方法/属性说明
获取请求参数c.Param("key")获取路由参数(如 /user/:id → id
c.Query("key")获取 URL 查询参数(如 ?name=John
c.PostForm("key")获取表单数据(Content-Type: application/x-www-form-urlencoded
c.FormFile("file")获取上传的文件(Content-Type: multipart/form-data
请求头操作c.GetHeader("User-Agent")获取请求头字段
c.Request.Header直接访问原始请求头(http.Header类型)

1.获取路由当中的静态值(Query):

r.GET("/test/:age", func(c *gin.Context) {age := c.Query("age")c.String(200, "I am %s years old", age)})

2.获取动态路由中的值(Param):

r.GET("/hello/:name", func(c *gin.Context) {name := c.Param("name")c.String(200, "hello %s", name)})

 3.保存前端所上传的文件(如word,excel,png图片等):

r := gin.Default()// 设置静态文件目录,方便前端访问上传的文件r.Static("/uploads", "./uploads")// 处理文件上传r.POST("/upload", func(c *gin.Context) {// 获取名为 "file" 的上传文件file, err := c.FormFile("file")if err != nil {c.String(http.StatusBadRequest, fmt.Sprintf("get form file err: %s", err.Error()))return}// 获取上传文件的原始文件名filename := file.Filename// 指定文件保存路径destination := "./uploads/" + filename// 创建 uploads 目录(如果不存在)err = os.MkdirAll("./uploads", os.ModePerm)if err != nil {c.String(http.StatusInternalServerError, fmt.Sprintf("mkdir err: %s", err.Error()))return}// 保存上传的文件到指定位置if err := c.SaveUploadedFile(file, destination); err != nil {c.String(http.StatusInternalServerError, fmt.Sprintf("upload file err: %s", err.Error()))return}// 返回成功信息c.String(http.StatusOK, fmt.Sprintf("'%s' uploaded!", filename))})

当然对于接受到的前端数据c,也可以进行后端变量的数据绑定:

方法说明
c.ShouldBindJSON(&obj)将请求体 JSON 绑定到结构体,自动触发 binding 标签验证
c.ShouldBindQuery(&obj)绑定 URL 查询参数到结构体
c.ShouldBindUri(&obj)绑定路由参数到结构体
c.Bind(&obj)自动根据 Content-Type 选择绑定方式,验证失败直接返回 400 错误

以下为一段示例代码:

type User struct {Name  string `json:"name" binding:"required"`// 必填且必须是邮箱格式Email string `json:"email" binding:"required,email"`// 数值范围限制(18 ≤ Age ≤ 60)Age   int    `json:"age" binding:"gte=18,lte=60"`// 字符串长度限制(6 ≤ 密码长度 ≤ 16)Password string `json:"password" binding:"required,min=6,max=16"`// 枚举值(只能是 "male" 或 "female")Gender string `json:"gender" binding:"oneof=male female"`
}
func CreateUser(c *gin.Context) {var user Userif err := c.ShouldBindJSON(&user); err != nil {// 返回验证错误信息c.JSON(400, gin.H{"error": err.Error()})return}// 验证通过后的业务逻辑c.JSON(200, gin.H{"message": "User created"})
}

         上述代码,会将前端传回的json数据c的值绑定在结构体变量user中,并验证数据是否符合结构体当中的binding要求,若不满足则会产生对应的错误err,否则err为空。

        对于中间件与流程控制,有如下方法: 

方法说明
c.Next()继续执行后续中间件或处理函数(通常在中间件中调用)
c.Abort()终止当前请求的后续处理(如权限校验失败时)
c.AbortWithStatus(code)终止并返回指定 HTTP 状态码
c.Set("key", value)存储数据供后续中间件或处理函数使用
c.Get("key")获取通过 Set 存储的值

中间件示例代码:

func AuthMiddleware() gin.HandlerFunc {return func(c *gin.Context) {token := c.GetHeader("Authorization")if token != "valid-token" {c.AbortWithStatusJSON(401, gin.H{"error": "Unauthorized"})return}c.Set("user", "admin") // 传递用户信息c.Next()}
}// 路由中使用中间件
router.GET("/admin", AuthMiddleware(), func(c *gin.Context) {user := c.MustGet("user").(string)c.String(200, "Welcome %s", user)
})

        关于响应的请求头,以及Cookie,Session会话机制的内容,将在后续章节进一步详细解释。 

6.Gin框架实战案例 -表单信息提交处理🌷

        本次案例地前端是使用VUE3与Vite共同创建,采用的UI组件为ElementPlus-Form,如果你熟悉VUE2或其他UI组件库,当然也可以使用。这里就不过多叙述前端的搭建了,前端页面最终效果如下:

4.1 前端JS请求 🔅

        对Create按键添加绑定函数,使得用户点击该按钮的时候,能够自动提交表单填写的信息。

                         

        接着使用Axios,将前端的表单数据发送到后端,当然熟悉fetch的uu,也可以使用fetch的方法进行数据传递。             

4.2 后端Gin编写 🔅 

        首先先介绍一个概念-跨域请求(CORS):CORS(Cross-Origin Resource Sharing)是一种机制,允许服务器通过设置HTTP头部来指定哪些源(域、协议或端口)可以访问其资源。它用于解决浏览器的同源策略限制,使得不同源之间的资源可以安全地进行交互。 

        为了使得数据可以从前端传递到后端,首先我们得先配置一下Gin的CORS,具体代码如下:

r := gin.Default()// 自定义 CORS 中间件r.Use(func(c *gin.Context) {// 设置允许的请求头c.Writer.Header().Set("Access-Control-Allow-Origin", "*")c.Writer.Header().Set("Access-Control-Allow-Credentials", "true")c.Writer.Header().Set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS")c.Writer.Header().Set("Access-Control-Allow-Headers", "Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization, accept, origin, Cache-Control, X-Requested-With")if c.Request.Method == "OPTIONS" {c.AbortWithStatus(http.StatusNoContent)return}c.Next()})

        配置完CORS之后,开始编写处理函数部分:

r.POST("/submit-form", func(c *gin.Context) {var formData map[string]interface{}if err := c.BindJSON(&formData); err != nil {c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})return}c.JSON(http.StatusOK, gin.H{"message": "Form submitted successfully", "data": formData})})

        这里与前端的请求相照应,由于前端发起的是POST方式,所以此处也使用r.POST,而不能使用r.GET,路径对应前端的请求路径,为 /submit-form

        接着声明一个 map[string]interface{} 类型的变量formData,用于存储从请求体中解析出来的JSON数据。map[string]interface{}是一个通用的键值对结构,可以存储任意类型的值。(关于Go语言当中map数据类型的内容,我确实没写过...后续有时间在补上。)

        c.BindJSON(&formData)尝试从请求体中解析JSON数据,并将其绑定到formData变量中。如果解析失败,err会包含错误信息。如果解析失败,使用c.JSON发送一个400状态码(http.StatusBadRequest)和一个包含错误信息的JSON响应。如果JSON解析成功,使用c.JSON发送一个200状态码(http.StatusOK)和一个包含成功消息和解析数据的JSON响应。

        最后依据前端的访问端口,进行对应的配置:

r.Run(":8000")

 至此,后端部分完成,下面开始测试:

1.使用npm run开启前端界面,以及运行对应的后端Go文件。

2.在前端界面的表单中输入信息,并点击Create按钮进行表单数据的提交

3.在后端Gin文件中,可以查看到刚刚的前端请求信息

 4.在前端界面中,使用F12,点击Console,可以在控制台看到,Gin所传回来的后端数据,接着前端接受,使用变量接收数据,便可以将数据渲染显示在网页界面上了。

相关文章:

GO语言学习(16)Gin后端框架

目录 ☀️前言 1.什么是前端?什么是后端?🌀 2.Gin框架介绍 🌷 3.Gin框架的基本使用 -Hello,World例子🌷 🌿入门示例 - Hello,World 💻补充(一些常用的网…...

GO语言 使用protobuf

1.什么是protobug,为什么要学它 protobuf是一种类似于json和xml的数据序列化格式 我们可能会存在这样的问题:不同语言之间真的没有办法互相传递数据吗?如果可以,那如果一个项目使用了多种语言有应该如何传递数据? 这…...

Golang的文件处理优化策略

Golang的文件处理优化策略 一、Golang的文件处理优化策略概述 是一门效率高、易于编程的编程语言,它的文件处理能力也非常强大。 在实际开发中,需要注意一些优化策略,以提高文件处理的效率和性能。 本文将介绍Golang中的文件处理优化策略&…...

Golang的文件同步与备份

Golang的文件同步与备份 一、Golang介绍 也称为Go语言,是谷歌开发的一种编程语言,具有高效的并发编程能力和出色的内存管理。由于其快速的编译速度和强大的标准库,Golang在网络应用、云平台和大数据等领域得到了广泛应用。 二、文件同步与备份…...

Go和Golang语言简介

李升伟 整理 Go 和 Golang 实际上指的是同一种编程语言,只是名称不同。 Go 名称:Go 是该编程语言的正式名称。 起源:由 Google 的 Robert Griesemer、Rob Pike 和 Ken Thompson 于 2007 年开始设计,2009 年正式发布。 设计目…...

spring boot集成reids的 RedisTemplate 序列化器详细对比(官方及非官方)

RedisTemplate 序列化器详细对比(官方及非官方) 1. 官方序列化器 (1) JdkSerializationRedisSerializer 特点: 基于 Java 原生序列化(Serializable)。支持复杂对象(需实现 Serializable 接口)…...

NLP高频面试题(三十二)——介绍一下CLIP和CLIP2

在人工智能领域,图像与文本的结合一直是研究的热点。近年来,OpenAI推出的CLIP模型,以及后续发展的CLIP2模型,在多模态学习方面取得了显著进展。本文将对这两个模型进行介绍,探讨它们的架构、训练方法和应用场景。 CLI…...

【FPGA】状态机思想回顾流水灯

【FPGA】状态机思想回顾流水灯 一、LED流水灯实现1. 基本要求2. 状态机思想3. 关键代码4. 仿真测试5. 效果演示 二、CPLD和FPGA1. 技术区别2. 应用场景 三、HDLbits组合逻辑题目四、实验总结 一、LED流水灯实现 1. 基本要求 用状态机思想写一个 LED流水灯的FPGA代码写出仿真测…...

Java——StringBuilder和StringBuffer

StringBuilder和StringBuffer 字符串的不可变性字符串修改StringBuilder和StringBuffer1 字符串拼接2 获取、修改和删除下标字符3 插入字符4 字符串替换5 字符串反转6 StringBuffer和StringBuilder类与String类的转换 StringBuffer和StringBuilder类的区别 前言 在Java中String…...

基于yolo11的BGA图像目标检测

1.产生图像数据的分辨率 2.产生图像的大小 3.产生图像是黑白或是RGB彩色 灰度图像,达到识别要求,减少计算量 4.标注数据的精准程度 1.模型标注后,少量标注全部人工校验,大量数据抽检,部分人工检验 2.明确边界框贴合…...

MongoDB 复制集实战

MongoDB 复制集实战 MongoDB 复制集架构 一、复制集核心原理 主从架构与数据冗余 复制集由主节点(Primary)和多个从节点(Secondary)构成,所有节点存储相同数据集副本。 主节点:唯一接受写操作的节点&…...

一个服务器算分布式吗,分布式需要几个服务器

一个服务器不构成分布式系统。分布式系统的核心在于多台独立的计算机(服务器)协同工作,通过通信网络共享资源、共同完成任务。以下是对问题的详细分析: 1. 单台服务器 ≠ 分布式 单台服务器的架构是集中式的,所有功能…...

k8s之Ingress讲解

一、Ingress基本介绍 Ingress是管理k8s外部访问(http/https)的API对象,提供应用层的路由功能,处理第七层(http/https)流量,支持基于域名、路径的路由。与service不同的是,service处理…...

centos-LLM+EmbeddingModel+VectorDB-简单模型

参考: Ollama平台里最流行的embedding模型: nomic-embed-text 模型介绍和实践-CSDN博客 https://blog.csdn.net/skywalk8163/article/details/145498041 https://docs.cherry-ai.com/knowledge-base/data Installation — Sentence Transformers docum…...

Uniapp 持续出现 Invalid Host/Origin header 解决方法

目录 前言1. 问题所示2. 原理分析前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 爬虫神器,无代码爬取,就来:bright.cn 1. 问题所示 执行代码的时候,源源不断,一直持续出现这个 Invalid Host/Origin header [WDS]...

密码学基础——古典密码学

目录 一、定义 特点: 二、发展阶段 三、代换密码 1.单表代换密码 1.1恺撒密码 1.2 移位变换 1.3 仿射变换 2.多表代换密码 维吉尼亚密码 四、置换密码 栅栏密码 一、定义 古典密码学是指在现代密码学出现之前,使用较为简单的数学方法和手工…...

Java 连接 Redis 的驱动(Jedis、Lettuce、Redisson、Spring Data Redis)分类及对比

Java 连接 Redis 的驱动分类及对比 1. Jedis 类型:纯 Java 实现的 阻塞式(同步) 客户端特点: 基于阻塞 IO,每个连接一个线程,适合中小型应用。支持单机、哨兵模式、集群模式。使用简单,直接操作…...

人工智能之数学基础:基于吉文斯变换完成矩阵的QR分解

本文重点 在数值线性代数中,QR分解是将矩阵分解为一个正交矩阵(Q)和一个上三角矩阵(R)的重要方法。它在求解线性方程组、计算矩阵特征值及最小二乘问题中具有广泛应用。吉文斯变换(Givens Transformation)作为实现QR分解的核心工具之一,通过平面旋转变换逐步消去矩阵元…...

后端框架入门:Django

Django 基础:模型、视图、模板Django REST Framework 的使用一、Django 概述 Django 是一个 高效、灵活、可扩展 的 Python Web 框架,主要用于快速开发 Web 应用 和 REST API。 📌 Django 的优势: ✅ MTV 架构:模型(Model)、视图(View)、模板(Template)分离,便于…...

16变量命名风格

给变量/函数/文件/类 起名字, 非常有讲究的~~ 1.起的名字要有描述性.不要使用 abc,xyz 这种比较无规律的名字来描述 2.如果名字比较长,由多个单词构成的,就需要使用适当的方式来进行区分不同单词 C中,偏好使用_来进行单词的分割. 形如: student_count(变量) unordered_map(stl容…...

【自学笔记】jQuery语言基础知识点总览-持续更新

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 jQuery基础知识点总览1. jQuery简介2. jQuery选择器示例代码 3. jQuery事件示例代码 4. jQuery动画示例代码 5. jQuery Ajax示例代码 6. jQuery DOM操作示例代码 总…...

基于机器学习的三国时期诸葛亮北伐失败因素量化分析

一、研究背景与方法论 1.1 历史问题的数据化挑战 三国时期(220-280年)的战争史存在史料分散、数据缺失的特点。本研究通过构建包含军事、经济、地理、政治四大维度的结构化数据库,收录建安十二年(207年)至建兴十二年…...

读取excel作为第一列创建数据表,然后将值插入数据表

读取 Excel 文件。创建一个数据库表,其列名与 Excel 表格的列名相同。插入数据,对于每一行,如果数据为 #N/A,插入空值。 下面是一个 Python 示例代码,使用 pandas 读取 Excel 文件,创建数据库表&#xff0…...

14-SpringBoot3入门-MyBatis-Plus之CRUD

1、整合 13-SpringBoot3入门-整合MyBatis-Plus-CSDN博客 2、表 3、crud package com.sgu;import com.sgu.mapper.UserMapper; import com.sgu.pojo.User; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.spri…...

英语口语 -- 常用 1368 词汇

英语口语 -- 常用 1368 词汇 介绍常用单词List1 (96 个)时间类气候类自然类植物类动物类昆虫类其他生物地点类 List2 (95 个)机构类声音类食品类餐饮类蔬菜类水果类食材类饮料类营养类疾病类房屋类家具类服装类首饰类化妆品类 Lis…...

《汽车噪声控制》课程作业

作业内容 在MATLAB绘制给出单个正弦波或余弦波的时域图和频域图 绘制实测数据的时域图和频域图 图1 单个正弦波的时频图 图1 单个正弦波的时频图 % 正弦波参数设置 f0 1000; % 信号频率 1kHz Fs 16384; % 采样频率 16kHz T 0.05; % 信号持续时间 0.05秒 A 0.8; % 信号幅度…...

nginx的反向代理和负载均衡

http 协议反向代理 反向代理配置参数: proxy_pass;#用来设置将客户端请求转发给的后端服务器的主机 可以是主机名(将转发至后端服务做为主机头首部)、IP地址:端口的方式 也可以代理到预先设置的主机群组,需要模块ngx_http_upstream_module支…...

栈 —— 数据结构基础刷题路程

一、P1739 表达式括号匹配 - 洛谷 算法代码&#xff1a; #include<bits/stdc.h> using namespace std; const int N300008; struct mystack {int a[N];int t-1;//压栈void push(int data){a[t]data; } //取栈顶元素int top(){return a[t]; } //弹出栈顶元素void pop(){i…...

SQL语句(一)—— DDL

目录 一、SQL 基础知识 &#xff08;一&#xff09;SQL 通用语法 &#xff08;二&#xff09;SQL 分类 二、DDL —— 数据库操作 1、查询所有数据库 2、查询当前数据库 3、创建数据库 4、删除数据库 5、切换数据库 三、DDL —— 表操作 &#xff08;一&#xff09;查…...

ROS2 高级组件中的webots介绍

前言 这一篇文章主要是和大家分享一下关于ROS2 高级组件中的webots&#xff0c;会介绍关于webots的知识点&#xff0c;以及如何安装和测试环节&#xff0c;最后就是利用 webots 实现一个差速轮式机器人的运动仿真。 正文内容 webots 引入和学习资料 webots 是来自瑞士的 Cy…...

SvelteKit 最新中文文档教程(17)—— 仅服务端模块和快照

前言 Svelte&#xff0c;一个语法简洁、入门容易&#xff0c;面向未来的前端框架。 从 Svelte 诞生之初&#xff0c;就备受开发者的喜爱&#xff0c;根据统计&#xff0c;从 2019 年到 2024 年&#xff0c;连续 6 年一直是开发者最感兴趣的前端框架 No.1&#xff1a; Svelte …...

Java 基础-29-final关键字-详解

在Java编程语言中&#xff0c;final是一个非常重要的关键字&#xff0c;它用于不同的上下文中以表示某些东西是不可变的。本文将详细介绍final关键字的各种用法和其应用场景。 1. final变量 当你将一个变量声明为final时&#xff0c;这意味着一旦给这个变量赋值后&#xff0c…...

从数据透视到AI分析,用四层架构解决运维难题

在数字化转型的浪潮中&#xff0c;企业 IT 系统已从单一架构演变为多云、多设备、多应用的复杂生态。传统监控工具因覆盖不全、响应滞后、分析能力弱而逐渐失效。Site24x7 以“全栈覆盖 智能协同”为核心&#xff0c;构建了一套四层递进式监控架构&#xff0c;实现从基础设施到…...

大智慧前端面试题及参考答案

如何实现水平垂直居中? 在前端开发中,实现元素的水平垂直居中是一个常见的需求,以下是几种常见的实现方式: 使用绝对定位和负边距:将元素的position设置为absolute,然后通过top、left属性将其定位到父元素的中心位置,再使用负的margin值来调整元素自身的偏移,使其水平垂…...

PyQt学习记录

PyQt学习记录 要在界面上 创建一个控件&#xff0c;就需要在程序代码中 创建 这个 控件对应类 地一个 实例对象。 在Qt系统中&#xff0c;控件&#xff08;widget&#xff09;是 层层嵌套 的&#xff0c;除了最顶层的控件&#xff0c;其他的控件都有父控件。 几个函数 函数mo…...

人工智能赋能管理系统,如何实现智能化决策?

随着信息技术的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;已经成为推动各行各业变革的重要力量。在企业管理领域&#xff0c;人工智能技术的引入为管理系统的智能化决策提供了强有力的支持。本文将深入探讨人工智能如何赋能管理系统&#xff0c;实现智能化决策&a…...

【深度学习新浪潮】DeepSeek近期的技术进展及未来动向

一、近期技术进展 模型迭代与性能提升 DeepSeek-V3-0324版本更新:2025年3月24日发布,作为V3的小版本升级,参数规模达6850亿,采用混合专家(MoE)架构,激活参数370亿。其代码能力接近Claude 3.7,数学推理能力显著提升,且在开源社区(如Hugging Face)上线。DeepSeek-R1模…...

存储型XSS漏洞解析

一、存储型XSS漏洞的核心原理 定义与攻击流程 存储型XSS&#xff08;Stored XSS&#xff09;是一种将恶意脚本永久存储在服务器端​&#xff08;如数据库、文件系统&#xff09;的跨站脚本攻击方式。其攻击流程分为四步&#xff1a; 注入阶段&#xff1a;攻击者通过输入点&…...

Python实现 MCP 客户端调用(高德地图 MCP 服务)查询天气工具示例

文章目录 MCP 官网GithubMCP 仓库简介架构高德地图 MCP 客户端示例python-sdk 客户端java-sdk 客户端 MCP 官网 https://modelcontextprotocol.io/introduction Github python-sdk&#xff1a;https://github.com/modelcontextprotocol/python-sdkjava-sdk&#xff1a;https…...

Flink介绍——实时计算核心论文之S4论文总结

PE对象的构成与功能 我们先来看下S4是怎么抽象流式计算的。 S4将所有的计算过程抽象为一个个Processing Element&#xff08;处理元素&#xff09;对象&#xff0c;简称为PE对象。 每一个PE对象&#xff0c;都有四部分组成&#xff0c;分别是&#xff1a; 功能&#xff08;F…...

第二十四章:Python-folium库实现中国地图绘制

一、folium库简介 hchinamap库是一个专门用于绘制中国地图的R包&#xff0c;它通过与Highmaps图表库的结合&#xff0c;提供了一种简单的方式来绘制中国及其各省市自治区的地图。虽然hchinamap库是为R语言设计的&#xff0c;但在Python中也可以通过类似的库&#xff08;如matpl…...

云巅之上:数字文明的重构与超越

序章&#xff1a;算力新纪元 2024年初春&#xff0c;当SpaceX的星舰将首批云计算节点送入近地轨道时&#xff0c;地球上的数字原住民们正通过云端AI助手规划着一天的行程。这场静默的革命已悄然进入新阶段——云计算不再只是工具&#xff0c;而是成为数字文明的"第六元素…...

蓝桥杯高频考点——高精度(含C++源码)

高精度 前言高精度加法例题思路及代码solution 1&#xff08;初阶版 40分&#xff09;solution 2&#xff08;完全体 AC&#xff09; 高精度乘法例题思路及代码solution 1&#xff08;TLE 但是代码很清晰&#xff09;solution 1的问题solution 2&#xff08;优化 AC&#xff09…...

程序化广告行业(52/89):程序化创意深度剖析

程序化广告行业&#xff08;52/89&#xff09;&#xff1a;程序化创意深度剖析 大家好&#xff01;我一直对程序化广告领域充满热情&#xff0c;在学习过程中发现其中有很多有趣又实用的知识。今天写这篇博客&#xff0c;就是希望能和大家一起学习进步&#xff0c;深入探索程序…...

selenium和pytessarct提取古诗文网的验证码(python爬虫)

代码实现的主要功能&#xff1a; 浏览器自动化控制 验证码图像获取与处理 OCR验证码识别 表单自动填写与提交 登录状态验证 异常处理与资源清理 1. 浏览器初始化与页面加载 driver webdriver.Chrome() driver.get("https://www.gushiwen.cn/user/login.aspx?fro…...

封装可拖动弹窗(vue jquery引入到html的版本)

vue cli上简单的功能&#xff0c;在js上太难弄了&#xff0c;这个弹窗功能时常用到&#xff0c;保存起来备用吧 备注&#xff1a;deepseek这个人工智障写一堆有问题的我&#xff0c;还老服务器繁忙 效果图&#xff1a; html代码&#xff1a; <div class"modal-mask&qu…...

JavaScript重难点突破:期约与异步函数

同步和异步 ​同步&#xff08;Synchronous&#xff09;​ ​定义&#xff1a;任务按顺序依次执行&#xff0c;前一个任务完成前&#xff0c;后续任务必须等待。 ​特点&#xff1a;阻塞性执行&#xff0c;程序逻辑直观&#xff0c;但效率较低 ​异步&#xff08;Asynchron…...

Spring事务的传播机制

目录 Spring 中事务的实现编程式事务(了解即可)&#xff1a;声明式事务(利用注解自动开启和提交事务)&#xff1a;事务回滚注意事项&#xff1a; Spring 事务传播机制&#xff1a;1.Propagation.REQUIRED&#xff1a;7.Propagation.NESTED&#xff1a;Propagation.NESTED和1.Pr…...

LlamaIndex实现RAG增强:融合检索(Fusion Retrieval)与混合检索(Hybrid Search)

&#x1f9e0; 向所有学习者致敬&#xff01; “学习不是装满一桶水&#xff0c;而是点燃一把火。” —— 叶芝 我的博客主页&#xff1a; https://lizheng.blog.csdn.net &#x1f310; 欢迎点击加入AI人工智能社区&#xff01; &#x1f680; 让我们一起努力&#xff0c;共创…...

什么是向量搜索Vector Search?

&#x1f9e0; 向所有学习者致敬&#xff01; “学习不是装满一桶水&#xff0c;而是点燃一把火。” —— 叶芝 我的博客主页&#xff1a; https://lizheng.blog.csdn.net &#x1f310; 欢迎点击加入AI人工智能社区&#xff01; &#x1f680; 让我们一起努力&#xff0c;共创…...