分类:Model/Repo/Service/Controller + 管理后台树形页面 + 首页导航栏
标签:Model/Repo/Service/Controller + /tags/{slug} 落地页 + 写文章页输入
Post 加 CategoryID,Create/Update 支持分类和标签
SQL 迁移含 categories/tags/post_tags 表及预设未分类
64 lines
1.5 KiB
Go
64 lines
1.5 KiB
Go
package repository
|
|
|
|
import (
|
|
"metazone.cc/mce/internal/model"
|
|
"metazone.cc/mce/internal/service"
|
|
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
// CategoryRepo 分类数据访问
|
|
type CategoryRepo struct {
|
|
db *gorm.DB
|
|
}
|
|
|
|
// NewCategoryRepo 构造函数
|
|
func NewCategoryRepo(db *gorm.DB) *CategoryRepo {
|
|
return &CategoryRepo{db: db}
|
|
}
|
|
|
|
// WithTx 基于事务创建新实例
|
|
func (r *CategoryRepo) WithTx(tx *gorm.DB) service.CategoryStore {
|
|
return &CategoryRepo{db: tx}
|
|
}
|
|
|
|
// Create 创建分类
|
|
func (r *CategoryRepo) Create(c *model.Category) error {
|
|
return r.db.Create(c).Error
|
|
}
|
|
|
|
// Update 更新分类
|
|
func (r *CategoryRepo) Update(c *model.Category) error {
|
|
return r.db.Save(c).Error
|
|
}
|
|
|
|
// Delete 删除分类
|
|
func (r *CategoryRepo) Delete(id uint) error {
|
|
return r.db.Delete(&model.Category{}, id).Error
|
|
}
|
|
|
|
// FindByID 按 ID 查询
|
|
func (r *CategoryRepo) FindByID(id uint) (*model.Category, error) {
|
|
var c model.Category
|
|
err := r.db.First(&c, id).Error
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &c, nil
|
|
}
|
|
|
|
// ListAll 查询全部分类(按 sort 排序)
|
|
func (r *CategoryRepo) ListAll() ([]model.Category, error) {
|
|
var list []model.Category
|
|
err := r.db.Order("sort ASC, id ASC").Find(&list).Error
|
|
return list, err
|
|
}
|
|
|
|
// GetLeaves 查询所有叶子分类(有子分类的父节点不返回)
|
|
func (r *CategoryRepo) GetLeaves() ([]model.Category, error) {
|
|
var leaves []model.Category
|
|
err := r.db.Where("id NOT IN (SELECT DISTINCT parent_id FROM categories WHERE parent_id IS NOT NULL)").
|
|
Order("sort ASC, id ASC").Find(&leaves).Error
|
|
return leaves, err
|
|
}
|