美文网首页三月听我说
beego从入门到弃坑( 三 )登录

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

作者: 三月孙记风 | 来源:发表于2019-01-10 15:40 被阅读0次

    在上一节中我带领小伙伴们完成了一个简单的登录,在这一节我们继续对这个登录做一下完善,我们需要在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: "dev@beego.me"}
        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从入门到弃坑( 三 )登录

        本文链接:https://www.haomeiwen.com/subject/fcrgrqtx.html