欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

golang用revel框架實(shí)現(xiàn)用戶注冊(cè)的方法-創(chuàng)新互聯(lián)

這篇文章運(yùn)用簡(jiǎn)單易懂的例子給大家介紹golang用revel框架實(shí)現(xiàn)用戶注冊(cè)的方法,代碼非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

桐廬ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書(shū)未來(lái)市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)的ssl證書(shū)銷(xiāo)售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18982081108(備注:SSL證書(shū)合作)期待與您的合作!

用戶注冊(cè)、登錄和注銷(xiāo)是任何一個(gè)網(wǎng)站都必然會(huì)有的功能,可以說(shuō),這是重新造輪子做多的領(lǐng)域,每個(gè)做網(wǎng)站的人應(yīng)該都做過(guò)很多遍。見(jiàn)微知著,從這么一個(gè)小功能其實(shí)就可以看到所使用的web框架中的大部分東西。

今天就讓我們用這個(gè)基本模塊來(lái)看看revel吧。

先整理一下我們選用的技術(shù)框架和組件:

web框架:revel

數(shù)據(jù)庫(kù):mongodb

數(shù)據(jù)庫(kù)driver:mgo

工欲善其事,必先利其器,這里著重推薦一個(gè)mongodb的GUI客戶端 - mongovue,可以說(shuō),如果沒(méi)有這個(gè)工具,在開(kāi)發(fā)的過(guò)程中我們會(huì)痛苦許多許多。

這里假設(shè)你已經(jīng)有了對(duì)Go語(yǔ)言最基本的知識(shí),已經(jīng)配置好GOROOT和GOPATH。

首先,在GOPATH下面運(yùn)行下面的命令安裝revel,并且把revel的工具編譯出來(lái)。

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

完成之后去GOPATH\bin下面看看是否已經(jīng)編譯出來(lái)了revel.exe。為了方便使用,我把GOPATH\bin添加到了環(huán)境變量PATH中。

到你希望存放工程文件的地方運(yùn)行

revel new myapp

整個(gè)工程的框架就建立好了,看下面的文件夾結(jié)構(gòu)就可以看出,revel是一個(gè)MVC框架。

golang用revel框架實(shí)現(xiàn)用戶注冊(cè)的方法

此時(shí)整個(gè)工程就可以運(yùn)行了,運(yùn)行下面的命令行啟動(dòng)站點(diǎn)。

revel run myapp

打開(kāi)瀏覽器 http://127.0.0.1:9000,就可以看到下面的結(jié)果

golang用revel框架實(shí)現(xiàn)用戶注冊(cè)的方法

內(nèi)部的細(xì)節(jié)暫時(shí)不多說(shuō),來(lái)吧,先讓用戶可以注冊(cè)。注意,在整個(gè)開(kāi)發(fā)過(guò)程中大部分時(shí)候不需要重新啟動(dòng)revel。

1、準(zhǔn)備Model

按照MVC的開(kāi)發(fā)節(jié)奏,我們先準(zhǔn)備model。在app目錄下新建一個(gè)models目錄,然后在里面新建entity.go(這個(gè)文件的命名大家可自便),打開(kāi)entity.go加入U(xiǎn)ser的實(shí)體定義。

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

內(nèi)部的細(xì)節(jié)暫時(shí)不多說(shuō),來(lái)吧,先讓用戶可以注冊(cè)。注意,在整個(gè)開(kāi)發(fā)過(guò)程中大部分時(shí)候不需要重新啟動(dòng)revel。

1、準(zhǔn)備Model

按照MVC的開(kāi)發(fā)節(jié)奏,我們先準(zhǔn)備model。在app目錄下新建一個(gè)models目錄,然后在里面新建entity.go(這個(gè)文件的命名大家可自便),打開(kāi)entity.go加入U(xiǎn)ser的實(shí)體定義。

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

為什么定義MockUser呢?原因后面會(huì)提到。

現(xiàn)在寫(xiě)dal(數(shù)據(jù)訪問(wèn)層),在app\models目錄下新建dal.go。dal的寫(xiě)法其實(shí)可以用revel的插件機(jī)制,這里為了避免一下子引入太多概念,先用這種簡(jiǎn)單的方式。

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已經(jīng)提供了配置系統(tǒng),打開(kāi)conf\app.conf,添加下面內(nèi)容

[db]
ip = 127.0.0.1

現(xiàn)在實(shí)現(xiàn)注冊(cè)需要用到的方法,在app\models目錄下添加文件dal_account.go,代碼如下。

func (d *Dal) RegisterUser(mu *MockUser) error {
  uc := d.session.DB(DbName).C(UserCollection)
  //先檢查email和nickname是否已經(jīng)被使用
  i, _ := uc.Find(M{"nickname": mu.Nickname}).Count()
  if i != 0 {
    return errors.New("用戶昵稱(chēng)已經(jīng)被使用")
  }
  i, _ = uc.Find(M{"email": mu.Email}).Count()
  if i != 0 {
    return errors.New("郵件地址已經(jīng)被使用")
  }
  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
}

看出來(lái)MockUser存在的意義了嗎?用戶在頁(yè)面上填寫(xiě)的是明文的密碼,這可不能直接存入數(shù)據(jù)庫(kù),需要先加密,這里用到了"code.google.com/p/go.crypto/bcrypt"這個(gè)庫(kù)。

2、準(zhǔn)備Controller

準(zhǔn)備controller,在app\controllers新建一個(gè)文件account.go,在里面實(shí)現(xiàn)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

準(zhǔn)備route,打開(kāi)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是啥意思,這里就是把兩個(gè)url映射到了Controller的兩個(gè)Action。

可以看到,這里定義了所有的URL到Controller之間的映射,很方便。這個(gè)文件在運(yùn)行前會(huì)被revel轉(zhuǎn)換成app\routes\routes.go文件參與編譯。后面在講到ReverseRedirect的時(shí)候需要用到這個(gè)文件里的內(nèi)容。

4、準(zhǔn)備View

準(zhǔn)備view,在app\views下面新建文件Register.html,關(guān)鍵內(nèi)容如下

<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}}
    …

一點(diǎn)一點(diǎn)解釋一下上面藍(lán)色部分關(guān)鍵字的含義。

url是revel提供的一個(gè)template function,可以很方便的把Controller的Action變成與之相對(duì)的url,它的運(yùn)作原理實(shí)際上就是去剛才定義好的routes映射里面查找。

field是revel提供的一個(gè)template function,專(zhuān)門(mén)方便生成form,還記得PostRegister方法的簽名嗎?

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

它接受一個(gè)名為user的*models.User類(lèi)型的參數(shù),所以,使用{{with $field := field “user.Email”}}就可以通知revel將form的參數(shù)封裝到user結(jié)構(gòu)中再傳遞給PostRegister。

我們都知道用戶注冊(cè)的時(shí)候填寫(xiě)的值是需要做有效性檢驗(yàn)的,當(dāng)用戶填寫(xiě)的值不符合標(biāo)準(zhǔn)時(shí)需要出現(xiàn)錯(cuò)誤提示,通常來(lái)說(shuō)會(huì)是下面這樣

golang用revel框架實(shí)現(xiàn)用戶注冊(cè)的方法

$field.ErrorClass的作用就是當(dāng)這個(gè)參數(shù)出現(xiàn)錯(cuò)誤的時(shí)候可以方便的通過(guò)添加class的方式在頁(yè)面上顯示錯(cuò)誤狀態(tài)。ErrorClass的值可以通過(guò)下面的代碼修改。

revel.ERROR_CLASS = "error"

$field.Id和$field.Name就不解釋了,大家待會(huì)兒打開(kāi)瀏覽器中看看生成的源代碼就明白了。

$field.Flash這里就需要解釋一下Flash的概念了。

Flash是一個(gè)字典,適用于在兩個(gè)Request中間傳遞數(shù)據(jù),數(shù)據(jù)存儲(chǔ)在cookie中。

大家都知道,HTTP協(xié)議本身是無(wú)狀態(tài)的,所以,考慮一下這個(gè)用例,用戶在注冊(cè)的時(shí)候輸入了一個(gè)無(wú)效的email地址,點(diǎn)擊注冊(cè)之后頁(yè)面刷新了一下,“電子郵件”下面出現(xiàn)一行紅字“你輸入的Email地址無(wú)效”,此刻文本框里面需要出現(xiàn)上次用戶輸入的值。那么,$field.Flash就是在Flash里去找以$field.Name為Key的值。

$field.Error就是在Flash里找以$field.Name_error為Key的值,也就是上圖中紅色的“密碼必須大于等于6位”這個(gè)錯(cuò)誤信息。

好了,現(xiàn)在大家就按照這個(gè)節(jié)奏在view中添加“昵稱(chēng)”,“密碼”和“確認(rèn)密碼”吧。

添加完成之后就去訪問(wèn)http://127.0.0.1/register看看吧。是不是這樣呢?

golang用revel框架實(shí)現(xiàn)用戶注冊(cè)的方法

revel會(huì)通過(guò)Controller.Action的名稱(chēng)去查找同名的view文件,例如,Register方法對(duì)應(yīng)的就是Register.html。這里需要注意的一點(diǎn)是,revel是通過(guò)反射去查找Controller.Render方法的調(diào)用者,而且只向上查找一層。

例如,下面這段代碼是不能工作的。

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

5. 實(shí)現(xiàn)Controller

現(xiàn)在讓我們?yōu)镻ostRegister添加處理注冊(cè)的邏輯。

首先,驗(yàn)證參數(shù)的有效性。

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機(jī)制,上面的代碼應(yīng)該不需要太多解釋?zhuān)挥幸恍?/p>

c.FlashParams()

它的作用就是把form提交的參數(shù)原樣存入Flash中,還記得剛才的$field.Flash嗎?

現(xiàn)在去玩玩注冊(cè)頁(yè)面吧,填寫(xiě)一些錯(cuò)誤的值看看反應(yīng)吧,嗯,你應(yīng)該很快就會(huì)發(fā)現(xiàn),錯(cuò)誤信息雖然已經(jīng)顯示出來(lái),但可惜卻是英文的,修改一下吧。

func (c *Account) PostRegister(user *models.MockUser) revel.Result {
  c.Validation.Email(user.Email).Message("電子郵件格式無(wú)效")
  c.Validation.Required(user.Nickname).Message("用戶昵稱(chēng)不能為空")
  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提供了好幾個(gè)常用的驗(yàn)證方法,大家可以自己看看,應(yīng)該是簡(jiǎn)單易懂的。

繼續(xù),當(dāng)所有參數(shù)檢查都通過(guò)之后,就調(diào)用dal.RegisterUser方法將用戶信息存入數(shù)據(jù)庫(kù)。

func (c *Account) PostRegister(user *models.MockUser) revel.Result {
  c.Validation.Email(user.Email).Message("電子郵件格式無(wú)效")
  c.Validation.Required(user.Nickname).Message("用戶昵稱(chēng)不能為空")
  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()
}

我增加了一個(gè)方法RegisterSuccessful,用于顯示注冊(cè)成功,大家別忘了在routes和view中添加相應(yīng)的東西。

至此,用戶注冊(cè)已經(jīng)完成。不知道大家注意到?jīng)]有,就算修改go代碼,依然不需要重新啟動(dòng)revel,直接刷新瀏覽器頁(yè)面就會(huì)發(fā)現(xiàn)新的代碼已經(jīng)自動(dòng)編譯并且啟用了。

關(guān)于golang用revel框架實(shí)現(xiàn)用戶注冊(cè)的方法就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性?xún)r(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

網(wǎng)頁(yè)標(biāo)題:golang用revel框架實(shí)現(xiàn)用戶注冊(cè)的方法-創(chuàng)新互聯(lián)
標(biāo)題路徑:http://aaarwkj.com/article44/ccphhe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)自適應(yīng)網(wǎng)站、網(wǎng)站改版、網(wǎng)站建設(shè)、網(wǎng)站營(yíng)銷(xiāo)、App設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁(yè)設(shè)計(jì)
亚洲综合福利视频网站| 国产偷自一区二区三区| 精品一区中文字幕少妇人妻| 久久婷婷国产综合精品青草| 亚洲精品一区二区三区三州| 欧美三级高清视频在线播放| 午夜视频在线观看免费高清国产| 亚洲av激情码国产一区| 亚洲欧美日韩综合久久| 日本束缚人妻一区二区三区| 成人在线午夜你懂的视频| 色呦呦视频在线免费观看| 日本成人在线播放网站| 一区二区三区四区在线视频观看| 青青草针对华人在线视频| 色呦呦视频在线免费看| 亚洲国产精品第一区第二区| 日本亚洲美丽少妇天堂| 日韩亚洲欧美成人一区| 不卡一区二区福利日本| 三级视频一区二区三区| 丁香婷婷深情五月亚洲天堂| 国产三级精品大乳人妇| 国产精品一区二区免费式| 久久久久久精品人妻网| 国内精品久久久久久2021| 黄色录像一级二级三级| 日本av高清视频在线观看| 一区二区三区乱码国产在线| 国产交换精品一区二区三区| 精品国产三级a在线观看网站| 日本午夜理论视频在线播放| 日本在线高清精品人妻| 中文字幕乱码日韩一区| 国产日本欧美一区二区三区| 日本高清视频免费一区| 亚洲奇米精品一区二区| 性生活免费在线观看视频| 91出品国产福利在线| 日韩一区二区免费看视频| 亚洲日本欧美激情综合|