這篇文章運用簡單易懂的例子給大家介紹golang用revel框架實現(xiàn)用戶注冊的方法,代碼非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
桐廬ssl適用于網(wǎng)站、小程序/APP、API接口等需要進行數(shù)據(jù)傳輸應用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18982081108(備注:SSL證書合作)期待與您的合作!用戶注冊、登錄和注銷是任何一個網(wǎng)站都必然會有的功能,可以說,這是重新造輪子做多的領域,每個做網(wǎng)站的人應該都做過很多遍。見微知著,從這么一個小功能其實就可以看到所使用的web框架中的大部分東西。
今天就讓我們用這個基本模塊來看看revel吧。
先整理一下我們選用的技術框架和組件:
web框架:revel
數(shù)據(jù)庫:mongodb
數(shù)據(jù)庫driver:mgo
工欲善其事,必先利其器,這里著重推薦一個mongodb的GUI客戶端 - mongovue,可以說,如果沒有這個工具,在開發(fā)的過程中我們會痛苦許多許多。
這里假設你已經(jīng)有了對Go語言最基本的知識,已經(jīng)配置好GOROOT和GOPATH。
首先,在GOPATH下面運行下面的命令安裝revel,并且把revel的工具編譯出來。
go get github.com/robfig/revel go build –o bin/revel.exe github.com/robfig/revel/revel
完成之后去GOPATH\bin下面看看是否已經(jīng)編譯出來了revel.exe。為了方便使用,我把GOPATH\bin添加到了環(huán)境變量PATH中。
到你希望存放工程文件的地方運行
revel new myapp
整個工程的框架就建立好了,看下面的文件夾結構就可以看出,revel是一個MVC框架。
此時整個工程就可以運行了,運行下面的命令行啟動站點。
revel run myapp
打開瀏覽器 http://127.0.0.1:9000,就可以看到下面的結果
內(nèi)部的細節(jié)暫時不多說,來吧,先讓用戶可以注冊。注意,在整個開發(fā)過程中大部分時候不需要重新啟動revel。
1、準備Model
按照MVC的開發(fā)節(jié)奏,我們先準備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 }
內(nèi)部的細節(jié)暫時不多說,來吧,先讓用戶可以注冊。注意,在整個開發(fā)過程中大部分時候不需要重新啟動revel。
1、準備Model
按照MVC的開發(fā)節(jié)奏,我們先準備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呢?原因后面會提到。
現(xiàn)在寫dal(數(shù)據(jù)訪問層),在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已經(jīng)提供了配置系統(tǒng),打開conf\app.conf,添加下面內(nèi)容
[db] ip = 127.0.0.1
現(xiàn)在實現(xiàn)注冊需要用到的方法,在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("用戶昵稱已經(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 }
看出來MockUser存在的意義了嗎?用戶在頁面上填寫的是明文的密碼,這可不能直接存入數(shù)據(jù)庫,需要先加密,這里用到了"code.google.com/p/go.crypto/bcrypt"這個庫。
2、準備Controller
準備controller,在app\controllers新建一個文件account.go,在里面實現(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
準備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的時候需要用到這個文件里的內(nèi)容。
4、準備View
準備view,在app\views下面新建文件Register.html,關鍵內(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}} …
一點一點解釋一下上面藍色部分關鍵字的含義。
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類型的參數(shù),所以,使用{{with $field := field “user.Email”}}就可以通知revel將form的參數(shù)封裝到user結構中再傳遞給PostRegister。
我們都知道用戶注冊的時候填寫的值是需要做有效性檢驗的,當用戶填寫的值不符合標準時需要出現(xiàn)錯誤提示,通常來說會是下面這樣
$field.ErrorClass的作用就是當這個參數(shù)出現(xiàn)錯誤的時候可以方便的通過添加class的方式在頁面上顯示錯誤狀態(tài)。ErrorClass的值可以通過下面的代碼修改。
revel.ERROR_CLASS = "error"
$field.Id和$field.Name就不解釋了,大家待會兒打開瀏覽器中看看生成的源代碼就明白了。
$field.Flash這里就需要解釋一下Flash的概念了。
Flash是一個字典,適用于在兩個Request中間傳遞數(shù)據(jù),數(shù)據(jù)存儲在cookie中。
大家都知道,HTTP協(xié)議本身是無狀態(tài)的,所以,考慮一下這個用例,用戶在注冊的時候輸入了一個無效的email地址,點擊注冊之后頁面刷新了一下,“電子郵件”下面出現(xiàn)一行紅字“你輸入的Email地址無效”,此刻文本框里面需要出現(xiàn)上次用戶輸入的值。那么,$field.Flash就是在Flash里去找以$field.Name為Key的值。
$field.Error就是在Flash里找以$field.Name_error為Key的值,也就是上圖中紅色的“密碼必須大于等于6位”這個錯誤信息。
好了,現(xiàn)在大家就按照這個節(jié)奏在view中添加“昵稱”,“密碼”和“確認密碼”吧。
添加完成之后就去訪問http://127.0.0.1/register看看吧。是不是這樣呢?
revel會通過Controller.Action的名稱去查找同名的view文件,例如,Register方法對應的就是Register.html。這里需要注意的一點是,revel是通過反射去查找Controller.Render方法的調(diào)用者,而且只向上查找一層。
例如,下面這段代碼是不能工作的。
func (c *Account) someMethod() revel.Result { ... return c.Render() } func (c *Account) Register() revel.Result { return c.someMethod() }
5. 實現(xiàn)Controller
現(xiàn)在讓我們?yōu)镻ostRegister添加處理注冊的邏輯。
首先,驗證參數(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機制,上面的代碼應該不需要太多解釋,只有一行
c.FlashParams()
它的作用就是把form提交的參數(shù)原樣存入Flash中,還記得剛才的$field.Flash嗎?
現(xiàn)在去玩玩注冊頁面吧,填寫一些錯誤的值看看反應吧,嗯,你應該很快就會發(fā)現(xiàn),錯誤信息雖然已經(jīng)顯示出來,但可惜卻是英文的,修改一下吧。
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提供了好幾個常用的驗證方法,大家可以自己看看,應該是簡單易懂的。
繼續(xù),當所有參數(shù)檢查都通過之后,就調(diào)用dal.RegisterUser方法將用戶信息存入數(shù)據(jù)庫。
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中添加相應的東西。
至此,用戶注冊已經(jīng)完成。不知道大家注意到?jīng)]有,就算修改go代碼,依然不需要重新啟動revel,直接刷新瀏覽器頁面就會發(fā)現(xiàn)新的代碼已經(jīng)自動編譯并且啟用了。
關于golang用revel框架實現(xiàn)用戶注冊的方法就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
網(wǎng)頁標題:golang用revel框架實現(xiàn)用戶注冊的方法-創(chuàng)新互聯(lián)
標題路徑:http://jinyejixie.com/article44/ccphhe.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設、自適應網(wǎng)站、網(wǎng)站改版、網(wǎng)站建設、網(wǎng)站營銷、App設計
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容