一、使用validate根据需求需要稍做调整
gin框架有自己的验证包,我们也可以用第三方的验证包,因为gin本身错误信息是英文的,而且是全部打印出来,不符合前端需求,所以需要做下调整
二、需要下载的包
在当前项目的命令处下载第三方库,用go get下载,比如
go get "github.com/go-playground/locales/zh_Hans_CN"
下载这些库,并在Validator.go中import引用
"github.com/go-playground/locales/zh_Hans_CN"
"github.com/go-playground/universal-translator"
"github.com/go-playground/validator/v10"
"github.com/go-playground/validator/v10/translations/zh"
三、基于mvc思路,写基本框架
写controller、model、utils,view用于网页端 暂时不需要,这样方便后期修改和二次开发,比如controller的User.go要调用model的Order.go,直接调用model.order就可以,这样不至于混乱
controller:控制层,写一切请求和逻辑判断都放这儿
model:模板层,struct类型和连接数据库都放这儿
utils:万能方法、函数,比如返回指定时间日期、数据验证、上传、下载、短信、返回信息等
四、截图流程
main.go 入口
package main
import (
"gin/app/controller"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
// 注册路由
r.POST("/login", controller.Login)
// 启动HTTP服务器
r.Run()
}
控制层controller的User.go
package controller
import (
"gin/app/model"
"gin/app/utils"
"github.com/gin-gonic/gin"
"net/http"
)
// 用户登录
func Login(c *gin.Context) {
var data model.User
//接收请求参数
_ = c.ShouldBindJSON(&data)
//验证数据并返回结果
msg, code := utils.Validate(&data)
//验证报错,返回错误信息给前端
if code != 200 {
c.JSON(http.StatusOK, gin.H{
"code": code,
"data": "",
"msg": msg,
})
return
}
}
模型层model的User.go
package model
// 表单数据 需要tag参数
type User struct {
UserName string `json:"username" validate:"required,min=4,max=12" label:"用户名"`
PassWord string `json:"password" validate:"required,min=6,max=20" label:"密码"`
Phone string `json:"phone" validate:"required,phone" label:"手机号"`
Email string `json:"email" validate:"required,email" label:"邮箱"`
Address string `json:"address"`
}
万能工具Utils的数据验证Validator.go
package utils
import (
"fmt"
"github.com/go-playground/locales/zh_Hans_CN"
unTrans "github.com/go-playground/universal-translator"
"github.com/go-playground/validator/v10"
zhTrans "github.com/go-playground/validator/v10/translations/zh"
"reflect"
)
func Validate(data interface{}) (string, int) {
//验证对象 并将英文报错转换成中文报错(message)
validate := validator.New()
uni := unTrans.New(zh_Hans_CN.New())
trans, _ := uni.GetTranslator("zh_Hans_CN")
err := zhTrans.RegisterDefaultTranslations(validate, trans)
if err != nil {
fmt.Println("err:", err)
}
//将验证法字段名 映射为中文名
validate.RegisterTagNameFunc(func(field reflect.StructField) string {
label := field.Tag.Get("label")
return label
})
err = validate.Struct(data)
if err != nil {
//错误可能有多个 遍历 返回一个
for _, v := range err.(validator.ValidationErrors) {
return v.Translate(trans), 400
}
}
return "", 200
}
完成后,直接go run main.go运行,返回结果如下
花费1小时写的,记得点赞收藏哈,Thanks♪(・ω・)ノ!!!