add:添加短链接服务
Build docker and publish / build (20.15.1) (push) Has been cancelled

This commit is contained in:
2026-01-24 00:32:08 -08:00
parent a98fcbfe73
commit 1d81df6664
51 changed files with 2957 additions and 621 deletions
+124
View File
@@ -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("✅ 数据库更新成功!")
}