## 问题分析 通过代码分析,我发现/api/top-clients端点数据无法持久化的原因有两个: 1. **数据保存逻辑缺失**:在`saveStatsData`方法中,虽然`StatsData`结构体包含了`ClientStats`字段,但没有将`server.clientStats`赋值给`statsData.ClientStats` 2. **数据加载逻辑缺失**:在`loadStatsData`方法中,虽然`StatsData`结构体包含了`ClientStats`字段,但没有将`statsData.ClientStats`赋值给`server.clientStats` 3. **自动保存功能未启用**:`startAutoSave`方法没有在`Server`的`Start`方法中被调用,导致数据不会定期保存 ## 修复计划 1. **修改`saveStatsData`方法**:添加保存`ClientStats`数据的逻辑 2. **修改`loadStatsData`方法**:添加加载`ClientStats`数据的逻辑 3. **在`Server.Start`方法中调用`startAutoSave`**:确保数据定期保存 ## 修复步骤 ### 步骤1:修改`saveStatsData`方法 在`dns/server.go`文件中,修改`saveStatsData`方法,添加保存`ClientStats`数据的逻辑: ```go // 复制客户端统计数据 s.clientStatsMutex.RLock() statsData.ClientStats = make(map[string]*ClientStats) for k, v := range s.clientStats { statsData.ClientStats[k] = v } s.clientStatsMutex.RUnlock() ``` ### 步骤2:修改`loadStatsData`方法 在`dns/server.go`文件中,修改`loadStatsData`方法,添加加载`ClientStats`数据的逻辑: ```go s.clientStatsMutex.Lock() if statsData.ClientStats != nil { s.clientStats = statsData.ClientStats } s.clientStatsMutex.Unlock() ``` ### 步骤3:在`Server.Start`方法中调用`startAutoSave` 在`dns/server.go`文件的`Start`方法中,添加调用`startAutoSave`的代码: ```go // 启动自动保存功能 go s.startAutoSave() ``` ## 预期效果 修复后,/api/top-clients端点的数据将: 1. 在服务器启动时从文件加载 2. 定期自动保存到文件 3. 在服务器停止时最后保存一次 这样就能确保/api/top-clients端点的数据持久化,不会因为服务器重启而丢失。