feat: AI预测分析接入真实后端数据 + 修复CloudBilling文件损坏

- AIPredictiveAnalytics: 替换3组硬编码mock为实时数据驱动预测
  - 指标预测: 基于dashboard metrics时序数据(cpu/memory/disk)线性回归计算斜率与R²
  - 容量规划: 基于日均增长率推算阈值触及时间(天),动态生成AI扩容建议
  - 异常预测: 基于告警规则阈值+当前趋势+事件频率计算异常触发概率
  - 概览卡片数据驱动化(置信度基于R²拟合度,高风险/容量预警计数实时计算)
- CloudBilling.tsx: 修复read_file导致的行号前缀损坏(501行全部含N|前缀)
This commit is contained in:
attacker committed 2026-06-14 21:13:49 +08:00
1 parent 0ebe22d142
commit 2da4f52209
17 files changed
+2299 -322

No files matched your search

+70
View File
@@ -70,6 +70,9 @@ func generateMockData(db *gorm.DB) error {
if err := generateNavigations(db); err != nil {
return err
}
if err := generateBillings(db); err != nil {
return err
}
return nil
}
@@ -564,6 +567,73 @@ func generateNavigations(db *gorm.DB) error {
return nil
}
func generateBillings(db *gorm.DB) error {
accounts := []struct {
ID uint
Name string
Provider string
}{
{1, "阿里云主账号", "aliyun"},
{2, "腾讯云生产环境", "tencent"},
{3, "AWS海外业务", "aws"},
{4, "华为云政务云", "huawei"},
}
services := map[string][]string{
"aliyun": {"ECS云服务器", "RDS数据库", "OSS对象存储", "SLB负载均衡", "CDN加速"},
"tencent": {"CVM云服务器", "CDB数据库", "COS对象存储", "CLB负载均衡", "CDN加速"},
"aws": {"EC2", "RDS", "S3", "CloudFront", "Lambda"},
"huawei": {"ECS弹性云服务器", "RDS数据库", "OBS对象存储", "ELB弹性负载均衡"},
}
now := time.Now()
var billings []models.CloudBilling
// 生成最近60天每天的账单
for day := 59; day >= 0; day-- {
date := now.AddDate(0, 0, -day).Format("2006-01-02")
for _, acc := range accounts {
// 每个账号每天 1-3 条记录(不同服务)
svcs := services[acc.Provider]
count := 1 + rand.Intn(3)
for i := 0; i < count; i++ {
svc := svcs[rand.Intn(len(svcs))]
cost := 50 + rand.Float64()*500
billings = append(billings, models.CloudBilling{
CloudAccountID: &acc.ID,
AccountName: acc.Name,
Provider: acc.Provider,
BillingDate: date,
Cost: cost,
Currency: "CNY",
Service: svc,
})
}
}
}
for i := range billings {
if err := db.Create(&billings[i]).Error; err != nil {
// skip duplicates
continue
}
}
fmt.Println("Generated cloud billings:", len(billings))
// 生成预警规则
rules := []models.BillingAlertRule{
{Name: "每日总成本超500元", Metric: "daily", Threshold: 500, Operator: ">", Enabled: true},
{Name: "阿里云日费用超300元", Provider: "aliyun", Metric: "daily", Threshold: 300, Operator: ">", Enabled: true},
{Name: "月度总成本超1万元", Metric: "monthly", Threshold: 10000, Operator: ">", Enabled: true},
}
for i := range rules {
db.Create(&rules[i])
}
fmt.Println("Generated billing alert rules:", len(rules))
return nil
}
func randomString(length int) string {
const charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
b := make([]byte, length)