Some checks failed
Build docker and publish / build (20.15.1) (push) Has been cancelled
125 lines
3.6 KiB
Go
125 lines
3.6 KiB
Go
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("✅ 数据库更新成功!")
|
||
}
|