在上一节中我带领小伙伴们完成了一个简单的登录,在这一节我们继续对这个登录做一下完善,我们需要在controller里对前台传过来的数据进行一下过滤,而beego给了我们一个简便的验证模板。
首先我们需要安装这个模板
安装:
go get github.com/astaxie/beego/validation
测试:
go test github.com/astaxie/beego/validation
而我们只需要选择第一种安装方法就行,第二种仅仅是测试用的。在你的目录下面安装执行这条命令便可
func (c *MainController)Login() {
valid := validation.Validation{};
//验证最大数字不超过11位
valid.MaxSize(c.GetString("school"),11,"school").Message("您输入的学号不正确")
valid.AlphaNumeric(c.GetString("school"),"number").Message("请您输入的学号必须是数字字符")
//用正则表达限制输入的密码必须是字母加数字
valid.Match(c.GetString("password"),regexp.MustCompile(`^[a-zA-Z0-9_-]{4,16}$`),"password").Message("您输入的密码格式不正确")
valid.Required(c.GetString("password"),"password").Message("请您输入密码")
valid.Required(c.GetString("captcha"),"captcha").Message("请您输入验证码")
if valid.HasErrors() {
// 如果有错误信息,证明验证没通过
// 打印错误信息
for _,err := range valid.Errors {
beego.Alert(err.Key+"+++++++"+err.Message)
}
c.Ctx.WriteString("您的信息输入错误")
return
}
c.Ctx.WriteString("登录成功")
return
}
如果小伙伴们想一个一个的判断的话可以这样做
if v := valid.Max(u.Age, 140, "age"); !v.Ok {
log.Println(v.Error.Key, v.Error.Message)
}
并且除了这种验证方法还有通过 StructTag 验证,但是这种方法我没有用到
文档上的实例代码
import (
"log"
"strings"
"github.com/astaxie/beego/validation"
)
// 验证函数写在 "valid" tag 的标签里
// 各个函数之间用分号 ";" 分隔,分号后面可以有空格
// 参数用括号 "()" 括起来,多个参数之间用逗号 "," 分开,逗号后面可以有空格
// 正则函数(Match)的匹配模式用两斜杠 "/" 括起来
// 各个函数的结果的 key 值为字段名.验证函数名
type user struct {
Id int
Name string `valid:"Required;Match(/^Bee.*/)"` // Name 不能为空并且以 Bee 开头
Age int `valid:"Range(1, 140)"` // 1 <= Age <= 140,超出此范围即为不合法
Email string `valid:"Email; MaxSize(100)"` // Email 字段需要符合邮箱格式,并且最大长度不能大于 100 个字符
Mobile string `valid:"Mobile"` // Mobile 必须为正确的手机号
IP string `valid:"IP"` // IP 必须为一个正确的 IPv4 地址
}
// 如果你的 struct 实现了接口 validation.ValidFormer
// 当 StructTag 中的测试都成功时,将会执行 Valid 函数进行自定义验证
func (u *user) Valid(v *validation.Validation) {
if strings.Index(u.Name, "admin") != -1 {
// 通过 SetError 设置 Name 的错误信息,HasErrors 将会返回 true
v.SetError("Name", "名称里不能含有 admin")
}
}
func main() {
valid := validation.Validation{}
u := user{Name: "Beego", Age: 2, Email: "[email protected]"}
b, err := valid.Valid(&u)
if err != nil {
// handle error
}
if !b {
// validation does not pass
// blabla...
for _, err := range valid.Errors {
log.Println(err.Key, err.Message)
}
}
}
返回值
如果想要返回多种格式的值
可以通过以下方式
JSON 数据直接输出:
func (this *AddController) Get() {
mystruct := { ... }
this.Data["json"] = &mystruct
this.ServeJSON()
}
调用 ServeJSON 之后,会设置 content-type 为 application/json,然后同时把数据进行 JSON 序列化输出。
XML 数据直接输出:
func (this *AddController) Get() {
mystruct := { ... }
this.Data["xml"]=&mystruct
this.ServeXML()
}
调用 ServeXML 之后,会设置 content-type 为 application/xml,同时数据会进行 XML 序列化输出。
jsonp 调用
func (this *AddController) Get() {
mystruct := { ... }
this.Data["jsonp"] = &mystruct
this.ServeJSONP()
}
下面我们将上面发会值改为json格式的
func (c *MainController)Login() {
valid := validation.Validation{};
valid.MaxSize(c.GetString("school"),11,"school").Message("您输入的学号不正确")
valid.AlphaNumeric(c.GetString("school"),"number").Message("请您输入的学号必须是数字字符")
valid.Match(c.GetString("password"),regexp.MustCompile(`^[a-zA-Z0-9_-]{4,16}$`),"password").Message("您输入的密码格式不正确")
valid.Required(c.GetString("password"),"password").Message("请您输入密码")
valid.Required(c.GetString("captcha"),"captcha").Message("请您输入验证码")
fmt.Println(valid.HasErrors())
if valid.HasErrors() {
for _,err := range valid.Errors {
beego.Alert(err.Key+"+++++++"+err.Message)
fmt.Println(err.Message)
}
c.Data["json"] = map[string]interface{}{"name": -1, "message": "你输入的数据有误"}
}
c.Data["json"] = map[string]interface{}{"name": 1, "message": "登陆成功"}
c.ServeJSON()
}
但是当我们运行时会发现代码会报找不到页面的错误,当我们仔细检查会发现代码的确没有任何问题,那到底是哪里出现问题呢,上一节我说过在beego中每一个控制器的方法都对应着一个tpl文件,如果我们不指定返回的文件,我就返回给默认的tpl文件,所以我们指定一下返回文件名就可以了
验证码
首先要按装第三方包还是进入项目后执行命令
go get github.com/astaxie/beego/cache
go get github.com/astaxie/beego/utils/captcha
var cpt *captcha.Captcha
func init() {
store := cache.NewMemoryCache()
cpt = captcha.NewWithFilter("/captcha/", store)
}
/*返回登录首页*/
// @router /login [get]
func (c *LoginContorller)Login() {
c.XSRFExpire = 7200
c.Data["xsrf_token"] = c.XSRFToken()
c.TplName = "reception/index.html"
}
html中的代码
如果ajax想要后台发送消息需要,发送两个一个是输入的验证码一个是验证码的编号,才可以验证他
我是通过字符串才分的方式得到的。
/*登录验证*/
//@router /login/judge [post]
func (c *LoginContorller)Post() {
valid.Required(c.GetString("captcha"),"captcha").Message("请您输入验证码")
//cpt 是上面初始化,上面有代码
captchaBoolean := cpt.Verify(c.GetString("captchaId"),c.GetString("captcha"));
if !captchaBoolean || len(user) == 0 {
if !captchaBoolean {
c.Data["json"] = map[string]interface{}{"name": -1, "message": "你输入的验证码不正确"}
}else {
c.Data["json"] = map[string]interface{}{"name": 0, "message": "你输入的账号或密码不正确"}
}
}else {
c.SetSession("account",c.GetString("school"))
c.Data["json"] = map[string]interface{}{"name": 1, "message": "登陆成功"}
}
c.ServeJSON()
c.TplName = "reception/index.html"
}
这是完整成绩管理系同的链接https://github.com/dajumao/achievement