Initial commit: 网络验证平台
This commit is contained in:
@@ -0,0 +1,928 @@
|
||||
package model
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
// User 平台用户模型(开发者、管理员)
|
||||
type User struct {
|
||||
ID uint `gorm:"primaryKey" json:"id"`
|
||||
Username string `gorm:"uniqueIndex;size:50" json:"username"`
|
||||
Email *string `gorm:"uniqueIndex;size:100" json:"email"`
|
||||
Password string `gorm:"size:255" json:"-"`
|
||||
Avatar string `gorm:"size:255" json:"avatar"`
|
||||
Signature string `gorm:"size:255" json:"signature"`
|
||||
Role string `gorm:"size:20;default:developer" json:"role"`
|
||||
Status string `gorm:"size:20;default:active" json:"status"`
|
||||
DeviceID string `gorm:"size:100" json:"device_id"`
|
||||
LastLoginAt *time.Time `json:"last_login_at"`
|
||||
ResetToken string `gorm:"size:255" json:"-"`
|
||||
ResetTokenExpiresAt *time.Time `json:"reset_token_expires_at"`
|
||||
|
||||
CurrentPackageID *uint `json:"current_package_id"`
|
||||
ApiCallsUsed int `gorm:"default:0" json:"api_calls_used"`
|
||||
StorageUsed int64 `gorm:"default:0" json:"storage_used"`
|
||||
ApiCallsResetAt *time.Time `json:"api_calls_reset_at"`
|
||||
ApiToken string `gorm:"size:64" json:"api_token"`
|
||||
|
||||
ParentAgentID *uint `gorm:"index" json:"parent_agent_id"`
|
||||
Commission float64 `gorm:"default:0" json:"commission"`
|
||||
CanCreateAgent bool `gorm:"default:false" json:"can_create_agent"`
|
||||
Balance float64 `gorm:"default:0" json:"balance"`
|
||||
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
|
||||
|
||||
Applications []Application `gorm:"foreignKey:UserID" json:"-"`
|
||||
AgentApplications []AgentApplication `gorm:"foreignKey:AgentID" json:"-"`
|
||||
CurrentPackage *Package `gorm:"foreignKey:CurrentPackageID" json:"current_package,omitempty"`
|
||||
ParentAgent *User `gorm:"foreignKey:ParentAgentID" json:"parent_agent,omitempty"`
|
||||
ChildAgents []User `gorm:"foreignKey:ParentAgentID" json:"child_agents,omitempty"`
|
||||
}
|
||||
|
||||
// AppUser 应用用户模型(应用对接的用户)
|
||||
type AppUser struct {
|
||||
ID uint `gorm:"primaryKey" json:"id"`
|
||||
Username string `gorm:"uniqueIndex:idx_app_user;size:50" json:"username"`
|
||||
Email string `gorm:"size:100" json:"email"`
|
||||
Password string `gorm:"size:255" json:"-"`
|
||||
DeviceID string `gorm:"size:100" json:"device_id"`
|
||||
Avatar string `gorm:"size:255" json:"avatar"`
|
||||
Status string `gorm:"size:20;default:active" json:"status"`
|
||||
ApplicationID uint `gorm:"index:idx_app_user;not null" json:"application_id"`
|
||||
Balance float64 `gorm:"default:0" json:"balance"`
|
||||
ExpiryAt *time.Time `json:"expiry_at"`
|
||||
LastLoginAt *time.Time `json:"last_login_at"`
|
||||
LastHeartbeatAt *time.Time `json:"last_heartbeat_at"`
|
||||
IsTrialUser bool `gorm:"default:false" json:"is_trial_user"`
|
||||
TrialStartAt *time.Time `json:"trial_start_at"`
|
||||
TrialEndAt *time.Time `json:"trial_end_at"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
|
||||
|
||||
Application Application `gorm:"foreignKey:ApplicationID" json:"application,omitempty"`
|
||||
}
|
||||
|
||||
type PaymentChannel struct {
|
||||
ID uint `gorm:"primaryKey" json:"id"`
|
||||
Name string `gorm:"size:100;not null" json:"name"`
|
||||
Type string `gorm:"size:50;not null" json:"type"`
|
||||
Icon string `gorm:"size:100" json:"icon"`
|
||||
Config string `gorm:"type:text" json:"config"`
|
||||
Sort int `gorm:"default:0" json:"sort"`
|
||||
Status string `gorm:"size:20;default:active" json:"status"`
|
||||
Remark string `gorm:"size:500" json:"remark"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
|
||||
}
|
||||
|
||||
// DynamicCode 动态代码模型
|
||||
type DynamicCode struct {
|
||||
ID uint `gorm:"primaryKey" json:"id"`
|
||||
ApplicationID uint `gorm:"index;not null" json:"application_id"`
|
||||
Name string `gorm:"size:100;not null" json:"name"`
|
||||
Key string `gorm:"size:100;uniqueIndex;not null" json:"key"`
|
||||
Code string `gorm:"type:longtext;not null" json:"code"`
|
||||
Description string `gorm:"type:text" json:"description"`
|
||||
Status string `gorm:"size:20;default:active" json:"status"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
|
||||
|
||||
Application Application `gorm:"foreignKey:ApplicationID" json:"application,omitempty"`
|
||||
Creator *User `gorm:"foreignKey:UserID" json:"creator,omitempty"`
|
||||
UserID *uint `gorm:"index" json:"user_id"`
|
||||
}
|
||||
|
||||
// UserLevel 用户等级模型
|
||||
type UserLevel struct {
|
||||
ID uint `gorm:"primaryKey" json:"id"`
|
||||
Name string `gorm:"size:50" json:"name"`
|
||||
Description string `gorm:"size:255" json:"description"`
|
||||
RequiredPoints int `gorm:"default:0" json:"required_points"`
|
||||
Discount int `gorm:"default:100" json:"discount"`
|
||||
IsDefault bool `gorm:"default:false" json:"is_default"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
|
||||
}
|
||||
|
||||
// Application 应用模型
|
||||
type Application struct {
|
||||
ID uint `gorm:"primaryKey" json:"id"`
|
||||
UserID uint `json:"user_id"`
|
||||
Name string `gorm:"size:100" json:"name"`
|
||||
Description string `gorm:"type:text" json:"description"`
|
||||
IconURL string `gorm:"size:255" json:"icon_url"`
|
||||
AppKey string `gorm:"uniqueIndex;size:50" json:"app_key"`
|
||||
BillingType string `gorm:"size:20" json:"billing_type"`
|
||||
LoginPolicy string `gorm:"size:20;default:loose" json:"login_policy"`
|
||||
EncryptType string `gorm:"size:20" json:"encrypt_type"`
|
||||
SecretKey string `gorm:"size:255" json:"secret_key"`
|
||||
BindType string `gorm:"size:20" json:"bind_type"`
|
||||
MaxDevices int `gorm:"default:1" json:"max_devices"`
|
||||
ChangeLimit int `gorm:"default:3" json:"change_limit"`
|
||||
ChangeInterval int `gorm:"default:7" json:"change_interval"`
|
||||
ChangeExceedAction string `gorm:"size:20;default:deny" json:"change_exceed_action"`
|
||||
ChangeDeductAmount float64 `gorm:"default:1" json:"change_deduct_amount"`
|
||||
MultiOpenMode string `gorm:"size:20;default:forbidden" json:"multi_open_mode"`
|
||||
MaxInstances int `gorm:"default:1" json:"max_instances"`
|
||||
MultiOpen bool `gorm:"default:false" json:"multi_open"`
|
||||
EnableTrial bool `gorm:"default:false" json:"enable_trial"`
|
||||
TrialBalance float64 `gorm:"default:0" json:"trial_balance"`
|
||||
TrialDays int `gorm:"default:0" json:"trial_days"`
|
||||
EnableFreePeriod bool `gorm:"default:false" json:"enable_free_period"`
|
||||
FreePeriodType string `gorm:"size:20;default:range" json:"free_period_type"`
|
||||
FreePeriodStart string `gorm:"size:50" json:"free_period_start"`
|
||||
FreePeriodEnd string `gorm:"size:50" json:"free_period_end"`
|
||||
FreePeriodWeekdays string `gorm:"size:50" json:"free_period_weekdays"`
|
||||
FreePeriodStartTime string `gorm:"size:10" json:"free_period_start_time"`
|
||||
FreePeriodEndTime string `gorm:"size:10" json:"free_period_end_time"`
|
||||
HeartbeatInterval int `gorm:"default:60" json:"heartbeat_interval"`
|
||||
HeartbeatTimeout int `gorm:"default:300" json:"heartbeat_timeout"`
|
||||
MaxAttempts int `gorm:"default:5" json:"max_attempts"`
|
||||
LockDuration int `gorm:"default:30" json:"lock_duration"`
|
||||
Status string `gorm:"size:20;default:active" json:"status"`
|
||||
DeductionMode string `gorm:"size:20;default:auto" json:"deduction_mode"`
|
||||
DeductionType string `gorm:"size:20;default:login" json:"deduction_type"`
|
||||
DeductionInterval int `gorm:"default:1" json:"deduction_interval"`
|
||||
DeductionUnit string `gorm:"size:20;default:minute" json:"deduction_unit"`
|
||||
DeductionAmount float64 `gorm:"default:1" json:"deduction_amount"`
|
||||
AllowRegister bool `gorm:"default:true" json:"allow_register"`
|
||||
RegisterMethods string `gorm:"size:100;default:'[\"username\"]'" json:"register_methods"`
|
||||
EnableEmailVerify bool `gorm:"default:false" json:"enable_email_verify"`
|
||||
RequireEmailVerify bool `gorm:"default:false" json:"require_email_verify"`
|
||||
EnablePasswordReset bool `gorm:"default:false" json:"enable_password_reset"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
|
||||
|
||||
User User `gorm:"foreignKey:UserID" json:"user,omitempty"`
|
||||
}
|
||||
|
||||
// Version 版本模型
|
||||
type Version struct {
|
||||
ID uint `gorm:"primaryKey" json:"id"`
|
||||
ApplicationID uint `json:"application_id"`
|
||||
Version string `gorm:"size:50" json:"version"`
|
||||
FilePath string `gorm:"size:255" json:"file_path"`
|
||||
FileSize int64 `json:"file_size"`
|
||||
FileHash string `gorm:"size:64" json:"file_hash"`
|
||||
EntryFile string `gorm:"size:255" json:"entry_file"`
|
||||
ForceUpdate bool `gorm:"default:false" json:"force_update"`
|
||||
UpdateStrategy string `gorm:"size:20;default:optional" json:"update_strategy"`
|
||||
UpdateMethod string `gorm:"size:20;default:manual" json:"update_method"`
|
||||
MinVersion string `gorm:"size:50" json:"min_version"`
|
||||
Description string `gorm:"type:text" json:"description"`
|
||||
Changelog string `gorm:"type:text" json:"changelog"`
|
||||
Status string `gorm:"size:20;default:active" json:"status"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
|
||||
|
||||
Application Application `gorm:"foreignKey:ApplicationID" json:"application,omitempty"`
|
||||
Files []VersionFile `gorm:"foreignKey:VersionID" json:"files,omitempty"`
|
||||
}
|
||||
|
||||
// VersionFile 版本文件模型
|
||||
type VersionFile struct {
|
||||
ID uint `gorm:"primaryKey" json:"id"`
|
||||
VersionID uint `json:"version_id"`
|
||||
FilePath string `gorm:"size:500" json:"file_path"`
|
||||
FileName string `gorm:"size:255" json:"file_name"`
|
||||
FileSize int64 `json:"file_size"`
|
||||
FileHash string `gorm:"size:64" json:"file_hash"`
|
||||
FileType string `gorm:"size:20;default:resource" json:"file_type"`
|
||||
IsRequired bool `gorm:"default:true" json:"is_required"`
|
||||
SortOrder int `gorm:"default:0" json:"sort_order"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
|
||||
|
||||
Version Version `gorm:"foreignKey:VersionID" json:"version,omitempty"`
|
||||
}
|
||||
|
||||
// CardType 卡密类型模型
|
||||
type CardType struct {
|
||||
ID uint `gorm:"primaryKey" json:"id"`
|
||||
UserID uint `json:"user_id"`
|
||||
ApplicationID uint `json:"application_id"`
|
||||
Name string `gorm:"size:100" json:"name"`
|
||||
RechargeType string `gorm:"size:20;default:balance" json:"recharge_type"` // balance(余额充值), subscription(订阅充值)
|
||||
Value float64 `json:"value"` // 余额值或订阅时长(秒)
|
||||
ValueUnit string `gorm:"size:20;default:day" json:"value_unit"` // 时长单位: day, month, year (仅订阅充值)
|
||||
Price float64 `json:"price"`
|
||||
Description string `gorm:"type:text" json:"description"`
|
||||
Status string `gorm:"size:20;default:active" json:"status"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
|
||||
|
||||
User User `gorm:"foreignKey:UserID" json:"user,omitempty"`
|
||||
Application *Application `gorm:"foreignKey:ApplicationID" json:"application,omitempty"`
|
||||
}
|
||||
|
||||
// Card 卡密模型
|
||||
type Card struct {
|
||||
ID uint `gorm:"primaryKey" json:"id"`
|
||||
ApplicationID uint `json:"application_id"` // 所属应用ID
|
||||
CardTypeID uint `json:"card_type_id"`
|
||||
CardKey string `gorm:"uniqueIndex;size:100" json:"card_key"`
|
||||
CreatorID uint `json:"creator_id"` // 创建人ID
|
||||
AppUserID *uint `json:"app_user_id"` // 使用者ID
|
||||
Status string `gorm:"size:20;default:unused" json:"status"` // unused, used, banned
|
||||
UsedAt *time.Time `json:"used_at"`
|
||||
ExpireAt *time.Time `json:"expire_at"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
|
||||
|
||||
Application *Application `gorm:"foreignKey:ApplicationID" json:"application,omitempty"`
|
||||
CardType CardType `gorm:"foreignKey:CardTypeID" json:"card_type,omitempty"`
|
||||
Creator User `gorm:"foreignKey:CreatorID" json:"creator,omitempty"`
|
||||
AppUser *AppUser `gorm:"foreignKey:AppUserID" json:"app_user,omitempty"`
|
||||
}
|
||||
|
||||
// Announcement 公告模型
|
||||
type Announcement struct {
|
||||
ID uint `gorm:"primaryKey" json:"id"`
|
||||
ApplicationID uint `json:"application_id"`
|
||||
Title string `gorm:"size:255" json:"title"`
|
||||
Content string `gorm:"type:text" json:"content"`
|
||||
Type string `gorm:"size:20;default:info" json:"type"` // info, warning, urgent
|
||||
Status string `gorm:"size:20;default:draft" json:"status"` // draft, active
|
||||
IsTop bool `gorm:"default:false" json:"is_top"` // 是否置顶
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
|
||||
|
||||
Application Application `gorm:"foreignKey:ApplicationID" json:"application,omitempty"`
|
||||
}
|
||||
|
||||
// Order 订单模型
|
||||
type Order struct {
|
||||
ID uint `gorm:"primaryKey" json:"id"`
|
||||
OrderNo string `gorm:"uniqueIndex;size:100" json:"order_no"`
|
||||
UserID uint `json:"user_id"`
|
||||
ApplicationID *uint `json:"application_id"`
|
||||
PackageID *uint `json:"package_id"`
|
||||
OrderType string `gorm:"size:50;not null" json:"order_type"` // card_recharge, agent_auth, user_recharge, user_deduct, package
|
||||
Title string `gorm:"size:200" json:"title"`
|
||||
Amount float64 `gorm:"type:decimal(10,2)" json:"amount"`
|
||||
PaymentType string `gorm:"size:50" json:"payment_type"` // alipay, wechat, balance, card, system
|
||||
PaymentMethod string `gorm:"size:50" json:"payment_method"`
|
||||
Status string `gorm:"size:20;default:pending" json:"status"` // pending, paid, cancelled, refunded, failed
|
||||
PaymentAt *time.Time `json:"payment_at"`
|
||||
RefundAt *time.Time `json:"refund_at"`
|
||||
RefundReason string `gorm:"type:text" json:"refund_reason"`
|
||||
Description string `gorm:"type:text" json:"description"`
|
||||
ExtraData string `gorm:"type:text" json:"extra_data"` // JSON格式存储额外数据
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
|
||||
|
||||
User User `gorm:"foreignKey:UserID" json:"user,omitempty"`
|
||||
Application Application `gorm:"foreignKey:ApplicationID" json:"application,omitempty"`
|
||||
Package *Package `gorm:"foreignKey:PackageID" json:"package,omitempty"`
|
||||
}
|
||||
|
||||
// Log 日志模型
|
||||
type Log struct {
|
||||
ID uint `gorm:"primaryKey" json:"id"`
|
||||
UserID *uint `json:"user_id"`
|
||||
ApplicationID *uint `json:"application_id"`
|
||||
AppUserID *uint `json:"app_user_id"`
|
||||
LogType string `gorm:"size:20;default:operation" json:"log_type"` // operation, verification, exception
|
||||
Action string `gorm:"size:100" json:"action"`
|
||||
Resource string `gorm:"size:100" json:"resource"`
|
||||
ResourceID *uint `json:"resource_id"`
|
||||
Details string `gorm:"type:text" json:"details"`
|
||||
IPAddress string `gorm:"size:50" json:"ip_address"`
|
||||
UserAgent string `gorm:"size:500" json:"user_agent"`
|
||||
DeviceID string `gorm:"size:100" json:"device_id"`
|
||||
Status string `gorm:"size:20;default:success" json:"status"` // success, failed, pending
|
||||
Level string `gorm:"size:20;default:info" json:"level"` // info, warning, error
|
||||
ErrorMessage string `gorm:"type:text" json:"error_message"`
|
||||
StackTrace string `gorm:"type:text" json:"stack_trace"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
|
||||
|
||||
User *User `gorm:"foreignKey:UserID" json:"user"`
|
||||
Application *Application `gorm:"foreignKey:ApplicationID" json:"application"`
|
||||
AppUser *AppUser `gorm:"foreignKey:AppUserID" json:"app_user"`
|
||||
}
|
||||
|
||||
// RechargeRecord 充值记录模型
|
||||
type RechargeRecord struct {
|
||||
ID uint `gorm:"primaryKey" json:"id"`
|
||||
UserID uint `json:"user_id"`
|
||||
OrderNo string `gorm:"size:50;uniqueIndex" json:"order_no"`
|
||||
CardID *uint `json:"card_id"`
|
||||
CardCode string `gorm:"size:100" json:"card_code"`
|
||||
Amount float64 `gorm:"type:decimal(10,2)" json:"amount"`
|
||||
Status string `gorm:"size:20;default:pending" json:"status"` // pending, success, failed
|
||||
PaymentType string `gorm:"size:50" json:"payment_type"` // card, alipay, wechat, balance
|
||||
Remark string `gorm:"type:text" json:"remark"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
|
||||
|
||||
AppUser *AppUser `gorm:"foreignKey:UserID" json:"app_user,omitempty"`
|
||||
Card *Card `gorm:"foreignKey:CardID" json:"card,omitempty"`
|
||||
}
|
||||
|
||||
// ConsumptionRecord 消费记录模型
|
||||
type ConsumptionRecord struct {
|
||||
ID uint `gorm:"primaryKey" json:"id"`
|
||||
UserID uint `json:"user_id"`
|
||||
ApplicationID uint `json:"application_id"`
|
||||
OrderNo string `gorm:"size:50;uniqueIndex" json:"order_no"`
|
||||
Type string `gorm:"size:50" json:"type"` // verification, card_purchase, subscription, feature, manual_deduct
|
||||
Content string `gorm:"type:text" json:"content"`
|
||||
Description string `gorm:"type:text" json:"description"`
|
||||
Amount float64 `gorm:"type:decimal(10,2)" json:"amount"`
|
||||
BalanceAfter float64 `gorm:"type:decimal(10,2)" json:"balance_after"`
|
||||
Status string `gorm:"size:20;default:success" json:"status"` // pending, success, failed
|
||||
PaymentType string `gorm:"size:50" json:"payment_type"` // alipay, wechat, balance
|
||||
Remark string `gorm:"type:text" json:"remark"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
|
||||
|
||||
AppUser *AppUser `gorm:"foreignKey:UserID" json:"app_user,omitempty"`
|
||||
}
|
||||
|
||||
// Ticket 工单模型
|
||||
type Ticket struct {
|
||||
ID uint `gorm:"primaryKey" json:"id"`
|
||||
UserID uint `json:"user_id"`
|
||||
ApplicationID *uint `json:"application_id"` // 关联的应用ID,如果为空则提交给平台
|
||||
Title string `gorm:"size:200" json:"title"`
|
||||
Content string `gorm:"type:text" json:"content"`
|
||||
Category string `gorm:"size:50" json:"category"` // account, payment, technical, feature, other
|
||||
Type string `gorm:"size:50" json:"type"` // user, agent, developer
|
||||
Status string `gorm:"size:20;default:open" json:"status"` // open, processing, resolved, closed
|
||||
Priority string `gorm:"size:20;default:normal" json:"priority"` // low, normal, high, urgent
|
||||
AssignedTo *uint `json:"assigned_to"` // 分配给的应用开发者ID或平台管理员ID
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
|
||||
|
||||
User User `gorm:"foreignKey:UserID" json:"user,omitempty"`
|
||||
Application *Application `gorm:"foreignKey:ApplicationID" json:"application,omitempty"`
|
||||
AssignedUser *User `gorm:"foreignKey:AssignedTo" json:"assigned_user,omitempty"`
|
||||
Replies []TicketReply `gorm:"foreignKey:TicketID" json:"replies,omitempty"`
|
||||
}
|
||||
|
||||
// TicketReply 工单回复模型
|
||||
type TicketReply struct {
|
||||
ID uint `gorm:"primaryKey" json:"id"`
|
||||
TicketID uint `json:"ticket_id"`
|
||||
UserID uint `json:"user_id"`
|
||||
Content string `gorm:"type:text" json:"content"`
|
||||
IsAdmin bool `gorm:"default:false" json:"is_admin"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
|
||||
|
||||
Ticket Ticket `gorm:"foreignKey:TicketID" json:"ticket,omitempty"`
|
||||
User User `gorm:"foreignKey:UserID" json:"user,omitempty"`
|
||||
}
|
||||
|
||||
// UserVariable 用户变量模型
|
||||
type UserVariable struct {
|
||||
ID uint `gorm:"primaryKey" json:"id"`
|
||||
UserID uint `json:"user_id"`
|
||||
AppID uint `json:"app_id"`
|
||||
VarName string `gorm:"size:100" json:"var_name"`
|
||||
VarValue string `gorm:"type:text" json:"var_value"`
|
||||
VarType string `gorm:"size:20;default:string" json:"var_type"`
|
||||
FilePath string `gorm:"size:500" json:"file_path"`
|
||||
FileSize int64 `json:"file_size"`
|
||||
MimeType string `gorm:"size:100" json:"mime_type"`
|
||||
OriginalName string `gorm:"size:255" json:"original_name"`
|
||||
FileMD5 string `gorm:"size:32" json:"file_md5"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
}
|
||||
|
||||
// CloudConstant 云端常量模型
|
||||
type CloudConstant struct {
|
||||
ID uint `gorm:"primaryKey" json:"id"`
|
||||
UserID uint `json:"user_id"`
|
||||
AppID *uint `json:"app_id"`
|
||||
Key string `gorm:"size:100;index" json:"key"`
|
||||
Value string `gorm:"type:text" json:"value"`
|
||||
VarType string `gorm:"size:20;default:string" json:"var_type"` // string, integer, decimal, binary
|
||||
FilePath string `gorm:"size:500" json:"file_path"`
|
||||
FileSize int64 `json:"file_size"`
|
||||
MimeType string `gorm:"size:100" json:"mime_type"`
|
||||
OriginalName string `gorm:"size:255" json:"original_name"`
|
||||
FileMD5 string `gorm:"size:32" json:"file_md5"`
|
||||
Description string `gorm:"size:255" json:"description"`
|
||||
Status string `gorm:"size:20;default:active" json:"status"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
|
||||
|
||||
User User `gorm:"foreignKey:UserID" json:"user,omitempty"`
|
||||
}
|
||||
|
||||
// RiskControlRule 风控规则模型
|
||||
type RiskControlRule struct {
|
||||
ID uint `gorm:"primaryKey" json:"id"`
|
||||
UserID uint `gorm:"index;not null" json:"user_id"` // 创建者ID
|
||||
ApplicationID *uint `gorm:"index" json:"application_id"` // 应用ID,为空表示全局规则
|
||||
Type string `gorm:"size:20;not null" json:"type"` // ip, device, user, region
|
||||
Value string `gorm:"size:255;not null" json:"value"`
|
||||
Reason string `gorm:"size:500" json:"reason"`
|
||||
Status string `gorm:"size:20;default:active" json:"status"` // active, inactive
|
||||
ExpiresAt *time.Time `json:"expires_at"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
|
||||
|
||||
User User `gorm:"foreignKey:UserID" json:"user,omitempty"`
|
||||
Application Application `gorm:"foreignKey:ApplicationID" json:"application,omitempty"`
|
||||
}
|
||||
type CloudVariable struct {
|
||||
ID uint `gorm:"primaryKey" json:"id"`
|
||||
UserID uint `json:"user_id"`
|
||||
AppID *uint `json:"app_id"`
|
||||
Key string `gorm:"size:100;index" json:"key"`
|
||||
DefaultValue string `gorm:"type:text" json:"default_value"`
|
||||
VarType string `gorm:"size:20;default:string" json:"var_type"` // string, integer, decimal, binary
|
||||
DataType string `gorm:"size:20;default:single" json:"data_type"` // single, stream
|
||||
MaxRecords int `gorm:"default:0" json:"max_records"` // 流水类型最大记录数,0=不限制
|
||||
FilePath string `gorm:"size:500" json:"file_path"`
|
||||
FileSize int64 `json:"file_size"`
|
||||
MimeType string `gorm:"size:100" json:"mime_type"`
|
||||
OriginalName string `gorm:"size:255" json:"original_name"`
|
||||
FileMD5 string `gorm:"size:32" json:"file_md5"`
|
||||
Scope string `gorm:"size:20;default:app" json:"scope"`
|
||||
WritePermission string `gorm:"size:20;default:developer" json:"write_permission"`
|
||||
Description string `gorm:"size:255" json:"description"`
|
||||
Status string `gorm:"size:20;default:active" json:"status"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
|
||||
|
||||
User User `gorm:"foreignKey:UserID" json:"user,omitempty"`
|
||||
}
|
||||
|
||||
type CloudVariableRecord struct {
|
||||
ID uint `gorm:"primaryKey" json:"id"`
|
||||
CloudVariableID uint `gorm:"index;not null" json:"cloud_variable_id"`
|
||||
AppUserID *uint `json:"app_user_id"`
|
||||
Data string `gorm:"type:text" json:"data"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
|
||||
CloudVariable CloudVariable `gorm:"foreignKey:CloudVariableID" json:"cloud_variable,omitempty"`
|
||||
}
|
||||
|
||||
// IPBlacklist IP黑名单模型
|
||||
type IPBlacklist struct {
|
||||
ID uint `gorm:"primaryKey" json:"id"`
|
||||
UserID uint `json:"user_id"`
|
||||
IPAddress string `gorm:"size:50" json:"ip_address"`
|
||||
Type string `gorm:"size:20;default:single" json:"type"` // single, range
|
||||
Reason string `gorm:"size:255" json:"reason"`
|
||||
ExpiresAt *time.Time `json:"expires_at"`
|
||||
Status string `gorm:"size:20;default:active" json:"status"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
|
||||
|
||||
User User `gorm:"foreignKey:UserID" json:"user,omitempty"`
|
||||
}
|
||||
|
||||
// DeviceBlacklist 机器码黑名单模型
|
||||
type DeviceBlacklist struct {
|
||||
ID uint `gorm:"primaryKey" json:"id"`
|
||||
UserID uint `json:"user_id"`
|
||||
DeviceID string `gorm:"size:100" json:"device_id"`
|
||||
Type string `gorm:"size:20;default:temporary" json:"type"` // permanent, temporary
|
||||
Reason string `gorm:"size:255" json:"reason"`
|
||||
ExpiresAt *time.Time `json:"expires_at"`
|
||||
Status string `gorm:"size:20;default:active" json:"status"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
|
||||
|
||||
User User `gorm:"foreignKey:UserID" json:"user,omitempty"`
|
||||
}
|
||||
|
||||
// AbnormalBehavior 异常行为模型
|
||||
type AbnormalBehavior struct {
|
||||
ID uint `gorm:"primaryKey" json:"id"`
|
||||
UserID *uint `json:"user_id"`
|
||||
DeviceID string `gorm:"size:100" json:"device_id"`
|
||||
IPAddress string `gorm:"size:50" json:"ip_address"`
|
||||
Type string `gorm:"size:50" json:"type"` // frequent-login, abnormal-api, data-tampering, suspicious-activity
|
||||
Level string `gorm:"size:20" json:"level"` // low, medium, high, critical
|
||||
Description string `gorm:"type:text" json:"description"`
|
||||
Details string `gorm:"type:text" json:"details"` // JSON格式的详细信息
|
||||
Status string `gorm:"size:20;default:pending" json:"status"` // pending, handled, ignored
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
|
||||
|
||||
User *User `gorm:"foreignKey:UserID" json:"user,omitempty"`
|
||||
}
|
||||
|
||||
// DocCategory 文档分类模型
|
||||
type DocCategory struct {
|
||||
ID uint `gorm:"primaryKey" json:"id"`
|
||||
Name string `gorm:"size:100" json:"name"`
|
||||
NameEn string `gorm:"size:100" json:"name_en"`
|
||||
Slug string `gorm:"size:100;uniqueIndex" json:"slug"`
|
||||
Description string `gorm:"size:255" json:"description"`
|
||||
DescriptionEn string `gorm:"size:255" json:"description_en"`
|
||||
Icon string `gorm:"size:50;default:file-text" json:"icon"`
|
||||
Status string `gorm:"size:20;default:active" json:"status"`
|
||||
Sort int `gorm:"default:0" json:"sort"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
|
||||
}
|
||||
|
||||
// AgentApplication 代理应用授权模型
|
||||
type AgentApplication struct {
|
||||
ID uint `gorm:"primaryKey" json:"id"`
|
||||
AgentID uint `json:"agent_id"`
|
||||
ApplicationID uint `json:"application_id"`
|
||||
DeveloperID uint `json:"developer_id"`
|
||||
Commission float64 `gorm:"default:0.1" json:"commission"`
|
||||
Discount float64 `gorm:"default:1.0" json:"discount"`
|
||||
Status string `gorm:"size:20;default:active" json:"status"`
|
||||
IsReceived bool `gorm:"default:false" json:"is_received"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
|
||||
|
||||
Agent User `gorm:"foreignKey:AgentID;references:ID" json:"agent,omitempty"`
|
||||
Application Application `gorm:"foreignKey:ApplicationID;references:ID" json:"application,omitempty"`
|
||||
Developer User `gorm:"foreignKey:DeveloperID;references:ID" json:"developer,omitempty"`
|
||||
CardTypes []AgentApplicationCardType `gorm:"foreignKey:AgentApplicationID" json:"card_types,omitempty"`
|
||||
}
|
||||
|
||||
// AgentApplicationCardType 代理应用卡密类型授权
|
||||
type AgentApplicationCardType struct {
|
||||
ID uint `gorm:"primaryKey" json:"id"`
|
||||
AgentApplicationID uint `json:"agent_application_id"`
|
||||
CardTypeID uint `json:"card_type_id"`
|
||||
CanGenerate bool `gorm:"default:false" json:"can_generate"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
|
||||
|
||||
AgentApplication AgentApplication `gorm:"foreignKey:AgentApplicationID" json:"agent_application,omitempty"`
|
||||
CardType CardType `gorm:"foreignKey:CardTypeID" json:"card_type,omitempty"`
|
||||
}
|
||||
|
||||
// AgentApplicationRequest 代理应用申请/邀请模型
|
||||
type AgentApplicationRequest struct {
|
||||
ID uint `gorm:"primaryKey" json:"id"`
|
||||
AgentID uint `json:"agent_id"`
|
||||
DeveloperID uint `json:"developer_id"`
|
||||
ApplicationID uint `json:"application_id"`
|
||||
Type string `gorm:"size:20" json:"type"`
|
||||
Status string `gorm:"size:20;default:pending" json:"status"`
|
||||
Message string `gorm:"type:text" json:"message"`
|
||||
RejectReason string `gorm:"type:text" json:"reject_reason"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
|
||||
|
||||
Agent User `gorm:"foreignKey:AgentID" json:"agent,omitempty"`
|
||||
Developer User `gorm:"foreignKey:DeveloperID" json:"developer,omitempty"`
|
||||
Application Application `gorm:"foreignKey:ApplicationID" json:"application,omitempty"`
|
||||
}
|
||||
|
||||
// Package 套餐模型
|
||||
type Package struct {
|
||||
ID uint `gorm:"primaryKey" json:"id"`
|
||||
Name string `gorm:"size:100" json:"name"`
|
||||
NameEn string `gorm:"size:100" json:"name_en"`
|
||||
Price float64 `gorm:"default:0" json:"price"`
|
||||
Currency string `gorm:"size:10;default:CNY" json:"currency"` // CNY, USD, EUR, GBP, JPY
|
||||
Period string `gorm:"size:20;default:permanent" json:"period"` // permanent, monthly, yearly
|
||||
Description string `gorm:"size:255" json:"description"`
|
||||
DescriptionEn string `gorm:"size:255" json:"description_en"`
|
||||
Status string `gorm:"size:20;default:active" json:"status"` // active, inactive
|
||||
Sort int `gorm:"default:0" json:"sort"`
|
||||
IsRecommended bool `gorm:"default:false" json:"is_recommended"`
|
||||
AllowUpgrade bool `gorm:"default:true" json:"allow_upgrade"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
|
||||
}
|
||||
|
||||
// PackagePermission 套餐权限模型
|
||||
type PackagePermission struct {
|
||||
ID uint `gorm:"primaryKey" json:"id"`
|
||||
PackageID uint `json:"package_id"`
|
||||
MaxApplications int `gorm:"default:1" json:"max_applications"`
|
||||
MaxStorage int `gorm:"default:100" json:"max_storage"`
|
||||
MaxApiCalls int `gorm:"default:1000" json:"max_api_calls"`
|
||||
AllowAgent bool `gorm:"default:false" json:"allow_agent"`
|
||||
AllowCloudData bool `gorm:"default:false" json:"allow_cloud_data"`
|
||||
AllowDynamicCode bool `gorm:"default:false" json:"allow_dynamic_code"`
|
||||
AllowEmail bool `gorm:"default:false" json:"allow_email"`
|
||||
AllowExtension bool `gorm:"default:false" json:"allow_extension"`
|
||||
PrioritySupport bool `gorm:"default:false" json:"priority_support"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
}
|
||||
|
||||
// Doc 文档模型
|
||||
type Doc struct {
|
||||
ID uint `gorm:"primaryKey" json:"id"`
|
||||
CategoryID *uint `json:"category_id"`
|
||||
Title string `gorm:"size:200" json:"title"`
|
||||
TitleEn string `gorm:"size:200" json:"title_en"`
|
||||
Slug string `gorm:"size:200;uniqueIndex" json:"slug"`
|
||||
Content string `gorm:"type:longtext" json:"content"`
|
||||
ContentEn string `gorm:"type:longtext" json:"content_en"`
|
||||
Summary string `gorm:"size:500" json:"summary"`
|
||||
SummaryEn string `gorm:"size:500" json:"summary_en"`
|
||||
Icon string `gorm:"size:50" json:"icon"`
|
||||
Sort int `gorm:"default:0" json:"sort"`
|
||||
Status string `gorm:"size:20;default:draft" json:"status"` // draft, published
|
||||
ViewCount int `gorm:"default:0" json:"view_count"`
|
||||
AuthorID *uint `json:"author_id"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
|
||||
|
||||
Category *DocCategory `gorm:"foreignKey:CategoryID" json:"category,omitempty"`
|
||||
Author *User `gorm:"foreignKey:AuthorID" json:"author,omitempty"`
|
||||
}
|
||||
|
||||
// Setting 系统设置模型
|
||||
type Setting struct {
|
||||
ID uint `gorm:"primaryKey" json:"id"`
|
||||
Category string `gorm:"size:50;index" json:"category"` // basic, email, sms, payment
|
||||
Key string `gorm:"size:100;uniqueIndex" json:"key"`
|
||||
Value string `gorm:"type:text" json:"value"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
}
|
||||
|
||||
// Captcha 验证码模型
|
||||
type Captcha struct {
|
||||
ID uint `gorm:"primaryKey" json:"id"`
|
||||
CaptchaID string `gorm:"uniqueIndex;size:50" json:"captcha_id"`
|
||||
Code string `gorm:"size:10" json:"code"`
|
||||
ExpiresAt time.Time `json:"expires_at"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
}
|
||||
|
||||
type EmailVerifyCode struct {
|
||||
ID uint `gorm:"primaryKey" json:"id"`
|
||||
ApplicationID uint `gorm:"index" json:"application_id"`
|
||||
Email string `gorm:"size:100;index" json:"email"`
|
||||
Code string `gorm:"size:10" json:"code"`
|
||||
Purpose string `gorm:"size:20;default:register" json:"purpose"`
|
||||
ExpiresAt time.Time `json:"expires_at"`
|
||||
Used bool `gorm:"default:false" json:"used"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
}
|
||||
|
||||
type AppSMTPConfig struct {
|
||||
ID uint `gorm:"primaryKey" json:"id"`
|
||||
ApplicationID uint `gorm:"uniqueIndex" json:"application_id"`
|
||||
Host string `gorm:"size:100" json:"host"`
|
||||
Port int `gorm:"default:465" json:"port"`
|
||||
User string `gorm:"size:100" json:"user"`
|
||||
Password string `gorm:"size:255" json:"password"`
|
||||
FromName string `gorm:"size:100" json:"from_name"`
|
||||
FromEmail string `gorm:"size:100" json:"from_email"`
|
||||
UseSSL bool `gorm:"default:true" json:"use_ssl"`
|
||||
Status string `gorm:"size:20;default:active" json:"status"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
|
||||
|
||||
Application Application `gorm:"foreignKey:ApplicationID" json:"application,omitempty"`
|
||||
}
|
||||
|
||||
type EmailTemplate struct {
|
||||
ID uint `gorm:"primaryKey" json:"id"`
|
||||
ApplicationID uint `gorm:"index" json:"application_id"`
|
||||
Type string `gorm:"size:50;index" json:"type"`
|
||||
Name string `gorm:"size:100" json:"name"`
|
||||
Subject string `gorm:"size:200" json:"subject"`
|
||||
Content string `gorm:"type:text" json:"content"`
|
||||
IsDefault bool `gorm:"default:false" json:"is_default"`
|
||||
Status string `gorm:"size:20;default:active" json:"status"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
|
||||
|
||||
Application Application `gorm:"foreignKey:ApplicationID" json:"application,omitempty"`
|
||||
}
|
||||
|
||||
// UserPackage 用户套餐授权模型
|
||||
type UserPackage struct {
|
||||
ID uint `gorm:"primaryKey" json:"id"`
|
||||
UserID uint `json:"user_id"`
|
||||
PackageID uint `json:"package_id"`
|
||||
Status string `gorm:"size:20;default:active" json:"status"` // active, expired, cancelled
|
||||
StartedAt time.Time `json:"started_at"`
|
||||
ExpiredAt *time.Time `json:"expired_at"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
|
||||
|
||||
User User `gorm:"foreignKey:UserID" json:"user,omitempty"`
|
||||
Package Package `gorm:"foreignKey:PackageID" json:"package,omitempty"`
|
||||
}
|
||||
|
||||
// UserDevice 用户设备模型(设备绑定,持久化)
|
||||
type UserDevice struct {
|
||||
ID uint `gorm:"primaryKey" json:"id"`
|
||||
UserID uint `gorm:"index" json:"user_id"`
|
||||
ApplicationID uint `gorm:"index" json:"application_id"`
|
||||
DeviceID string `gorm:"size:100;index" json:"device_id"`
|
||||
DeviceName string `gorm:"size:100" json:"device_name"`
|
||||
DeviceType string `gorm:"size:50" json:"device_type"`
|
||||
Status string `gorm:"size:20;default:active" json:"status"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
|
||||
|
||||
User AppUser `gorm:"foreignKey:UserID" json:"user,omitempty"`
|
||||
Application Application `gorm:"foreignKey:ApplicationID" json:"application,omitempty"`
|
||||
Sessions []DeviceSession `gorm:"foreignKey:DeviceID;references:ID" json:"sessions,omitempty"`
|
||||
}
|
||||
|
||||
// DeviceSession 设备会话模型(多开实例,运行时)
|
||||
type DeviceSession struct {
|
||||
ID uint `gorm:"primaryKey" json:"id"`
|
||||
DeviceID uint `gorm:"index" json:"device_id"`
|
||||
UserID uint `gorm:"index" json:"user_id"`
|
||||
ApplicationID uint `gorm:"index" json:"application_id"`
|
||||
InstanceID string `gorm:"size:100;uniqueIndex:idx_device_instance" json:"instance_id"`
|
||||
LastHeartbeat *time.Time `json:"last_heartbeat"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
|
||||
Device UserDevice `gorm:"foreignKey:DeviceID" json:"device,omitempty"`
|
||||
User AppUser `gorm:"foreignKey:UserID" json:"user,omitempty"`
|
||||
Application Application `gorm:"foreignKey:ApplicationID" json:"application,omitempty"`
|
||||
}
|
||||
|
||||
// UserIP 用户IP绑定模型
|
||||
type UserIP struct {
|
||||
ID uint `gorm:"primaryKey" json:"id"`
|
||||
UserID uint `gorm:"index" json:"user_id"`
|
||||
ApplicationID uint `gorm:"index" json:"application_id"`
|
||||
IPAddress string `gorm:"size:50;index" json:"ip_address"`
|
||||
Status string `gorm:"size:20;default:active" json:"status"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
|
||||
|
||||
User AppUser `gorm:"foreignKey:UserID" json:"user,omitempty"`
|
||||
Application Application `gorm:"foreignKey:ApplicationID" json:"application,omitempty"`
|
||||
}
|
||||
|
||||
// PackHistory 加壳历史记录模型
|
||||
type PackHistory struct {
|
||||
ID uint `gorm:"primaryKey" json:"id"`
|
||||
ApplicationID uint `gorm:"index" json:"application_id"`
|
||||
UserID uint `gorm:"index" json:"user_id"`
|
||||
Filename string `gorm:"size:255" json:"filename"`
|
||||
FileSize int64 `json:"file_size"`
|
||||
MD5 string `gorm:"size:32" json:"md5"`
|
||||
DownloadURL string `gorm:"size:500" json:"download_url"`
|
||||
UploadTime time.Time `json:"upload_time"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
|
||||
Application Application `gorm:"foreignKey:ApplicationID" json:"application,omitempty"`
|
||||
User AppUser `gorm:"foreignKey:UserID" json:"user,omitempty"`
|
||||
}
|
||||
|
||||
// WebhookConfig Webhook配置
|
||||
type WebhookConfig struct {
|
||||
ID uint `gorm:"primaryKey" json:"id"`
|
||||
ApplicationID uint `gorm:"index;not null" json:"application_id"`
|
||||
Name string `gorm:"size:100;not null" json:"name"`
|
||||
URL string `gorm:"size:500;not null" json:"url"`
|
||||
SecretKey string `gorm:"size:255" json:"secret_key"`
|
||||
Events string `gorm:"type:text" json:"events"` // JSON数组存储订阅的事件类型
|
||||
Status string `gorm:"size:20;default:active" json:"status"`
|
||||
RetryCount int `gorm:"default:3" json:"retry_count"`
|
||||
Timeout int `gorm:"default:10" json:"timeout"` // 超时时间(秒)
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
|
||||
|
||||
Application Application `gorm:"foreignKey:ApplicationID" json:"application,omitempty"`
|
||||
}
|
||||
|
||||
// WebhookLog Webhook发送日志
|
||||
type WebhookLog struct {
|
||||
ID uint `gorm:"primaryKey" json:"id"`
|
||||
WebhookID uint `gorm:"index;not null" json:"webhook_id"`
|
||||
Event string `gorm:"size:50;not null" json:"event"`
|
||||
RequestData string `gorm:"type:text" json:"request_data"`
|
||||
ResponseCode int `json:"response_code"`
|
||||
ResponseData string `gorm:"type:text" json:"response_data"`
|
||||
Status string `gorm:"size:20" json:"status"` // success, failed, retrying
|
||||
RetryCount int `json:"retry_count"`
|
||||
ErrorMessage string `gorm:"type:text" json:"error_message"`
|
||||
Duration int `json:"duration"` // 请求耗时(毫秒)
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
|
||||
WebhookConfig WebhookConfig `gorm:"foreignKey:WebhookID" json:"webhook,omitempty"`
|
||||
}
|
||||
|
||||
// ExtensionAPIKey 扩展API密钥
|
||||
type ExtensionAPIKey struct {
|
||||
ID uint `gorm:"primaryKey" json:"id"`
|
||||
ApplicationID uint `gorm:"index;not null" json:"application_id"`
|
||||
Name string `gorm:"size:100;not null" json:"name"`
|
||||
AccessKey string `gorm:"uniqueIndex;size:64;not null" json:"access_key"`
|
||||
SecretKey string `gorm:"size:64;not null" json:"secret_key"`
|
||||
Permissions string `gorm:"type:text" json:"permissions"` // JSON数组存储权限列表
|
||||
Status string `gorm:"size:20;default:active" json:"status"`
|
||||
LastUsedAt *time.Time `json:"last_used_at"`
|
||||
ExpiresAt *time.Time `json:"expires_at"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
|
||||
|
||||
Application Application `gorm:"foreignKey:ApplicationID" json:"application,omitempty"`
|
||||
}
|
||||
|
||||
// ApiUsage API调用统计模型
|
||||
type ApiUsage struct {
|
||||
ID uint `gorm:"primaryKey" json:"id"`
|
||||
UserID uint `json:"user_id"`
|
||||
ApplicationID uint `json:"application_id"`
|
||||
Endpoint string `gorm:"size:255" json:"endpoint"`
|
||||
Method string `gorm:"size:10" json:"method"`
|
||||
IPAddress string `gorm:"size:50" json:"ip_address"`
|
||||
UserAgent string `gorm:"size:500" json:"user_agent"`
|
||||
ResponseTime int `json:"response_time"` // 响应时间(毫秒)
|
||||
StatusCode int `json:"status_code"`
|
||||
Success bool `json:"success"`
|
||||
ErrorMessage string `gorm:"type:text" json:"error_message"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
|
||||
User User `gorm:"foreignKey:UserID" json:"user,omitempty"`
|
||||
Application Application `gorm:"foreignKey:ApplicationID" json:"application,omitempty"`
|
||||
}
|
||||
|
||||
// StorageUsage 存储使用记录模型
|
||||
type StorageUsage struct {
|
||||
ID uint `gorm:"primaryKey" json:"id"`
|
||||
UserID uint `json:"user_id"`
|
||||
ApplicationID *uint `json:"application_id"`
|
||||
ResourceType string `gorm:"size:20" json:"resource_type"` // version, cloud_file
|
||||
ResourceID uint `json:"resource_id"`
|
||||
FileName string `gorm:"size:255" json:"file_name"`
|
||||
FileSize int64 `json:"file_size"`
|
||||
Action string `gorm:"size:20" json:"action"` // upload, delete
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
|
||||
User User `gorm:"foreignKey:UserID" json:"user,omitempty"`
|
||||
Application *Application `gorm:"foreignKey:ApplicationID" json:"application,omitempty"`
|
||||
}
|
||||
|
||||
// UsageAlertRecord 用量告警记录模型
|
||||
type UsageAlertRecord struct {
|
||||
ID uint `gorm:"primaryKey" json:"id"`
|
||||
UserID uint `json:"user_id"`
|
||||
Type string `gorm:"size:20" json:"type"` // api_calls, storage, package_expiry
|
||||
Level string `gorm:"size:20" json:"level"` // warning, critical
|
||||
Message string `gorm:"size:255" json:"message"`
|
||||
Usage float64 `json:"usage"`
|
||||
Limit float64 `json:"limit"`
|
||||
Percent float64 `json:"percent"`
|
||||
Status string `gorm:"size:20;default:sent" json:"status"` // sent, read
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
|
||||
User User `gorm:"foreignKey:UserID" json:"user,omitempty"`
|
||||
}
|
||||
|
||||
// Notification 站内通知模型
|
||||
type Notification struct {
|
||||
ID uint `gorm:"primaryKey" json:"id"`
|
||||
UserID uint `json:"user_id"`
|
||||
Title string `gorm:"size:100" json:"title"`
|
||||
Content string `gorm:"type:text" json:"content"`
|
||||
Type string `gorm:"size:20" json:"type"` // usage_alert, system, package
|
||||
IsRead bool `gorm:"default:false" json:"is_read"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
|
||||
User User `gorm:"foreignKey:UserID" json:"user,omitempty"`
|
||||
}
|
||||
Reference in New Issue
Block a user