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

Gin 中使用 base64Captcha 生成图形验证码

验证码库
https://github.com/mojocn/base64Captcha
中文文档
Go进阶37:重构我的base64Captcha图形验证码项目 | 🐶❤️🦀
在models文件夹中写一个验证码的文件,Captcha.go
package modelsimport ("github.com/mojocn/base64Captcha""image/color"
)// 设置自带的 store 存在服务器内存中
var store = base64Captcha.DefaultMemStore// GetCaptcha 获取验证码
func GetCaptcha() (string, string, error) {// 生成验证码var driver base64Captcha.Driver//driver = base64Captcha.NewDriverString(80, 240, 0, 0, 4, "1234567890", nil)//设置验证码的配置driverString := base64Captcha.DriverChinese{Height:          40,           //设置验证码图片的高度Width:           100,          //设置验证码图片的宽度NoiseCount:      0,            //设置干扰线的数量ShowLineOptions: 2 | 4,        //设置线条的类型Length:          4,            //设置验证码的长度Source:          "1234567890", //设置验证码的字符源BgColor: &color.RGBA{ //设置验证码图片的背景颜色R: 3,G: 102,B: 214,A: 125,},Fonts: []string{"wqy-microhei.ttc"}, //设置验证码的字体}//生成验证码driver = driverString.ConvertFonts()//生成base64图片c := base64Captcha.NewCaptcha(driver, store)//验证码id base64图片字符串 验证码字符串 errorid, b64s, _, err := c.Generate()return id, b64s, err
}// VerifyCaptcha 验证验证码
func VerifyCaptcha(id string, VerifyValue string) bool {//验证验证码,参数1是验证码的id,参数2是用户输入的验证码if store.Verify(id, VerifyValue, true) {return true} else {return false}
}

在登录控制器中添加获取验证码的方法,LoginController.go

package adminimport ("gin1/models""github.com/gin-gonic/gin""net/http"
)type LoginController struct {}func (con LoginController) Index(c *gin.Context) {c.HTML(http.StatusOK, "admin/login/login.html", gin.H{})
}
func (con LoginController) DoLogin(c *gin.Context) {// 获取参数verifyValue := c.PostForm("verifyValue")captchaId := c.PostForm("captchaId")// 验证验证码if !models.VerifyCaptcha(captchaId, verifyValue) {c.JSON(http.StatusBadRequest, gin.H{"code": 400, "msg": "验证码错误"})return} else {c.JSON(http.StatusOK, gin.H{"code": 200, "msg": "验证码正确"})return}}// GetCaptcha 获取验证码
func (con LoginController) GetCaptcha(c *gin.Context) {// 生成验证码,返回验证码id,base64图片字符串id, base64, err := models.GetCaptcha()if err != nil {c.JSON(http.StatusBadRequest, gin.H{"code": 400, "msg": "验证码生成失败"})return}//定义一个map,用来存储验证码id和base64图片字符串data := make(map[string]interface{})data["id"] = iddata["image"] = base64c.JSON(http.StatusOK, gin.H{"code": 200, "msg": "验证码生成成功", "data": data})
}

设置路由,Admin.go

package routersimport ("gin1/controllers/admin""gin1/middlewares""github.com/gin-gonic/gin"
)func AdminRoutersInit(r *gin.Engine) {//middlewares.InitMiddleware中间件adminRouters := r.Group("/admin", middlewares.Init){//后台首页adminRouters.GET("/", admin.MainController{}.Index)//欢迎页adminRouters.GET("/welcome", admin.MainController{}.Welcome)//登录页adminRouters.GET("/login", admin.LoginController{}.Index)//登录操作adminRouters.POST("/doLogin", admin.LoginController{}.DoLogin)//获取验证码adminRouters.GET("/getCaptcha", admin.LoginController{}.GetCaptcha)}
}

登录页面,Login.html

{{ define "admin/login/login.html" }}<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
<html>
<head><title>用户登录</title><link rel="stylesheet" href="/static/admin/css/login.css"><script type="text/javascript" src="/static/admin/bootstrap/js/jquery-1.10.1.js"></script><script type="text/javascript" src="/static/admin/js/login.js"></script>
</head>
<body>
<div class="container"><div id="login"><form action="/admin/doLogin" method="post" id="myform"><input type="hidden" name="captchaId" id="captchaId"><div class="l_title">小米商城后台管理系统-IT营</div><dl><dd>管理员姓名:<input class="text" type="text" name="username" id="username"></dd><dd>管理员密码:<input class="text" type="password" name="password" id="password"></dd><dd>验 证 码:<input id="verify" type="text" name="verifyValue"><img id="captchaImg" src=""></dd><dd><input type="submit" class="submit" name="dosubmit" value=""></dd></dl></form></div>
</div></body>
</html>{{end}}

登录页的js,login.js

$(function(){app.init();
})
var app={init:function(){this.getCaptcha()this.captchaImgChage()},getCaptcha:function(){$.get("/admin/getCaptcha?t="+Math.random(),function(response){console.log(response)$("#captchaId").val(response.data.id)$("#captchaImg").attr("src",response.data.image)})},captchaImgChage:function(){var that=this;$("#captchaImg").click(function(){that.getCaptcha()})}
}

相关文章:

  • flask+python高校学生综合测评管理系统 phl8b
  • 1.JavaScript中的数据类型
  • 小白学习Halcon100例:如何利用动态阈值分割图像进行PCB印刷缺陷检测?
  • DolphinScheduler安装与配置
  • 《零基础实践深度学习》波士顿房价预测任务1.3.3.4训练过程
  • 寒假学习记录13:JS对象
  • 探索XGBoost:自动化机器学习(AutoML)
  • 投资银行在网络安全生态中的作用
  • Python 线性回归可视化 并将回归函数放置到图像上
  • Prompt Tuning:深度解读一种新的微调范式
  • YOLOv5改进 | 融合改进篇 | 华为VanillaNet + BiFPN突破涨点极限
  • TeamCity创建git项目Timed out 超时的一个解决办法
  • 【Spring】定义过滤器Filter和拦截器Interceptor
  • 微服务—ES数据同步
  • 跨域问题浅析
  • SegmentFault for Android 3.0 发布
  • [译] React v16.8: 含有Hooks的版本
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 「译」Node.js Streams 基础
  • 【附node操作实例】redis简明入门系列—字符串类型
  • 10个最佳ES6特性 ES7与ES8的特性
  • Docker容器管理
  • gf框架之分页模块(五) - 自定义分页
  • HTTP中GET与POST的区别 99%的错误认识
  • JAVA_NIO系列——Channel和Buffer详解
  • JavaScript 基础知识 - 入门篇(一)
  • js递归,无限分级树形折叠菜单
  • oldjun 检测网站的经验
  • Redis在Web项目中的应用与实践
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • webpack+react项目初体验——记录我的webpack环境配置
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • mysql面试题分组并合并列
  • Spring Batch JSON 支持
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • (12)Linux 常见的三种进程状态
  • (ZT)薛涌:谈贫说富
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (十)c52学习之旅-定时器实验
  • (未解决)macOS matplotlib 中文是方框
  • (转)fock函数详解
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • .NET Remoting Basic(10)-创建不同宿主的客户端与服务器端
  • .net程序集学习心得
  • :中兴通讯为何成功
  • @cacheable 是否缓存成功_让我们来学习学习SpringCache分布式缓存,为什么用?
  • [ANT] 项目中应用ANT
  • [AutoSar]工程中的cpuload陷阱(三)测试
  • [C++]四种方式求解最大子序列求和问题