//go:build plus package db import ( "crypto/tls" "fmt" "io" "net/http" "strings" "time" "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" "github.com/iwind/TeaGo/actions" ) type TestClickHouseAction struct { actionutils.ParentAction } func (this *TestClickHouseAction) Init() { this.Nav("db", "db", "clickhouse") } func (this *TestClickHouseAction) RunPost(params struct { Host string Port int User string Password string Database string Scheme string Must *actions.Must }) { params.Must. Field("host", params.Host). Require("请输入 ClickHouse 连接地址") if params.Database == "" { params.Database = "default" } scheme := "https" if strings.EqualFold(params.Scheme, "http") { scheme = "http" } if params.Port <= 0 { params.Port = 8443 } // 构造测试请求 testURL := fmt.Sprintf("%s://%s:%d/?query=SELECT+1&database=%s", scheme, params.Host, params.Port, params.Database) transport := &http.Transport{} if scheme == "https" { transport.TLSClientConfig = &tls.Config{ InsecureSkipVerify: true, } } client := &http.Client{ Timeout: 5 * time.Second, Transport: transport, } req, err := http.NewRequest(http.MethodGet, testURL, nil) if err != nil { this.Fail("请求构造失败: " + err.Error()) return } if params.User != "" || params.Password != "" { req.SetBasicAuth(params.User, params.Password) } resp, err := client.Do(req) if err != nil { this.Fail("连接失败: " + err.Error()) return } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { body, _ := io.ReadAll(resp.Body) msg := strings.TrimSpace(string(body)) if len(msg) > 200 { msg = msg[:200] + "..." } this.Fail(fmt.Sprintf("ClickHouse 返回 HTTP %d: %s", resp.StatusCode, msg)) return } this.Success() }