ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、视频、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
### 【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) ![gin_yunxing70](http://image.chaindesk.cn/gin_yunxing70.png/mark) 可以看到查询出web标签的三篇文章,重新输入网址:[http://127.0.0.1:8081?tag=socket](http://127.0.0.1:8081/?tag=socket) ![gin_yunxing71](http://image.chaindesk.cn/gin_yunxing71.png/mark) socket标签下的两篇文章也被查询出来了,下面我们输入以下页码:[http://127.0.0.1:8081?page=3](http://127.0.0.1:8081/?page=3) ![gin_yunxing72](http://image.chaindesk.cn/gin_yunxing72.png/mark)