這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
1.設計歸檔頁面
首先在開始之前,我要說一下,有的同學在做的時候可能發現import的時候,一會是"MyTest/app/models",一會是"GBlog/app/models" 這是我的錯,沒有說明,我自己完成的是GBlog項目,現在做的教程是拿MyTest這個給大家做的,所以把前面改成你的項目名稱就行,不用跟我這一樣。為什麼要特別說一下呢,我怕有些同學,做的時候出了錯,而找不到原因,自己明明跟著教程做的為什麼是錯的呢。這樣可能打擊他的興趣。所以這裡說明一下。本來我想回去都改一下的,畢竟也花不了多久時間,但是畢竟有些問題還是需要大家自己解決的,所以才在這裡說明。
好下面我們來做歸檔頁面,在views/App下建立History.html,內容:
{{set . "title" "History blogs - GBlog"}}{{set . "history" "active" }}{{template "header.html" .}}<div class="content"> <div class="history-nav" id="his"> <div class="history-title"> 部落格歸檔 </div> <div class="history-cell"> <div class="panel-heading" style="padding:0;border-bottom: 1px dashed #ccc;"> <a data-toggle="collapse" data-toggle="collapse" data-parent="#his" href="#collapseOne">2014</a> </div> <div id="collapseOne" class="panel-collapse collapse in"> <div class="panel-body" style="padding:0 20px;"> <ul style="padding:10px 10px;list-style:none;"> <li><time>2014-04-01</time><a href="#">Abourt the blog</a><span class="history-auth">By jov</span></li> </ul> </div> </div> </div> </div></div>{{template "footer.html" .}}
在controllers/app.go添加方法:
func (c App) History() revel.Result {return c.Render()}
好,下面添加我們的路由,conf/routes:
GET /history App.History
看一下效果:
下面我們來實現它,在models裡面建立history.go 內容:
package modelsimport ("github.com/revel/revel""labix.org/v2/mgo/bson""time")type History struct {Year intBlogs []Blog}func (dao *Dao) InsertHistory(history *History) error {historyCollection := dao.session.DB(DbName).C(HistoryCollection)err := historyCollection.Insert(history)if err != nil {revel.WARN.Printf("Unable to save History: %v error %v", history, err)}return err}func (dao *Dao) FindHistory() []History{historyCollection := dao.session.DB(DbName).C(HistoryCollection)his := []History{}query := historyCollection.Find(bson.M{}).Sort("-year")query.All(&his)return his}func (dao *Dao) RemoveAll() error{historyCollection := dao.session.DB(DbName).C(HistoryCollection)_,err := historyCollection.RemoveAll(bson.M{})if err != nil {revel.WARN.Printf("Unable to RemoveAll: error %v", err)}return err}func (dao *Dao) CreateAllHistory() {dao.RemoveAll();var end int = time.Now().Year();for i:=BaseYear;i<=end;i++{history := new(History);history.Year = i;dao.InsertHistory(history);}}
這個model只有兩個屬性,但是儲存到db中的只有year屬性,看一下最後的方法,我們以BaseYear為基礎,判斷當前年與baseyear之間的差,然後做歸檔。
好,在controllers/app.go的History方法中,做如下修改:
func (c App) History() revel.Result {dao, err := models.NewDao()if err != nil {c.Response.Status = 500return c.RenderError(err)}defer dao.Close()dao.CreateAllHistory();historys := dao.FindHistory();for i,_ := range historys{historys[i].Blogs =dao.FindBlogsByYear(historys[i].Year);}return c.Render(historys)}
這裡又多了一個方法,按年查詢blog,下面我們在models/blog.go中添加方法:
func (dao *Dao) FindBlogsByYear(year int) []Blog{blogCollection := dao.session.DB(DbName).C(BlogCollection)blogs := []Blog{}query := blogCollection.Find(bson.M{"year":year}).Sort("-cdate")query.All(&blogs)return blogs}
好的,修改我們的頁面,views/App/History.html:
{{set . "title" "History blogs - GBlog"}}{{set . "history" "active" }}{{template "header.html" .}}<div class="content"> <div class="history-nav" id="his"> <div class="history-title"> 部落格歸檔 </div> {{if .historys}} {{range $index,$history :=.historys}} <div class="history-cell"> <div class="panel-heading" style="padding:0;border-bottom: 1px dashed #ccc;"> <a data-toggle="collapse" data-toggle="collapse" data-parent="#his" href="#collapseOne{{$index}}">{{$history.Year}}</a> </div> <div id="collapseOne{{$index}}" class="panel-collapse collapse in"> <div class="panel-body" style="padding:0 20px;"> <ul style="padding:10px 10px;list-style:none;"> {{if $history.Blogs }} {{range $blog :=$history.Blogs}} <li><time>{{$blog.CDate.Format "2006-01-02"}}</time><a href="#">{{$blog.GetShortTitle }}</a><span class="history-auth">By {{$blog.Email}}</span></li> {{end}} {{end}} </ul> </div> </div> </div> {{end}} {{end}} </div></div>{{template "footer.html" .}}
好了,ok,來看看結果:
你是否已經ok了呢?
源碼地址:https://github.com/joveth/GBlog
交流QQ:158325682