### 【GoWeb开发实战Gin框架】微博项目实战-首页功能扩展
# 首页功能
我们最初只是让首页显示第一页的文章数据,如果在访问首页的时候,后面传入相应的参数,那么我们应该根据参数显示对应的内容。
如果浏览器输入首页网址:[http://127.0.0.1:8081/,那么我们显示第一页的文章数据](http://127.0.0.1:8081/%EF%BC%8C%E9%82%A3%E4%B9%88%E6%88%91%E4%BB%AC%E6%98%BE%E7%A4%BA%E7%AC%AC%E4%B8%80%E9%A1%B5%E7%9A%84%E6%96%87%E7%AB%A0%E6%95%B0%E6%8D%AE)
如果浏览器输入网址是:[http://127.0.0.1:8081/?page=3,那么我们直接显示第三页的文章数据](http://127.0.0.1:8081/?page=3%EF%BC%8C%E9%82%A3%E4%B9%88%E6%88%91%E4%BB%AC%E7%9B%B4%E6%8E%A5%E6%98%BE%E7%A4%BA%E7%AC%AC%E4%B8%89%E9%A1%B5%E7%9A%84%E6%96%87%E7%AB%A0%E6%95%B0%E6%8D%AE)
如果浏览器输入网址是:[http://127.0.0.1:8081/?tag=go,那么我们应该显示所有标签为go的文章,同理如果tag=web,我们应该显示所有标签为web的文章](http://127.0.0.1:8081/?tag=go%EF%BC%8C%E9%82%A3%E4%B9%88%E6%88%91%E4%BB%AC%E5%BA%94%E8%AF%A5%E6%98%BE%E7%A4%BA%E6%89%80%E6%9C%89%E6%A0%87%E7%AD%BE%E4%B8%BAgo%E7%9A%84%E6%96%87%E7%AB%A0%EF%BC%8C%E5%90%8C%E7%90%86%E5%A6%82%E6%9E%9Ctag=web%EF%BC%8C%E6%88%91%E4%BB%AC%E5%BA%94%E8%AF%A5%E6%98%BE%E7%A4%BA%E6%89%80%E6%9C%89%E6%A0%87%E7%AD%BE%E4%B8%BAweb%E7%9A%84%E6%96%87%E7%AB%A0)。
接下来我们就去改进首页的功能。
## 一、Controller
我们首先修改home\_controller.go文件中的处理,修改代码如下:
~~~go
package controllers
import (
"github.com/gin-gonic/gin"
"net/http"
"blogweb_gin/models"
"strconv"
"fmt"
)
//可以通过翻页来获取该网页,也可以通过tag标签获取
//传page参数代表翻页,传tag参数代表标签
//首先判断page有值那么就是翻页,否则判断tag有值就是标签,否则就是默认的第一页
func HomeGet(c *gin.Context) {
//获取session,判断用户是否登录
islogin := GetSession(c)
tag := c.Query("tag")
fmt.Println("tag:", tag)
page, _ := strconv.Atoi(c.Query("page"))
var artList []models.Article
var hasFooter bool
if len(tag) > 0 {
//按照指定的标签搜索
artList, _ = models.QueryArticlesWithTag(tag)
hasFooter = false
} else {
if page <= 0 {
page = 1
}
artList, _ = models.FindArticleWithPage(page)
hasFooter = true
}
homeFooterPageCode := models.ConfigHomeFooterPageCode(page)
html := models.MakeHomeBlocks(artList, islogin)
c.HTML(http.StatusOK, "home.html", gin.H{"IsLogin": islogin, "Content": html, "HasFooter": hasFooter, "PageCode": homeFooterPageCode})
}
~~~
我们先接收tag的值和page的值:
那么有三种情况:
~~~
1. 如果tag有值,page就不会有值。比如:http://127.0.0.1:8081/?pag=web
2. 如果page有值,那么tag就不会有值。比如:http://127.0.0.1:8081/?page=3
3. 就是用户直接访问首页,没有传入tag也没有传入page:http://127.0.0.1:8081
~~~
如果是第一种情况,那么我们应该按照tag进行搜索。如果是第二种情况就按照页数查询。如果是第三种就默认按照分页查询,只是查询第一页。
## 二、model
接下来我们去实现按照tag进行查询,这里有个复杂的地方,就是我们在写文章的手,标签可能有一个,也肯能有多个,如果是多个,我们是按照&连接的,比如:go&socket。那么在按照标签查询的时候,就要分为4种情况:
~~~
通过标签查询首页的数据
有四种情况
1.左右两边有&符和其他符号
2.左边有&符号和其他符号,同时右边没有任何符号
3.右边有&符号和其他符号,同时左边没有任何符号
4.左右两边都没有符号
通过%去匹配任意多个字符,至少是一个
~~~
我们在article\_model.go文件中,添加一个方法:
~~~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:8081?tag=web](http://127.0.0.1:8081/?tag=web)

可以看到查询出web标签的三篇文章,重新输入网址:[http://127.0.0.1:8081?tag=socket](http://127.0.0.1:8081/?tag=socket)

socket标签下的两篇文章也被查询出来了,下面我们输入以下页码:[http://127.0.0.1:8081?page=3](http://127.0.0.1:8081/?page=3)
