feat: 修复仪表盘数据管线 — 补充应用发布种子数据 + 修复limit参数解析 + LDAP认证集成 + User类型完善

后端改进:
- 修复 dashboard/recent-alerts 的 limit 参数解析 (原代码错误地将数字解析为日期)
- 为 dashboard/recent-releases 添加 limit 参数解析支持
- 新增 generateAppReleases 种子数据生成函数 (10条应用发布记录)
- 修复 AlertEvent 的 rule_name/rule_id/severity 数据一致性
- 添加 go-ldap/ldap/v3 依赖并集成 LDAP 认证处理器
- 添加 seed.go 自动种子数据初始化 (admin用户+LDAP配置)
- User model 添加 AuthSource/LDAPConfig 字段

前端改进:
- 修复 User 类型定义以匹配后端 API (real_name/is_admin/auth_source等)
- 修复 Header.tsx 的 real_name 属性引用导致 TypeScript 编译错误
- 统一 API 服务层、暗色主题样式、组件联调优化

验证:
- go build ./... 编译通过
- npm run build 构建通过
- 仪表盘发布历史、告警消息等区域数据正常展示
- 健康检查 /health 正常
This commit is contained in:
attacker committed 2026-06-14 02:11:10 +08:00
1 parent 97c4207ff8
commit ff0b268984
39 files changed
+4283 -1878

No files matched your search

+67 -3
View File
@@ -52,6 +52,9 @@ func generateMockData(db *gorm.DB) error {
if err := generatePipelines(db); err != nil {
return err
}
if err := generateAppReleases(db); err != nil {
return err
}
if err := generateCronJobs(db); err != nil {
return err
}
@@ -210,10 +213,11 @@ func generateAlertRules(db *gorm.DB) error {
}
}
for i := 0; i < 20; i++ {
rule := rules[rand.Intn(len(rules))]
event := models.AlertEvent{
RuleID: rules[rand.Intn(len(rules))].ID,
RuleName: rules[rand.Intn(len(rules))].Name,
Severity: []string{"info", "warning", "critical"}[rand.Intn(3)],
RuleID: rule.ID,
RuleName: rule.Name,
Severity: rule.Severity,
Status: []string{"firing", "resolved"}[rand.Intn(2)],
Target: fmt.Sprintf("server-%03d", rand.Intn(50)+1),
Message: fmt.Sprintf("告警事件 %d", i+1),
@@ -262,6 +266,66 @@ func generatePipelines(db *gorm.DB) error {
return nil
}
func generateAppReleases(db *gorm.DB) error {
apps := []string{"EZOps 前端", "EZOps 后端", "用户中心", "支付网关", "数据分析平台"}
environments := []string{"dev", "test", "staging", "prod"}
statuses := []string{"pending", "building", "deploying", "success", "success", "success", "failed", "rolled_back"}
authors := []string{"admin", "ops01", "dev01"}
releases := make([]models.AppRelease, 0, 10)
for i := 0; i < 10; i++ {
app := apps[i%len(apps)]
env := environments[rand.Intn(len(environments))]
status := statuses[rand.Intn(len(statuses))]
minor := rand.Intn(20)
patch := rand.Intn(10)
release := models.AppRelease{
AppName: app,
Version: fmt.Sprintf("v1.%d.%d", minor, patch),
Environment: env,
Status: status,
CommitID: randomString(8),
CommitMsg: fmt.Sprintf("feat: 更新 %s 功能", app),
Author: authors[rand.Intn(len(authors))],
Duration: rand.Intn(600) + 60,
Description: fmt.Sprintf("%s %s 环境发布", app, env),
}
// Set timestamps and approval fields based on status
now := time.Now()
hoursAgo := time.Duration(rand.Intn(168)+1) * time.Hour
if status == "success" || status == "failed" {
approver := authors[rand.Intn(len(authors))]
release.Approver = approver
approvedAt := now.Add(-hoursAgo + 30*time.Minute)
release.ApprovedAt = &approvedAt
deployedAt := now.Add(-hoursAgo + 2*time.Hour)
release.DeployedAt = &deployedAt
} else if status == "rolled_back" {
approver := authors[rand.Intn(len(authors))]
release.Approver = approver
approvedAt := now.Add(-hoursAgo + 30*time.Minute)
release.ApprovedAt = &approvedAt
deployedAt := now.Add(-hoursAgo + 2*time.Hour)
release.DeployedAt = &deployedAt
rollbackAt := now.Add(-hoursAgo + 4*time.Hour)
release.RollbackAt = &rollbackAt
}
releases = append(releases, release)
}
for i := range releases {
if err := db.Create(&releases[i]).Error; err != nil {
return err
}
}
fmt.Println("Generated app releases:", len(releases))
return nil
}
func generateCronJobs(db *gorm.DB) error {
cronJobs := []models.CronJob{
{Name: "数据库备份", CronExpr: "0 2 * * *", Type: "script", Content: "/scripts/backup-db.sh", Enabled: true, Description: "每日凌晨 2 点备份数据库"},