Blog/models/category.go

78 lines
1.8 KiB
Go

package models
import (
"blog/config"
"sort"
"strings"
)
type Category struct {
Name string
Quantity int
Articles Articles
}
type Categories []Category
func GetCategoryName(path string) string {
var categoryName string
newPath := strings.Replace(path, config.Cfg.DocumentContentDir+"/", "", 1)
if strings.Index(newPath, "/") == -1 { //文件在根目录下(content/)没有分类名称
categoryName = "未分类"
} else {
categoryName = strings.Split(newPath, "/")[0]
}
return categoryName
}
// GroupByCategory 按类别对文章进行分组
func GroupByCategory(articles *Articles, articleQuantity int) Categories {
var categories Categories
categoryMap := make(map[string]Articles)
// 根据类别将文章分组
for _, article := range *articles {
_, existedCategory := categoryMap[article.Category]
if existedCategory {
categoryMap[article.Category] = append(categoryMap[article.Category], article)
} else {
categoryMap[article.Category] = Articles{article}
}
}
// 遍历类别映射,构建分类信息
for categoryName, articles := range categoryMap {
articleLen := len(articles)
var articleList Articles
// 根据指定数量截取文章列表
if articleQuantity <= 0 {
articleList = articles
} else {
if articleQuantity > articleLen {
articleList = articles[0:articleLen]
} else {
articleList = articles[0:articleQuantity]
}
}
// 添加分类信息到结果集
categories = append(categories, Category{
Name: categoryName,
Quantity: articleLen,
Articles: articleList,
})
}
// 对分类结果集进行排序
sort.Sort(categories)
return categories
}
func (c Categories) Len() int { return len(c) }
func (c Categories) Less(i, j int) bool { return c[i].Quantity > c[j].Quantity }
func (c Categories) Swap(i, j int) { c[i], c[j] = c[j], c[i] }