beego从入门到弃坑( 三 )登录

在上一节中我带领小伙伴们完成了一个简单的登录,在这一节我们继续对这个登录做一下完善,我们需要在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文件,所以我们指定一下返回文件名就可以了


2019-01-10_15-19.png

验证码

首先要按装第三方包还是进入项目后执行命令

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中的代码


2019-01-10_15-31.png

如果ajax想要后台发送消息需要,发送两个一个是输入的验证码一个是验证码的编号,才可以验证他

2019-01-10_15-34.png

我是通过字符串才分的方式得到的。


/*登录验证*/
//@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

你可能感兴趣的:(beego从入门到弃坑( 三 )登录)