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

【Gin】精准应用:Gin框架中工厂模式的现代软件开发策略与实施技巧(下)

【Gin】精准应用:Gin框架中工厂模式的现代软件开发策略与实施技巧(下)

大家好 我是寸铁👊
【Gin】精准应用:Gin框架中工厂模式的现代软件开发策略与实施技巧(下)✨
喜欢的小伙伴可以点点关注 💝

在这里插入图片描述

前言

本次文章分为上下两部分,上部分为对理论的介绍,下部分为具体的底层代码深度剖析和编程实践,感兴趣的伙伴不要错过哦~

上篇:【Gin】精准应用:Gin框架中工厂模式的现代软件开发策略与实施技巧(上)

在现代软件开发中,设计模式是提高代码质量和可维护性的重要工具之一。特别是对于像Gin这样的高性能、轻量级的Web框架,如何合理运用设计模式显得尤为重要。工厂模式作为其中一种经典的创建型模式,能够帮助开发者有效地解耦对象的创建过程,并提供更大的灵活性和可扩展性。本文将深入探讨在Gin框架中工厂模式的具体应用场景、实施技巧以及现代软件开发中的最佳实践。
工厂模式通过引入工厂类来负责创建对象的过程,可以根据需要动态地生成不同类型的对象,而无需直接在代码中指定具体的类。在Gin框架中,合理运用工厂模式可以优化路由、中间件和控制器的管理,提升代码的模块化程度和可测试性。本文旨在帮助开发者深入理解工厂模式在实际项目中的应用,以及如何利用它来构建更加灵活和可扩展的Web应用程序。


关键的类图和时序图

(1) 类图

角色介绍

Client:
客户端,应用程序类,它需要某种产品对象,但不直接创建它们,而是通过工厂来获取所需的产品对象。


GinFactory:
工厂接口或抽象类,声明了创建产品对象的方法。它可以是抽象的,也可以提供默认的实现,但通常不会创建具体的产品对象。


RouterFactory:
具体工厂类,实现了工厂接口或抽象类,并负责创建具体的产品对象。每个具体工厂对应一种具体产品的创建方式。


IRoute:
产品接口或抽象类,定义了工厂方法模式创建的对象类型。具体的产品类将实现这个接口或继承这个抽象类,客户端最终会使用这些产品。


在这里插入图片描述
图1 工厂模式类图

由图1可知:gin工厂类具有创建gin引擎对象的方法,实现IRoute接口,具体的创建对象职责由不同的Router路由工厂类承担。


(2) 时序图

在这里插入图片描述图2 工厂模式时序图

由图2得:客户端请求产品:客户端Client需要获取具体产品invoke(),调用工厂对象的方法来请求产品对象。
工厂方法调用:工厂对象(Gin)接收到客户端的请求,调用工厂方法(Default())来创建具体产品。
具体工厂创建产品:具体工厂类(Router)实现了工厂方法,根据客户端请求创建具体的产品对象New()
产品创建完成:具体产品(IRoute)被创建并返回给客户端,客户端可以继续使用这个产品实例进行操作。


主程序的流程

由如下图3可得:

程序开始 先调用Gin工厂Defalut()获得engine引擎对象,其中Defalut()方法中包含Router工厂的真正创建对象方法New() 返回创建好的engine引擎对象,返回对象后,客户端获取到engine对象,程序结束。

在这里插入图片描述

图 3 工厂模式主程序流程图

程序模块之间的调用关系

如下图展示程序模块之间的调用关系:
在这里插入图片描述
图4 工厂模式调用关系图

由图4得: 客户端调用gin工厂,gin工厂gin.Default()创建一个默认的Gin引擎对象Default()方法中调用New()创建engine对象实例engine对象的类型为Engine,New()方法中用&{}的方式创建Engine结构体对象,对象创建完毕后,再把对象返回给客户端使用。

在上图的基础上,下面结合设计模式对程序中各个模块的源码进行深入剖析:

在这里插入图片描述

图5 客户端调用代码

首先,在客户端中使用gin工厂调用Defalut()方法得到一个Gin引擎对象。这里无需暴露任何的new创建对象,gin.Default() 可以被看作是一个工厂方法,它封装了创建Gin引擎实例的细节。客户端代码(即这段示例中的 main() 函数)不需要了解或直接处理Gin引擎的内部实现细节。通过调用 gin.Default(),客户端只需获取一个已经配置好的Gin引擎实例,然后可以直接开始定义路由和处理HTTP请求。


在这里插入图片描述图6 抽象工厂代码

该代码的位置位于gin.go文件中的220-226行,需要注意的是在Golang的世界中,并没有 abstract 关键字。Go语言支持面向对象的设计哲学之一是保持简洁和直接,因此它没有类似于其他面向对象语言(如Java、C#)中的抽象类和抽象方法的概念。并且所有的成员都封装在具体的Struct中,可以类比为Java的类,但与Java不同的是,Struct不存放具体的方法,只是将要用到的成员变量封装到一个结构体Struct中,只承担存储的职责,无任何实际的操作。实际的操作只在文件中的方法中具体编写、展开即可。为了比较好理解设计模式关系,可以暂且认为Default()为抽象工厂部分,具体的实现New为具体工厂部分。

工厂方法的定义:在Default()函数内部,首先调用了 New() 函数来创建一个新的 Engine 实例。这里可以将 New() 函数视为简单工厂方法,用于实例化一个基本的 Engine 对象
封装对象创建过程:接着,通过 engine.Use(Logger(), Recovery()) 将日志记录和恢复中间件附加到新创建的引擎实例上。这一步是在工厂方法内部对对象进行配置的典型操作,确保了每个通过 Default() 创建的引擎都具有相同的预配置行为。

配置默认选项:Default() 方法通过接受可选的 OptionFunc 参数来支持对引擎的额外定制。这些选项可以是函数或者闭包,允许开发者在创建引擎时进一步配置和调整其行为,例如设置路由、中间件或者其他定制化的功能。

灵活的选项扩展:Default() 方法通过接受可选的 OptionFunc 参数来支持对引擎的额外定制。这些选项可以是函数或者闭包,允许开发者在创建引擎时进一步配置和调整其行为,例如设置路由、中间件或者其他定制化的功能。

隐藏具体实现细节:
客户端调用 Default() 方法时,只需知道它返回一个预配置好的 Engine 实例,而无需了解内部的对象创建和配置细节。这种封装隐藏了具体实现,降低了客户端代码与Gin框架的耦合度,同时提升了代码的可维护性和灵活性。

小结:Default() 函数在这段代码中充当了工厂方法的角色,通过封装对象的创建和配置过程,提供了一个统一的接口来获取预配置的 Engine 实例。这种设计符合工厂模式的核心思想,即封装和隐藏对象的创建细节,提供灵活性和可扩展性的同时,简化了客户端代码的使用方式。


在这里插入图片描述

图7 具体工厂代码

该代码的位置位于gin.go文件中的188-218行:由于没有抽象类和具体类的概念,这里可以将New()具体实现部分作为具体工厂角色。下面对具体工厂的职责和对象的初始化代码进行剖析:

在这里插入图片描述
图8 New方法代码

189行:debugPrintWARNINGNew():这是一个调试函数或者日志函数的调用,用于输出或记录关于 New() 函数被调用的警告信息或日志。它通常用于开发和调试阶段,帮助开发人员跟踪函数的调用流程。


在这里插入图片描述
图9 定义Engine对象

191-195行:engine := &Engine{ … }:创建一个名为 engine 的新的 Engine 结构体实例。在这里,使用结构体字面量初始化了 Engine 和 RouterGroup 结构体的字段。Engine 结构体可能包含了整个应用程序的路由、中间件和其他配置信息。


在这里插入图片描述图10 结构体字段代码

196-212行: Engine 结构体的字段初始化:
FuncMap:模板函数映射,初始化为空。
RedirectTrailingSlash:是否重定向尾部斜杠,默认为 true。
RedirectFixedPath:是否重定向固定路径,默认为 false。
HandleMethodNotAllowed:是否处理不允许的方法,默认为 false。
ForwardedByClientIP:是否使用客户端IP地址,默认为 true。
RemoteIPHeaders:远程IP地址的请求头字段,默认为 [“X-Forwarded-For”, “X-Real-IP”]。
TrustedPlatform:受信任的平台,默认为 defaultPlatform。
UseRawPath:是否使用原始路径,默认为 false。
RemoveExtraSlash:是否移除额外的斜杠,默认为 false。
UnescapePathValues:是否解码路径中的值,默认为 true。
MaxMultipartMemory:多部分表单的最大内存,默认为 defaultMultipartMemory。
trees:方法树的初始化,使用 make 函数创建一个容量为 9 的空切片。
delims:渲染模板的分隔符,默认左右分隔符为 {{ 和 }}。
secureJSONPrefix:安全的 JSON 前缀,默认为 “while(1);”。
trustedProxies:受信任的代理服务器列表,默认为 [“0.0.0.0/0”, “::/0”]。
trustedCIDRs:受信任的CIDR列表,默认为 defaultTrustedCIDRs。


在这里插入图片描述图11 engine方法代码

213行: engine.RouterGroup.engine = engine:将当前创建的 engine 实例赋给 RouterGroup 结构体中的 engine 字段。这个步骤确保 RouterGroup 中可以访问到当前的 engine 实例。
214-216行:engine.pool.New = func() any { … }:定义了 pool 结构体中 New 字段的函数回调。这个函数会在需要时创建新的上下文对象。具体来说,它通过调用 engine.allocateContext(engine.maxParams) 来创建一个新的上下文对象。这种设计通常用于对象池技术,用于重用对象并减少内存分配的开销。
217-218行:return engine.With(opts…):最后,调用 With() 方法,并传入 opts… 参数列表中的配置选项,对 engine 进行最后的配置。这里假设 With() 方法用于应用外部传入的配置选项,返回一个完全配置好的 Engine 实例。


在这里插入图片描述图12 engine结构体代码

在这里插入图片描述
图13 engine结构体代码

89-176行:Engine结构体的字段说明如下(省略部分为注释):
RouterGroup:嵌入了一个 RouterGroup 结构体,表示 Engine 结构体包含了 RouterGroup 的属性和方法。
RedirectTrailingSlash bool:布尔类型的属性 RedirectTrailingSlash,用于控制是否重定向尾部斜杠。
RedirectFixedPath bool:布尔类型的属性 RedirectFixedPath,用于控制是否重定向固定路径。
HandleMethodNotAllowed bool:布尔类型的属性 HandleMethodNotAllowed,用于控制是否处理不允许的方法。
ForwardedByClientIP bool:布尔类型的属性 ForwardedByClientIP,用于控制是否通过客户端IP进行转发。
AppEngine bool:布尔类型的属性 AppEngine,表示是否是 AppEngine。
UseRawPath bool:布尔类型的属性 UseRawPath,用于控制是否使用原始路径。
UnescapePathValues bool:布尔类型的属性 UnescapePathValues,用于控制是否解码路径值。
RemoveExtraSlash bool:布尔类型的属性 RemoveExtraSlash,用于控制是否移除额外的斜杠。
RemoteIPHeaders []string:字符串数组类型的属性 RemoteIPHeaders,存储远程IP的头部信息。
TrustedPlatform string:字符串类型的属性 TrustedPlatform,存储受信任的平台。
MaxMultipartMemory int64:int64 类型的属性 MaxMultipartMemory,表示最大的多部分内存大小。
UseH2C bool:布尔类型的属性 UseH2C,表示是否使用 H2C。
ContextWithFallback bool:布尔类型的属性 ContextWithFallback,用于控制是否使用后备上下文。
delims render.Delims:render.Delims 类型的属性 delims,存储渲染分隔符。
secureJSONPrefix string:字符串类型的属性 secureJSONPrefix,存储安全JSON的前缀。
HTMLRender render.HTMLRender:HTMLRender 类型的属性 HTMLRender,表示HTML渲染器。
FuncMap template.FuncMap:template.FuncMap 类型的属性 FuncMap,存储函数映射。
allNoRoute HandlersChain:HandlersChain 类型的属性 allNoRoute,表示所有没有路由的处理程序链。
allNoMethod HandlersChain:HandlersChain 类型的属性 allNoMethod,表示所有没有方法的处理程序链。
noRoute HandlersChain:HandlersChain 类型的属性 noRoute,表示没有路由的处理程序链。
noMethod HandlersChain:HandlersChain 类型的属性 noMethod,表示没有方法的处理程序链。
pool sync.Pool:sync.Pool 类型的属性 pool,表示同步池。
trees methodTrees:methodTrees 类型的属性 trees,表示方法树。
maxParams uint16:uint16 类型的属性 maxParams,表示最大参数数量。
maxSections uint16:uint16 类型的属性 maxSections,表示最大节段数量。
trustedProxies []string:字符串数组类型的属性 trustedProxies,存储受信任的代理。
trustedCIDRs []*net.IPNet:net.IPNet 类型的指针数组属性 trustedCIDRs,存储受信任的CIDR网段。


案例及调试分析

测试案例

package mainimport ("github.com/gin-gonic/gin""net/http"
)// 定义一个结构体来封装 Gin 框架相关的操作
type Server struct {router *gin.Engine
}// 初始化 Server 结构体对象
func GetServer() *Server {return &Server{router: gin.Default(),}
}// Gin引擎对象调用setupRoutes函数,设置路由处理。
func (s *Server) setupRoutes() {s.router.GET("/", func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"message": "Hello, welcome to the Factory demo!",})})
}// 启动 HTTP 服务器
func (s *Server) runServer(addr string) error {return s.router.Run(addr)
}func main() {server := GetServer()server.setupRoutes()err := server.runServer(":8080")if err != nil {panic(err)}
}

工厂模式案例详细说明如下:
在这里插入图片描述
图82 定义的结构体信息

Server 结构体用来封装 Gin 框架的相关操作,其中包括一个 router 字段,类型为 *gin.Engine,即 Gin 框架的核心引擎。


在这里插入图片描述

图83 获得Server的方法

GetServer是一个工厂方法,用来创建并初始化 Server 结构体的实例。在这里,它返回一个新的 Server 实例,并通过gin.Default()方法创建一个默认配置的 Gin 引擎,并将其赋值给 router 字段


在这里插入图片描述

图84 设置路由的方法

setupRoute方法用于设置 HTTP 请求的路由处理函数。在这里,它定义了一个 GET 请求的处理函数,当用户访问根路径 “/” 时,返回一个 JSON 响应,内容为 {"message": "Hello, welcome to the Factory demo!"}


在这里插入图片描述图85 启动HTTP服务器的方法

runServer 方法用于启动 HTTP 服务器,监听指定的地址(addr 参数)。它调用了 Gin 框架的 Run 方法来启动 HTTP 服务器,并返回可能出现的错误error。

在这里插入图片描述
图86 客户端主方法

main 函数是程序的入口点。在 main 函数中:首先使用 GetServer 方法创建了一个 Server 实例。然后调用 setupRoutes 方法设置了 HTTP 请求的路由处理函数。最后调用runServer方法启动 HTTP 服务器,监听 8080 端口。如果启动过程中发生错误,通过panic函数处理并输出错误信息。 调试分析如下:Gin引擎对象启动成功,正在监听8080端口,Demo启动成功!

在这里插入图片描述
图87 工厂模式调试成功图


测试结果

服务端监听8080端口,并往客户端的端口发送一条Get类型的Json请求信息。工厂模式测试成功!

在这里插入图片描述图127 服务端监听8080端口


在这里插入图片描述
图128 获取服务端的响应信息


结语

通过本文的探讨,我们深入了解了工厂模式在现代软件开发中的关键作用和实际应用。工厂模式不仅提供了一种灵活的对象创建机制,还能有效地管理复杂系统中的对象依赖关系。无论是简单工厂、工厂方法还是抽象工厂模式,它们都为开发者提供了多种选择,以应对不同的设计需求和业务场景。在未来的软件开发中,结合工厂模式的设计思想,将有助于构建更加稳健、可维护和可扩展的应用程序。

注:本次文章分为上下两部分,上部分为对理论的介绍,下部分为具体的底层代码深度剖析和编程实践,感兴趣的伙伴不要错过哦~


看到这里的小伙伴,恭喜你又掌握了一个技能👊
希望大家能取得胜利,坚持就是胜利💪
我是寸铁!我们下期再见💕


在这里插入图片描述

往期好文💕

保姆级教程

【保姆级教程】Windows11下go-zero的etcd安装与初步使用

【保姆级教程】Windows11安装go-zero代码生成工具goctl、protoc、go-zero

【Go-Zero】手把手带你在goland中创建api文件并设置高亮


报错解决

【Go-Zero】Error: user.api 27:9 syntax error: expected ‘:‘ | ‘IDENT‘ | ‘INT‘, got ‘(‘ 报错解决方案及api路由注意事项

【Go-Zero】Error: only one service expected goctl一键转换生成rpc服务错误解决方案

【Go-Zero】【error】 failed to initialize database, got error Error 1045 (28000):报错解决方案

【Go-Zero】Error 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)报错解决方案

【Go-Zero】type mismatch for field “Auth.AccessSecret“, expect “string“, actual “number“报错解决方案

【Go-Zero】Error: user.api 30:2 syntax error: expected ‘)‘ | ‘KEY‘, got ‘IDENT‘报错解决方案

【Go-Zero】Windows启动rpc服务报错panic:context deadline exceeded解决方案


Go面试向

【Go面试向】defer与time.sleep初探

【Go面试向】defer与return的执行顺序初探

【Go面试向】Go程序的执行顺序

【Go面试向】rune和byte类型的认识与使用

【Go面试向】实现map稳定的有序遍历的方式

相关文章:

【Gin】精准应用:Gin框架中工厂模式的现代软件开发策略与实施技巧(下)

【Gin】精准应用:Gin框架中工厂模式的现代软件开发策略与实施技巧(下) 大家好 我是寸铁👊 【Gin】精准应用:Gin框架中工厂模式的现代软件开发策略与实施技巧(下)✨ 喜欢的小伙伴可以点点关注 💝 前言 本次文章分为上下两部分&…...

国科大作业考试资料-人工智能原理与算法-2024新编-第十二次作业整理

袋子里面有3个有偏差的硬币a、b和c,抛掷硬币正面朝上的概率分别是20%、60%和80%。从袋子里随机取出一个硬币(3个硬币被取出的概率是相等的),并把取出的硬币抛掷3次,得到抛掷结果依次是X1 , X2和 X3。 a. 画出对应的贝叶斯网络并定义必要的CPT表。 b. 如果抛掷结果是2次正…...

《0基础》学习Python——第二十一讲__网络爬虫/<4>爬取豆瓣电影电影信息

爬取网页数据(获取网页信息全过程) 1、爬取豆瓣电影的电影名称、导演、主演、年份、国家、评价 2、首先我们先爬取页面然后再获取信息 1、爬取网页源码 import requests from lxml import etree if __name__ __main__:#UA伪装head{User-Agent:Mozilla/…...

【C++初阶】string类

【C初阶】string类 🥕个人主页:开敲🍉 🔥所属专栏:C🥭 🌼文章目录🌼 1. 为什么学习string类? 1.1 C语言中的字符串 1.2 实际中 2. 标准库中的string类 2.1 string类 2.…...

RAS--APEI 报错解析流程(2)

RAS--APEI 报错解析流程(1) 除了APEI 中除了GHES会记录错误,在Post过程中的错误通常是通过BERT Table汇报 1.BERT Boot Error Record Table is used to report unhandled errors that occurred in a previous boot,it is reported as a ‘one-time polle…...

微软蓝屏事件对企业数字化转型有什么影响?

引言:从北京时间2024年7月19日(周五)下午2点多开始,全球大量Windows用户出现电脑崩溃、蓝屏死机、无法重启等情况。事发后,网络安全公司CrowdStrike称,收到大量关于Windows电脑出现蓝屏报告,公司…...

【Gin】精准应用:Gin框架中工厂模式的现代软件开发策略与实施技巧(上)

【Gin】精准应用:Gin框架中工厂模式的现代软件开发策略与实施技巧(上) 大家好 我是寸铁👊 【Gin】精准应用:Gin框架中工厂模式的现代软件开发策略与实施技巧(上)✨ 喜欢的小伙伴可以点点关注 💝 前言 本次文章分为上下两部分&…...

浅谈Devops

1.什么是Devops DevopsDev(Development)Ops(Operation) DevOps(Development和Operations的混合词)是一种重视“软件开发人员(Dev)”和“IT运维技术人员(Ops)”…...

大文件分片上传(前端TS实现)

大文件分片上传 内容 一般情况下,前端上传文件就是new FormData,然后把文件 append 进去,然后post发送给后端就完事了,但是文件越大,上传的文件也就越长,如果在上传过程中,突然网络故障,又或者…...

unity2D游戏开发02添加组件移动玩家

添加组件 给PlayGame和EnemyObject添加组件BoxCollider 2D碰撞器,不用修改参数 给PlayGame添加组件Rigibody 2D 设置数据 添加EnemyObject,属性如下 Edit->project setting->Physics 2D 将 y的值改为0 给playerObject添加标签 新建层 将PlayerObj…...

设计模式 之 —— 单例模式

目录 什么是单例模式? 定义 单例模式的主要特点 单例模式的几种设计模式 1.懒汉式:线程不安全 2.懒汉式:线程安全 3.饿汉式 4.双重校验锁 单例模式的优缺点 优点: 缺点: 适用场景: 什么是单例模…...

深入浅出WebRTC—ULPFEC

FEC 通过在发送端添加额外的冗余信息,使接收端即使在部分数据包丢失的情况下也能恢复原始数据,从而减轻网络丢包的影响。在 WebRTC 中,FEC 主要有两种实现方式:ULPFEC 和 FlexFEC,FlexFEC 是 ULPFEC 的扩展和升级&…...

Python从0到100(四十三):数据库与Django ORM 精讲

前言: 零基础学Python:Python从0到100最新最全教程。 想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…...

Redis-主从模式

目录 前言 一.主从节点介绍 二.配置redis主从结构 二.主从复制 四.拓扑结构 五.数据同步 全量复制(Full Sync Replication) 局部复制(Partial Replication) Redis的学习专栏:http://t.csdnimg.cn/a8cvV 前言 …...

加速决策过程:企业级爬虫平台的实时数据分析

摘要 在当今数据驱动的商业环境中,企业如何才能在海量信息中迅速做出精准决策?本文将探讨企业级爬虫平台如何通过实时数据分析加速决策过程,实现数据到决策的无缝衔接。我们聚焦于技术如何赋能企业,提升数据处理效率,…...

字典树(前缀树)数组实现(只能查26个单词)

这段代码实现了一个基于 Trie 树的字典树(Trie)数据结构,用于存储和检索字符串。其中包含以下几个方法. insert(String word): 向 Trie 树中插入一个单词。首先将单词转换为字符数组,然后遍历字符数组,逐个字符在 Trie…...

CTF-pwn-虚拟化-vmmware 前置

文章目录 参考vmware逃逸简介虚拟机和主机通信机制(guest to host)共享内存(弃用)backdoor机制Message_Send和Message_RecvGuestRPC实例RpcOutSendOneRawWork实例 vmware-rpctool info-get guestinfo.ip各个步骤对应的backdoor操作Open RPC channelSend …...

thinkphp8结合layui2.9 图片上传验证

<?php declare (strict_types 1);namespace app\index\validate;use think\Validate;class Upload extends Validate {/*** 定义验证规则* 格式&#xff1a;字段名 > [规则1,规则2...]** var array*/protected $rule [image > fileExt:jpg,png|fileSize:204800|fi…...

农村污水处理难题:探索低成本高效解决方案

农村污水处理难题&#xff1a;探索低成本高效解决方案 农村污水处理作为国家生态文明建设的重要一环&#xff0c;面临着诸多挑战&#xff0c;尤其是技术落后、管理分散、资源匮乏等问题。物联网技术的引入&#xff0c;为解决这些痛点提供了创新途径&#xff0c;实现了对污水处…...

lightningcss介绍及使用

lightningcss介绍及使用 一款使用 rust 编写的 css 解析器&#xff0c;转换器、及压缩器。 特性 特别快&#xff1a;可以在毫秒级别解析、压缩大量的 css 文件&#xff0c;而且比其他工具的打包结果更小给值添加类型&#xff1a;许多其他css解析器会将值解析成一个无类型的 …...

HTTP服务的应用

1、编辑json请求参数&#xff1b; 2、把json发送到服务url&#xff0c;接收服务的返回参数&#xff1b; 3、解析返回参数。 procedure TfrmCustomQuery.btnFullUpdateClick(Sender: TObject); varfrm: TfrmInputQueryConditionEX;b_OK: Boolean;sBeginDate, sEndDate, sJSON…...

uni-app:踩坑路---scroll-view内使用fixed定位,无效的问题

前言&#xff1a; emmm&#xff0c;说起来这个问题整得还挺好笑的&#xff0c;本人在公司内&#xff0c;奋笔疾书写代码&#xff0c;愉快的提交测试的时候&#xff0c;测试跟我说&#xff0c;在苹果手机上你这个样式有bug&#xff0c;我倒是要看看&#xff0c;是什么bug。 安卓…...

MySQL4.索引及视图

1.建库 create database mydb15_indexstu; use mydb15_indexstu;2.建表 2.1 student表学&#xff08;sno&#xff09;号为主键&#xff0c;姓名&#xff08;sname&#xff09;不能重名&#xff0c;性别&#xff08;ssex&#xff09;仅能输入男或女&#xff0c;默认所在系别&a…...

MongoDB - 聚合阶段 $match、$sort、$limit

文章目录 1. $match 聚合阶段1. 构造测试数据2. $match 示例3. $match 示例 2. $sort 聚合阶段1. 排序一致性问题2. $sort 示例 3. $limit 聚合阶段 1. $match 聚合阶段 $match 接受一个指定查询条件的文档。 $match 阶段语法&#xff1a; { $match: { <query> } }$ma…...

ModuleNotFoundError: No module named ‘scrapy.utils.reqser‘

在scrapy中使用scrapy-rabbitmq-scheduler会出现报错 ModuleNotFoundError: No module named scrapy.utils.reqser原因是新的版本的scrapy已经摒弃了该方法,但是scrapy-rabbitmq-scheduler 没有及时的更新,所以此时有两种解决方法 方法一.将scrapy回退至旧版本,找到对应的旧版…...

vue3+ts+vite+electron+electron-packager打包成exe文件

目录 1、创建vite项目 2、添加需求文件 3、根据package.json文件安装依赖 4、打包 5、electron命令运行 6、electron-packager打包成exe文件 Build cross-platform desktop apps with JavaScript, HTML, and CSS | Electron 1、创建vite项目 npm create vitelatest 2、添…...

使用脚本搭建MySQL数据库基础环境

数据库的基本概念 数据&#xff08;Data&#xff09; 描述事物的符号记录 包括数字&#xff0c;文字&#xff0c;图形。图像&#xff0c;声音&#xff0c;档案记录等。 以记录形式按统一格式进行存储 表 将不同的记录组织在一起 用来储存具体数据 数据库 表的集合&#xff0c;是…...

Parameter index out of range (2 > number of parameters, which is 1【已解决】

文章目录 1、SysLogMapper.xml添加注释导致的2、解决方法3、总结 1、SysLogMapper.xml添加注释导致的 <!--定义一个查询方法&#xff0c;用于获取日志列表--><!--方法ID为getLogList&#xff0c;返回类型com.main.server.api.model.SysLogModel,参数类型为com.main.se…...

rk3588s 定制版 USB adb , USB2.0与USB3.0 区别,adb 由typeC 转换到USB3.0(第二部分)

硬件资源&#xff1a; rk3588s 核心板定制的地板 软件资源&#xff1a; 网盘上的 android12 源码 1 硬件上 客户只想使用 type c 接口中的 usb2.0 OTG 。在硬件上&#xff0c;甚至连 CC芯片都没有连接。 关于一些前置的知识。 1 USB2.0 与 USB3.0 的区别。 usb3.0 兼容2.0 …...

Cookie与Session 实现登录操作

Cookie Cookie 是网络编程中使用最广泛的一项技术&#xff0c;主要用于辨识用户身份。 客户端&#xff08;浏览器&#xff09;与网站服务端通讯的过程如下图所示&#xff1a; 从图中看&#xff0c;服务端既要返回 Cookie 给客户端&#xff0c;也要读取客户端提交的 Cookie。所…...

通过IEC104转MQTT网关轻松接入阿里云平台

随着智能电网和物联网技术的飞速发展&#xff0c;电力系统中的传统IEC 104协议设备正面临向现代化、智能化转型的迫切需求。阿里云作为全球领先的云计算服务提供商&#xff0c;其强大的物联网平台为IEC 104设备的接入与数据处理提供了强大的支持。本文将深入探讨钡铼网关在MQTT…...

lua 游戏架构 之 游戏 AI (五)ai_autofight_find_way

这段Lua脚本定义了一个名为 ai_autofight_find_way 的类&#xff0c;继承自 ai_base 类。 lua 游戏架构 之 游戏 AI &#xff08;一&#xff09;ai_base-CSDN博客文章浏览阅读238次。定义了一套接口和属性&#xff0c;可以基于这个基础类派生出具有特定行为的AI组件。例如&…...

vue3+openLayers点击标记事件

<template><!--地图--><div class"distributeMap" id"distributeMap"></div> </template> <script lang"ts" setup> import { onMounted, reactive } from "vue"; import { Feature, Map, View }…...

深入分析 Android ContentProvider (三)

文章目录 深入分析 Android ContentProvider (三)ContentProvider 的高级使用和性能优化1. 高级使用场景1.1. 数据分页加载示例&#xff1a;分页加载 1.2. 使用 Loader 实现异步加载示例&#xff1a;使用 CursorLoader 加载数据 1.3. ContentProvider 与权限管理示例&#xff1…...

养宠浮毛异味双困扰?性价比高的宠物空气净化器推荐

家里养了两只银渐层&#xff0c;谁懂啊&#xff01;一下班打开家门就看到家里飘满了猫浮毛雪&#xff0c;空气中还传来隐隐约约的异味。每天不是在吸毛的路上&#xff0c;就是在洗猫砂盆的路上&#xff0c;而且空气中的浮毛还很难清理干净&#xff0c;这是最让人头疼的问题。 …...

maven项目容器化运行之3-优雅的利用Jenkins和maven使用docker插件调用远程docker构建服务并在1Panel中运行

一.背景 在《maven项目容器化运行之1》中&#xff0c;我们开启了1Panel环境中docker构建服务给到了局域网。在《maven项目容器化运行之2》中&#xff0c;我们基本实现了maven工程创建、远程调用docker构建镜像、在1Panel选择镜像运行容器三大步骤。 但是&#xff0c;存在一个问…...

docker 打包orbbec

docker pull humble容器 sudo docker run -it osrf/ros:humble-desktop docker 启动容器 sudo docker run -u root --device/dev/bus/usb:/dev/bus/usb -it -v /home/wl:/share --name wl4 osrf/ros:humble-desktop /bin/bash新开一个终端 查看本地存在的容器&#xff1a;…...

无涯·问知财报解读,辅助更加明智的决策

财报解读就像是给公司做一次全面的体检&#xff0c;是理解公司内部运作机制和市场表现的一把钥匙&#xff0c;能够有效帮助投资者、分析师、管理层以及所有市场参与者判断一家公司的健康程度和发展潜力。 星环科技无涯问知的财经库内置了企业年报及财经类信息&#xff0c;并对…...

【Apache Doris】数据副本问题排查指南

【Apache Doris】数据副本问题排查指南 一、问题现象二、问题定位三、问题处理 本文主要分享Doris中数据副本异常的问题现象、问题定位以及如何处理此类问题。 一、问题现象 问题日志 查询报错 Failed to initialize storage reader, tablet{tablet_id}.xxx.xxx问题说明 查…...

【HarmonyOS】关于鸿蒙消息推送的心得体会(二)

【HarmonyOS】关于鸿蒙消息推送的心得体会&#xff08;二&#xff09; 前言 推送功能的开发与传统功能开发还是有很大区别。首先最大的区别点就在于需要多部门之间的协同&#xff0c;作为鸿蒙客户端开发&#xff0c;你需要和产品&#xff0c;运营&#xff0c;以及后台开发一起…...

零基础入门:创建一个简单的Python爬虫管理系统

摘要&#xff1a; 本文将手把手教你&#xff0c;从零开始构建一个简易的Python爬虫管理系统&#xff0c;无需编程基础&#xff0c;轻松掌握数据抓取技巧。通过实战演练&#xff0c;你将学会设置项目、编写基本爬虫代码、管理爬取任务与数据&#xff0c;为个人研究或企业需求奠…...

【Node.js基础04】node.js模块化

一&#xff1a;什么是模块化 在Node.js中&#xff0c;每个文件都可视为一个独立的模块。模块化提高了代码的复用性&#xff0c;按需加载&#xff0c;具有独立的作用域 二&#xff1a;如何实现多个文件间导入和导出 1 CommonJS标准&#xff08;默认&#xff09;-导入和导出 …...

数据库——单表查询

一、建立数据库mydb8_worker mysql> use mydb8_worker; 二、建立表 1.创建表 mysql> create table t_worker(department_id int(11) not null comment 部门号,-> worder_id int(11) primary key not null comment 职工号,-> worker_date date not null comment…...

dsa加训

refs: OI Wiki - OI Wiki (oi-wiki.org) 1. 枚举 POJ 2811 熄灯问题 refs : OpenJudge - 2811:熄灯问题 如果要枚举每个灯开或者不开的情况&#xff0c;总计2^30种情况&#xff0c;显然T。 不过我们可以发现&#xff1a;若第i行的某个灯亮了&#xff0c;那么有且仅有第i行和第…...

SpringBoot源码(1)ApplicationContext和BeanFactory

1、调用getBean方法 SpringBootApplication public class SpringBootDemoApplication {public static void main(String[] args) {ConfigurableApplicationContext applicationContext SpringApplication.run(SpringBootDemoApplication.class, args);applicationContext.get…...

CANoe编程实例--TCP/IP通信

1、简介 本实例将使用目前常用的开发工具C#来开发服务器端&#xff0c;以CANoe端作为客户端。服务器端和客户端&#xff0c;通过TCP/IP连接&#xff0c;实现数据交换。 首先在服务器端建立一个监听Socket&#xff0c;自动创建一个监听线程&#xff0c;随时监听是否有客户端的连…...

Neuron协议网关的北向应用插件开发

目录 概述 指令处理层开发​ 应用层开发​ .open​ .close​ .init​ .uninit​ .start​ .stop​ .setting​ .request​ 插件设置文件​ 适配华为的思路 概述 最近研究了一段时间的Neuron协议网关&#xff0c;前面的博文也提到它虽然能够把数据发到华为的IoT平台上…...

【BUG】已解决:You are using pip version 10.0.1, however version 21.3.1 is available.

You are using pip version 10.0.1, however version 21.3.1 is available. 目录 You are using pip version 10.0.1, however version 21.3.1 is available. 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#…...

electron-builder打包vue2项目不显示element-ui图标

1、使用版本 vue ^2.6.14element-ui ^2.15.14vue-cli-plugin-electron-builder 2.1.1 2、解决办法 1&#xff09; 如果是简单的图标可以使用图片代替&#xff08;这种对于elementui组件的图标还是不会显示&#xff09; 2&#xff09;在vue.config.js配置 const { defineCon…...

controller层-请求格式为json-请求方法为get

前置条件 get请求映射&#xff0c;内容和PostMapping一致&#xff0c;需要请求参数更换为get数据 请求过程&#xff1a;用户请求--初始化DispatcherServlet及对接和分发用户请求--controller--service 用户请求&#xff1a;http://ip:port/user/getinfo 请求方法&#xff1a;ge…...