hi,你好!欢迎访问本站!登录
本站由简数采集腾讯云宝塔系统阿里云强势驱动
当前位置:首页 - 文章 - 后端开发 - 正文 看Cosplay古风插画小姐姐,合集图集打包下载:炫龙网 · 炫龙图库

【后端开辟】go言语运用revel框架完成用户注册教程(附代码)

2019-11-30后端开发ki4网31°c
A+ A-

用户注册、登录和注销是任何一个网站都必然会有的功用,能够说,这是重新造轮子做多的范畴,每一个做网站的人应当都做过很多遍。见微知著,从这么一个小功用实在就能够看到所运用的web框架中的大部份东西。

本日就让我们用这个基础模块来看看revel吧。

先整顿一下我们选用的手艺框架和组件:

web框架:revel

数据库:mongodb

数据库driver:mgo

工欲善其事,必先利其器,这里偏重引荐一个mongodb的GUI客户端 - mongovue,能够说,假如没有这个东西,在开辟的过程当中我们会痛楚很多很多。

这里假定你已有了对Go言语最基础的学问,已设置好GOROOT和GOPATH。

起首,在GOPATH下面运转下面的敕令装置revel,而且把revel的东西编译出来。

go get github.com/robfig/revel
go build –o bin/revel.exe github.com/robfig/revel/revel

完成以后去GOPATH\bin下面看看是不是已编译出来了revel.exe。为了轻易运用,我把GOPATH\bin增加到了环境变量PATH中。

到你愿望寄存工程文件的处所运转

revel new myapp

全部工程的框架就竖立好了,看下面的文件夹构造就能够看出,revel是一个MVC框架。

此时全部工程就能够运转了,运转下面的敕令行启动站点。

revel run myapp

翻开浏览器 http://127.0.0.1:9000,就能够看到下面的效果

内部的细节暂时不多说,来吧,先让用户能够注册。注重,在全部开辟过程当中大部份时刻不须要重新启动revel。

1、预备Model

根据MVC的开辟节拍,我们先预备model。在app目次下新建一个models目次,然后在内里新建entity.go(这个文件的定名人人可自便),翻开entity.go到场User的实体定义。

type User struct {
  Email    string
  Nickname string
  Password []byte
}
type MockUser struct {
  Email           string
  Nickname        string
  Password        string
  ConfirmPassword string
}

内部的细节暂时不多说,来吧,先让用户能够注册。注重,在全部开辟过程当中大部份时刻不须要重新启动revel。

1、预备Model

根据MVC的开辟节拍,我们先预备model。在app目次下新建一个models目次,然后在内里新建entity.go(这个文件的定名人人可自便),翻开entity.go到场User的实体定义。

type User struct {
  Email    string
  Nickname string
  Password []byte
}
type MockUser struct {
  Email           string
  Nickname        string
  Password        string
  ConfirmPassword string
}

为何定义MockUser呢?缘由背面会提到。

如今写dal(数据接见层),在app\models目次下新建dal.go。dal的写法实在能够用revel的插件机制,这里为了防止一会儿引入太多观点,先用这类简朴的体式格局。

package models
import (
  "github.com/robfig/revel"
  "labix.org/v2/mgo"
)
const (
  DbName                         = "myapp"
  UserCollection                 = "user"
)
type Dal struct {
  session *mgo.Session
}
func NewDal() (*Dal, error) {
  revel.Config.SetSection("db")
  ip, found := revel.Config.String("ip")
  if !found {
    revel.ERROR.Fatal("Cannot load database ip from app.conf")
  }
  session, err := mgo.Dial(ip)
  if err != nil {
    return nil, err
  }
  return &Dal{session}, nil
}
func (d *Dal) Close() {
  d.session.Close()
}

revel已供应了设置体系,翻开conf\app.conf,增加下面内容

[db]
ip = 127.0.0.1

如今完成注册须要用到的要领,在app\models目次下增加文件dal_account.go,代码以下。

func (d *Dal) RegisterUser(mu *MockUser) error {
  uc := d.session.DB(DbName).C(UserCollection)
  //先搜检email和nickname是不是已被运用
  i, _ := uc.Find(M{"nickname": mu.Nickname}).Count()
  if i != 0 {
    return errors.New("用户昵称已被运用")
  }
  i, _ = uc.Find(M{"email": mu.Email}).Count()
  if i != 0 {
    return errors.New("邮件地点已被运用")
  }
  var u User
  u.Email = mu.Email
  u.Nickname = mu.Nickname
  u.Password, _ = bcrypt.GenerateFromPassword([]byte(mu.Password), bcrypt.DefaultCost)
  err := uc.Insert(u)
  return err
}

看出来MockUser存在的意义了吗?用户在页面上填写的是明文的暗码,这可不能直接存入数据库,须要先加密,这里用到了"code.google.com/p/go.crypto/bcrypt"这个库。

2、预备Controller

预备controller,在app\controllers新建一个文件account.go,在内里完成Account控制器,代码以下。

package controllers
import (
  "github.com/robfig/revel"
  "myapp/app/models"
)
type Account struct {
  *revel.Controller
}
func (c *Account) Register() revel.Result {
  return c.Render()
}
func (c *Account) PostRegister(user *models.MockUser) revel.Result {
  return c.Render()
}

3、增加Route

预备route,翻开conf\routes,增加Register的URL映照。

# Routes
# This file defines all application routes (Higher priority routes first)
# ~~~~
module:testrunner
GET     /                                          App.Index
GET     /register                                Account.Register
POST   /register                                Account.PostRegister
# Ignore favicon requests
GET     /favicon.ico                           404
# Map static resources from the /app/public folder to the /public path
GET     /public/*filepath                     Static.Serve("public")
# Catch all
*       /:controller/:action                   :controller.:action

假定人人都晓得Restful是啥意思,这里就是把两个url映照到了Controller的两个Action。

能够看到,这里定义了一切的URL到Controller之间的映照,很轻易。这个文件在运转前会被revel转换成app\routes\routes.go文件介入编译。背面在讲到ReverseRedirect的时刻须要用到这个文件里的内容。

4、预备View

预备view,在app\views下面新建文件Register.html,症结内容以下

<form action="{{url "Account.PostRegister"}}" method="POST">
    {{with $field := field "user.Email" .}}
    <div class="control-group {{$field.ErrorClass}}">
      <label class="control-label" for="{{$field.Id}}">电子邮件</label>
      <div class="controls">
        <input type="email" id="{{$field.Id}}" name="{{$field.Name}}" value="{{$field.Flash}}" required>
        {{if $field.Error}}
        <span class="help-inline">{{$field.Error}}</span>
        {{end}}
      </div>
    </div>
    {{end}}
    …

一点一点诠释一下上面蓝色部份症结字的寄义。

url是revel供应的一个template function,能够很轻易的把Controller的Action变成与之相对的url,它的运作道理实际上就是去适才定义好的routes映照内里查找。

field是revel供应的一个template function,特地轻易生成form,还记得PostRegister要领的署名吗?

func (c *Account) PostRegister(user *models.MockUser) revel.Result

它接收一个名为user的*models.User范例的参数,所以,运用{{with $field := field “user.Email”}}就能够关照revel将form的参数封装到user构造中再通报给PostRegister。

我们都晓得用户注册的时刻填写的值是须要做有效性磨练的,当用户填写的值不符合标准时须要涌现毛病提醒,一般来讲会是下面如许

$field.ErrorClass的作用就是当这个参数涌现毛病的时刻能够轻易的经由过程增加class的体式格局在页面上显现毛病状况。ErrorClass的值能够经由过程下面的代码修正。

revel.ERROR_CLASS = "error"

$field.Id和$field.Name就不诠释了,人人待会儿翻开浏览器中看看生成的源代码就邃晓了。

$field.Flash这里就须要诠释一下Flash的观点了。

Flash是一个字典,适用于在两个Request中心通报数据,数据存储在cookie中。

人人都晓得,HTTP协定自身是无状况的,所以,考虑一下这个用例,用户在注册的时刻输入了一个无效的email地点,点击注册以后页面革新了一下,“电子邮件”下面涌现一行红字“你输入的Email地点无效”,现在文本框内里须要涌现上次用户输入的值。那末,$field.Flash就是在Flash里去找以$field.Name为Key的值。

$field.Error就是在Flash里找以$field.Name_error为Key的值,也就是上图中赤色的“暗码必需大于即是6位”这个毛病信息。

好了,如今人人就根据这个节拍在view中增加“昵称”,“暗码”和“确认暗码”吧。

增加完成以后就去接见http://127.0.0.1/register看看吧。是不是是如许呢?

revel会经由过程Controller.Action的称号去查找同名的view文件,比方,Register要领对应的就是Register.html。这里须要注重的一点是,revel是经由过程反射去查找Controller.Render要领的挪用者,而且只向上查找一层。

比方,下面这段代码是不能事情的。

func (c *Account) someMethod() revel.Result {
  ...
  return c.Render()
}
func (c *Account) Register() revel.Result {
  return c.someMethod()
}

5. 完成Controller

如今让我们为PostRegister增加处置惩罚注册的逻辑。

起首,考证参数的有效性。

func (c *Account) PostRegister(user *models.MockUser) revel.Result {
  c.Validation.Required(user)
  c.Validation.Email(user.Email)
  c.Validation.Required(user.Nickname)
  c.Validation.Required(user.Password)
  c.Validation.Required(user.ConfirmPassword == user.Password)
  if c.Validation.HasErrors() {
    c.FlashParams()
    return c.Redirect((*Account).Register)
  }
  return c.Render()
}

revel供应了挺好用的Validation机制,上面的代码应当不须要太多诠释,只要一行

c.FlashParams()

它的作用就是把form提交的参数原样存入Flash中,还记得适才的$field.Flash吗?

如今去玩玩注册页面吧,填写一些毛病的值看看回响反映吧,嗯,你应当很快就会发明,毛病信息虽然已显现出来,但惋惜倒是英文的,修正一下吧。

func (c *Account) PostRegister(user *models.MockUser) revel.Result {
  c.Validation.Email(user.Email).Message("电子邮件花样无效")
  c.Validation.Required(user.Nickname).Message("用户昵称不能为空")
  c.Validation.Required(user.Password).Message("暗码不能为空")
  c.Validation.Required(user.ConfirmPassword == user.Password).Message("两次输入的暗码不一致")
  if c.Validation.HasErrors() {
    c.FlashParams()
    return c.Redirect((*Account).Register)
  }
  return c.Render()
}

Validation供应了好几个经常使用的考证要领,人人能够本身看看,应当是简朴易懂的。

继承,当一切参数搜检都经由过程以后,就挪用dal.RegisterUser要领将用户信息存入数据库。

func (c *Account) PostRegister(user *models.MockUser) revel.Result {
  c.Validation.Email(user.Email).Message("电子邮件花样无效")
  c.Validation.Required(user.Nickname).Message("用户昵称不能为空")
  c.Validation.Required(user.Password).Message("暗码不能为空")
  c.Validation.Required(user.ConfirmPassword == user.Password).Message("两次输入的暗码不一致")
  if c.Validation.HasErrors() {
    c.FlashParams()
    return c.Redirect((*Account).Register)
  }
  dal, err := models.NewDal()
  if err != nil {
    c.Response.Status = 500
    return c.RenderError(err)
  }
  defer dal.Close()
  err = dal.RegisterUser(user)
  if err != nil {
    c.Flash.Error(err.Error())
    return c.Redirect((*Account).Register)
  }
  return c.Redirect((*Account).RegisterSuccessful)
}
func (c *Account) RegisterSuccessful() revel.Result {
  return c.Render()
}

我增加了一个要领RegisterSuccessful,用于显现注册胜利,人人别忘了在routes和view中增加响应的东西。

至此,用户注册已完成。不晓得人人注重到没有,就算修正go代码,依旧不须要重新启动revel,直接革新浏览器页面就会发明新的代码已自动编译而且启用了。

更多go言语相干文章请关注go言语教程栏目。

以上就是go言语运用revel框架完成用户注册教程(附代码)的细致内容,更多请关注ki4网别的相干文章!

  选择打赏方式
微信赞助

打赏

QQ钱包

打赏

支付宝赞助

打赏

  选择分享方式
  移步手机端
【后端开辟】go言语运用revel框架完成用户注册教程(附代码)

1、打开你手机的二维码扫描APP
2、扫描左则的二维码
3、点击扫描获得的网址
4、可以在手机端阅读此文章

发表评论

选填

必填

必填

选填

请拖动滑块解锁
>>