golang gin数据绑定综合案例:用户注册及自定义数据校验器的应用:github.com/go-playground/validator/v10/translations/zh
2023-09-14 09:01:53 时间
package main
import (
"fmt"
"reflect"
"strings"
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding"
"github.com/go-playground/locales/zh"
ut "github.com/go-playground/universal-translator"
"github.com/go-playground/validator/v10"
zhTranslations "github.com/go-playground/validator/v10/translations/zh"
)
type LoginForm struct {
UserName string `json:"username" binding:"required,min=3,max=7"`
Password string `json:"password" binding:"required,len=8"`
RePassword string `json:"re_password" binding:"required,len=8,eqfield=Password"`
}
type RegisterForm struct {
UserName string `json:"username" binding:"required,min=3,max=7"`
Password string `json:"password" binding:"required,len=8"`
Age uint32 `json:"age" binding:"required,gte=1,lte=150"`
Sex uint32 `json:"sex" binding:"required"`
Email string `json:"email" binding:"required,email"`
}
var trans ut.Translator
func main() {
if err := InitializeTrans(); err != nil {
fmt.Println(err.Error())
panic(err)
}
r := gin.Default()
// 登录
r.POST("login", loginHandler)
// 注册
r.POST("register", registerHandler)
r.Run()
}
// registerHandler 注册
func registerHandler(c *gin.Context) {
var r RegisterForm
if err := c.ShouldBindJSON(&r); err != nil {
err, ok := err.(validator.ValidationErrors)
if !ok {
c.JSON(200, gin.H{
"code": 40010,
"msg": "注册失败",
"err": err.Error(),
})
return
}
c.JSON(200, gin.H{
"code": 40004,
"msg": "注册失败,请检测参数",
"err": removeTopStruct(err.Translate(trans)),
})
return
}
// 注册成功
c.JSON(200, gin.H{
"code": 0,
"msg": "success",
"data": r,
})
}
// loginHandler 登录
func loginHandler(c *gin.Context) {
var l LoginForm
if err := c.ShouldBindJSON(&l); err != nil {
err, ok := err.(validator.ValidationErrors)
if !ok {
c.JSON(200, gin.H{
"code": 40010,
"msg": "登录失败",
"err": err.Error(),
})
return
}
c.JSON(200, gin.H{
"code": 40004,
"msg": "登录失败,请检测参数",
"err": removeTopStruct(err.Translate(trans)),
})
return
}
// 登录成功
c.JSON(200, gin.H{
"code": 0,
"msg": "success",
"data": l.UserName,
})
}
func InitializeTrans() (err error) {
// Accept-Language
// 修改gin框架validator引擎属性
if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
v.RegisterTagNameFunc(func(fld reflect.StructField) string {
name := fld.Tag.Get("json")
return name
})
zhT := zh.New()
uni := ut.New(zhT, zhT)
trans, _ = uni.GetTranslator("zh")
err = zhTranslations.RegisterDefaultTranslations(v, trans)
return
}
return
}
func removeTopStruct(fields validator.ValidationErrorsTranslations) validator.ValidationErrorsTranslations {
r := make(validator.ValidationErrorsTranslations)
for f, v := range fields {
r[f[strings.Index(f, ".")+1:]] = v
}
return r
}
相关文章
- 扩散模型爆火,这是首篇综述与Github论文分类汇总
- 【Go】github.com/robfig/cron 源码阅读
- 惊 GitHub首次开源!在国内外都被称为分布式理论+实践的巅峰之作
- 开发了个在线绘图小站+github加速
- GitHub国内下载和访问加速
- 2023-02-28:moonfdd/ffmpeg-go是用go语言绑定ffmpeg的库,目前是github上最好用的库。请用go语言将yuv文件编码为h264
- github package的使用教程
- 解决idea登录github出现的invalid authentication data 404 not found以及登录 token 失效
- Hexo博客下 Github Action 和 Qexo 搭建
- 「Go工具箱」推荐一个变量调试神器:go-spew
- 「Go工具箱」将文件大小转换成Kb、Mb、Gb就用这个库:go-humanize
- 「Go工具箱」一个对语义化版本进行解析、比较的库:go-version
- 放弃ElasticSearch,GitHub从零打造搜索引擎!2亿代码仓库怎么搜?
- 打开 Github,我惊呆了!1 个亿开发者
- 《安富莱嵌入式周报》第307期:开源智能制冷板,Keil MDK6发布时间,编程助手Github Copilot X,Matlab2023,高品质电容式麦DIY
- 【OpenGL】三、Visual Studio 2019 配置 GitHub ( 将项目上传到 GitHub )
- 2021 GitHub年度报告:7300万开发者,最爱的依旧是Javascript
- Go-包管理-go get(一)
- Go-包管理-go get(二)
- Go-连接Redis-学习go-redis包详解编程语言
- 2018 GitHub 最火技术趋势
- GitHub 工程师谈 GitHub Pages 服务开发经验
- 微软 GitHub 推出 AI 编程工具 Copilot,自由软件基金会强烈不满,质疑其侵犯代码版权
- 基于Github的源码白盒扫描工具Raptor
- 掰一掰GitHub上优秀的大数据项目
- 部署Linux下快速部署Go环境(go环境linux)
- SQL Server快速上手GO!(sqlserver go)
- Go语言与Linux:全新的开发环境体验(go语言linux)
- 提升Go读取Oracle的速度(go读取oracle速度)
- 数据库Go语言实现监控Oracle数据库(go监听oracle)
- 程序Go语言调用Oracle数据库驱动程序指南(go oracle驱动)
- Oracle Go用法快速指南(oracle go用法)