|
9 | 9 | "log" |
10 | 10 | "os" |
11 | 11 | "strconv" |
| 12 | + "strings" |
12 | 13 | "sync" |
13 | 14 | "time" |
14 | 15 |
|
@@ -423,7 +424,52 @@ func (b *BadgerDB) FindAll(prefix string, result interface{}) error { |
423 | 424 | return err |
424 | 425 | } |
425 | 426 |
|
426 | | - return json.Unmarshal(monitorsJSON, result) |
| 427 | + // 反序列化到结果,然后手动解析特殊字段 |
| 428 | + if err := json.Unmarshal(monitorsJSON, result); err != nil { |
| 429 | + return err |
| 430 | + } |
| 431 | + |
| 432 | + // 手动解析监控器的特殊字段(模拟 GORM 的 AfterFind 钩子) |
| 433 | + if monitorSlice, ok := result.(*[]*model.Monitor); ok { |
| 434 | + for _, monitor := range *monitorSlice { |
| 435 | + if monitor != nil { |
| 436 | + // 解析 SkipServersRaw 到 SkipServers 字段 |
| 437 | + monitor.SkipServers = make(map[uint64]bool) |
| 438 | + if monitor.SkipServersRaw != "" { |
| 439 | + var skipServers []uint64 |
| 440 | + if err := utils.Json.Unmarshal([]byte(monitor.SkipServersRaw), &skipServers); err != nil { |
| 441 | + log.Printf("解析监控器 %d 的 SkipServersRaw 失败: %v", monitor.ID, err) |
| 442 | + skipServers = []uint64{} |
| 443 | + } |
| 444 | + for _, serverID := range skipServers { |
| 445 | + monitor.SkipServers[serverID] = true |
| 446 | + } |
| 447 | + } |
| 448 | + |
| 449 | + // 解析 FailTriggerTasksRaw 到 FailTriggerTasks 字段 |
| 450 | + if monitor.FailTriggerTasksRaw != "" { |
| 451 | + if err := utils.Json.Unmarshal([]byte(monitor.FailTriggerTasksRaw), &monitor.FailTriggerTasks); err != nil { |
| 452 | + log.Printf("解析监控器 %d 的 FailTriggerTasksRaw 失败: %v", monitor.ID, err) |
| 453 | + monitor.FailTriggerTasks = []uint64{} |
| 454 | + } |
| 455 | + } else { |
| 456 | + monitor.FailTriggerTasks = []uint64{} |
| 457 | + } |
| 458 | + |
| 459 | + // 解析 RecoverTriggerTasksRaw 到 RecoverTriggerTasks 字段 |
| 460 | + if monitor.RecoverTriggerTasksRaw != "" { |
| 461 | + if err := utils.Json.Unmarshal([]byte(monitor.RecoverTriggerTasksRaw), &monitor.RecoverTriggerTasks); err != nil { |
| 462 | + log.Printf("解析监控器 %d 的 RecoverTriggerTasksRaw 失败: %v", monitor.ID, err) |
| 463 | + monitor.RecoverTriggerTasks = []uint64{} |
| 464 | + } |
| 465 | + } else { |
| 466 | + monitor.RecoverTriggerTasks = []uint64{} |
| 467 | + } |
| 468 | + } |
| 469 | + } |
| 470 | + } |
| 471 | + |
| 472 | + return nil |
427 | 473 | case "user": |
428 | 474 | // 用户记录需要特殊处理布尔字段和Token字段 |
429 | 475 | var users []*map[string]interface{} |
@@ -600,7 +646,26 @@ func (b *BadgerDB) FindAll(prefix string, result interface{}) error { |
600 | 646 | return err |
601 | 647 | } |
602 | 648 |
|
603 | | - return json.Unmarshal(profilesJSON, result) |
| 649 | + // 反序列化到结果,然后手动解析特殊字段 |
| 650 | + if err := json.Unmarshal(profilesJSON, result); err != nil { |
| 651 | + return err |
| 652 | + } |
| 653 | + |
| 654 | + // 手动解析 DDNS 配置的特殊字段(模拟 GORM 的 AfterFind 钩子) |
| 655 | + if profileSlice, ok := result.(*[]*model.DDNSProfile); ok { |
| 656 | + for _, profile := range *profileSlice { |
| 657 | + if profile != nil { |
| 658 | + // 解析 DomainsRaw 到 Domains 字段 |
| 659 | + if profile.DomainsRaw != "" { |
| 660 | + profile.Domains = strings.Split(profile.DomainsRaw, ",") |
| 661 | + } else { |
| 662 | + profile.Domains = []string{} |
| 663 | + } |
| 664 | + } |
| 665 | + } |
| 666 | + } |
| 667 | + |
| 668 | + return nil |
604 | 669 | case "notification": |
605 | 670 | // 通知配置记录需要特殊处理布尔字段 |
606 | 671 | var notifications []*map[string]interface{} |
@@ -663,7 +728,31 @@ func (b *BadgerDB) FindAll(prefix string, result interface{}) error { |
663 | 728 | return err |
664 | 729 | } |
665 | 730 |
|
666 | | - return json.Unmarshal(cronsJSON, result) |
| 731 | + // 反序列化到结果,然后手动解析特殊字段 |
| 732 | + if err := json.Unmarshal(cronsJSON, result); err != nil { |
| 733 | + return err |
| 734 | + } |
| 735 | + |
| 736 | + // 手动解析计划任务的特殊字段(模拟 GORM 的 AfterFind 钩子) |
| 737 | + if cronSlice, ok := result.(*[]*model.Cron); ok { |
| 738 | + for _, cron := range *cronSlice { |
| 739 | + if cron != nil { |
| 740 | + // 解析 ServersRaw 到 Servers 字段 |
| 741 | + if cron.ServersRaw == "" { |
| 742 | + cron.ServersRaw = "[]" |
| 743 | + cron.Servers = []uint64{} |
| 744 | + } else { |
| 745 | + if err := utils.Json.Unmarshal([]byte(cron.ServersRaw), &cron.Servers); err != nil { |
| 746 | + log.Printf("解析计划任务 %d 的 ServersRaw 失败: %v", cron.ID, err) |
| 747 | + cron.Servers = []uint64{} |
| 748 | + cron.ServersRaw = "[]" |
| 749 | + } |
| 750 | + } |
| 751 | + } |
| 752 | + } |
| 753 | + } |
| 754 | + |
| 755 | + return nil |
667 | 756 | default: |
668 | 757 | // 其他类型的记录,也需要进行字段类型转换 |
669 | 758 | var others []*map[string]interface{} |
|
0 commit comments