我们最初只是让首页显示第一页的文章数据,如果在访问首页的时候,后面传入相应的参数,那么我们应该根据参数显示对应的内容。
如果浏览器输入首页网址:http://127.0.0.1:8080/,那么我们显示第一页的文章数据
如果浏览器输入网址是:http://127.0.0.1:8080/?page=3,那么我们直接显示第三页的文章数据
如果浏览器输入网址是:http://127.0.0.1:8080/?tag=go,那么我们应该显示所有标签为go的文章,同理如果tag=web,我们应该显示所有标签为web的文章。
接下来我们就去改进首页的功能。
一、Controller
我们首先修改home_controller.go文件中的处理,修改代码如下:
package controllers
import (
"fmt"
"myblogweb/models"
)
type HomeController struct {
//beego.Controller
BaseController
}
func (this *HomeController) Get() {
tag := this.GetString("tag")
fmt.Println("tag:", tag)
page, _ := this.GetInt("page")
var artList []models.Article
if len(tag) > 0 {
//按照指定的标签搜索
artList, _ = models.QueryArticlesWithTag(tag)
this.Data["HasFooter"] = false
} else {
if page <= 0 {
page = 1
}
artList, _ = models.FindArticleWithPage(page)
this.Data["PageCode"] = models.ConfigHomeFooterPageCode(page)
this.Data["HasFooter"] = true
}
fmt.Println("IsLogin:", this.IsLogin, this.Loginuser)
this.Data["Content"] = models.MakeHomeBlocks(artList, this.IsLogin)
this.TplName = "home.html"
}
我们先接收tag的值和page的值:
那么有三种情况:
- 如果tag有值,page就不会有值。比如:http://127.0.0.1:8080/?pag=web
- 如果page有值,那么tag就不会有值。比如:http://127.0.0.1:8080/?page=3
- 就是用户直接访问首页,没有传入tag也没有传入page:http://127.0.0.1:8080
如果是第一种情况,那么我们应该按照tag进行搜索。如果是第二种情况就按照页数查询。如果是第三种就默认按照分页查询,只是查询第一页。
二、model
接下来我们去实现按照tag进行查询,这里有个复杂的地方,就是我们在写文章的手,标签可能有一个,也肯能有多个,如果是多个,我们是按照&连接的,比如:go&socket。那么在按照标签查询的时候,就要分为4种情况:
通过标签查询首页的数据
有四种情况
1.左右两边有&符和其他符号
2.左边有&符号和其他符号,同时右边没有任何符号
3.右边有&符号和其他符号,同时左边没有任何符号
4.左右两边都没有符号
通过%去匹配任意多个字符,至少是一个
我们在article_model.go文件中,添加一个方法:
//--------------按照标签查询--------------
func QueryArticlesWithTag(tag string) ([]Article, error) {
sql := " where tags like '%&" + tag + "&%'"
sql += " or tags like '%&" + tag + "'"
sql += " or tags like '" + tag + "&%'"
sql += " or tags like '" + tag + "'"
fmt.Println(sql)
return QueryArticlesWithCon(sql)
}
三、运行
前端页面不用修改,我们打开浏览器输入以下网址:http://127.0.0.1:8080?tag=web
可以看到查询出web标签的三篇文章,重新输入网址:http://127.0.0.1:8080?tag=http
socket标签下的两篇文章也被查询出来了,下面我们输入以下页码:http://127.0.0.1:8080?page=3