package main import ( "encoding/json" "fmt" "os" "gopkg.in/yaml.v3" "gorm.io/driver/mysql" "gorm.io/gorm" ) // 配置结构 type AppConfig struct { MySQL struct { Addr string `yaml:"Addr"` Dbname string `yaml:"Dbname"` Username string `yaml:"Username"` Password string `yaml:"Password"` Config string `yaml:"Config"` } `yaml:"MySQL"` } type System struct { Key string `gorm:"column:key;primaryKey"` Value string `gorm:"column:value"` } func main() { fmt.Println("====== 更新 CustomData ======") // 1. 读取配置 cfgData, err := os.ReadFile("configs/ppanel.yaml") if err != nil { fmt.Printf("读取配置失败: %v\n", err) return } var cfg AppConfig if err := yaml.Unmarshal(cfgData, &cfg); err != nil { fmt.Printf("解析配置失败: %v\n", err) return } // 2. 连接数据库 dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s?%s", cfg.MySQL.Username, cfg.MySQL.Password, cfg.MySQL.Addr, cfg.MySQL.Dbname, cfg.MySQL.Config) db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) if err != nil { fmt.Printf("数据库连接失败: %v\n", err) return } fmt.Println("✅ 数据库连接成功") // 3. 查找 SiteConfig (在 system 表中,key 通常是 'SiteConfig') // 注意:system 表结构可能由 key, value 组成 // 我们需要查找包含 CustomData 的那个配置 // 先尝试直接查找 SiteConfig var sysConfig System // 根据之前的查看,SiteConfig 可能不是直接存 JSON,而是字段。 // 但用户之前 curl 看到的是 custom_data 字段。 // 让我们查找包含 "shareUrl" 的记录来定位 err = db.Table("system").Where("value LIKE ?", "%shareUrl%").First(&sysConfig).Error if err != nil { fmt.Printf("未找到包含 shareUrl 的配置: %v\n", err) // 尝试列出所有 key var keys []string db.Table("system").Pluck("key", &keys) fmt.Printf("现有 Keys: %v\n", keys) return } fmt.Printf("找到配置 Key: %s\n", sysConfig.Key) fmt.Printf("原始内容: %s\n", sysConfig.Value) // 4. 解析并修改 // System Value 可能是 SiteConfig 的 JSON,或者 CustomData 只是其中一个字段 // 假设 Value 是 SiteConfig 结构体的 JSON var siteConfigMap map[string]interface{} if err := json.Unmarshal([]byte(sysConfig.Value), &siteConfigMap); err != nil { fmt.Printf("解析 Config Value 失败: %v\n", err) return } // 检查是否有 CustomData if customDataStr, ok := siteConfigMap["CustomData"].(string); ok { fmt.Println("找到 CustomData 字段,正在更新...") var customDataMap map[string]interface{} if err := json.Unmarshal([]byte(customDataStr), &customDataMap); err != nil { fmt.Printf("解析 CustomData 失败: %v\n", err) return } // 添加 domain customDataMap["domain"] = "getsapp.net" // 重新序列化 CustomData newCustomDataBytes, _ := json.Marshal(customDataMap) siteConfigMap["CustomData"] = string(newCustomDataBytes) fmt.Printf("新的 CustomData: %s\n", string(newCustomDataBytes)) } else { // 也许 Value 本身就是 CustomData? (不太可能,根据之前的 grep 结果) // 或者 Key 是 'custom_data'? fmt.Println("未在配置中找到 CustomData 字段,尝试直接解析为 CustomData...") // 尝试直接添加 domain 看是否合理 siteConfigMap["domain"] = "getsapp.net" } // 5. 保存回数据库 newConfigBytes, _ := json.Marshal(siteConfigMap) // fmt.Printf("更新后的配置 Value: %s\n", string(newConfigBytes)) err = db.Table("system").Where("`key` = ?", sysConfig.Key).Update("value", string(newConfigBytes)).Error if err != nil { fmt.Printf("更新数据库失败: %v\n", err) return } fmt.Println("✅ 数据库更新成功!") }