server: Go 服务器(REST+WSS 网关+JWT+Argon2+配对+素材直链+任务状态机);修复并发下线 send-on-closed-channel、下发查询 SQL 优先级、配对码原子占用、上传体积上限、JWT 默认密钥告警

This commit is contained in:
Qiufeng
2026-08-20 20:38:21 +08:00
parent bf25d8beac
commit cc8845dcec
44 changed files with 4995 additions and 0 deletions
+166
View File
@@ -0,0 +1,166 @@
package models
import "time"
// Base 通用字段
type Base struct {
ID uint64 `gorm:"primaryKey;autoIncrement" json:"id"`
CreatedAt time.Time `json:"createdAt"`
UpdatedAt time.Time `json:"updatedAt"`
}
// User 网站用户
type User struct {
Base
Email string `gorm:"uniqueIndex;size:191" json:"email"`
PasswordHash string `gorm:"size:255" json:"-"`
Nickname string `gorm:"size:64" json:"nickname"`
Role string `gorm:"size:16;default:user" json:"role"`
TOTPSecret string `gorm:"size:64" json:"-"`
TOTPEnabled bool `gorm:"default:false" json:"totpEnabled"`
Status string `gorm:"size:16;default:active" json:"status"`
}
// Workspace 工作空间(租户)
type Workspace struct {
Base
Name string `gorm:"size:128" json:"name"`
OwnerID uint64 `gorm:"index" json:"ownerId"`
Plan string `gorm:"size:32;default:free" json:"plan"`
Status string `gorm:"size:16;default:active" json:"status"`
}
// Member 工作空间成员(角色:owner/admin/operator/reviewer/viewer)
type Member struct {
Base
WorkspaceID uint64 `gorm:"uniqueIndex:uk_ws_user" json:"workspaceId"`
UserID uint64 `gorm:"uniqueIndex:uk_ws_user" json:"userId"`
Role string `gorm:"size:16;default:viewer" json:"role"`
}
// Account 平台账号(凭据仅在 Agent 本机保险库,服务器零凭据)
type Account struct {
Base
WorkspaceID uint64 `gorm:"index" json:"workspaceId"`
Platform string `gorm:"size:32;index" json:"platform"`
AccountName string `gorm:"size:128" json:"accountName"`
Remark string `gorm:"size:255" json:"remark"`
AvatarURL string `gorm:"size:512" json:"avatarUrl"`
Status string `gorm:"size:16;default:unbound" json:"status"`
Health int `gorm:"default:100" json:"health"`
AgentDeviceID uint64 `gorm:"index" json:"agentDeviceId"`
IPProfile string `gorm:"size:191" json:"ipProfile"`
LastActiveAt *time.Time `json:"lastActiveAt"`
LastError string `gorm:"size:512" json:"lastError"`
}
// Material 素材
type Material struct {
Base
WorkspaceID uint64 `gorm:"index" json:"workspaceId"`
Name string `gorm:"size:255" json:"name"`
Kind string `gorm:"size:16;default:video" json:"kind"`
Size int64 `json:"size"`
SHA256 string `gorm:"size:64;index" json:"sha256"`
Mime string `gorm:"size:128" json:"mime"`
StorageKey string `gorm:"size:512" json:"-"`
Group string `gorm:"size:64" json:"group"`
Tags string `gorm:"type:text" json:"tags"`
Status string `gorm:"size:16;default:ready" json:"status"`
CreatedBy uint64 `json:"createdBy"`
}
// Task 发布任务(状态机:draft→pending_review→approved→queued→dispatched→running→success/failed→retrying;可 cancelled/suspended/rejected)
type Task struct {
Base
WorkspaceID uint64 `gorm:"index" json:"workspaceId"`
Title string `gorm:"size:255" json:"title"`
Content string `gorm:"type:text" json:"content"`
Tags string `gorm:"type:text" json:"tags"`
AccountIDs string `gorm:"type:text" json:"accountIds"`
MaterialIDs string `gorm:"type:text" json:"materialIds"`
ScheduleAt *time.Time `gorm:"index" json:"scheduleAt"`
Status string `gorm:"size:32;index;default:draft" json:"status"`
Priority int `gorm:"default:5" json:"priority"`
RetryCount int `gorm:"default:0" json:"retryCount"`
MaxRetry int `gorm:"default:3" json:"maxRetry"`
ErrorMessage string `gorm:"size:1024" json:"errorMessage"`
PublishedAt *time.Time `json:"publishedAt"`
PublishedURLs string `gorm:"type:text" json:"publishedUrls"`
Receipts string `gorm:"type:text" json:"receipts"`
CreatedBy uint64 `json:"createdBy"`
ReviewedBy uint64 `json:"reviewedBy"`
ReviewNote string `gorm:"size:512" json:"reviewNote"`
}
// AgentDevice 客户端设备(配对时注册 Ed25519 公钥)
type AgentDevice struct {
Base
WorkspaceID uint64 `gorm:"index" json:"workspaceId"`
Name string `gorm:"size:128" json:"name"`
OS string `gorm:"size:32" json:"os"`
Version string `gorm:"size:32" json:"version"`
PublicKey string `gorm:"type:text" json:"-"`
Status string `gorm:"size:16;default:offline" json:"status"`
IP string `gorm:"size:64" json:"ip"`
Revoked bool `gorm:"default:false" json:"revoked"`
LastSeenAt *time.Time `json:"lastSeenAt"`
PairedAt time.Time `json:"pairedAt"`
}
// Challenge 二次验证挑战(qr/sms/confirm/captcha/pending;超时挂起,永不暴力破解)
type Challenge struct {
Base
WorkspaceID uint64 `gorm:"index" json:"workspaceId"`
AccountID uint64 `gorm:"index" json:"accountId"`
DeviceID uint64 `gorm:"index" json:"deviceId"`
Platform string `gorm:"size:32" json:"platform"`
Kind string `gorm:"size:16" json:"kind"`
Status string `gorm:"size:16;default:active" json:"status"`
QRToken string `gorm:"size:512" json:"qrToken"`
QRURL string `gorm:"size:1024" json:"qrUrl"`
Prompt string `gorm:"size:512" json:"prompt"`
Payload string `gorm:"type:text" json:"payload"`
ExpiresAt time.Time `gorm:"index" json:"expiresAt"`
SolvedAt *time.Time `json:"solvedAt"`
}
// AuditLog 审计日志
type AuditLog struct {
Base
WorkspaceID uint64 `gorm:"index" json:"workspaceId"`
UserID uint64 `gorm:"index" json:"userId"`
Action string `gorm:"size:64;index" json:"action"`
Resource string `gorm:"size:128" json:"resource"`
Detail string `gorm:"type:text" json:"detail"`
IP string `gorm:"size:64" json:"ip"`
}
// Notification 站内通知
type Notification struct {
Base
WorkspaceID uint64 `gorm:"index" json:"workspaceId"`
UserID uint64 `gorm:"index" json:"userId"`
Kind string `gorm:"size:32" json:"kind"`
Title string `gorm:"size:255" json:"title"`
Content string `gorm:"type:text" json:"content"`
Read bool `gorm:"default:false" json:"read"`
}
// PairingCode 配对码(一次性,5 分钟过期)
type PairingCode struct {
Base
WorkspaceID uint64 `gorm:"index" json:"workspaceId"`
Code string `gorm:"size:12;uniqueIndex" json:"code"`
ExpiresAt time.Time `json:"expiresAt"`
Used bool `gorm:"default:false" json:"used"`
DeviceID uint64 `json:"deviceId"`
}
// TransferToken 素材直链下载 token(短时签名)
type TransferToken struct {
Base
MaterialID uint64 `gorm:"index" json:"materialId"`
Token string `gorm:"size:191;uniqueIndex" json:"token"`
ExpiresAt time.Time `json:"expiresAt"`
}