package models import ( "time" "gorm.io/gorm" ) // Template 前端页面模板(内置 / 自定义布局包) type Template struct { ID uint `json:"id" gorm:"primaryKey;column:id"` Slug string `json:"slug" gorm:"column:slug;uniqueIndex"` Name string `json:"name" gorm:"column:name"` Type string `json:"type" gorm:"column:type"` // builtin | custom Description string `json:"description" gorm:"column:description;type:text"` Manifest string `json:"-" gorm:"column:manifest;type:longtext"` // 解析后的 manifest.json(DB 冗余,避免读盘) LayoutJSON string `json:"-" gorm:"column:layout_json;type:longtext"` // 解析后的 layout.json(仅 custom) SkinCSSPath string `json:"skinCssPath" gorm:"column:skin_css_path;type:varchar(500)"` // 皮肤 CSS 相对路径 /uploads/templates/{slug}/skin.css IsSystem bool `json:"isSystem" gorm:"column:is_system;default:0"` IsActive bool `json:"isActive" gorm:"column:is_active;default:1"` SortOrder int `json:"sortOrder" gorm:"column:sort_order;default:0"` CreatedAt int64 `json:"createdAt" gorm:"column:created_at"` UpdatedAt int64 `json:"updatedAt" gorm:"column:updated_at"` DeletedAt int64 `json:"deletedAt" gorm:"column:deleted_at;default:0"` } func (Template) TableName() string { return "templates" } func (t *Template) BeforeCreate(tx *gorm.DB) error { now := time.Now().Unix() if t.CreatedAt == 0 { t.CreatedAt = now } if t.UpdatedAt == 0 { t.UpdatedAt = now } return nil } func (t *Template) BeforeUpdate(tx *gorm.DB) error { t.UpdatedAt = time.Now().Unix() return nil } // TemplateDescriptor 公开接口返回的模板描述(供自定义布局渲染引擎拉取) type TemplateDescriptor struct { Slug string `json:"slug"` Name string `json:"name"` Type string `json:"type"` Description string `json:"description"` Manifest interface{} `json:"manifest,omitempty"` Layout interface{} `json:"layout,omitempty"` SkinCssPath string `json:"skinCssPath,omitempty"` AssetsBase string `json:"assetsBase"` }