Go 原生开发博客项目系列(第四篇)

177 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第10天,点击查看活动详情

项目原视频地址:www.bilibili.com/video/BV1VS…

文章列表查询

因为会有很多的文章,所以需要做分页处理。

page:页码。pageSize:每页的数量。

DB.Query("select * from post limit ?,?", page, pageSize)

e-book-website/databases/post.go

func GetPostPage(page, pageSize int) []models.Post {
   page = (page - 1) * pageSize
   rows, err := DB.Query("select * from post limit ?,?", page, pageSize)
   if err != nil {
      return nil
   }
   var posts []models.Post
   for rows.Next() {
      var post models.Post
      err := rows.Scan(
         &post.Pid,
         &post.Title,
         &post.Content,
         &post.Markdown,
         &post.CategoryId,
         &post.UserId,
         &post.ViewCount,
         &post.Type,
         &post.Slug,
         &post.CreateAt,
         &post.UpdateAt,
      )
      if err != nil {
         return nil
      }
      posts = append(posts, post)
   }
   return posts
}

service 层调用 databases.GetPostPage(page, pageSize),获取数据库中的信息。赋值给 PostMore

PostMore 数据结构中有 CategoryNameUserNameGetPostPage 这个中不存在的。因此我们需要使用其他的 select 语句获取。

categoryName := databases.GetCategoryNameById(post.CategoryId)

e-book-website/databases/post.go

func GetCategoryNameById(cId int) string {
   row := DB.QueryRow("select name from blog_category where cid=?", cId)
   if row.Err() != nil {
      log.Println(row.Err())
   }
   var categoryName string
   _ = row.Scan(&categoryName)
   return categoryName
}

e-book-website/databases/user.go

package databases

import (
   "log"
)

func GetUserNameById(userId int) string {
   row := DB.QueryRow("select user_name from user where uid=?", userId)
   if row.Err() != nil {
      log.Println(row.Err())
   }
   var userName string
   _ = row.Scan(&userName)
   return userName
}

e-book-website/service/index.go

package service

import (
   "blog-go/config"
   "blog-go/databases"
   "blog-go/models"
   "fmt"
   "html/template"
)

func GetAllIndexInfo(page, pageSize int) (*models.HomeResponse, error) {
   categorys, err := databases.GetAllCategory()
   if err != nil {
      return nil, err
   }
   posts := databases.GetPostPage(page, pageSize)
   var postMores []models.PostMore
   for _, post := range posts {
      categoryName := databases.GetCategoryNameById(post.CategoryId)
      userName := databases.GetUserNameById(post.UserId)
      content := []rune(post.Content)
      if len(content) > 100 {
         content = content[0:100]
      }
      postMore := models.PostMore{
         post.Pid,
         post.Title,
         post.Slug,
         template.HTML(content),
         post.CategoryId,
         categoryName,
         post.UserId,
         userName,
         post.ViewCount,
         post.Type,
         models.DateDay(post.CreateAt),
         models.DateDay(post.UpdateAt),
      }
      postMores = append(postMores, postMore)
   }
   fmt.Print("postMores", postMores)
   if err != nil {
      return nil, err
   }
   var data = &models.HomeResponse{
      config.Cfg.Viewer,
      categorys,
      postMores,
      1,
      1,
      []int{1},
      true,
   }
   return data, nil
}

刷新页面,就可以看到数据中的数据了。

图片.png

获取文章的总数,只有知道了文章的总数,才可以计算出分页的数量。

e-book-website/databases/post.go

func CountGetAllPost() (count int) {
   rows := DB.QueryRow("select count(1) from post")
   _ = rows.Scan(&count)
   return
}
func GetAllIndexInfo(page, pageSize int) (*models.HomeResponse, error) {
   // ...
   total := databases.CountGetAllPost()
   pagesCount := (total-1)/10 + 1
   var pages []int
   for i := 0; i < pagesCount; i++ {
      pages = append(pages, i+1)
   }
   var data = &models.HomeResponse{
      config.Cfg.Viewer,
      categorys,
      postMores,
      total,
      page,
      pages,
      page != pagesCount,
   }
   return data, nil
}

重启项目,即可看到页面的样式出现

图片.png