2
0
mirror of https://github.com/acepanel/panel.git synced 2026-02-04 09:13:49 +08:00

feat: 新增一批dns提供商

This commit is contained in:
2025-03-30 01:48:07 +08:00
parent ecc44b2e92
commit cc15852944
10 changed files with 315 additions and 70 deletions

9
go.mod
View File

@@ -27,8 +27,14 @@ require (
github.com/lib/pq v1.10.9
github.com/libdns/alidns v1.0.3
github.com/libdns/cloudflare v0.1.3
github.com/libdns/gcore v0.0.0-20250127070537-4a9d185c9d20
github.com/libdns/godaddy v1.0.3
github.com/libdns/huaweicloud v0.3.1
github.com/libdns/libdns v0.2.3
github.com/libdns/namecheap v0.0.0-20250228022813-d8b4b66c5072
github.com/libdns/namedotcom v0.3.3
github.com/libdns/namesilo v0.1.1
github.com/libdns/porkbun v0.2.0
github.com/libdns/tencentcloud v1.2.0
github.com/mholt/acmez/v3 v3.1.1
github.com/ncruces/go-sqlite3 v0.24.1
@@ -51,6 +57,7 @@ require (
require (
filippo.io/edwards25519 v1.1.0 // indirect
github.com/G-Core/gcore-dns-sdk-go v0.2.9 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/fsnotify/fsnotify v1.8.0 // indirect
github.com/gabriel-vasile/mimetype v1.4.8 // indirect
@@ -67,6 +74,7 @@ require (
github.com/mitchellh/copystructure v1.2.0 // indirect
github.com/mitchellh/reflectwalk v1.0.2 // indirect
github.com/ncruces/julianday v1.0.0 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/stretchr/objx v0.5.2 // indirect
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1096 // indirect
@@ -75,6 +83,7 @@ require (
github.com/tklauser/numcpus v0.9.0 // indirect
github.com/yusufpapurcu/wmi v1.2.4 // indirect
golang.org/x/exp v0.0.0-20250305212735-054e65f0b394 // indirect
golang.org/x/sync v0.12.0 // indirect
golang.org/x/sys v0.31.0 // indirect
golang.org/x/text v0.23.0 // indirect
)

19
go.sum
View File

@@ -1,5 +1,7 @@
filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
github.com/G-Core/gcore-dns-sdk-go v0.2.9 h1:LMMZIRX8y3aJJuAviNSpFmLbovZUw+6Om+8VElp1F90=
github.com/G-Core/gcore-dns-sdk-go v0.2.9/go.mod h1:35t795gOfzfVanhzkFyUXEzaBuMXwETmJldPpP28MN4=
github.com/bddjr/hlfhr v1.3.8 h1:QQ6KYgtnBbvYvCWuu/tOnBZamKAPtJzesj2qbjgyn7o=
github.com/bddjr/hlfhr v1.3.8/go.mod h1:oyIv4Q9JpCgZFdtH3KyTNWp7YYRWl4zl8k4ozrMAB4g=
github.com/beevik/ntp v1.4.3 h1:PlbTvE5NNy4QHmA4Mg57n7mcFTmr1W1j3gcK7L1lqho=
@@ -71,6 +73,8 @@ github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD
github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs=
github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI=
github.com/knadh/koanf/parsers/yaml v0.1.0 h1:ZZ8/iGfRLvKSaMEECEBPM1HQslrZADk8fP1XFUxVI5w=
@@ -89,11 +93,24 @@ github.com/libdns/alidns v1.0.3 h1:LFHuGnbseq5+HCeGa1aW8awyX/4M2psB9962fdD2+yQ=
github.com/libdns/alidns v1.0.3/go.mod h1:e18uAG6GanfRhcJj6/tps2rCMzQJaYVcGKT+ELjdjGE=
github.com/libdns/cloudflare v0.1.3 h1:XPFa2f3Mm/3FDNwl9Ki2bfAQJ0Cm5GQB0e8PQVy25Us=
github.com/libdns/cloudflare v0.1.3/go.mod h1:XbvSCSMcxspwpSialM3bq0LsS3/Houy9WYxW8Ok8b6M=
github.com/libdns/gcore v0.0.0-20250127070537-4a9d185c9d20 h1:bQwFw+C9sX/zYZlV53ey0KnNkxrfWYIFpvptuAVhJ1Y=
github.com/libdns/gcore v0.0.0-20250127070537-4a9d185c9d20/go.mod h1:JGoT1mbmqQwtYQqN5F/vGc9j4TTTMKw/hDm5vXADHUI=
github.com/libdns/godaddy v1.0.3 h1:PX1FOYDQ1HGQzz8mVOmtwm3aa6Sv5MwCkNzivUUTA44=
github.com/libdns/godaddy v1.0.3/go.mod h1:vuKWUXnvblDvcaiRwutOoLl7DuB21x8tI06owsF/JTM=
github.com/libdns/huaweicloud v0.3.1 h1:wro0zpG86JKL3QVEaV/xfHW/59rmqwMYhcbl16w9EYg=
github.com/libdns/huaweicloud v0.3.1/go.mod h1:6s5ZIwLUr2qKsQz2SRNo7uh8X5uJohxoBR95rtSpNcI=
github.com/libdns/libdns v0.2.0/go.mod h1:yQCXzk1lEZmmCPa857bnk4TsOiqYasqpyOEeSObbb40=
github.com/libdns/libdns v0.2.2-0.20230227175549-2dc480633939/go.mod h1:4Bj9+5CQiNMVGf87wjX4CY3HQJypUHRuLvlsfsZqLWQ=
github.com/libdns/libdns v0.2.3 h1:ba30K4ObwMGB/QTmqUxf3H4/GmUrCAIkMWejeGl12v8=
github.com/libdns/libdns v0.2.3/go.mod h1:4Bj9+5CQiNMVGf87wjX4CY3HQJypUHRuLvlsfsZqLWQ=
github.com/libdns/namecheap v0.0.0-20250228022813-d8b4b66c5072 h1:hCPOoLd9Mr5kAWLofhSCuGYZxAVVy0CV9zgbahzIeSg=
github.com/libdns/namecheap v0.0.0-20250228022813-d8b4b66c5072/go.mod h1:jo2LWZSD/g/scevxNSp2kWtdMIXfsgWxrtSc3Z0Yy/I=
github.com/libdns/namedotcom v0.3.3 h1:R10C7+IqQGVeC4opHHMiFNBxdNBg1bi65ZwqLESl+jE=
github.com/libdns/namedotcom v0.3.3/go.mod h1:GbYzsAF2yRUpI0WgIK5fs5UX+kDVUPaYCFLpTnKQm0s=
github.com/libdns/namesilo v0.1.1 h1:G6ECxNXpphWDVhSXyAdQBLA4KpHU0Az+TB9YMZMMH/4=
github.com/libdns/namesilo v0.1.1/go.mod h1:JSyG04w+33JDbA2fYWaD9A4zufcxwK7ATNQ1RDuZbps=
github.com/libdns/porkbun v0.2.0 h1:oa2F0doE93RiJkauVVbM+P2AZ7jovDSiH6u3aaQezvQ=
github.com/libdns/porkbun v0.2.0/go.mod h1:mwrhwXpsSA2Xw23t9+qmgFnz+erkn25Sxuh7IBA+x2I=
github.com/libdns/tencentcloud v1.2.0 h1:SBbZ9gUZ+ba/p2d8NpiOcj+WZTdYqB5Fz7zypdbK3YU=
github.com/libdns/tencentcloud v1.2.0/go.mod h1:o0+WCxQ7LGLtyjnjYU4HbGW9uVjN44SdUDhxdUYLGPw=
github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw=
@@ -110,6 +127,8 @@ github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWb
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
github.com/orandin/slog-gorm v1.4.0 h1:FgA8hJufF9/jeNSYoEXmHPPBwET2gwlF3B85JdpsTUU=
github.com/orandin/slog-gorm v1.4.0/go.mod h1:MoZ51+b7xE9lwGNPYEhxcUtRNrYzjdcKvA8QXQQGEPA=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs=

View File

@@ -10,7 +10,7 @@ import (
type CertDNS struct {
ID uint `gorm:"primaryKey" json:"id"`
Name string `gorm:"not null;default:''" json:"name"` // 备注名称
Type string `gorm:"not null;default:'aliyun'" json:"type"` // DNS 提供商 (tencent, aliyun, cloudflare)
Type acme.DnsType `gorm:"not null;default:'aliyun'" json:"type"` // DNS 提供商
Data acme.DNSParam `gorm:"not null;serializer:json" json:"dns_param"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`

View File

@@ -158,7 +158,7 @@ func (r *certRepo) ObtainAuto(id uint) (*acme.Certificate, error) {
}
if cert.DNS != nil {
client.UseDns(acme.DnsType(cert.DNS.Type), cert.DNS.Data)
client.UseDns(cert.DNS.Type, cert.DNS.Data)
} else {
if cert.Website == nil {
return nil, errors.New("this certificate is not associated with a website and cannot be signed. You can try to sign it manually")
@@ -273,7 +273,7 @@ func (r *certRepo) Renew(id uint) (*acme.Certificate, error) {
}
if cert.DNS != nil {
client.UseDns(acme.DnsType(cert.DNS.Type), cert.DNS.Data)
client.UseDns(cert.DNS.Type, cert.DNS.Data)
} else {
if cert.Website == nil {
return nil, errors.New("this certificate is not associated with a website and cannot be signed. You can try to sign it manually")

View File

@@ -3,14 +3,14 @@ package request
import "github.com/tnb-labs/panel/pkg/acme"
type CertDNSCreate struct {
Type string `form:"type" json:"type" validate:"required"`
Type acme.DnsType `form:"type" json:"type" validate:"required|in:aliyun,tencent,huawei,cloudflare,godaddy,gcore,porkbun,namecheap,namesilo,namecom"`
Name string `form:"name" json:"name" validate:"required"`
Data acme.DNSParam `form:"data" json:"data" validate:"required"`
}
type CertDNSUpdate struct {
ID uint `form:"id" json:"id" validate:"required|exists:cert_dns,id"`
Type string `form:"type" json:"type" validate:"required"`
Type acme.DnsType `form:"type" json:"type" validate:"required|in:aliyun,tencent,huawei,cloudflare,godaddy,gcore,porkbun,namecheap,namesilo,namecom"`
Name string `form:"name" json:"name" validate:"required"`
Data acme.DNSParam `form:"data" json:"data" validate:"required"`
}

View File

@@ -69,6 +69,30 @@ func (s *CertService) DNSProviders(w http.ResponseWriter, r *http.Request) {
Label: "CloudFlare",
Value: string(acme.CloudFlare),
},
{
Label: "Godaddy",
Value: string(acme.Godaddy),
},
{
Label: "Gcore",
Value: string(acme.Gcore),
},
{
Label: "Porkbun",
Value: string(acme.Porkbun),
},
{
Label: "Namecheap",
Value: string(acme.Namecheap),
},
{
Label: "NameSilo",
Value: string(acme.NameSilo),
},
{
Label: "Name.com",
Value: string(acme.Namecom),
},
})
}

View File

@@ -9,8 +9,14 @@ import (
"github.com/libdns/alidns"
"github.com/libdns/cloudflare"
"github.com/libdns/gcore"
"github.com/libdns/godaddy"
"github.com/libdns/huaweicloud"
"github.com/libdns/libdns"
"github.com/libdns/namecheap"
"github.com/libdns/namedotcom"
"github.com/libdns/namesilo"
"github.com/libdns/porkbun"
"github.com/libdns/tencentcloud"
"github.com/mholt/acmez/v3/acme"
"golang.org/x/net/publicsuffix"
@@ -30,11 +36,11 @@ func (s httpSolver) Present(_ context.Context, challenge acme.Challenge) error {
}
`, challenge.HTTP01ResourcePath(), challenge.KeyAuthorization)
if err := os.WriteFile(s.conf, []byte(conf), 0644); err != nil {
return fmt.Errorf("无法写入 Nginx 配置文件: %w", err)
return fmt.Errorf("failed to write nginx config %q: %w", s.conf, err)
}
if err := systemctl.Reload("nginx"); err != nil {
_, err = shell.Execf("nginx -t")
return fmt.Errorf("无法重载 Nginx: %w", err)
return fmt.Errorf("failed to reload nginx: %w", err)
}
return nil
@@ -58,25 +64,26 @@ func (s dnsSolver) Present(ctx context.Context, challenge acme.Challenge) error
keyAuth := challenge.DNS01KeyAuthorization()
provider, err := s.getDNSProvider()
if err != nil {
return fmt.Errorf("获取 DNS 提供商失败: %w", err)
return fmt.Errorf("failed to get DNS provider: %w", err)
}
zone, err := publicsuffix.EffectiveTLDPlusOne(dnsName)
if err != nil {
return fmt.Errorf("获取域名 %q 的顶级域失败: %w", dnsName, err)
return fmt.Errorf("failed to get the effective TLD+1 for %q: %w", dnsName, err)
}
rec := libdns.Record{
Type: "TXT",
Name: libdns.RelativeName(dnsName+".", zone+"."),
Value: keyAuth,
TTL: 10 * time.Minute,
}
results, err := provider.SetRecords(ctx, zone+".", []libdns.Record{rec})
if err != nil {
return fmt.Errorf("域名 %q 添加临时记录 %q 失败: %w", zone, dnsName, err)
return fmt.Errorf("failed to set DNS record %q for %q: %w", dnsName, zone, err)
}
if len(results) != 1 {
return fmt.Errorf("预期添加 1 条记录,但实际添加了 %d 条记录", len(results))
return fmt.Errorf("expected to add 1 record, but actually added %d records", len(results))
}
s.records = &results
@@ -87,7 +94,7 @@ func (s dnsSolver) CleanUp(ctx context.Context, challenge acme.Challenge) error
dnsName := challenge.DNS01TXTRecordName()
provider, err := s.getDNSProvider()
if err != nil {
return fmt.Errorf("获取 DNS 提供商失败: %w", err)
return fmt.Errorf("failed to get DNS provider: %w", err)
}
ctx, cancel := context.WithTimeout(ctx, 2*time.Minute)
@@ -95,8 +102,9 @@ func (s dnsSolver) CleanUp(ctx context.Context, challenge acme.Challenge) error
zone, err := publicsuffix.EffectiveTLDPlusOne(dnsName)
if err != nil {
return fmt.Errorf("获取域名 %q 的顶级域失败: %w", dnsName, err)
return fmt.Errorf("failed to get the effective TLD+1 for %q: %w", dnsName, err)
}
_, _ = provider.DeleteRecords(ctx, zone+".", *s.records)
return nil
}
@@ -124,8 +132,36 @@ func (s dnsSolver) getDNSProvider() (DNSProvider, error) {
dns = &cloudflare.Provider{
APIToken: s.param.AK,
}
case Godaddy:
dns = &godaddy.Provider{
APIToken: s.param.AK,
}
case Gcore:
dns = &gcore.Provider{
APIKey: s.param.AK,
}
case Porkbun:
dns = &porkbun.Provider{
APIKey: s.param.AK,
APISecretKey: s.param.SK,
}
case Namecheap:
dns = &namecheap.Provider{
APIKey: s.param.AK,
User: s.param.SK,
}
case NameSilo:
dns = &namesilo.Provider{
APIToken: s.param.AK,
}
case Namecom:
dns = &namedotcom.Provider{
Token: s.param.AK,
User: s.param.SK,
Server: "https://api.name.com",
}
default:
return nil, fmt.Errorf("未知的DNS提供商 %q", s.dns)
return nil, fmt.Errorf("unsupported DNS provider: %s", s.dns)
}
return dns, nil
@@ -134,10 +170,16 @@ func (s dnsSolver) getDNSProvider() (DNSProvider, error) {
type DnsType string
const (
Tencent DnsType = "tencent"
AliYun DnsType = "aliyun"
Tencent DnsType = "tencent"
Huawei DnsType = "huawei"
CloudFlare DnsType = "cloudflare"
Godaddy DnsType = "godaddy"
Gcore DnsType = "gcore"
Porkbun DnsType = "porkbun"
Namecheap DnsType = "namecheap"
NameSilo DnsType = "namesilo"
Namecom DnsType = "namecom"
)
type DNSParam struct {
@@ -162,7 +204,7 @@ func (s manualDNSSolver) Present(ctx context.Context, challenge acme.Challenge)
keyAuth := challenge.DNS01KeyAuthorization()
domain, err := publicsuffix.EffectiveTLDPlusOne(full)
if err != nil {
return fmt.Errorf("获取 %q 的顶级域失败: %w", full, err)
return fmt.Errorf("failed to get the effective TLD+1 for %q: %w", full, err)
}
*s.records = append(*s.records, DNSRecord{

View File

@@ -119,6 +119,78 @@ const handleCreateDNS = async () => {
placeholder="输入 Cloudflare API Key"
/>
</n-form-item>
<n-form-item v-if="model.type == 'godaddy'" path="ak" label="Token">
<n-input
v-model:value="model.data.ak"
type="text"
@keydown.enter.prevent
placeholder="输入 GoDaddy Token"
/>
</n-form-item>
<n-form-item v-if="model.type == 'gcore'" path="ak" label="API Key">
<n-input
v-model:value="model.data.ak"
type="text"
@keydown.enter.prevent
placeholder="输入 G-Core API Key"
/>
</n-form-item>
<n-form-item v-if="model.type == 'porkbun'" path="ak" label="API Key">
<n-input
v-model:value="model.data.ak"
type="text"
@keydown.enter.prevent
placeholder="输入 Porkbun API Key"
/>
</n-form-item>
<n-form-item v-if="model.type == 'porkbun'" path="sk" label="Secret Key">
<n-input
v-model:value="model.data.sk"
type="text"
@keydown.enter.prevent
placeholder="输入 Porkbun Secret Key"
/>
</n-form-item>
<n-form-item v-if="model.type == 'namecheap'" path="sk" label="API Username">
<n-input
v-model:value="model.data.sk"
type="text"
@keydown.enter.prevent
placeholder="输入 Namecheap API Username"
/>
</n-form-item>
<n-form-item v-if="model.type == 'namecheap'" path="ak" label="API Key">
<n-input
v-model:value="model.data.ak"
type="text"
@keydown.enter.prevent
placeholder="输入 Namecheap API Key"
/>
</n-form-item>
<n-form-item v-if="model.type == 'namesilo'" path="ak" label="API Token">
<n-input
v-model:value="model.data.ak"
type="text"
@keydown.enter.prevent
placeholder="输入 NameSilo API Token"
/>
</n-form-item>
<n-form-item v-if="model.type == 'namecom'" path="sk" label="Username">
<n-input
v-model:value="model.data.sk"
type="text"
@keydown.enter.prevent
placeholder="输入 Name.com Username"
/>
</n-form-item>
<n-form-item v-if="model.type == 'namecom'" path="ak" label="Token">
<n-input
v-model:value="model.data.ak"
type="text"
@keydown.enter.prevent
placeholder="输入 Name.com Token"
/>
</n-form-item>
</n-form>
<n-button type="info" block @click="handleCreateDNS">提交</n-button>
</n-space>

View File

@@ -46,17 +46,11 @@ const columns: any = [
},
{
default: () => {
switch (row.type) {
case 'aliyun':
return '阿里云'
case 'tencent':
return '腾讯云'
case 'huawei':
return '华为云'
case 'cloudflare':
return 'Cloudflare'
default:
return '未知'
const provider = dnsProviders.value.find((provider: any) => provider.value === row.type)
if (provider) {
return provider.label
} else {
return '未知'
}
}
}
@@ -206,7 +200,6 @@ onUnmounted(() => {
:options="dnsProviders"
/>
</n-form-item>
<n-form-item v-if="updateDNSModel.type == 'aliyun'" path="ak" label="Access Key">
<n-input
v-model:value="updateDNSModel.data.ak"
@@ -239,7 +232,6 @@ onUnmounted(() => {
placeholder="输入腾讯云 SecretKey"
/>
</n-form-item>
<n-form-item v-if="updateDNSModel.type == 'huawei'" path="ak" label="AccessKeyId">
<n-input
v-model:value="updateDNSModel.data.ak"
@@ -264,6 +256,78 @@ onUnmounted(() => {
placeholder="输入 Cloudflare API Key"
/>
</n-form-item>
<n-form-item v-if="updateDNSModel.type == 'godaddy'" path="ak" label="Token">
<n-input
v-model:value="updateDNSModel.data.ak"
type="text"
@keydown.enter.prevent
placeholder="输入 GoDaddy Token"
/>
</n-form-item>
<n-form-item v-if="updateDNSModel.type == 'gcore'" path="ak" label="API Key">
<n-input
v-model:value="updateDNSModel.data.ak"
type="text"
@keydown.enter.prevent
placeholder="输入 G-Core API Key"
/>
</n-form-item>
<n-form-item v-if="updateDNSModel.type == 'porkbun'" path="ak" label="API Key">
<n-input
v-model:value="updateDNSModel.data.ak"
type="text"
@keydown.enter.prevent
placeholder="输入 Porkbun API Key"
/>
</n-form-item>
<n-form-item v-if="updateDNSModel.type == 'porkbun'" path="sk" label="Secret Key">
<n-input
v-model:value="updateDNSModel.data.sk"
type="text"
@keydown.enter.prevent
placeholder="输入 Porkbun Secret Key"
/>
</n-form-item>
<n-form-item v-if="updateDNSModel.type == 'namecheap'" path="sk" label="API Username">
<n-input
v-model:value="updateDNSModel.data.sk"
type="text"
@keydown.enter.prevent
placeholder="输入 Namecheap API Username"
/>
</n-form-item>
<n-form-item v-if="updateDNSModel.type == 'namecheap'" path="ak" label="API Key">
<n-input
v-model:value="updateDNSModel.data.ak"
type="text"
@keydown.enter.prevent
placeholder="输入 Namecheap API Key"
/>
</n-form-item>
<n-form-item v-if="updateDNSModel.type == 'namesilo'" path="ak" label="API Token">
<n-input
v-model:value="updateDNSModel.data.ak"
type="text"
@keydown.enter.prevent
placeholder="输入 NameSilo API Token"
/>
</n-form-item>
<n-form-item v-if="updateDNSModel.type == 'namecom'" path="sk" label="Username">
<n-input
v-model:value="updateDNSModel.data.sk"
type="text"
@keydown.enter.prevent
placeholder="输入 Name.com Username"
/>
</n-form-item>
<n-form-item v-if="updateDNSModel.type == 'namecom'" path="ak" label="Token">
<n-input
v-model:value="updateDNSModel.data.ak"
type="text"
@keydown.enter.prevent
placeholder="输入 Name.com Token"
/>
</n-form-item>
</n-form>
<n-button type="info" block @click="handleUpdateDNS">提交</n-button>
</n-space>

View File

@@ -34,49 +34,64 @@ const handleSubmit = () => {
messageReactive?.destroy()
})
} else if (model.value.type == 'manual') {
const { data } = useRequest(cert.manualDNS(id.value))
messageReactive.destroy()
window.$message.info('请先前往域名处设置 DNS 解析,再继续签发')
const d = window.$dialog.info({
style: 'width: 60vw',
title: '待设置DNS 记录列表',
content: () => {
return h(NTable, [
h('thead', [
h('tr', [h('th', '域名'), h('th', '类型'), h('th', '主机记录'), h('th', '记录值')])
]),
h(
'tbody',
data.map((item: any) =>
h('tr', [
h('td', item?.domain),
h('td', 'TXT'),
h('td', item?.name),
h('td', item?.value)
])
useRequest(cert.manualDNS(id.value))
.onSuccess(({ data }: { data: any }) => {
window.$message.info('请先前往域名处设置 DNS 解析,再继续签发')
const d = window.$dialog.info({
style: 'width: 60vw',
title: '待设置DNS 记录列表',
content: () => {
return h(
NTable,
{},
{
default: () => [
h('thead', [
h('tr', [
h('th', '域名'),
h('th', '类型'),
h('th', '主机记录'),
h('th', '记录值')
])
]),
h(
'tbody',
data.map((item) =>
h('tr', [
h('td', item?.domain),
h('td', 'TXT'),
h('td', item?.name),
h('td', item?.value)
])
)
)
]
}
)
)
])
},
positiveText: '签发',
onPositiveClick: async () => {
d.loading = true
messageReactive = window.$message.loading('请稍后...', {
duration: 0
},
positiveText: '签发',
onPositiveClick: async () => {
d.loading = true
messageReactive = window.$message.loading('请稍后...', {
duration: 0
})
useRequest(cert.obtainManual(id.value))
.onSuccess(() => {
window.$bus.emit('cert:refresh-cert')
window.$bus.emit('cert:refresh-async')
show.value = false
window.$message.success('签发成功')
})
.onComplete(() => {
d.loading = false
messageReactive?.destroy()
})
}
})
useRequest(cert.obtainManual(id.value))
.onSuccess(() => {
window.$bus.emit('cert:refresh-cert')
window.$bus.emit('cert:refresh-async')
show.value = false
window.$message.success('签发成功')
})
.onComplete(() => {
d.loading = false
messageReactive?.destroy()
})
}
})
})
.onComplete(() => {
messageReactive?.destroy()
})
} else {
useRequest(cert.obtainSelfSigned(id.value))
.onSuccess(() => {