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] }