【小雞創(chuàng)作】beego開發(fā)輕博客
本章目標(biāo):添加“首頁文章列表”和“文章查詢”功能
github: 打開后轮傍,點(diǎn)擊右上角star按鈕
視頻教程: B站地址
文章列表功能
1. 功能分析
首頁的路由對(duì)應(yīng)的控制器邏輯是在controllers->index.go中的Get方法里面崇呵,我們需要抓到文章的數(shù)據(jù)就必須將查數(shù)據(jù)庫的邏輯放到controllers->index.go中的Get方法里面。
首頁文章列表功能,有分頁邏輯姐霍。查文章數(shù)據(jù)的時(shí)候,我們得知道查的是第幾頁的數(shù)據(jù),需要得到多少行數(shù)據(jù)珊泳。因此我們?cè)O(shè)定:頁面?zhèn)鲄ⅰ皃age”代表第幾頁,我們默認(rèn)每頁顯示10行數(shù)據(jù)拷沸。同時(shí)色查,頁面需要拿到當(dāng)前頁、總頁數(shù)來控制“上一頁”和“下一頁”撞芍。為了得到總頁數(shù)秧了,我們還需要知道文章的總數(shù)量,再與每頁顯示數(shù)據(jù)做運(yùn)算得到總頁數(shù)序无。
2.數(shù)據(jù)庫邏輯調(diào)整
2.1 添加數(shù)據(jù)庫查詢文章的功能
修改models->note.go文件 添加 更具當(dāng)前頁數(shù)和每頁顯示的行數(shù)得到文章數(shù)據(jù)的方法验毡,代碼如下:
func QueryNotesByPage(page,limit int) (note []*Note,err error) {
//Offset從第幾行開始,Limit:返回多少數(shù)據(jù)帝嗡。
return note,db.Offset((page-1)*limit).Limit(limit).Find(¬e).Error
}
2.2 添加數(shù)據(jù)庫查詢文章的總數(shù)量的功能,代碼如下:
func QueryNotesCount()(count int,err error) {
return count,db.Model(&Note{}).Count(&count).Error
}
3. 控制器邏輯調(diào)整
3.1修改 controllers->index.go中的Get方法晶通,代碼如下(請(qǐng)留意代碼中的注解,都是邏輯說明):
// @router / [get]
func (this *IndexController) Get() {
//每頁顯示10條數(shù)據(jù)
limit := 10
// 得到頁面?zhèn)鬟^來的參數(shù)哟玷,沒有就默認(rèn)為1
page, err := this.GetInt("page", 1)
if err != nil || page <= 0 {
page = 1
}
//根據(jù) 當(dāng)前頁 和 每頁顯示的行數(shù) 得到文章列表數(shù)據(jù)集
notes, err := models.QueryNotesByPage(page, limit)
if err != nil {
this.Abort500(err)
}
//將數(shù)據(jù)傳到模版頁面index.html狮辽,等待渲染
this.Data["notes"] = notes
//得到文章的總行數(shù)
count, err := models.QueryNotesCount()
if err != nil {
this.Abort500(err)
}
//這兒計(jì)算總頁數(shù),如果“文章的總數(shù)量”不是“每頁顯示的行數(shù)”的倍數(shù)巢寡,就要多顯示一頁
totpage := count / limit
if count%limit != 0 {
//取余數(shù)喉脖,不為0。那就要多加一頁顯示這些數(shù)據(jù)
totpage = totpage + 1
}
// 將總頁數(shù) 當(dāng)前頁 傳到模版頁面讼渊。等待渲染
this.Data["totpage"] = totpage
this.Data["page"] = page
this.TplName = "index.html"
}
4. 前臺(tái)頁面調(diào)整
4.1. 修改views->index.html頁面动看,我們添加顯示文章的邏輯。將原來頁面中的重復(fù)顯示的代碼:
<div class="item">
<div class="item-box layer-photos-demo1 layer-photos-demo">
...
</div>
</div>
改成如下代碼:
{{ range .notes}}
<div class="item">
<div class="item-box layer-photos-demo1 layer-photos-demo">
<h3><a href="details.html">{{.Title}}</a></h3>
<h5>發(fā)布于:<span>{{date .UpdatedAt "Y-m-d H:i:s"}}</span></h5>
<p>{{.Summary}}</p>
</div>
<div class="comment count">
<a href="details.html#comment">評(píng)論</a>
<a href="javascript:;" class="like">點(diǎn)贊</a>
</div>
</div>
{{end}}
4.2 我們?yōu)榱藢?shí)現(xiàn)上一頁和下一頁的功能爪幻,我們需要對(duì)當(dāng)前頁進(jìn)行加一和減一操作菱皆,因此我們需要添加模版方法须误,方便運(yùn)算。修改main.go->initTemplate方法仇轻,代碼如下:
func initTemplate() {
....
beego.AddFuncMap("add", func(x, y int) int {
return x+y
})
}
4.3 我們繼續(xù)修改views-index.html 添加上一頁和下一頁的功能京痢,代碼如下
<div class="item-btn">
{{ if gt .page 1 }}
<button class="layui-btn layui-btn-normal"
onclick="window.location.href='/?page={{add .page -1}}'"
>上一頁</button>
{{end}}
{{if lt .page .totpage}}
<button class="layui-btn layui-btn-normal"
onclick="window.location.href='/?page={{add .page 1}}'"
>下一頁</button>
{{end}}
</div>
文章列表功能 已經(jīng)完成。
文章查詢功能
1. 功能分析
文章查詢功能篷店,我們還是需要修改首頁的路由對(duì)應(yīng)的控制邏輯controllers->index.go中的Get方法祭椰,頁面?zhèn)鱰itle參數(shù)到后臺(tái),后臺(tái)根據(jù)title進(jìn)行模糊查詢疲陕,因此我們需要繼續(xù)修改“文章列表功能”方淤。
2. 數(shù)據(jù)庫邏輯調(diào)整
2.1 修改數(shù)據(jù)庫查詢文章的功能,添加模糊匹配title字段
修改models->note.go文件蹄殃,代碼如下:
func QueryNotesByPage(title string ,page,limit int) (note []*Note,err error) {
// 模糊匹配 title字段
//.Where("title like ? ",fmt.Sprintf("%%%s%%",title))
return note,db.Where("title like ? ",fmt.Sprintf("%%%s%%",title)).Offset((page-1)*limit).Limit(limit).Find(¬e).Error
}
2.1 同理携茂,我們也要修改數(shù)據(jù)庫查詢文章的總數(shù)量的功能
修改models->note.go文件,代碼如下:
func QueryNotesCount(title string)(count int,err error) {
//同QueryNotesByPage的修改一致
return count,db.Model(&Note{}).Where("title like ? ",fmt.Sprintf("%%%s%%",title)).Count(&count).Error
}
3. 控制器邏輯調(diào)整
3.1 繼續(xù)修改 controllers->index.go中的Get方法:
// @router / [get]
func (this *IndexController) Get() {
...
title := this.GetString("title")
//根據(jù) 當(dāng)前頁 和 每頁顯示的行數(shù) 得到文章列表數(shù)據(jù)集
notes, err := models.QueryNotesByPage(title,page, limit)
...
//得到文章的總行數(shù)
count, err := models.QueryNotesCount(title)
...
this.Data["title"] = title
this.TplName = "index.html"
}
4. 前臺(tái)頁面調(diào)整
4.1. 修改views->index.html頁面诅岩,在“上一頁”和“下一頁”的功能中讳苦,跳轉(zhuǎn)的鏈接添加帶上title字段,代碼如下:
<!--請(qǐng)注意吩谦,onclick里面多了 &title={{.title}} -->
<div class="item-btn">
{{ if gt .page 1 }}
<button class="layui-btn layui-btn-normal"
onclick="window.location.href='/?page={{add .page -1}}&title={{.title}}'"
>上一頁</button>
{{end}}
{{if lt .page .totpage}}
<button class="layui-btn layui-btn-normal"
onclick="window.location.href='/?page={{add .page 1}}&title={{.title}}'"
>下一頁</button>
{{end}}
</div>
文章查詢的功能已經(jīng)實(shí)現(xiàn)
貼個(gè)頁面效果圖