【Go web开发之revel+mgo】第7章 实现归档

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 models
import (
	"github.com/revel/revel"
	"labix.org/v2/mgo/bson"
	"time"
)
type History struct {
	Year int
	Blogs []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 = 500
		return 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了呢?


交流QQ:158325682

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值