這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
示範地址 http://gblog-revel.herokuapp.com/
1.設計Email牆頁面
呀,什麼是email牆啊,這,博主,隨便扯了點東西把,不知到大家西部喜歡,先來做,後面看效果吧。
首先在views/App下建立Emails.html 內容:
{{set . "title" "Email list - GBlog"}}{{set . "ema" "active" }}{{template "header.html" .}}<div class="content"> <div class="email-nav" > <span class="email-tag"> <img src="http://www.gravatar.com/avatar/8b801bb6de1a876f7df749cedb8994a6?s=64" style="border-radius:32px"/> <span>jov123@163.com</span> </span> </div> </div> </div> </body></html>
其中,img的url裡面那一串,是博主自己的email加密後的串。後面會教大家怎麼做這個東西。
在controllers/app.go加入方法:
func (c App) Emails() revel.Result {return c.Render()}
conf/routes添加路由:
GET /email App.Emails
ok,看看效果:
好的,現在來實現它。
2.實現email牆
首先在models下建立email.go 內容:
package modelsimport ("github.com/revel/revel""labix.org/v2/mgo/bson""time""crypto/md5""io""fmt")type EmailObj struct{Email stringImgUrl stringCDate time.Time}func (dao *Dao) InsertEmail(emailObj *EmailObj) error {emailCollection := dao.session.DB(DbName).C(EmailCollection)emailObj.CDate = time.Now();h := md5.New()io.WriteString(h, emailObj.Email) emailObj.ImgUrl = fmt.Sprintf("%x", h.Sum(nil)) fmt.Println(emailObj)_,err := emailCollection.Upsert(bson.M{"email": emailObj.Email}, emailObj)if err != nil {revel.WARN.Printf("Unable to save EmailObj: %v error %v", emailObj, err)}return err}func (dao *Dao) FindAllEmails() []EmailObj{emailCollection := dao.session.DB(DbName).C(EmailCollection)emails := []EmailObj{}query := emailCollection.Find(bson.M{}).Sort("-cdate")query.All(&emails)return emails}
看一下,insert方法,裡面我們為url做了md5加密,這個是go內建的東西,只需要引入即可,我這來簡單的使用了一下。另外,我們的mgo的Upsert方法,以email為主,如果有這個email,我們就只做更新,如果沒人,就做插入,這個策略很不錯。
好,在controllers/app.go的Emails方法裡面添加:
func (c App) Emails() revel.Result {dao, err := models.NewDao()if err != nil {c.Response.Status = 500return c.RenderError(err)}defer dao.Close()emails :=dao.FindAllEmails();return c.Render(emails)}
將views/App/Emails.html最後修改為:
{{set . "title" "Email list - GBlog"}}{{set . "ema" "active" }}{{template "header.html" .}}<div class="content"> <div class="email-nav" > {{if .emails}} {{range $email:= .emails}} <span class="email-tag"> <img src="http://www.gravatar.com/avatar/{{$email.ImgUrl}}?s=64" style="border-radius:32px"/> <span title="last update at:{{$email.CDate.Format "2006-01-02 15:04"}}">{{$email.Email}}</span> </span> {{end}} {{end}} </div> </div> </div> </body></html>
恩,做完了嗎?當然沒有,我們這裡做了資料的讀取,卻沒有插入,怎麼辦呢,好,還記得我們controllers下的以w開頭的類嗎,這就是我們的入口。首先在wblog.go的Putup方法中,return之前新增內容:
newEmail := new(models.EmailObj);newEmail.Email = blog.Email;dao.InsertEmail(newEmail);
同樣在wcomment.go的Docomment方法中,return之前新增內容:
newEmail := new(models.EmailObj);newEmail.Email = comment.Email;dao.InsertEmail(newEmail);
同樣在wmessage.go的Putup方法中,return之前新增內容:
newEmail := new(models.EmailObj);newEmail.Email = message.Email;dao.InsertEmail(newEmail);
ok,這樣,不管是發blog還是評論,還是留言都會為我們增加email。來看看最後的效果:
nice,你做好了嗎?
源碼地址:https://github.com/joveth/GBlog
交流QQ:158325682