Skip to content

Commit 19d2124

Browse files
committed
Update.
1 parent 27c02b6 commit 19d2124

File tree

4 files changed

+108
-5
lines changed

4 files changed

+108
-5
lines changed

cmd/dashboard/controller/member_api.go

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ func (ma *memberAPI) issueNewToken(c *gin.Context) {
150150
})
151151
return
152152
}
153-
log.Printf("API Token已保存到BadgerDB: %s (Note: %s)", token.Token, token.Note)
153+
log.Printf("API Token已保存到SQLite: %s (Note: %s)", token.Token, token.Note)
154154
}
155155

156156
if err != nil {
@@ -705,6 +705,17 @@ func (ma *memberAPI) addOrEditServer(c *gin.Context) {
705705
if isEdit {
706706
singleton.ServerLock.Lock()
707707
s.CopyFromRunningServer(singleton.ServerList[s.ID])
708+
709+
// 确保 DDNSProfiles 字段正确解析(特别是 BadgerDB 模式)
710+
if s.DDNSProfilesRaw != "" {
711+
if err := utils.Json.Unmarshal([]byte(s.DDNSProfilesRaw), &s.DDNSProfiles); err != nil {
712+
log.Printf("编辑服务器时解析DDNS配置失败: %v", err)
713+
s.DDNSProfiles = []uint64{}
714+
}
715+
} else {
716+
s.DDNSProfiles = []uint64{}
717+
}
718+
708719
// 如果修改了 Secret
709720
if s.Secret != singleton.ServerList[s.ID].Secret {
710721
// 删除旧 Secret-ID 绑定关系

db/badger.go

Lines changed: 92 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"log"
1010
"os"
1111
"strconv"
12+
"strings"
1213
"sync"
1314
"time"
1415

@@ -423,7 +424,52 @@ func (b *BadgerDB) FindAll(prefix string, result interface{}) error {
423424
return err
424425
}
425426

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
427473
case "user":
428474
// 用户记录需要特殊处理布尔字段和Token字段
429475
var users []*map[string]interface{}
@@ -600,7 +646,26 @@ func (b *BadgerDB) FindAll(prefix string, result interface{}) error {
600646
return err
601647
}
602648

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
604669
case "notification":
605670
// 通知配置记录需要特殊处理布尔字段
606671
var notifications []*map[string]interface{}
@@ -663,7 +728,31 @@ func (b *BadgerDB) FindAll(prefix string, result interface{}) error {
663728
return err
664729
}
665730

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
667756
default:
668757
// 其他类型的记录,也需要进行字段类型转换
669758
var others []*map[string]interface{}

model/server.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,9 @@ func (s *Server) CopyFromRunningServer(old *Server) {
6565
s.CumulativeNetInTransfer = old.CumulativeNetInTransfer
6666
s.CumulativeNetOutTransfer = old.CumulativeNetOutTransfer
6767
s.LastFlowSaveTime = old.LastFlowSaveTime
68+
69+
// 注意:不要复制配置相关的字段,因为这些可能已经在编辑时更新了
70+
// 包括:DDNSProfiles, DDNSProfilesRaw, EnableDDNS 等
6871
}
6972

7073
func (s *Server) AfterFind(tx *gorm.DB) error {

service/singleton/badger_adapter.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,7 @@ func loadServersFromBadgerDB() error {
267267
}
268268

269269
// 手动初始化DDNSProfiles字段(模拟AfterFind方法)
270-
if server.DDNSProfilesRaw != "" {
270+
if server.DDNSProfilesRaw != "" && server.DDNSProfilesRaw != "[]" {
271271
if err := utils.Json.Unmarshal([]byte(server.DDNSProfilesRaw), &server.DDNSProfiles); err != nil {
272272
log.Printf("解析服务器 %d 的DDNSProfiles失败: %v", server.ID, err)
273273
server.DDNSProfiles = []uint64{}

0 commit comments

Comments
 (0)