diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..f6c26977bbb993b180afd759658dcf5ea6619cd0
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,194 @@
+木兰宽松许可证,第2版
+
+木兰宽松许可证,第2版
+
+2020年1月 http://license.coscl.org.cn/MulanPSL2
+
+您对“软件”的复制、使用、修改及分发受木兰宽松许可证,第2版(“本许可证”)的如下条款的约束:
+
+0. 定义
+
+“软件” 是指由“贡献”构成的许可在“本许可证”下的程序和相关文档的集合。
+
+“贡献” 是指由任一“贡献者”许可在“本许可证”下的受版权法保护的作品。
+
+“贡献者” 是指将受版权法保护的作品许可在“本许可证”下的自然人或“法人实体”。
+
+“法人实体” 是指提交贡献的机构及其“关联实体”。
+
+“关联实体” 是指,对“本许可证”下的行为方而言,控制、受控制或与其共同受控制的机构,此处的控制是
+指有受控方或共同受控方至少50%直接或间接的投票权、资金或其他有价证券。
+
+1. 授予版权许可
+
+每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的版权许可,您可
+以复制、使用、修改、分发其“贡献”,不论修改与否。
+
+2. 授予专利许可
+
+每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的(根据本条规定
+撤销除外)专利许可,供您制造、委托制造、使用、许诺销售、销售、进口其“贡献”或以其他方式转移其“贡
+献”。前述专利许可仅限于“贡献者”现在或将来拥有或控制的其“贡献”本身或其“贡献”与许可“贡献”时的“软
+件”结合而将必然会侵犯的专利权利要求,不包括对“贡献”的修改或包含“贡献”的其他结合。如果您或您的“
+关联实体”直接或间接地,就“软件”或其中的“贡献”对任何人发起专利侵权诉讼(包括反诉或交叉诉讼)或
+其他专利维权行动,指控其侵犯专利权,则“本许可证”授予您对“软件”的专利许可自您提起诉讼或发起维权
+行动之日终止。
+
+3. 无商标许可
+
+“本许可证”不提供对“贡献者”的商品名称、商标、服务标志或产品名称的商标许可,但您为满足第4条规定
+的声明义务而必须使用除外。
+
+4. 分发限制
+
+您可以在任何媒介中将“软件”以源程序形式或可执行形式重新分发,不论修改与否,但您必须向接收者提供“
+本许可证”的副本,并保留“软件”中的版权、商标、专利及免责声明。
+
+5. 免责声明与责任限制
+
+“软件”及其中的“贡献”在提供时不带任何明示或默示的担保。在任何情况下,“贡献者”或版权所有者不对
+任何人因使用“软件”或其中的“贡献”而引发的任何直接或间接损失承担责任,不论因何种原因导致或者基于
+何种法律理论,即使其曾被建议有此种损失的可能性。
+
+6. 语言
+
+“本许可证”以中英文双语表述,中英文版本具有同等法律效力。如果中英文版本存在任何冲突不一致,以中文
+版为准。
+
+条款结束
+
+如何将木兰宽松许可证,第2版,应用到您的软件
+
+如果您希望将木兰宽松许可证,第2版,应用到您的新软件,为了方便接收者查阅,建议您完成如下三步:
+
+1, 请您补充如下声明中的空白,包括软件名、软件的首次发表年份以及您作为版权人的名字;
+
+2, 请您在软件包的一级目录下创建以“LICENSE”为名的文件,将整个许可证文本放入该文件中;
+
+3, 请将如下声明文本放入每个源文件的头部注释中。
+
+Copyright (c) [Year] [name of copyright holder]
+[Software Name] is licensed under Mulan PSL v2.
+You can use this software according to the terms and conditions of the Mulan
+PSL v2.
+You may obtain a copy of Mulan PSL v2 at:
+ http://license.coscl.org.cn/MulanPSL2
+THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
+See the Mulan PSL v2 for more details.
+
+Mulan Permissive Software License,Version 2
+
+Mulan Permissive Software License,Version 2 (Mulan PSL v2)
+
+January 2020 http://license.coscl.org.cn/MulanPSL2
+
+Your reproduction, use, modification and distribution of the Software shall
+be subject to Mulan PSL v2 (this License) with the following terms and
+conditions:
+
+0. Definition
+
+Software means the program and related documents which are licensed under
+this License and comprise all Contribution(s).
+
+Contribution means the copyrightable work licensed by a particular
+Contributor under this License.
+
+Contributor means the Individual or Legal Entity who licenses its
+copyrightable work under this License.
+
+Legal Entity means the entity making a Contribution and all its
+Affiliates.
+
+Affiliates means entities that control, are controlled by, or are under
+common control with the acting entity under this License, ‘control’ means
+direct or indirect ownership of at least fifty percent (50%) of the voting
+power, capital or other securities of controlled or commonly controlled
+entity.
+
+1. Grant of Copyright License
+
+Subject to the terms and conditions of this License, each Contributor hereby
+grants to you a perpetual, worldwide, royalty-free, non-exclusive,
+irrevocable copyright license to reproduce, use, modify, or distribute its
+Contribution, with modification or not.
+
+2. Grant of Patent License
+
+Subject to the terms and conditions of this License, each Contributor hereby
+grants to you a perpetual, worldwide, royalty-free, non-exclusive,
+irrevocable (except for revocation under this Section) patent license to
+make, have made, use, offer for sale, sell, import or otherwise transfer its
+Contribution, where such patent license is only limited to the patent claims
+owned or controlled by such Contributor now or in future which will be
+necessarily infringed by its Contribution alone, or by combination of the
+Contribution with the Software to which the Contribution was contributed.
+The patent license shall not apply to any modification of the Contribution,
+and any other combination which includes the Contribution. If you or your
+Affiliates directly or indirectly institute patent litigation (including a
+cross claim or counterclaim in a litigation) or other patent enforcement
+activities against any individual or entity by alleging that the Software or
+any Contribution in it infringes patents, then any patent license granted to
+you under this License for the Software shall terminate as of the date such
+litigation or activity is filed or taken.
+
+3. No Trademark License
+
+No trademark license is granted to use the trade names, trademarks, service
+marks, or product names of Contributor, except as required to fulfill notice
+requirements in section 4.
+
+4. Distribution Restriction
+
+You may distribute the Software in any medium with or without modification,
+whether in source or executable forms, provided that you provide recipients
+with a copy of this License and retain copyright, patent, trademark and
+disclaimer statements in the Software.
+
+5. Disclaimer of Warranty and Limitation of Liability
+
+THE SOFTWARE AND CONTRIBUTION IN IT ARE PROVIDED WITHOUT WARRANTIES OF ANY
+KIND, EITHER EXPRESS OR IMPLIED. IN NO EVENT SHALL ANY CONTRIBUTOR OR
+COPYRIGHT HOLDER BE LIABLE TO YOU FOR ANY DAMAGES, INCLUDING, BUT NOT
+LIMITED TO ANY DIRECT, OR INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING
+FROM YOUR USE OR INABILITY TO USE THE SOFTWARE OR THE CONTRIBUTION IN IT, NO
+MATTER HOW IT’S CAUSED OR BASED ON WHICH LEGAL THEORY, EVEN IF ADVISED OF
+THE POSSIBILITY OF SUCH DAMAGES.
+
+6. Language
+
+THIS LICENSE IS WRITTEN IN BOTH CHINESE AND ENGLISH, AND THE CHINESE VERSION
+AND ENGLISH VERSION SHALL HAVE THE SAME LEGAL EFFECT. IN THE CASE OF
+DIVERGENCE BETWEEN THE CHINESE AND ENGLISH VERSIONS, THE CHINESE VERSION
+SHALL PREVAIL.
+
+END OF THE TERMS AND CONDITIONS
+
+How to Apply the Mulan Permissive Software License,Version 2
+(Mulan PSL v2) to Your Software
+
+To apply the Mulan PSL v2 to your work, for easy identification by
+recipients, you are suggested to complete following three steps:
+
+i. Fill in the blanks in following statement, including insert your software
+name, the year of the first publication of your software, and your name
+identified as the copyright owner;
+
+ii. Create a file named "LICENSE" which contains the whole context of this
+License in the first directory of your software package;
+
+iii. Attach the statement to the appropriate annotated syntax at the
+beginning of each source file.
+
+Copyright (c) [Year] [name of copyright holder]
+[Software Name] is licensed under Mulan PSL v2.
+You can use this software according to the terms and conditions of the Mulan
+PSL v2.
+You may obtain a copy of Mulan PSL v2 at:
+ http://license.coscl.org.cn/MulanPSL2
+THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
+See the Mulan PSL v2 for more details.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..551ac141465fbdd993e7246fd04a2612eb202eed
--- /dev/null
+++ b/README.md
@@ -0,0 +1,387 @@
+
+
+![logo][image-logo]
+
+### tianaiCAPTCHA - 天爱验证码
+#### 基于 Golang 实现的滑动/旋转/点选 验证码 **[在线体验][online-demo-link]**
+可能是开源界最好用的行为验证码工具
+
+[![][github-release-shield]][github-release-link] [![][github-license-shield]][github-license-link]
+
+
+
+---
+
+- **tianai CAPTCHA Golang 版** 目前含有的的行为验证码类型
+
+
+ 滑块验证码 |
+ 旋转验证码 |
+ 文字点选验证码 |
+
+
+ |
+ |
+ |
+
+
+ 在线体验 🚀 |
+
+
+
+> 更多验证码类型待开发,敬请期待! ✨
+
+> [!NOTE]
+> 功能更丰富的 Java 版:[github.com/dromara/tianai-captcha][tianai-captcha-java-link]
+
+# 快速开始
+
+> [!TIP]
+> Demo 参考 [gitee.com/tianai/captcha-go-demo][captcha-go-demo-link]
+
+## 1. mod 导入
+```shell
+go get github.com/tianaiyouqing/tianai-captcha-go@v1.0.1
+```
+> #### 需要本地开发,可拉取至项目根目录,并在 `go.mod` 添加
+> ```mod
+> replace github.com/tianaiyouqing/tianai-captcha-go => ./tianai-captcha-go
+> ```
+
+## 2. 初始化验证码
+
+
+ 展开
+
+```go
+import (
+ "github.com/tianaiyouqing/tianai-captcha-go/application"
+ "github.com/tianaiyouqing/tianai-captcha-go/common/model"
+)
+
+var Captcha *application.TianAiCaptchaApplication
+
+func init() {
+ builder := application.NewBuilder()
+ // 添加滑块验证码
+ builder.AddProvider(application.CreateSliderProvider())
+ // 添加旋转验证码
+ builder.AddProvider(application.CreateRotateProvider())
+ // 添加文字点选验证码, 参数为nil时会读取默认的字体,可以替换成自定义字体, 传入多个字体会随机选择
+ builder.AddProvider(application.CreateWordClickProvider(nil))
+ // 注意 构建出来的 CaptchaApplication 是单例的,所以可以全局使用
+ Captcha = builder.Build()
+}
+```
+
+
+## 3. 在项目中使用
+
+
+ 展开
+
+```go
+// 这里以gin框架为例,其它框架自行修改即可
+
+// 生成验证码
+func GenCaptcha(c *gin.Context) {
+ // 这里生成类型为 SLIDER的验证码, 目前支持 SLIDER、ROTATE、WORD_IMAGE_CLICK
+ captcha, err := Captcha.GenerateCaptcha(&model.GenerateParam{
+ CaptchaName: "SLIDER",
+ })
+ if err != nil {
+ c.JSON(500, gin.H{
+ "code": 500,
+ "msg": err.Error(),
+ })
+ return
+ }
+ // 这边返回的结构是为了适配 tianai-captcha-web-sdk 前端项目
+ c.JSON(200, gin.H{
+ "code": 200,
+ "msg": "success",
+ "id": captcha.Id,
+ "captcha": captcha,
+ })
+
+}
+
+// 校验验证码
+func Valid(c *gin.Context) {
+
+ // 此接收的参数结构是前端项目 tianai-captcha-web-sdk 的 ValidParam
+ validParam := new(ValidParam)
+ if err := c.ShouldBindJSON(validParam); err != nil {
+ c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
+ return
+ }
+ valid, err := Captcha.Valid(validParam.Id, &validParam.Data)
+ if err != nil {
+ c.JSON(500, gin.H{
+ "code": 500,
+ "msg": err.Error(),
+ })
+ return
+ }
+ c.JSON(200, valid)
+}
+
+type ValidParam struct {
+ Id string `json:"id" binding:"required"`
+ Data model.ImageCaptchaTrack `json:"data" binding:"required"`
+}
+
+```
+
+
+---
+
+> [!NOTE]
+> 默认前端 SDK
+> [github.com/tianaiyouqing/captcha-web-sdk][tianai-captcha-web-sdk-link]
+
+
+## 扩展
+
+
+ 自定义背景图片和模板图片
+
+```go
+package controller
+
+import (
+ "github.com/tianaiyouqing/tianai-captcha-go/application"
+ "github.com/tianaiyouqing/tianai-captcha-go/common"
+ "github.com/tianaiyouqing/tianai-captcha-go/common/model"
+ "github.com/tianaiyouqing/tianai-captcha-go/resource"
+)
+
+var Captcha *application.TianAiCaptchaApplication
+
+func init() {
+
+ // 创建一个resourceStore存储
+ store := resource.NewMemoryImageCaptchaResourceStore()
+
+ // ==================== 设置背景图片 ====================
+
+ // 注意: 背景图片的宽高为 600*360, 后台支持自定义调整宽高, 但是 tianai-captcha-web-sdk 项目设置的样式必须为 600*360的比例, 可以缩放大小,但是小白的话直接就设置600*360
+
+ // 第一个参数为验证码名称,第二个参数为资源, 验证码名称目前支持 "SLIDER" "ROTATE" "WORD_IMAGE_CLICK"
+ store.AddResource(common.CAPTCHA_NAME_SLIDER, &model.Resource{
+ ResourceType: "file", // 这个参数指定资源类型,目前支持file、url, 可以自己扩展相对应的资源读取器,这里演示file类型
+ Data: "./rsources/1.jpeg", // 如果类型为file, 则data为文件路径, 如果类型为url, 则data为url地址, 以此类推
+ })
+ store.AddResource(common.CAPTCHA_NAME_ROTATE, &model.Resource{
+ ResourceType: "file",
+ Data: "./rsources/2.jpeg",
+ })
+ store.AddResource(common.CAPTCHA_NAME_SLIDER, &model.Resource{
+ ResourceType: "file",
+ Data: "./rsources/3.jpeg",
+ })
+ store.AddResource(common.CAPTCHA_NAME_SLIDER, &model.Resource{
+ ResourceType: "file",
+ Data: "./rsources/4.jpegg",
+ })
+
+ // ============================ 设置模板图片 ============================
+ // 注意模板图片要按照指定的格式设置样式和尺寸, 下面给出默认大小,该宽高是按照背景图为 600*360计算的, 如果模板图片不符合要求, 则需要自己调整样式和尺寸
+ // slider 底图样式大小为 110*110, 滑块样式大小为 110*110
+ // rotate 底图样式大小为 200*200, 旋转图片样式大小为 200*200
+
+ // ============= 设置自定义模板 ====================
+ resourceMap := model.NewResourceMap()
+ resourceMap.PutValue("active.png", &model.Resource{
+ ResourceType: "file",
+ Data: "C:\\Users\\Thinkpad\\Desktop\\captcha\\templates\\六边形-滑块.png",
+ })
+ resourceMap.PutValue("fixed.png", &model.Resource{
+ ResourceType: "file",
+ Data: "C:\\Users\\Thinkpad\\Desktop\\captcha\\templates\\六边形-底图.png",
+ })
+ store.AddTemplate(common.CAPTCHA_NAME_SLIDER, resourceMap)
+
+ // ============= 设置默认模板 ====================
+ // 如果小白只想替换背景图,不想设置模板,也可以使用系统自带的模板,代码如下
+ defaultSliderTemplates := resource.GetDefaultSliderTemplates()
+ for _, template := range defaultSliderTemplates {
+ store.AddTemplate(common.CAPTCHA_NAME_SLIDER, template)
+ }
+ defaultRotateTemplates := resource.GetDefaultRotateTemplate()
+ for _, template := range defaultRotateTemplates {
+ store.AddTemplate(common.CAPTCHA_NAME_ROTATE, template)
+ }
+
+ // ========= 构建验证码应用 ==========
+
+ builder := application.NewBuilder()
+ // 设置存放资源的存储器
+ builder.SetResourceStore(store)
+ // 添加验证码生成器
+ builder.AddProvider(application.CreateSliderProvider())
+ builder.AddProvider(application.CreateRotateProvider())
+ builder.AddProvider(application.CreateWordClickProvider(nil))
+ Captcha = builder.Build()
+}
+```
+
+
+
+ 验证码校验信息的存储位置
+
+#### 验证码的校验信息默认存储在内存中,若要换成 Redis 之类的,自定义扩展即可,例子:
+
+```go
+package controller
+
+import (
+ "github.com/tianaiyouqing/tianai-captcha-go/application"
+ "github.com/tianaiyouqing/tianai-captcha-go/common/model"
+)
+
+var Captcha *application.TianAiCaptchaApplication
+
+func init() {
+ // 自定义缓存存储器
+ customCacheStore := &CustomCacheStore{}
+
+ builder := application.NewBuilder()
+ // 设置自定义缓存存储器
+ builder.SetCacheStore(customCacheStore)
+ // 添加验证码生成器
+ builder.AddProvider(application.CreateSliderProvider())
+ builder.AddProvider(application.CreateRotateProvider())
+ builder.AddProvider(application.CreateWordClickProvider(nil))
+ Captcha = builder.Build()
+}
+
+type CustomCacheStore struct{}
+
+func (CustomCacheStore) GetCache(key string) (value map[string]any, ok bool) {
+ //TODO 通过key获取缓存
+ panic("implement me")
+}
+
+func (CustomCacheStore) GetAndRemoveCache(key string) (value map[string]any, ok bool) {
+ //TODO 通过key获取缓存并删除
+ panic("implement me")
+}
+
+func (CustomCacheStore) SetCache(key string, data map[string]any, captchaInfo *model.ImageCaptchaInfo) error {
+ //TODO 设置缓存
+ panic("implement me")
+}
+```
+
+
+
+ 自定义图片转换器
+
+```go
+package controller
+
+import (
+ "github.com/tianaiyouqing/tianai-captcha-go/application"
+ "github.com/tianaiyouqing/tianai-captcha-go/common/model"
+ "github.com/tianaiyouqing/tianai-captcha-go/generator"
+)
+
+var Captcha *application.TianAiCaptchaApplication
+
+func init() {
+ // 自定义缓存存储器
+
+
+ builder := application.NewBuilder()
+ // 设置自定义图片转换器, 默认是base64格式的转换前, 背景图为 jpg, 模板图为png, 如有需要可自定义实现 `generator.ImageTransform` 接口进行转换
+ builder.SetImageTransform(generator.NewBase64ImageTransform())
+ // 添加验证码生成器
+ builder.AddProvider(application.CreateSliderProvider())
+ builder.AddProvider(application.CreateRotateProvider())
+ builder.AddProvider(application.CreateWordClickProvider(nil))
+ Captcha = builder.Build()
+}
+```
+
+
+
+ 其他
+
+```go
+package controller
+
+import (
+ "github.com/tianaiyouqing/tianai-captcha-go/application"
+ "github.com/tianaiyouqing/tianai-captcha-go/common/model"
+ "github.com/tianaiyouqing/tianai-captcha-go/generator"
+ "github.com/tianaiyouqing/tianai-captcha-go/resource"
+ "github.com/tianaiyouqing/tianai-captcha-go/validator"
+ "time"
+)
+
+var Captcha *application.TianAiCaptchaApplication
+
+func init() {
+ builder := application.NewBuilder()
+
+ // 设置资源存储器
+ builder.SetResourceStore(resource.NewMemoryImageCaptchaResourceStore())
+ // 设置资源读取器,负责把Resource对象转换成Image图片对象
+ readers := resource.NewDefaultImageCaptchaResourceReaders()
+ //readers.AddResourceReader(nil)// 自定义可以添加自定义的资源读取器
+ builder.SetResourceImageReader(readers)
+ // 设置自定义图片转换器, 默认是base64格式的转换前, 背景图为 jpg, 模板图为png, 如有需要可自定义实现 `generator.ImageTransform` 接口进行转换
+ builder.SetImageTransform(generator.NewBase64ImageTransform())
+ // 设置缓冲存储器, 默认是内存存储器, 如需要扩展redis之类, 可自定义实现 `application.CacheStore` 接口
+ builder.SetCacheStore(application.NewMemoryCacheStore(5*time.Minute, 5*time.Minute))
+ // 设置验证码验证器 参数为默认的容错值,传nil则容错值默认设置为 0.02
+ builder.SetImageCaptchaValidator(validator.NewSimpleImageCaptchaValidator(nil))
+
+ // 添加验证码生成器
+ builder.AddProvider(application.CreateSliderProvider())
+ builder.AddProvider(application.CreateRotateProvider())
+ builder.AddProvider(application.CreateWordClickProvider(nil))
+ Captcha = builder.Build()
+}
+```
+
+
+---
+
+> [!TIP]
+> ### 👋 加入我们,与其他爱好者交流学习
+>
+> QQ群:`197340494`
+>
+> 微信群:群满,可扫码添加好友拉入群聊,或搜索微信号: `youseeseeyou-1ttd` 备注 `验证码`
+>
+> ![qrcode-link][qrcode-link]
+>
+
+---
+
+## 贡献者
+
+
+
+
+
+
+ |
+
+
+
+
+---
+
+[image-logo]: https://minio.tianai.cloud/public/captcha/logo/logo-519x100.png
+[github-release-shield]: https://img.shields.io/github/v/release/tianaiyouqing/tianai-captcha-go?color=369eff&labelColor=black&logo=github&style=flat-square
+[github-release-link]: https://github.com/tianaiyouqing/tianai-captcha-go/releases
+[github-license-link]: https://github.com/tianaiyouqing/tianai-captcha-go/blob/master/LICENSE
+[github-license-shield]: https://img.shields.io/badge/MulanPSL-2.0-white?labelColor=black&style=flat-square
+[tianai-captcha-java-link]: https://github.com/dromara/tianai-captcha
+[captcha-go-demo-link]: https://gitee.com/tianai/captcha-go-demo
+[tianai-captcha-web-sdk-link]: https://github.com/tianaiyouqing/captcha-web-sdk
+[online-demo-link]: http://captcha.tianai.cloud
+[qrcode-link]: https://minio.tianai.cloud/public/qun4.png
\ No newline at end of file
diff --git a/application/application.go b/application/application.go
index ba4cbe2159a5138ba9bd3f73f819bae9ddd99eac..220047fb8e179189212946c14d74c818f18636a1 100644
--- a/application/application.go
+++ b/application/application.go
@@ -66,7 +66,7 @@ func (self *TianAiCaptchaApplication) GenerateCaptcha(param *model.GenerateParam
}
func (self *TianAiCaptchaApplication) Valid(id string, track *model.ImageCaptchaTrack) (*model.ApiResponse, error) {
- validData, ok := self.CacheStore.getCache(id)
+ validData, ok := self.CacheStore.GetCache(id)
if !ok {
response := model.ApiResponse{}
return response.Expire(), nil
diff --git a/application/caches.go b/application/caches.go
index 33a44ba55b0a05edbb89d6c1b04ade558011e55b..322500d2a9de527fd381edf9a13b82f6eec3f9cc 100644
--- a/application/caches.go
+++ b/application/caches.go
@@ -7,8 +7,8 @@ import (
)
type CacheStore interface {
- getCache(key string) (value map[string]any, ok bool)
- getAndRemoveCache(key string) (value map[string]any, ok bool)
+ GetCache(key string) (value map[string]any, ok bool)
+ GetAndRemoveCache(key string) (value map[string]any, ok bool)
SetCache(key string, data map[string]any, captchaInfo *model.ImageCaptchaInfo) error
}
@@ -23,7 +23,7 @@ func NewMemoryCacheStore(expired time.Duration, cleanUpInterval time.Duration) *
}
}
-func (self *MemoryCacheStore) getCache(key string) (value map[string]any, ok bool) {
+func (self *MemoryCacheStore) GetCache(key string) (value map[string]any, ok bool) {
data, ok := self.cache.Get(key)
if ok {
return data.(map[string]any), ok
@@ -31,7 +31,7 @@ func (self *MemoryCacheStore) getCache(key string) (value map[string]any, ok boo
return nil, ok
}
-func (self *MemoryCacheStore) getAndRemoveCache(key string) (value map[string]any, ok bool) {
+func (self *MemoryCacheStore) GetAndRemoveCache(key string) (value map[string]any, ok bool) {
data, ok := self.cache.Get(key)
if ok {
self.cache.Delete(key)
diff --git a/go.mod b/go.mod
index d305d228547037a75ad3c3503850bb4f8b0fba40..87e0be04bf7ae97e527e2ab5450b6b395785f9ca 100644
--- a/go.mod
+++ b/go.mod
@@ -3,9 +3,10 @@ module github.com/tianaiyouqing/tianai-captcha-go
go 1.21
require (
- github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect
- github.com/google/uuid v1.6.0 // indirect
- github.com/patrickmn/go-cache v2.1.0+incompatible // indirect
- github.com/pkg/errors v0.9.1 // indirect
- golang.org/x/image v0.18.0 // indirect
+ github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0
+ github.com/google/uuid v1.6.0
+ github.com/patrickmn/go-cache v2.1.0+incompatible
+ github.com/pkg/errors v0.9.1
)
+
+require golang.org/x/image v0.18.0 // indirect
diff --git a/go.sum b/go.sum
index 6ecc73b2a0459ed14947d8136911367d3a45a5ca..8d6c89b5f5cace34a555ea48c1a7a3bd79b511f6 100644
--- a/go.sum
+++ b/go.sum
@@ -1,5 +1,3 @@
-github.com/disintegration/imaging v1.6.2 h1:w1LecBlG2Lnp8B3jk5zSuNqd7b4DXhcjwek1ei82L+c=
-github.com/disintegration/imaging v1.6.2/go.mod h1:44/5580QXChDfwIclfc/PCwrr44amcmDAg8hxG0Ewe4=
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g=
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
@@ -8,9 +6,5 @@ github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaR
github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
-golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/image v0.18.0 h1:jGzIakQa/ZXI1I0Fxvaa9W7yP25TqT6cHIHn+6CqvSQ=
golang.org/x/image v0.18.0/go.mod h1:4yyo5vMFQjVjUcVk4jEQcU9MGy/rulF5WvUILseCM2E=
-golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
-golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4=
-golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI=