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: "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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,198评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,663评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,985评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,673评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,994评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,399评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,717评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,407评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,112评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,371评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,891评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,255评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,881评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,010评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,764评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,412评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,299评论 2 260

推荐阅读更多精彩内容