我首先定义了一个默认的验证包,在控制器中会调用验证包中的方法进行验证表单提交时候传入的字段
// 发表文章的内容提交
// @router /release [post]
func (c *ArticleController) Post() {
u := &validate.ValidateArticle{
ArticleName: c.GetString("article_name"),
ArticleContent: c.GetString("article_content"),
}
//作为表单验证
err := u.ValidArticle()
if err != nil {
c.Abort500(err.Error(), "")
return
}
//进行提交表单
article := models.Article{
ArticleName: c.GetString("article_name"),
ArticleContent: c.GetString("article_content"),
CreateTime: time.Now().Unix(),
UpdateTime: time.Now().Unix(),
Status: int8(2),
}
err = article.SaveArticle()
id := article.Id
if err != nil {
c.Abort500(err.Error(), "")
}
idStr := strconv.FormatInt(id, 10)
c.Abort200("添加成功", "/article/"+idStr)
}
package validate
import (
"errors"
"github.com/astaxie/beego/validation"
"imooc/beego/myproject/models"
"reflect"
)
//tags中 alias 表示验证不通过时候的提示名称,valid表示验证的格式 分号分割不同的验证内容
type ValidateArticle struct {
ArticleName string `alias:"文章名称" valid:"Required;MaxSize(40);Mobile;Unique"`
ArticleContent string `alias:"文章内容" valid:"Required"`
}
func (a *ValidateArticle) ValidArticle() (err error) {
valid := validation.Validation{}
b,_ := valid.Valid(a)
if !b {
//表示获取验证的结构体
st := reflect.TypeOf(ValidateArticle{})
for _, err := range valid.Errors {
//获取验证的字段名和提示信息的别名
filed, _ := st.FieldByName(err.Field)
var alias = filed.Tag.Get("alias")
//返回验证的错误信息
return errors.New(alias+err.Message)
}
}
return nil
}
这个是验证的公共方法
package validate
import (
"github.com/astaxie/beego/logs"
"github.com/astaxie/beego/validation"
)
func InitValidate() {
SetDefaultMessage()
}
下载第一步首先修改默认的验证提示信息
原有的提示信息是中文不太好展示,如果每一个验证信息都全部重新,重复代码太多不够优美,所有才有修改默认信息
在刚才的自己创建的的验证包 validate 中,重新定义一次所有的提示信息:
var MessageTmpls = map[string]string{
"Required": "不能为空",
"Min": "最小为 %d",
"Max": "最大为 %d",
"Range": "范围在 %d 至 %d",
"MinSize": "最小长度为 %d",
"MaxSize": "最大长度为 %d",
"Length": "长度必须是 %d",
"Alpha": "必须是有效的字母字符",
"Numeric": "必须是有效的数字字符",
"AlphaNumeric": "必须是有效的字母或数字字符",
"Match": "必须匹配格式 %s",
"NoMatch": "必须不匹配格式 %s",
"AlphaDash": "必须是有效的字母或数字或破折号(-_)字符",
"Email": "必须是有效的邮件地址",
"IP": "必须是有效的IP地址",
"Base64": "必须是有效的base64字符",
"Mobile": "必须是有效手机号码",
"Tel": "必须是有效电话号码",
"Phone": "必须是有效的电话号码或者手机号码",
"ZipCode": "必须是有效的邮政编码",
}
再写入刚才validate报中 initValidate方法调用的函数
SetDefaultMessage()
//默认设置通用的错误验证和提示项
func SetDefaultMessage() {
if len(MessageTmpls) == 0{
return
}
//将默认的提示信息转为自定义
for k,_:= range MessageTmpls{
validation.MessageTmpls[k] = MessageTmpls[k]
}
//增加默认的自定义验证方法
_ = validation.AddCustomFunc("Unique", Unique)
}
2、自定义的验证方法的话 在调用的时候需要设置到想对应的方法名与函数
var Unique validation.CustomFunc = func(v *validation.Validation, obj interface{}, key string) {
logs.Debug("传入的字段名称:",key)
logs.Debug("传入的字段内容:",obj)
logs.Debug("传入的验证:",v)
logs.Debug("验证当前字段在表中不重复")
}
package main
import (
"github.com/astaxie/beego"
_ "imooc/beego/myproject/routers"
"imooc/beego/myproject/validate"
"strings"
)
func main() {
validate.InitValidate() //验证信息的初始化定义
beego.Run()
}