后端双协议: 新增 anthropic.go(Complete/Stream/工具转换) + client.go 工厂按 Protocol 路由; llm.Client 加 Stream; llm_chat 三方法收敛复用 llm.Client; resolveProtocol 按 provider 路由; Agent CLI 注入协议。编码套餐(GLM-5.2/Kimi/MiMo/Anthropic)走 Anthropic /v1/messages。 SSH凭证修复: applyCredential 正确解析凭证 JSON 的 private_key(旧实现把整个 JSON 当私钥 → ssh.ParsePrivateKey 失败 → ssh-key 登录不通); AssignCredential/批量导入/单台 CRUD 三处统一; 单台补齐 credential_id 字段(原被忽略)。 容量预测: 新增 AI 深度解读(buildCapacityInsightPrompt + PredictiveCapacityTab 按钮, 复用 aiApi.chat)。 其他: DeepSeek 模型名更新为 deepseek-v4-flash/pro; 智能助手去掉重复模型配置按钮; LLMConfig 精简生成参数(Claude Code 式)。 Co-Authored-By: Claude <noreply@anthropic.com>
220 lines
9.0 KiB
Go
220 lines
9.0 KiB
Go
package model
|
|
|
|
import (
|
|
"time"
|
|
|
|
)
|
|
|
|
// Server 服务器模型
|
|
type Server struct {
|
|
ID uint `gorm:"primarykey" json:"id"`
|
|
Hostname string `gorm:"size:128;not null" json:"hostname"`
|
|
IP string `gorm:"size:64;not null" json:"ip"`
|
|
PublicIP string `gorm:"size:64" json:"public_ip"`
|
|
Port int `gorm:"default:22" json:"port"`
|
|
Username string `gorm:"size:64;default:root" json:"username"`
|
|
Password string `gorm:"size:255" json:"-"`
|
|
SSHKey string `gorm:"type:text" json:"-"`
|
|
AuthType string `gorm:"size:32;default:password" json:"auth_type"` // password, key
|
|
OS string `gorm:"size:64" json:"os"`
|
|
Kernel string `gorm:"size:64" json:"kernel"`
|
|
OSVersion string `gorm:"size:64" json:"os_version"`
|
|
Arch string `gorm:"size:32" json:"arch"`
|
|
CPU int `json:"cpu"`
|
|
Memory int64 `json:"memory"` // MB
|
|
Disk int64 `json:"disk"` // GB
|
|
Status string `gorm:"size:32;default:stopped" json:"status"` // running, stopped, maintenance, error
|
|
CPUUsage float64 `json:"cpu_usage"`
|
|
MemoryUsage float64 `json:"memory_usage"`
|
|
DiskUsage float64 `json:"disk_usage"`
|
|
Uptime int64 `json:"uptime"` // seconds
|
|
AgentVersion string `gorm:"size:32" json:"agent_version"`
|
|
AgentStatus string `gorm:"size:32;default:offline" json:"agent_status"` // online, offline
|
|
HasAuth bool `gorm:"-" json:"has_auth"` // 是否有认证凭据(密码或SSH密钥) — 不存DB,handler 计算后返回 // Logan.Li
|
|
RegionID *uint `json:"region_id"`
|
|
CloudID *uint `json:"cloud_id"`
|
|
Tags string `gorm:"type:text" json:"tags"` // JSON
|
|
Description string `gorm:"size:500" json:"description"`
|
|
LastCheckAt *time.Time `json:"last_check_at"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
|
|
// 关联
|
|
Region *Region `json:"region,omitempty"`
|
|
Cloud *Cloud `json:"cloud,omitempty"`
|
|
}
|
|
|
|
// TableName 表名
|
|
func (Server) TableName() string {
|
|
return "asset_servers"
|
|
}
|
|
|
|
// Cloud 云平台模型
|
|
type Cloud struct {
|
|
ID uint `gorm:"primarykey" json:"id"`
|
|
Name string `gorm:"size:64;not null" json:"name"`
|
|
Code string `gorm:"size:64;uniqueIndex;not null" json:"code"`
|
|
Type string `gorm:"size:32;default:public" json:"type"` // public, private, hybrid
|
|
Status string `gorm:"size:32;default:active" json:"status"`
|
|
Website string `gorm:"size:255" json:"website"`
|
|
Description string `gorm:"size:500" json:"description"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
}
|
|
|
|
// TableName 表名
|
|
func (Cloud) TableName() string {
|
|
return "asset_clouds"
|
|
}
|
|
|
|
// CloudAccount 云账号模型
|
|
type CloudAccount struct {
|
|
ID uint `gorm:"primarykey" json:"id"`
|
|
Name string `gorm:"size:128;not null" json:"name"`
|
|
Provider string `gorm:"size:64;not null" json:"provider"` // aws, aliyun, tencent, huawei, azure
|
|
AccessKey string `gorm:"size:255;not null" json:"-"`
|
|
SecretKey string `gorm:"size:255;not null" json:"-"`
|
|
Status string `gorm:"size:32;default:active" json:"status"` // active, inactive, error
|
|
RegionCount int `gorm:"default:0" json:"region_count"`
|
|
ServerCount int `gorm:"default:0" json:"server_count"`
|
|
MonthlyCost float64 `gorm:"default:0" json:"monthly_cost"` // 月费用(元),驱动仪表盘成本统计
|
|
LastSyncAt *time.Time `json:"last_sync_at"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
}
|
|
|
|
// TableName 表名
|
|
func (CloudAccount) TableName() string {
|
|
return "asset_cloud_accounts"
|
|
}
|
|
|
|
// Region 区域模型
|
|
type Region struct {
|
|
ID uint `gorm:"primarykey" json:"id"`
|
|
Name string `gorm:"size:64;not null" json:"name"`
|
|
Code string `gorm:"size:64;uniqueIndex;not null" json:"code"`
|
|
Provider string `gorm:"size:64;not null" json:"provider"`
|
|
Location string `gorm:"size:128" json:"location"`
|
|
Status string `gorm:"size:32;default:active" json:"status"`
|
|
Endpoint string `gorm:"size:255" json:"endpoint"`
|
|
VPCCount int `gorm:"default:0" json:"vpc_count"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
}
|
|
|
|
// TableName 表名
|
|
func (Region) TableName() string {
|
|
return "asset_regions"
|
|
}
|
|
|
|
// Domain 域名模型
|
|
type Domain struct {
|
|
ID uint `gorm:"primarykey" json:"id"`
|
|
Name string `gorm:"size:255;uniqueIndex;not null" json:"name"`
|
|
Registrar string `gorm:"size:128" json:"registrar"`
|
|
Status string `gorm:"size:32;default:active" json:"status"` // active, expired, pending
|
|
ExpireDate *time.Time `json:"expire_date"`
|
|
DNSProvider string `gorm:"size:128" json:"dns_provider"`
|
|
RecordCount int `gorm:"default:0" json:"record_count"`
|
|
SSLEnabled bool `gorm:"default:false" json:"ssl_enabled"`
|
|
SSLExpireDate *time.Time `json:"ssl_expire_date"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
}
|
|
|
|
// TableName 表名
|
|
func (Domain) TableName() string {
|
|
return "asset_domains"
|
|
}
|
|
|
|
// CreateServerRequest 创建服务器请求
|
|
type CreateServerRequest struct {
|
|
Hostname string `json:"hostname" binding:"required"`
|
|
IP string `json:"ip" binding:"required,ip"`
|
|
PublicIP string `json:"public_ip" binding:"omitempty,ip"`
|
|
Port int `json:"port" binding:"omitempty,min=1,max=65535"`
|
|
Username string `json:"username"`
|
|
Password string `json:"password"`
|
|
SSHKey string `json:"ssh_key"`
|
|
AuthType string `json:"auth_type" binding:"omitempty,oneof=password key"`
|
|
CredentialID *uint `json:"credential_id,omitempty"` // 关联 SSH 凭证,非空则后端解密覆盖认证字段
|
|
OS string `json:"os"`
|
|
CPU int `json:"cpu"`
|
|
Memory int64 `json:"memory"`
|
|
Disk int64 `json:"disk"`
|
|
Status string `json:"status" binding:"omitempty,oneof=running stopped maintenance error"`
|
|
RegionID *uint `json:"region_id"`
|
|
CloudID *uint `json:"cloud_id"`
|
|
Tags string `json:"tags"`
|
|
Description string `json:"description"`
|
|
}
|
|
|
|
// UpdateServerRequest 更新服务器请求
|
|
type UpdateServerRequest struct {
|
|
Hostname string `json:"hostname"`
|
|
IP string `json:"ip" binding:"omitempty,ip"`
|
|
PublicIP string `json:"public_ip" binding:"omitempty,ip"`
|
|
Port int `json:"port" binding:"omitempty,min=1,max=65535"`
|
|
Username string `json:"username"`
|
|
Password string `json:"password"`
|
|
SSHKey string `json:"ssh_key"`
|
|
AuthType string `json:"auth_type" binding:"omitempty,oneof=password key"`
|
|
CredentialID *uint `json:"credential_id,omitempty"` // 关联 SSH 凭证,非空则后端解密覆盖认证字段
|
|
OS string `json:"os"`
|
|
CPU int `json:"cpu"`
|
|
Memory int64 `json:"memory"`
|
|
Disk int64 `json:"disk"`
|
|
Status string `json:"status" binding:"omitempty,oneof=running stopped maintenance error"`
|
|
RegionID *uint `json:"region_id"`
|
|
CloudID *uint `json:"cloud_id"`
|
|
Tags string `json:"tags"`
|
|
Description string `json:"description"`
|
|
}
|
|
|
|
// BatchServerItem 批量导入单条服务器 // Logan.Li
|
|
type BatchServerItem struct {
|
|
Hostname string `json:"hostname"`
|
|
IP string `json:"ip"`
|
|
Port int `json:"port"`
|
|
Username string `json:"username"`
|
|
OS string `json:"os"`
|
|
CPU int `json:"cpu"`
|
|
Memory int64 `json:"memory"` // GB(后端转 MB 存储)
|
|
Disk int64 `json:"disk"` // GB
|
|
Tags string `json:"tags"`
|
|
}
|
|
|
|
// BatchCreateServerRequest 批量导入服务器请求 // Logan.Li
|
|
type BatchCreateServerRequest struct {
|
|
Servers []BatchServerItem `json:"servers"`
|
|
RegionID *uint `json:"region_id"`
|
|
AuthType string `json:"auth_type"`
|
|
CredentialID *uint `json:"credential_id"` // 凭据ID,非空则解密后写入每台服务器
|
|
}
|
|
|
|
// BatchCreateResult 批量导入结果 // Logan.Li
|
|
type BatchCreateResult struct {
|
|
Success int `json:"success"`
|
|
Skipped int `json:"skipped"`
|
|
Failed int `json:"failed"`
|
|
Errors []string `json:"errors"`
|
|
}
|
|
|
|
// ServerListResponse 服务器列表响应
|
|
type ServerListResponse struct {
|
|
List []Server `json:"list"`
|
|
Total int64 `json:"total"`
|
|
}
|
|
|
|
// ServerStats 服务器统计
|
|
type ServerStats struct {
|
|
Total int64 `json:"total"`
|
|
Running int64 `json:"running"`
|
|
Stopped int64 `json:"stopped"`
|
|
Maintenance int64 `json:"maintenance"`
|
|
Error int64 `json:"error"`
|
|
AvgCPU float64 `json:"avg_cpu"`
|
|
AvgMemory float64 `json:"avg_memory"`
|
|
AvgDisk float64 `json:"avg_disk"`
|
|
}
|