>백엔드 개발 >Golang >Go 언어는 revel 프레임워크를 사용하여 사용자 등록 튜토리얼(코드 포함)을 구현합니다.

Go 언어는 revel 프레임워크를 사용하여 사용자 등록 튜토리얼(코드 포함)을 구현합니다.

尚
앞으로
2019-11-26 11:29:412910검색

Go 언어는 revel 프레임워크를 사용하여 사용자 등록 튜토리얼(코드 포함)을 구현합니다.

사용자 등록, 로그인 및 로그아웃은 모든 웹사이트에서 피할 수 없는 기능입니다. 이는 많은 사람들이 웹사이트를 구축하는 누구나 여러 번 해보았을 영역이라고 할 수 있습니다. 이렇게 작은 기능만으로도 실제로 웹 프레임워크에서 사용되는 대부분의 것들을 볼 수 있습니다.

오늘은 이 기본 모듈을 사용하여 revel을 살펴보겠습니다.

먼저 우리가 선택한 기술 프레임워크와 구성요소를 정리하겠습니다.

웹 프레임워크: revel

데이터베이스: mongodb

데이터베이스 드라이버: 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

완료 후 GOPATHbin으로 이동하여 revel.exe가 컴파일되었는지 확인하세요. 사용 편의성을 위해 환경 변수 PATH에 GOPATHbin을 추가했습니다.

프로젝트 파일을 저장하고 싶은 곳으로 가서

revel new myapp

를 실행하면 전체 프로젝트 프레임워크가 완성됩니다. 아래 폴더 구조를 보면 알 수 있듯이 revel은 MVC 프레임워크입니다.

Go 언어는 revel 프레임워크를 사용하여 사용자 등록 튜토리얼(코드 포함)을 구현합니다.

이제 전체 프로젝트를 실행할 준비가 되었습니다. 다음 명령줄을 실행하여 사이트를 시작하세요.

revel run myapp

http://127.0.0.1:9000 브라우저를 열면 다음과 같은 결과를 볼 수 있습니다

Go 언어는 revel 프레임워크를 사용하여 사용자 등록 튜토리얼(코드 포함)을 구현합니다.

당분간 내부 내용은 다루지 않겠습니다. 먼저 사용자 등록을 해주세요. 대부분의 경우 전체 개발 프로세스 중에 revel을 다시 시작할 필요가 없습니다.

1. 모델 준비

MVC의 개발 리듬에 따라 먼저 모델을 준비합니다. 앱 디렉터리에 새 모델 디렉터리를 만든 다음 그 안에 새 엔터티.go를 만들고(이 파일의 이름은 원하는 대로 지정할 수 있음), 엔터티.go를 열고 사용자 엔터티 정의를 추가합니다.

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

지금은 내부적인 내용은 다루지 않고 먼저 사용자 등록을 하도록 하겠습니다. 대부분의 경우 전체 개발 프로세스 중에 revel을 다시 시작할 필요가 없습니다.

1. 모델 준비

MVC의 개발 리듬에 따라 먼저 모델을 준비합니다. 앱 디렉터리에 새 모델 디렉터리를 만든 다음 그 안에 새 엔터티.go를 만들고(이 파일의 이름은 원하는 대로 지정할 수 있음), 엔터티.go를 열고 사용자 엔터티 정의를 추가합니다.

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

MockUser를 정의하는 이유는 무엇인가요? 이유는 나중에 언급하겠습니다.

이제 dal(데이터 액세스 레이어)을 작성하고 appmodels 디렉터리에 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은 구성 시스템을 제공하고 confapp.conf를 열고 다음 콘텐츠를 추가합니다.

[db]
ip = 127.0.0.1

이제 등록에 필요한 방법을 구현하고 appmodels 디렉터리에 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. 컨트롤러 준비

컨트롤러를 준비하고 appcontrollers에 새 파일 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. 경로 추가

경로를 준비하고, 경로를 열고, 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을 컨트롤러의 두 작업에 매핑합니다.

여기서 모든 URL과 컨트롤러 간의 매핑이 정의되어 있는 것을 볼 수 있어 매우 편리합니다. 이 파일은 컴파일에 참여하기 위해 실행하기 전에 revel에 의해 approutesroutes.go 파일로 변환됩니다. 이 파일의 내용은 나중에 ReverseRedirect에 관해 이야기할 때 사용됩니다.

4. 보기 준비

보기 준비, appviews 아래 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。

我们都知道用户注册的时候填写的值是需要做有效性检验的,当用户填写的值不符合标准时需要出现错误提示,通常来说会是下面这样

Go 언어는 revel 프레임워크를 사용하여 사용자 등록 튜토리얼(코드 포함)을 구현합니다.

$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看看吧。是不是这样呢?

Go 언어는 revel 프레임워크를 사용하여 사용자 등록 튜토리얼(코드 포함)을 구현합니다.

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 프레임워크를 사용하여 사용자 등록 튜토리얼(코드 포함)을 구현합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 cnblogs.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제