Files
nl-blogs/server/repositories/template_repository.go
2026-08-24 13:06:04 +08:00

146 lines
4.0 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package repositories
import (
"errors"
"time"
"github.com/niangaodev/art-code/config"
"github.com/niangaodev/art-code/models"
)
// 内置模板 slug保留字自定义上传不可占用
const (
BuiltinTemplateClassic = "classic"
BuiltinTemplateTerminal = "ubuntu-terminal"
BuiltinTemplatePixel = "pixel"
BuiltinTemplateMagazine = "magazine"
BuiltinTemplateNewspaper = "newspaper"
BuiltinTemplateBento = "bento"
BuiltinTemplateGlass = "glass"
BuiltinTemplateRetro = "retro"
BuiltinTemplateGuofeng = "guofeng"
DefaultSiteTemplateSlug = "classic"
TemplateTypeBuiltin = "builtin"
TemplateTypeCustom = "custom"
SettingKeySiteTemplate = "site_template"
)
var ErrTemplateSystemDelete = errors.New("system template cannot be deleted")
var ErrTemplateInUse = errors.New("template is currently active and cannot be deleted")
// GetActiveTemplates 获取所有启用模板(公开)
func GetActiveTemplates() ([]models.Template, error) {
var list []models.Template
err := config.DB.Model(&models.Template{}).
Where("deleted_at = ? AND is_active = ?", 0, true).
Order("sort_order ASC, id ASC").
Find(&list).Error
return list, err
}
// GetAllTemplates 获取全部模板(后台)
func GetAllTemplates() ([]models.Template, error) {
var list []models.Template
err := config.DB.Model(&models.Template{}).
Where("deleted_at = ?", 0).
Order("sort_order ASC, id ASC").
Find(&list).Error
return list, err
}
// GetTemplateByID 按 ID 获取模板
func GetTemplateByID(id uint) (*models.Template, error) {
var t models.Template
err := config.DB.Model(&models.Template{}).
Where("id = ? AND deleted_at = ?", id, 0).
First(&t).Error
if err != nil {
return nil, err
}
return &t, nil
}
// GetTemplateBySlug 按 slug 获取模板(含未启用,内部使用)
func GetTemplateBySlug(slug string) (*models.Template, error) {
var t models.Template
err := config.DB.Model(&models.Template{}).
Where("slug = ? AND deleted_at = ?", slug, 0).
First(&t).Error
if err != nil {
return nil, err
}
return &t, nil
}
// GetActiveTemplateBySlug 按 slug 获取启用模板(公开接口,未启用返回 404
func GetActiveTemplateBySlug(slug string) (*models.Template, error) {
var t models.Template
err := config.DB.Model(&models.Template{}).
Where("slug = ? AND deleted_at = ? AND is_active = ?", slug, 0, true).
First(&t).Error
if err != nil {
return nil, err
}
return &t, nil
}
// CreateTemplate 创建模板
func CreateTemplate(t *models.Template) error {
return config.DB.Create(t).Error
}
// UpdateTemplate 更新模板基础信息
func UpdateTemplate(t *models.Template) error {
return config.DB.Model(&models.Template{}).
Where("id = ? AND deleted_at = ?", t.ID, 0).
Updates(map[string]interface{}{
"name": t.Name,
"description": t.Description,
"is_active": t.IsActive,
"updated_at": time.Now().Unix(),
}).Error
}
// DeleteTemplate 物理删除自定义模板(内置模板禁止删除)
func DeleteTemplate(id uint) error {
t, err := GetTemplateByID(id)
if err != nil {
return err
}
if t.IsSystem {
return ErrTemplateSystemDelete
}
if t.Slug == GetCurrentSiteTemplateSlug() {
return ErrTemplateInUse
}
return config.DB.Model(&models.Template{}).
Where("id = ?", id).
Delete(&models.Template{}).Error
}
// GetCurrentSiteTemplateSlug 读取当前启用的站点模板 slug缺省 classic
func GetCurrentSiteTemplateSlug() string {
s, err := GetSettingByKey(SettingKeySiteTemplate)
if err != nil || s == nil || s.Value == "" {
return DefaultSiteTemplateSlug
}
return s.Value
}
// ActivateTemplate 将模板设为站点当前模板
func ActivateTemplate(slug string) error {
s, err := GetSettingByKey(SettingKeySiteTemplate)
if err != nil {
return err
}
if s == nil {
return CreateSetting(&models.Setting{
KeyName: SettingKeySiteTemplate,
Value: slug,
Description: "当前启用的前端页面模板 slug",
})
}
s.Value = slug
return UpdateSetting(s)
}