This commit is contained in:
@@ -0,0 +1,124 @@
|
||||
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("✅ 数据库更新成功!")
|
||||
}
|
||||
Reference in New Issue
Block a user