feat: 分类/变体体系 + 用户认证 + 管理后台
- 运行时分类体系:Shell/Python/JavaScript/Ruby/PHP 各含变体 - 用户注册/登录(JWT + bcrypt),首个注册用户为管理员 - 管理后台 /admin 动态管理分类和变体 - 脚本市场支持按分类筛选 - CodeMirror 语言模式根据分类名称自动切换 - 结果页展示该分类下所有变体的运行命令 - source 命令变体用于 Shell 类继承环境变量 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
76
backend/internal/model/models.go
Normal file
76
backend/internal/model/models.go
Normal file
@@ -0,0 +1,76 @@
|
||||
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},
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
package model
|
||||
|
||||
import "time"
|
||||
|
||||
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"`
|
||||
Runtime string `gorm:"size:16;not null;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"`
|
||||
}
|
||||
Reference in New Issue
Block a user