Initial commit
This commit is contained in:
@@ -0,0 +1,363 @@
|
||||
package model
|
||||
|
||||
import (
|
||||
"time"
|
||||
)
|
||||
|
||||
// Network 组网模型 - 使用雪花算法生成 ID(uint64)
|
||||
type Network struct {
|
||||
ID uint64 `gorm:"primaryKey;type:bigint" json:"id"` // 雪花算法 ID
|
||||
Name string `gorm:"type:varchar(64);not null;uniqueIndex" json:"name"`
|
||||
SubnetIPv4 string `gorm:"type:varchar(18);not null" json:"subnet_ipv4"`
|
||||
SubnetIPv6 string `gorm:"type:varchar(43)" json:"subnet_ipv6,omitempty"`
|
||||
Mode string `gorm:"type:varchar(16);not null;default:'enhanced';index" json:"mesh_mode"` // native | enhanced
|
||||
WGMode string `gorm:"type:varchar(16);not null;default:'userspace'" json:"wg_mode"` // kernel | userspace
|
||||
PolicyID uint64 `gorm:"type:bigint;index" json:"policy_id"`
|
||||
DHCPEnabled bool `gorm:"default:true" json:"dhcp_enabled"`
|
||||
TunEnabled bool `gorm:"default:true" json:"tun_enabled"`
|
||||
TunName string `gorm:"type:varchar(16);default:'meshray-tun'" json:"tun_name"`
|
||||
MTU int `gorm:"default:1420" json:"mtu"`
|
||||
Password string `gorm:"type:varchar(128)" json:"-"` // AES-256-GCM 加密存储
|
||||
Status string `gorm:"type:varchar(16);default:'running';index" json:"status"` // running | stopped | error
|
||||
CreatedAt time.Time `gorm:"autoCreateTime" json:"created_at"`
|
||||
UpdatedAt time.Time `gorm:"autoUpdateTime" json:"updated_at"`
|
||||
|
||||
// 关联字段
|
||||
Devices []Device `gorm:"foreignKey:NetworkID" json:"devices,omitempty"`
|
||||
|
||||
// DDNS 同步字段
|
||||
DDNSEnabled bool `gorm:"default:false" json:"ddns_enabled"`
|
||||
DDNSServiceID string `gorm:"type:varchar(36);index" json:"ddns_service_id"` // ExternalService.ID
|
||||
DDNSUsageID string `gorm:"type:varchar(36);index" json:"ddns_usage_id"` // DDNSUsage.ID
|
||||
DDNSPrefix string `gorm:"type:varchar(255)" json:"ddns_prefix"` // TXT 记录前缀(如:_meshray.ABC123)
|
||||
}
|
||||
|
||||
// Device 设备模型 - 使用雪花算法生成 ID(uint64)
|
||||
type Device struct {
|
||||
ID uint64 `gorm:"primaryKey;type:bigint" json:"id"` // 雪花算法 ID
|
||||
NetworkID uint64 `gorm:"type:bigint;not null;index:idx_device_network" json:"network_id"` // 所属网络 ID
|
||||
Name string `gorm:"type:varchar(64);not null" json:"name"`
|
||||
VirtualIP string `gorm:"type:varchar(45);not null" json:"virtual_ip"`
|
||||
PublicKey string `gorm:"type:varchar(64);not null" json:"public_key"`
|
||||
PresharedKey string `gorm:"type:varchar(64)" json:"-"`
|
||||
Endpoint string `gorm:"type:varchar(261)" json:"endpoint,omitempty"` // 原始公网 Endpoint(host:port),用于增强模式回退
|
||||
IsRelayCapable bool `gorm:"default:false" json:"is_relay_capable"` // 是否作为 Mesh 中继节点
|
||||
Status string `gorm:"type:varchar(16);default:'offline';index" json:"status"` // online | offline
|
||||
LastSeen time.Time `json:"last_seen"`
|
||||
CreatedAt time.Time `gorm:"autoCreateTime" json:"created_at"`
|
||||
}
|
||||
|
||||
// Policy 传输策略模型
|
||||
type Policy struct {
|
||||
ID uint64 `gorm:"primaryKey;type:bigint" json:"id"` // Snowflake ID, matches Network.PolicyID
|
||||
Name string `gorm:"size:255;not null;index" json:"name"`
|
||||
Type string `gorm:"size:32;not null;default:'custom'" json:"type"` // system | custom
|
||||
Description string `gorm:"size:512" json:"description"`
|
||||
LayerConfig string `gorm:"type:text" json:"layer_config"` // JSON 格式存储 9 层链路配置
|
||||
GlobalParams string `gorm:"type:text" json:"global_params"` // JSON 格式存储全局参数
|
||||
Enabled bool `gorm:"default:true" json:"enabled"`
|
||||
IsDefault bool `gorm:"default:false" json:"is_default"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
}
|
||||
|
||||
// TURNAuthType TURN 鉴权方式
|
||||
type TURNAuthType string
|
||||
|
||||
const (
|
||||
TURNAuthCredential TURNAuthType = "credential" // Username + Password(RFC 5766,自建 coturn)
|
||||
TURNAuthToken TURNAuthType = "token" // 临时 Token(商业 TURN 服务:Twilio、Xirsys 等)
|
||||
TURNAuthSecret TURNAuthType = "secret" // Shared Secret(由信令服务器签发临时凭证)
|
||||
)
|
||||
|
||||
// Service 服务模型 - 前端用户视角的服务实例
|
||||
type Service struct {
|
||||
ID string `gorm:"primaryKey;type:varchar(36)" json:"id"`
|
||||
Name string `gorm:"type:varchar(64);not null" json:"name"`
|
||||
Type string `gorm:"type:varchar(8);not null;index" json:"type"` // "tun"/"turn"/"ddns"
|
||||
Address string `gorm:"type:varchar(255);not null" json:"address"`
|
||||
Port int `gorm:"not null" json:"port"`
|
||||
Protocols []string `gorm:"type:text;serializer:json" json:"protocols"` // JSON: ["udp","tcp","tls","ws","wss"]
|
||||
AuthType string `gorm:"type:varchar(16)" json:"auth_type,omitempty"`
|
||||
AuthUsername string `gorm:"type:varchar(128)" json:"username,omitempty"`
|
||||
AuthPassword string `gorm:"type:varchar(128)" json:"password,omitempty"` // 仅用于输入,存储时仍需加密处理
|
||||
Token string `gorm:"type:text" json:"token,omitempty"`
|
||||
SharedSecret string `gorm:"type:varchar(128)" json:"shared_secret,omitempty"`
|
||||
MTU int `gorm:"default:1420" json:"mtu,omitempty"`
|
||||
Provider string `gorm:"type:varchar(32)" json:"provider,omitempty"`
|
||||
Domain string `gorm:"type:varchar(255)" json:"domain,omitempty"`
|
||||
RecordType string `gorm:"type:varchar(8)" json:"record_type,omitempty"`
|
||||
// DDNS 全功能模式字段
|
||||
ConfigMode string `gorm:"type:varchar(16);default:'infrastructure'" json:"config_mode"` // "infrastructure" | "fullservice"
|
||||
DDNSConfigID string `gorm:"type:varchar(36)" json:"ddns_config_id,omitempty"` // 关联的 DDNS 配置 ID(全功能模式)
|
||||
Subdomain string `gorm:"type:varchar(255)" json:"subdomain,omitempty"` // 主机记录(全功能模式)
|
||||
TargetIP string `gorm:"type:varchar(64)" json:"target_ip,omitempty"` // 目标 IP(全功能模式)
|
||||
TXTRecordName string `gorm:"type:varchar(255)" json:"txt_record_name,omitempty"` // TXT 记录名称(全功能模式)
|
||||
TXTValue string `gorm:"type:text" json:"txt_value,omitempty"` // TXT 记录值(全功能模式)
|
||||
CNAMETarget string `gorm:"type:varchar(255)" json:"cname_target,omitempty"` // CNAME 目标域名(全功能模式)
|
||||
TTL int `gorm:"default:600" json:"ttl,omitempty"` // TTL(全功能模式)
|
||||
Status string `gorm:"type:varchar(16);default:'active'" json:"status"` // active | inactive
|
||||
Reachable bool `gorm:"-" json:"reachable"` // 连通性状态
|
||||
Latency int `gorm:"-" json:"latency"` // 延迟
|
||||
WSEnabled bool `gorm:"default:false" json:"ws_enabled"`
|
||||
IndependentWS string `gorm:"type:text" json:"independent_ws,omitempty"` // JSON: {address, port, wss}
|
||||
Enabled bool `gorm:"default:true;index" json:"enabled"`
|
||||
CreatedAt time.Time `gorm:"autoCreateTime" json:"created_at"`
|
||||
UpdatedAt time.Time `gorm:"autoUpdateTime" json:"updated_at"`
|
||||
}
|
||||
|
||||
// ExternalService 外部服务模型 - 统一管理所有外部依赖服务
|
||||
// 按照 README 6.4 节定义,通过 category + serviceType + config JSON 实现无限扩展
|
||||
type ExternalService struct {
|
||||
ID string `gorm:"primaryKey;type:varchar(36)" json:"id"`
|
||||
Category string `gorm:"type:varchar(32);not null;index" json:"category"` // "networking" / "dns" / "security" / "gateway" / "automation"
|
||||
ServiceType string `gorm:"type:varchar(64);not null;index" json:"service_type"` // stun_server / turn_server / ddns_aliyun / ssl_acme 等
|
||||
Name string `gorm:"type:varchar(64);not null" json:"name"`
|
||||
Enabled bool `gorm:"default:true;index" json:"enabled"`
|
||||
Address string `gorm:"type:varchar(255)" json:"address,omitempty"` // 服务器地址(可选)
|
||||
Port int `json:"port,omitempty"` // 端口(可选)
|
||||
Config string `gorm:"type:text;not null" json:"config"` // JSON,结构由 serviceType 决定(敏感字段加密)
|
||||
Status string `gorm:"type:varchar(16);default:'unknown';index" json:"status"` // reachable / unreachable / unknown
|
||||
LastTestAt *time.Time `json:"last_test_at,omitempty"` // 最后测试时间
|
||||
LatencyMs int `gorm:"default:0" json:"latency_ms"` // 延迟(ms)
|
||||
CreatedAt time.Time `gorm:"autoCreateTime" json:"created_at"`
|
||||
UpdatedAt time.Time `gorm:"autoUpdateTime" json:"updated_at"`
|
||||
}
|
||||
|
||||
// SystemSetting 系统设置模型 - 单例模式,全局只有一条记录
|
||||
type SystemSetting struct {
|
||||
ID uint `gorm:"primaryKey;type:bigint" json:"id"` // 固定为 1
|
||||
ServerIP string `gorm:"type:varchar(45)" json:"server_ip"` // 服务端公网 IP
|
||||
ServerPort int `gorm:"default:51820" json:"server_port"` // WireGuard 监听端口
|
||||
ServerPublicKey string `gorm:"type:varchar(64)" json:"server_public_key,omitempty"` // WireGuard 服务端公钥
|
||||
DDNSDomain string `gorm:"type:varchar(255)" json:"ddns_domain"` // DDNS 域名(如 mesh.example.com)
|
||||
TURNMode string `gorm:"type:varchar(16);default:'auto'" json:"turn_mode"` // auto/manual
|
||||
TURNURL string `gorm:"type:varchar(255)" json:"turn_url"` // TURN 服务器 URL(手动模式)
|
||||
TURNUsername string `gorm:"type:varchar(128)" json:"turn_username,omitempty"` // TURN 用户名
|
||||
TURNPassword string `gorm:"type:varchar(128)" json:"-"` // TURN 密码(加密存储)
|
||||
LogLevel string `gorm:"type:varchar(16);default:'info'" json:"log_level"` // debug/info/warn/error
|
||||
LogFormat string `gorm:"type:varchar(16);default:'console'" json:"log_format"` // console/json
|
||||
MaxBackups int `gorm:"default:7" json:"max_backups"` // 日志最大保留份数
|
||||
MaxAge int `gorm:"default:30" json:"max_age"` // 日志最大保留天数
|
||||
Theme string `gorm:"type:varchar(32);default:'light'" json:"theme"` // light/dark/auto
|
||||
Language string `gorm:"type:varchar(16);default:'zh-CN'" json:"language"` // zh-CN/en-US
|
||||
CreatedAt time.Time `gorm:"autoCreateTime" json:"createdAt"`
|
||||
UpdatedAt time.Time `gorm:"autoUpdateTime" json:"updatedAt"`
|
||||
}
|
||||
|
||||
// DDNSProvider DDNS 服务商配置模型(配置层)
|
||||
type DDNSProvider struct {
|
||||
ID string `gorm:"primaryKey;type:varchar(36)" json:"id"`
|
||||
Name string `gorm:"type:varchar(64);not null" json:"name"` // 服务商名称,如 "Cloudflare-Mesh"
|
||||
Provider string `gorm:"type:varchar(32);not null" json:"provider"` // cloudflare, aliyun, tencent
|
||||
Domain string `gorm:"type:varchar(255);not null" json:"domain"` // 主域名
|
||||
AccessKey string `gorm:"type:varchar(255)" json:"-"` // 加密存储
|
||||
SecretKey string `gorm:"type:text" json:"-"` // 加密存储
|
||||
Config string `gorm:"type:text" json:"config"` // JSON 扩展配置
|
||||
Enabled bool `gorm:"default:true" json:"enabled"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
}
|
||||
|
||||
// DDNSUsageType DDNS 用途类型
|
||||
type DDNSUsageType string
|
||||
|
||||
const (
|
||||
DDNSUsageMeshSeedSync DDNSUsageType = "meshseed_sync" // MeshSeed 同步(TXT 记录)
|
||||
DDNSUsageIPResolve DDNSUsageType = "ip_resolve" // IP 动态解析(A/AAAA 记录)
|
||||
DDNSUsageDeviceBind DDNSUsageType = "device_bind" // 设备域名绑定(CNAME 记录)
|
||||
)
|
||||
|
||||
// DDNSUsage DDNS 用途定义模型(应用层)
|
||||
type DDNSUsage struct {
|
||||
ID string `gorm:"primaryKey;type:varchar(36)" json:"id"`
|
||||
ProviderID string `gorm:"type:varchar(36);not null;index" json:"provider_id"` // 关联的 Provider(即 ExternalService.ID)
|
||||
UsageType DDNSUsageType `gorm:"type:varchar(32);not null" json:"usage_type"`
|
||||
RecordType string `gorm:"type:varchar(8);not null" json:"record_type"` // TXT, A, AAAA, CNAME
|
||||
RecordPrefix string `gorm:"type:varchar(255);not null" json:"record_prefix"` // 记录前缀
|
||||
Description string `gorm:"type:varchar(512)" json:"description"`
|
||||
IsExclusive bool `gorm:"default:false" json:"is_exclusive"` // 是否独占
|
||||
PrefixMode string `gorm:"type:varchar(16);not null;default:'auto'" json:"prefix_mode"` // "auto" | "custom"
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
|
||||
// 关联关系
|
||||
Provider *DDNSProvider `gorm:"foreignKey:ProviderID" json:"provider,omitempty"`
|
||||
}
|
||||
|
||||
// NetworkDDNSBinding 网络 DDNS 绑定模型(使用层)
|
||||
type NetworkDDNSBinding struct {
|
||||
ID string `gorm:"primaryKey;type:varchar(36)" json:"id"`
|
||||
NetworkID uint64 `gorm:"type:bigint;not null;uniqueIndex" json:"network_id"` // 每个网络只能绑定一个
|
||||
UsageID string `gorm:"type:varchar(36);not null" json:"usage_id"` // 选择的用途
|
||||
ProviderID string `gorm:"type:varchar(36);not null" json:"provider_id"` // 冗余存储
|
||||
Status string `gorm:"type:varchar(16);default:'active'" json:"status"` // active, sync_pending, sync_failed
|
||||
LastSyncAt *time.Time `json:"last_sync_at"`
|
||||
SyncMessage string `gorm:"type:text" json:"sync_message"` // 同步结果/错误信息
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
|
||||
// 关联字段
|
||||
Network *Network `gorm:"foreignKey:NetworkID" json:"network,omitempty"`
|
||||
Usage *DDNSUsage `gorm:"foreignKey:UsageID" json:"usage,omitempty"`
|
||||
}
|
||||
|
||||
// MeshSeed 组网凭证模型
|
||||
type MeshSeed struct {
|
||||
ID uint `gorm:"primaryKey" json:"id"`
|
||||
SeedID string `gorm:"size:64;not null;uniqueIndex" json:"seed_id"` // 16 字节随机 Base64
|
||||
NetworkID uint64 `gorm:"type:bigint;not null;index" json:"network_id"` // ✅ 与 Network.ID 类型一致
|
||||
Network *Network `gorm:"foreignKey:NetworkID" json:"network,omitempty"`
|
||||
JoinToken string `gorm:"size:512;not null" json:"join_token"` // Base64 编码的完整 MeshSeed
|
||||
Signature string `gorm:"size:512;not null" json:"signature"` // Ed25519 签名
|
||||
IssuerNodeID string `gorm:"size:255;not null" json:"issuer_node_id"`
|
||||
MaxUses int `gorm:"default:10" json:"max_uses"`
|
||||
UsedCount int `gorm:"default:0" json:"used_count"`
|
||||
ExpiresAt time.Time `gorm:"index" json:"expires_at"`
|
||||
DDNSEnabled bool `gorm:"default:false" json:"ddns_enabled"`
|
||||
UpdateVersion int `gorm:"default:0" json:"update_version"`
|
||||
DDNSDomain string `gorm:"size:255" json:"ddns_domain"`
|
||||
Revoked bool `gorm:"default:false" json:"revoked"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
}
|
||||
|
||||
// SecurityKey 安全密钥模型(用于存储 Ed25519 签名密钥等)
|
||||
type SecurityKey struct {
|
||||
ID uint `gorm:"primaryKey" json:"id"`
|
||||
Name string `gorm:"size:64;not null;uniqueIndex" json:"name"` // 密钥名称,如 "meshseed_signing"
|
||||
Value string `gorm:"size:512;not null" json:"-"` // Base64 编码的密钥值
|
||||
Algorithm string `gorm:"size:32;not null" json:"algorithm"` // 算法类型:ed25519, rsa 等
|
||||
Purpose string `gorm:"size:128" json:"purpose"` // 用途描述
|
||||
CreatedAt time.Time `gorm:"autoCreateTime" json:"createdAt"`
|
||||
UpdatedAt time.Time `gorm:"autoUpdateTime" json:"updatedAt"`
|
||||
}
|
||||
|
||||
// PendingJoin 待加入审核模型
|
||||
type PendingJoin struct {
|
||||
ID uint `gorm:"primaryKey" json:"id"`
|
||||
SeedID string `gorm:"size:64;not null;index" json:"seed_id"`
|
||||
DeviceName string `gorm:"size:255;not null" json:"device_name"`
|
||||
RequestIP string `gorm:"size:64" json:"request_ip"`
|
||||
Status string `gorm:"size:32;default:'pending'" json:"status"` // pending | approved | rejected
|
||||
ExpireAt time.Time `gorm:"index" json:"expire_at"` // 72 小时超时
|
||||
ApprovedAt *time.Time `json:"approved_at"`
|
||||
RejectedAt *time.Time `json:"rejected_at"`
|
||||
Reason string `gorm:"size:512" json:"reason"` // 拒绝原因
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
}
|
||||
|
||||
// AlertRule 告警规则模型
|
||||
type AlertRule struct {
|
||||
ID uint `gorm:"primaryKey" json:"id"`
|
||||
Type string `gorm:"size:32;not null;index" json:"type"` // resource | link | service
|
||||
Name string `gorm:"size:255;not null" json:"name"`
|
||||
Threshold float64 `gorm:"not null" json:"threshold"`
|
||||
Operator string `gorm:"size:8;not null" json:"operator"` // gt | lt | eq
|
||||
NotifyEmail bool `gorm:"default:false" json:"notify_email"`
|
||||
NotifyWebhook bool `gorm:"default:false" json:"notify_webhook"`
|
||||
WebhookURL string `gorm:"size:512" json:"webhook_url"`
|
||||
Enabled bool `gorm:"default:true" json:"enabled"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
}
|
||||
|
||||
// User 用户模型
|
||||
type User struct {
|
||||
ID uint `gorm:"primaryKey" json:"id"`
|
||||
Username string `gorm:"size:64;not null;uniqueIndex" json:"username"`
|
||||
PasswordHash string `gorm:"size:255;not null" json:"-"` // bcrypt 加密存储
|
||||
Email string `gorm:"size:255" json:"email"`
|
||||
Role string `gorm:"size:32;default:'user'" json:"role"` // admin | user
|
||||
Status string `gorm:"size:32;default:'active'" json:"status"` // active | banned
|
||||
LastLoginAt time.Time `json:"last_login_at,omitempty"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
}
|
||||
|
||||
// AuditLog 审计日志模型
|
||||
type AuditLog struct {
|
||||
ID uint `gorm:"primaryKey" json:"id"`
|
||||
Action string `gorm:"size:64;not null;index" json:"action"` // create_network | delete_network | generate_seed | etc.
|
||||
OperatorIP string `gorm:"size:64;not null" json:"operator_ip"`
|
||||
UserAgent string `gorm:"size:512" json:"user_agent"`
|
||||
Detail string `gorm:"type:text" json:"detail"` // JSON 格式存储详细信息
|
||||
CreatedAt time.Time `gorm:"index" json:"created_at"`
|
||||
}
|
||||
|
||||
// SystemConfig 系统配置模型(全局唯一)
|
||||
type SystemConfig struct {
|
||||
ID uint `gorm:"primaryKey" json:"id"`
|
||||
Key string `gorm:"size:64;not null;uniqueIndex" json:"key"` // 配置键,如 "wg_mode"
|
||||
Value string `gorm:"size:255;not null" json:"value"` // 配置值,如 "auto" | "kernel" | "userspace"
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
}
|
||||
|
||||
// Notification 通知模型
|
||||
type Notification struct {
|
||||
ID uint `gorm:"primaryKey" json:"id"`
|
||||
UserID uint `gorm:"not null;index" json:"user_id"` // 接收用户 ID
|
||||
Type string `gorm:"size:32;not null;index" json:"type"` // alert/system/update/ddns
|
||||
Priority int `gorm:"default:2;index" json:"priority"` // 1=low, 2=medium, 3=high
|
||||
Title string `gorm:"size:255;not null" json:"title"`
|
||||
Message string `gorm:"type:text;not null" json:"message"`
|
||||
Data string `gorm:"type:text" json:"data,omitempty"` // JSON 格式额外数据
|
||||
IsRead bool `gorm:"default:false;index" json:"is_read"` // 是否已读
|
||||
ReadAt *time.Time `json:"read_at,omitempty"` // 阅读时间
|
||||
CreatedAt time.Time `gorm:"autoCreateTime;index" json:"created_at"` // 创建时间
|
||||
}
|
||||
|
||||
// DDNSConfig DDNS 配置模型
|
||||
type DDNSConfig struct {
|
||||
ID string `gorm:"primaryKey;type:varchar(36)" json:"id"`
|
||||
Provider string `gorm:"type:varchar(32);not null" json:"provider"` // aliyun | tencent
|
||||
AccessKey string `gorm:"type:varchar(128);not null" json:"accessKey"`
|
||||
SecretKey string `gorm:"type:varchar(128);not null" json:"-"` // AES-256-GCM 加密存储
|
||||
Domain string `gorm:"type:varchar(255);not null" json:"domain"`
|
||||
TXTRecordName string `gorm:"type:varchar(255)" json:"txtRecordName"` // 自动生成
|
||||
SyncMode string `gorm:"type:varchar(16);default:'auto'" json:"syncMode"` // auto | manual
|
||||
RetryCount int `gorm:"default:10" json:"retryCount"`
|
||||
RetryInterval int `gorm:"default:300" json:"retryInterval"` // 秒
|
||||
Enabled bool `gorm:"default:true" json:"enabled"`
|
||||
CreatedAt time.Time `gorm:"autoCreateTime" json:"createdAt"`
|
||||
UpdatedAt time.Time `gorm:"autoUpdateTime" json:"updatedAt"`
|
||||
}
|
||||
|
||||
// NetworkMemberRole 网络成员角色
|
||||
type NetworkMemberRole string
|
||||
|
||||
const (
|
||||
RoleOwner NetworkMemberRole = "owner" // 创建者,拥有所有权限
|
||||
RoleMember NetworkMemberRole = "member" // 加入者,只能使用网络
|
||||
)
|
||||
|
||||
// NetworkMember 网络成员表 - 管理网络成员及其角色
|
||||
type NetworkMember struct {
|
||||
ID uint64 `gorm:"primaryKey;type:bigint" json:"id"`
|
||||
NetworkID uint64 `gorm:"type:bigint;not null;uniqueIndex:idx_network_user" json:"networkID"`
|
||||
UserID uint64 `gorm:"type:bigint;not null;uniqueIndex:idx_network_user" json:"userID"`
|
||||
Role NetworkMemberRole `gorm:"type:varchar(16);not null;default:'member'" json:"role"` // owner | member
|
||||
JoinedAt time.Time `gorm:"autoCreateTime" json:"joinedAt"`
|
||||
|
||||
// 关联
|
||||
Network *Network `gorm:"foreignKey:NetworkID" json:"network,omitempty"`
|
||||
User *User `gorm:"foreignKey:UserID" json:"user,omitempty"`
|
||||
}
|
||||
|
||||
// TableName 指定表名
|
||||
func (NetworkMember) TableName() string {
|
||||
return "network_members"
|
||||
}
|
||||
|
||||
// Permission 权限类型
|
||||
type Permission string
|
||||
|
||||
const (
|
||||
PermManageNetwork Permission = "manage_network" // 管理网络配置
|
||||
PermAddPeer Permission = "add_peer" // 添加节点
|
||||
PermRemovePeer Permission = "remove_peer" // 移除节点
|
||||
PermKickMember Permission = "kick_member" // 踢出成员
|
||||
PermUpdateConfig Permission = "update_config" // 更新组网参数
|
||||
PermDeleteNetwork Permission = "delete_network" // 解散网络
|
||||
PermLeaveNetwork Permission = "leave_network" // 退出网络
|
||||
)
|
||||
Reference in New Issue
Block a user