update: category

This commit is contained in:
ctwj
2025-07-16 08:29:49 +08:00
parent f9b096c867
commit 22d264d0a4
9 changed files with 1159 additions and 25 deletions

View File

@@ -32,9 +32,10 @@ func ToResourceResponse(resource *entity.Resource) dto.ResourceResponse {
response.Tags = make([]dto.TagResponse, len(resource.Tags))
for i, tag := range resource.Tags {
response.Tags[i] = dto.TagResponse{
ID: tag.ID,
Name: tag.Name,
Description: tag.Description,
ID: tag.ID,
Name: tag.Name,
Description: tag.Description,
ResourceCount: 0, // 在资源上下文中,标签的资源数量不相关
}
}
@@ -71,19 +72,21 @@ func ToCategoryResponseList(categories []entity.Category, resourceCounts map[uin
}
// ToTagResponse 将Tag实体转换为TagResponse
func ToTagResponse(tag *entity.Tag) dto.TagResponse {
func ToTagResponse(tag *entity.Tag, resourceCount int64) dto.TagResponse {
return dto.TagResponse{
ID: tag.ID,
Name: tag.Name,
Description: tag.Description,
ID: tag.ID,
Name: tag.Name,
Description: tag.Description,
ResourceCount: resourceCount,
}
}
// ToTagResponseList 将Tag实体列表转换为TagResponse列表
func ToTagResponseList(tags []entity.Tag) []dto.TagResponse {
func ToTagResponseList(tags []entity.Tag, resourceCounts map[uint]int64) []dto.TagResponse {
responses := make([]dto.TagResponse, len(tags))
for i, tag := range tags {
responses[i] = ToTagResponse(&tag)
count := resourceCounts[tag.ID]
responses[i] = ToTagResponse(&tag, count)
}
return responses
}

View File

@@ -39,9 +39,10 @@ type CategoryResponse struct {
// TagResponse 标签响应
type TagResponse struct {
ID uint `json:"id"`
Name string `json:"name"`
Description string `json:"description"`
ID uint `json:"id"`
Name string `json:"name"`
Description string `json:"description"`
ResourceCount int64 `json:"resource_count"`
}
// PanResponse 平台响应

View File

@@ -12,6 +12,8 @@ type CategoryRepository interface {
FindByName(name string) (*entity.Category, error)
FindWithResources() ([]entity.Category, error)
GetResourceCount(categoryID uint) (int64, error)
FindWithPagination(page, pageSize int) ([]entity.Category, int64, error)
Search(query string, page, pageSize int) ([]entity.Category, int64, error)
}
// CategoryRepositoryImpl Category的Repository实现
@@ -49,3 +51,49 @@ func (r *CategoryRepositoryImpl) GetResourceCount(categoryID uint) (int64, error
err := r.db.Model(&entity.Resource{}).Where("category_id = ?", categoryID).Count(&count).Error
return count, err
}
// FindWithPagination 分页查询分类
func (r *CategoryRepositoryImpl) FindWithPagination(page, pageSize int) ([]entity.Category, int64, error) {
var categories []entity.Category
var total int64
// 获取总数
err := r.db.Model(&entity.Category{}).Count(&total).Error
if err != nil {
return nil, 0, err
}
// 分页查询
offset := (page - 1) * pageSize
err = r.db.Offset(offset).Limit(pageSize).Order("created_at DESC").Find(&categories).Error
if err != nil {
return nil, 0, err
}
return categories, total, nil
}
// Search 搜索分类
func (r *CategoryRepositoryImpl) Search(query string, page, pageSize int) ([]entity.Category, int64, error) {
var categories []entity.Category
var total int64
// 构建搜索条件
searchQuery := "%" + query + "%"
// 获取总数
err := r.db.Model(&entity.Category{}).Where("name ILIKE ? OR description ILIKE ?", searchQuery, searchQuery).Count(&total).Error
if err != nil {
return nil, 0, err
}
// 分页搜索
offset := (page - 1) * pageSize
err = r.db.Where("name ILIKE ? OR description ILIKE ?", searchQuery, searchQuery).
Offset(offset).Limit(pageSize).Order("created_at DESC").Find(&categories).Error
if err != nil {
return nil, 0, err
}
return categories, total, nil
}

View File

@@ -13,6 +13,8 @@ type TagRepository interface {
FindWithResources() ([]entity.Tag, error)
GetResourceCount(tagID uint) (int64, error)
FindByResourceID(resourceID uint) ([]entity.Tag, error)
FindWithPagination(page, pageSize int) ([]entity.Tag, int64, error)
Search(query string, page, pageSize int) ([]entity.Tag, int64, error)
}
// TagRepositoryImpl Tag的Repository实现
@@ -58,3 +60,49 @@ func (r *TagRepositoryImpl) FindByResourceID(resourceID uint) ([]entity.Tag, err
Where("resource_tags.resource_id = ?", resourceID).Find(&tags).Error
return tags, err
}
// FindWithPagination 分页查询标签
func (r *TagRepositoryImpl) FindWithPagination(page, pageSize int) ([]entity.Tag, int64, error) {
var tags []entity.Tag
var total int64
// 获取总数
err := r.db.Model(&entity.Tag{}).Count(&total).Error
if err != nil {
return nil, 0, err
}
// 分页查询
offset := (page - 1) * pageSize
err = r.db.Offset(offset).Limit(pageSize).Order("created_at DESC").Find(&tags).Error
if err != nil {
return nil, 0, err
}
return tags, total, nil
}
// Search 搜索标签
func (r *TagRepositoryImpl) Search(query string, page, pageSize int) ([]entity.Tag, int64, error) {
var tags []entity.Tag
var total int64
// 构建搜索条件
searchQuery := "%" + query + "%"
// 获取总数
err := r.db.Model(&entity.Tag{}).Where("name ILIKE ? OR description ILIKE ?", searchQuery, searchQuery).Count(&total).Error
if err != nil {
return nil, 0, err
}
// 分页搜索
offset := (page - 1) * pageSize
err = r.db.Where("name ILIKE ? OR description ILIKE ?", searchQuery, searchQuery).
Offset(offset).Limit(pageSize).Order("created_at DESC").Find(&tags).Error
if err != nil {
return nil, 0, err
}
return tags, total, nil
}