Files
scriptforge/backend/internal/model/models.go
zhilv 5414c9c865 feat: 分类/变体体系 + 用户认证 + 管理后台
- 运行时分类体系:Shell/Python/JavaScript/Ruby/PHP 各含变体
- 用户注册/登录(JWT + bcrypt),首个注册用户为管理员
- 管理后台 /admin 动态管理分类和变体
- 脚本市场支持按分类筛选
- CodeMirror 语言模式根据分类名称自动切换
- 结果页展示该分类下所有变体的运行命令
- source 命令变体用于 Shell 类继承环境变量

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-29 15:02:20 +08:00

76 lines
4.0 KiB
Go

package model
import "time"
type User struct {
ID uint `gorm:"primaryKey;autoIncrement"`
Username string `gorm:"uniqueIndex;size:32;not null"`
PasswordHash string `gorm:"size:128;not null"`
Email string `gorm:"size:128"`
Role string `gorm:"size:16;not null;default:user"`
GiteaID int `gorm:"uniqueIndex"`
CreatedAt time.Time `gorm:"autoCreateTime"`
}
type RuntimeCategory struct {
ID uint `gorm:"primaryKey;autoIncrement"`
Name string `gorm:"uniqueIndex;size:32;not null"`
Label string `gorm:"size:64;not null"`
Icon string `gorm:"size:8"`
SortOrder int `gorm:"default:0"`
Variants []RuntimeVariant `gorm:"foreignKey:CategoryID"`
}
type RuntimeVariant struct {
ID uint `gorm:"primaryKey;autoIncrement"`
CategoryID uint `gorm:"not null;index"`
Name string `gorm:"size:32;not null"`
Label string `gorm:"size:64;not null"`
Extension string `gorm:"size:8;not null"`
MIMEType string `gorm:"size:64;not null"`
CommandTemplate string `gorm:"size:128;not null"`
SourceTemplate string `gorm:"size:128"`
IsDefault bool `gorm:"default:false"`
SortOrder int `gorm:"default:0"`
}
type Script struct {
ID string `gorm:"primaryKey;size:8"`
Title string `gorm:"size:128;not null"`
Description string `gorm:"size:512"`
Content string `gorm:"type:text;not null"`
CategoryID uint `gorm:"not null;index"`
UserID uint `gorm:"index"`
AdminToken string `gorm:"size:64;not null"`
Status string `gorm:"size:16;not null;default:draft;index"`
ExpiresAt time.Time `gorm:"not null;index"`
CreatedAt time.Time `gorm:"not null;autoCreateTime"`
PublishedAt *time.Time `gorm:"index"`
}
// Default seed data
var DefaultCategories = []RuntimeCategory{
{Name: "shell", Label: "Shell 脚本", Icon: "🐚", SortOrder: 1},
{Name: "python", Label: "Python", Icon: "🐍", SortOrder: 2},
{Name: "javascript", Label: "JavaScript", Icon: "🟨", SortOrder: 3},
{Name: "ruby", Label: "Ruby", Icon: "💎", SortOrder: 4},
{Name: "php", Label: "PHP", Icon: "🐘", SortOrder: 5},
}
var DefaultVariants = []RuntimeVariant{
// Shell variants
{CategoryID: 1, Name: "bash", Label: "Bash", Extension: ".sh", MIMEType: "text/x-shellscript", CommandTemplate: "curl {url} | bash", SourceTemplate: "source <(curl {url})", IsDefault: true, SortOrder: 1},
{CategoryID: 1, Name: "zsh", Label: "Zsh", Extension: ".zsh", MIMEType: "text/x-shellscript", CommandTemplate: "curl {url} | zsh", SourceTemplate: "source <(curl {url})", SortOrder: 2},
{CategoryID: 1, Name: "sh", Label: "Sh", Extension: ".sh", MIMEType: "text/x-shellscript", CommandTemplate: "curl {url} | sh", SourceTemplate: ". <(curl {url})", SortOrder: 3},
{CategoryID: 1, Name: "fish", Label: "Fish", Extension: ".fish", MIMEType: "text/x-shellscript", CommandTemplate: "curl {url} | fish", SourceTemplate: "curl {url} | source", SortOrder: 4},
// Python variants
{CategoryID: 2, Name: "python3", Label: "Python 3", Extension: ".py", MIMEType: "text/x-python", CommandTemplate: "curl {url} | python3", IsDefault: true, SortOrder: 1},
{CategoryID: 2, Name: "python", Label: "Python", Extension: ".py", MIMEType: "text/x-python", CommandTemplate: "curl {url} | python", SortOrder: 2},
// JavaScript variants
{CategoryID: 3, Name: "node", Label: "Node.js", Extension: ".js", MIMEType: "text/javascript", CommandTemplate: "curl {url} | node", IsDefault: true, SortOrder: 1},
{CategoryID: 3, Name: "bun", Label: "Bun", Extension: ".js", MIMEType: "text/javascript", CommandTemplate: "curl {url} | bun", SortOrder: 2},
// Ruby variants
{CategoryID: 4, Name: "ruby", Label: "Ruby", Extension: ".rb", MIMEType: "text/x-ruby", CommandTemplate: "curl {url} | ruby", IsDefault: true, SortOrder: 1},
// PHP variants
{CategoryID: 5, Name: "php", Label: "PHP", Extension: ".php", MIMEType: "text/x-php", CommandTemplate: "curl {url} | php", IsDefault: true, SortOrder: 1},
}