This commit is contained in:
unknown
2026-02-04 20:27:13 +08:00
commit 3b042d1dad
9410 changed files with 1488147 additions and 0 deletions

View File

@@ -0,0 +1,416 @@
{$layout "layout_popup"}
<h3>添加DNS服务商账号</h3>
<form class="ui form" data-tea-action="$" data-tea-success="success">
<csrf-token></csrf-token>
<table class="ui table definition selectable">
<tr>
<td class="title">账号说明 *</td>
<td>
<input type="text" name="name" maxlength="50" ref="focus"/>
<p class="comment">用来方便区分不同的账号。</p>
</td>
</tr>
<tr>
<td>服务商厂家 *</td>
<td>
<select class="ui dropdown auto-width" name="type" v-model="type" @change="changeType">
<option value="">[请选择]</option>
<option v-for="type in types" :value="type.code">{{type.name}}</option>
</select>
<p class="comment" v-if="typeDescription.length > 0">{{typeDescription}} 系统会保留原有域名下的域名解析,请放心使用。<span v-if="!teaIsPlus">购买商业版可获得更多厂商支持。</span></p>
</td>
</tr>
<tr v-show="type.length > 0">
<td colspan="2">API参数</td>
</tr>
<!-- DNSPod -->
<tbody v-if="type == 'dnspod'">
<tr>
<td>密钥类型 *</td>
<td>
<select class="ui dropdown auto-width" name="paramDNSPodAPIType" v-model="paramDNSPodAPIType">
<option value="tencentDNS">腾讯云API密钥</option>
<option value="dnsPodToken">DNSPod Token</option>
</select>
</td>
</tr>
<tr v-show="paramDNSPodAPIType == 'tencentDNS'">
<td>SecretId *</td>
<td>
<input type="text" name="paramDNSPodAccessKeyId" maxlength="100"/>
<p class="comment">在DNSPod控制台“账号中心--API密钥”中获取。</p>
</td>
</tr>
<tr v-show="paramDNSPodAPIType == 'tencentDNS'">
<td>SecretKey *</td>
<td>
<input type="text" name="paramDNSPodAccessKeySecret" maxlength="100"/>
<p class="comment">在DNSPod控制台“账号中心--API密钥”中获取。<mask-warning></mask-warning></p>
</td>
</tr>
<tr v-show="paramDNSPodAPIType == 'dnsPodToken'">
<td>密钥ID *</td>
<td>
<input type="text" name="paramDNSPodId" maxlength="100" spellcheck="false"/>
<p class="comment">在DNSPod控制台“账号中心--API密钥--DNSPod Token”中获取。</p>
</td>
</tr>
<tr v-show="paramDNSPodAPIType == 'dnsPodToken'">
<td>密钥Token *</td>
<td>
<input type="text" name="paramDNSPodToken" maxlength="100" spellcheck="false"/>
<p class="comment">在DNSPod控制台“账号中心--API密钥--DNSPod Token”中获取。<mask-warning></mask-warning></p>
</td>
</tr>
<tr v-if="paramDNSPodAPIType == 'dnsPodToken'">
<td>区域</td>
<td>
<select class="ui dropdown auto-width" name="paramDNSPodRegion">
<option value="">中国站</option>
<option value="international">国际站</option>
</select>
</td>
</tr>
</tbody>
<!-- AliDNS -->
<tbody v-if="type == 'alidns'">
<tr>
<td>AccessKeyId *</td>
<td>
<input type="text" name="paramAliDNSAccessKeyId" maxlength="100" spellcheck="false"/>
<p class="comment">登录阿里云控制台 -- 在"访问控制"中创建和获取。</p>
</td>
</tr>
<tr>
<td>AccessKeySecret *</td>
<td>
<input type="text" name="paramAliDNSAccessKeySecret" maxlength="100" spellcheck="false"/>
<p class="comment">登录阿里云控制台 -- 在"访问控制"中创建和获取。<mask-warning></mask-warning></p>
</td>
</tr>
<tr>
<td>区域ID<optional-label></optional-label></td>
<td>
<input type="text" name="paramAliDNSRegionId" maxlength="100" spellcheck="false"/>
<p class="comment">阿里云产品所在区域代号,通常不需要填写。</p>
</td>
</tr>
</tbody>
<!-- 华为云 -->
<tbody v-if="type == 'huaweiDNS'">
<tr>
<td>AccessKeyId *</td>
<td>
<input type="text" name="paramHuaweiAccessKeyId" maxlength="100" spellcheck="false"/>
<p class="comment">登录华为云控制台 -- 在"我的凭证 -- 访问密钥"中创建和获取。</p>
</td>
</tr>
<tr>
<td>AccessKeySecret *</td>
<td>
<input type="text" name="paramHuaweiAccessKeySecret" maxlength="100" spellcheck="false"/>
<p class="comment">登录华为云控制台 -- 在"我的凭证 -- 访问密钥"中创建和获取。<mask-warning></mask-warning></p>
</td>
</tr>
<tr>
<td>终端节点</td>
<td>
<input type="text" name="paramHuaweiEndpoint" maxlength="100" spellcheck="false"/>
<p class="comment">选填项。可以填写终端节点Endpoint区域代号或者域名参考 <a href="https://developer.huaweicloud.com/endpoint?DNS" target="_blank">https://developer.huaweicloud.com/endpoint?DNS</a>(如果此链接失效,请到华为云开发者中心自行查找)。</p>
</td>
</tr>
</tbody>
<!-- CloudFlare -->
<tbody v-if="type == 'cloudFlare'">
<tr>
<td>API密钥 *</td>
<td>
<input type="text" name="paramCloudFlareAPIKey" maxlength="100" spellcheck="false"/>
<p class="comment">在个人资料中的"API令牌"--"API密钥"--"Global API Key"中获取。<mask-warning></mask-warning></p>
</td>
</tr>
<tr>
<td>账号邮箱 *</td>
<td>
<input type="text" name="paramCloudFlareEmail" maxlength="100" spellcheck="false"/>
<p class="comment">登录账号使用的邮箱。</p>
</td>
</tr>
</tbody>
<!-- GoDaddy -->
<tbody v-if="type == 'godaddy'">
<tr>
<td>Key *</td>
<td>
<input type="text" name="paramGoDaddyKey" maxlength="100" spellcheck="false"/>
<p class="comment">可以在GoDaddy<a href="https://developer.godaddy.com/keys" target="_blank">开发者中心</a>创建创建时Environment选择Production。</p>
</td>
</tr>
<tr>
<td>Secret *</td>
<td>
<input type="text" name="paramGoDaddySecret" maxlength="100" spellcheck="false"/>
<p class="comment"><mask-warning></mask-warning></p>
</td>
</tr>
</tbody>
<!-- ClouDNS -->
<tbody v-if="type == 'cloudns'">
<tr>
<td>用户认证ID<em>auth-id</em></td>
<td>
<input type="text" name="paramClouDNSAuthId" maxlength="20" spellcheck="false"/>
<p class="comment">和子用户认证ID二选一。可以在ClouDNS<a href="https://www.cloudns.net/api-settings/" target="_blank">API设置页面</a>添加。</p>
</td>
</tr>
<tr>
<td>子用户认证ID<em>sub-auth-id</em></td>
<td>
<input type="text" name="paramClouDNSSubAuthId" maxlength="20" spellcheck="false"/>
<p class="comment">和用户认证ID二选一。可以在ClouDNS<a href="https://www.cloudns.net/api-settings/" target="_blank">API设置页面</a>添加。</p>
</td>
</tr>
<tr>
<td>认证密码 *<em>auth-password</em></td>
<td>
<input type="password" name="paramClouDNSAuthPassword" maxlength="100" spellcheck="false"/>
<p class="comment">用户或者子用户的认证密码。<mask-warning></mask-warning></p>
</td>
</tr>
</tbody>
<!-- DNS.COM -->
<tbody v-if="type == 'dnscom'">
<tr>
<td>API Key *</td>
<td>
<input type="text" name="paramDNSComKey" maxlength="100" spellcheck="false"/>
<p class="comment">在51DNS.COM控制台账号中心--API设置中创建和查看。</p>
</td>
</tr>
<tr>
<td>API Secret *</td>
<td>
<input type="text" name="paramDNSComSecret" maxlength="100" spellcheck="false"/>
<p class="comment">在51DNS.COM控制台账号中心--API设置中创建和查看。<mask-warning></mask-warning></p>
</td>
</tr>
</tbody>
<!-- DNS.LA -->
<tbody v-if="type == 'dnsla'">
<tr>
<td>API ID *</td>
<td>
<input type="text" name="paramDNSLaAPIId" maxlength="100"/>
<p class="comment">在DNS.LA控制台--账户信息中查看。</p>
</td>
</tr>
<tr>
<td>API密钥 *</td>
<td>
<input type="text" name="paramDNSLaSecret" maxlength="100" spellcheck="false"/>
<p class="comment">在DNS.LA控制台--账户信息中查看。<mask-warning></mask-warning></p>
</td>
</tr>
</tbody>
<!-- VolcEngine -->
<tbody v-if="type == 'volcEngine'">
<tr>
<td>Access Key ID *</td>
<td>
<input type="text" name="paramVolcEngineAccessKeyId" maxlength="100" spellcheck="false"/>
<p class="comment">在火山引擎“访问控制--API访问密钥”中获取。</p>
</td>
</tr>
<tr>
<td>Secret Access Key *</td>
<td>
<input type="text" name="paramVolcEngineAccessKeySecret" maxlength="100" spellcheck="false"/>
<p class="comment"><mask-warning></mask-warning></p>
</td>
</tr>
</tbody>
<!-- Amazon Route 53 -->
<tbody v-if="type == 'amazonRoute53'">
<tr>
<td>Access Key ID *</td>
<td>
<input type="text" name="paramAmazonRoute53AccessKeyId" maxlength="100" spellcheck="false"/>
</td>
</tr>
<tr>
<td>Secret Access Key *</td>
<td>
<input type="text" name="paramAmazonRoute53AccessKeySecret" maxlength="100" spellcheck="false"/>
<p class="comment"><mask-warning></mask-warning></p>
</td>
</tr>
<tr>
<td>API区域</td>
<td>
<input type="text" name="paramAmazonRoute53Region" maxlength="100" spellcheck="false"/>
<p class="comment">通常不需要填写。</p>
</td>
</tr>
</tbody>
<!-- Microsoft Azure DNS -->
<tbody v-if="type == 'azureDNS'">
<tr>
<td>订阅ID <br/><em>(Subscription ID)</em> *</td>
<td>
<input type="text" name="paramAzureDNSSubscriptionId" maxlength="100" spellcheck="false"/>
<p class="comment">可以在订阅Subscriptions服务中查看。</p>
</td>
</tr>
<tr>
<td>目录(租户) ID <br/><em>(Directory Tenant ID)</em> *</td>
<td>
<input type="text" name="paramAzureDNSTenantId" maxlength="100" spellcheck="false"/>
<p class="comment">可以在应用注册App registrations中对应应用概述Overview中查看。</p>
</td>
</tr>
<tr>
<td>应用程序(客户端) ID <br/><em>(Client ID)</em> *</td>
<td><input type="text" name="paramAzureDNSClientId" maxlength="100" spellcheck="false"/>
<p class="comment">需要在应用注册App registrations中新注册应用程序获得。</p>
</td>
</tr>
<tr>
<td>客户端密码值 <br/><em>(Client Secret Value)</em> *</td>
<td><input type="text" name="paramAzureDNSClientSecret" maxlength="100" spellcheck="false"/>
<p class="comment">可以在应用注册App registrations中对应应用的“证书和密码Certificates &amp; secrets”--“客户端密码Client secrets”中创建和查看。<mask-warning></mask-warning></p>
</td>
</tr>
<tr>
<td>资源组 <br/><em>(Resource Group Name)</em> *</td>
<td>
<input type="text" name="paramAzureDNSResourceGroupName" maxlength="100" spellcheck="false"/>
<p class="comment">权限设置帮助你需要在对应资源组Resource group-- 访问控制Access control (IAM)-- 角色分配Role assignments中添加一个角色分配Role assignment其中作业职能角色Job function roles为"DNS 区域参与者(DNS Zone Contributor)"成员Members为应用注册App registrations中的应用程序application有时需要在选择成员select members界面搜索应用程序application名称才能看到</p>
</td>
</tr>
</tbody>
<!-- bunny.net -->
<tbody v-if="type == 'bunnyNet'">
<tr>
<td>API密钥 *</td>
<td>
<input type="text" name="paramBunnyNetAPIKey" maxlength="100" spellcheck="false"/>
<p class="comment">在"Edit account details" -- "API Key"中获取。<mask-warning></mask-warning></p>
</td>
</tr>
</tbody>
<!-- Gname -->
<tbody v-if="type == 'gname'">
<tr>
<td>APPID *</td>
<td>
<input type="text" name="paramGnameAppid" maxlength="100" spellcheck="false"/>
<p class="comment">在Gname控制台API设置中获取。</p>
</td>
</tr>
<tr>
<td>API Secret *</td>
<td>
<input type="text" name="paramGnameSecret" maxlength="100" spellcheck="false"/>
<p class="comment">在Gname控制台API设置中获取。<mask-warning></mask-warning></p>
</td>
</tr>
</tbody>
<!-- EdgeDNS -->
<tbody v-if="type == 'localEdgeDNS'">
<tr>
<td>选择域名服务集群 *</td>
<td>
<select class="ui dropdown auto-width" name="paramLocalEdgeDNSClusterId">
<option value="0">[选择域名服务集群]</option>
<option v-for="cluster in nsClusters" :value="cluster.id">{{cluster.name}}</option>
</select>
</td>
</tr>
</tbody>
<!-- EdgeDNS API -->
<tbody v-if="type == 'edgeDNSAPI'">
<tr>
<td>API地址 *</td>
<td>
<input type="text" name="paramEdgeDNSAPIHost" maxlength="100"/>
</td>
</tr>
<tr>
<td>AccessKey类型 *</td>
<td>
<select class="ui dropdown auto-width" name="paramEdgeDNSAPIRole">
<option value="user">平台用户</option>
<option value="admin">管理员</option>
</select>
</td>
</tr>
<tr>
<td>AccessKey ID *</td>
<td>
<input type="text" name="paramEdgeDNSAPIAccessKeyId" maxlength="64"/>
</td>
</tr>
<tr>
<td>AccessKey密钥 *</td>
<td>
<input type="text" name="paramEdgeDNSAPIAccessKeySecret" maxlength="64"/>
<p class="comment"><mask-warning></mask-warning></p>
</td>
</tr>
</tbody>
<!-- 自定义HTTP-->
<tbody v-if="type == 'customHTTP'">
<tr>
<td>HTTP URL *</td>
<td>
<input type="text" name="paramCustomHTTPURL" maxlength="200"/>
<p class="comment">HTTP URL完整地址DNS所有操作都会以POST的方式转发到此地址。</p>
</td>
</tr>
<tr>
<td>私钥 *</td>
<td>
<input type="text" name="paramCustomHTTPSecret" maxlength="64" v-model="paramCustomHTTPSecret"/>
<p class="comment">通讯用的私钥转发请求时会在Header中加入相关信息方便开发者校验请求是否合法。</p>
</td>
</tr>
</tbody>
<!-- 更多选项 -->
<tr>
<td colspan="2"><more-options-indicator></more-options-indicator></td>
</tr>
<tbody v-show="moreOptionsVisible">
<tr>
<td>最小TTL</td>
<td>
<div class="ui right labeled input">
<input type="text" name="minTTL" size="4" maxlength="6" style="width: 6em"/>
<span class="ui label"></span>
</div>
<p class="comment">生成的DNS时可以使用的最小TTL请根据你选择的服务商和你在服务商中的账号等级进行填写不填写或者0表示默认。</p>
</td>
</tr>
</tbody>
</table>
<submit-btn></submit-btn>
</form>

View File

@@ -0,0 +1,20 @@
Tea.context(function () {
this.success = NotifyPopup
this.type = ""
this.typeDescription = ""
this.changeType = function () {
let that = this
let t = this.types.$find(function (k, v) {
return v.code == that.type
})
if (t != null) {
this.typeDescription = t.description
} else {
this.typeDescription = ""
}
}
// DNSPod
this.paramDNSPodAPIType = "tencentDNS"
})

View File

@@ -0,0 +1,55 @@
{$layout}
<first-menu>
<a href="" class="item" @click.prevent="createProvider()">[添加DNS账号信息]</a>
</first-menu>
<div class="margin"></div>
<form class="ui form" method="get" action="/dns/providers">
<div class="ui fields inline">
<div class="ui field">
<input type="text" name="keyword" placeholder="账号说明..." v-model="keyword"/>
</div>
<div class="ui field">
<input type="text" name="domain" placeholder="域名..." v-model="domain"/>
</div>
<div class="ui field" v-if="providerTypes.length > 0">
<select class="ui dropdown auto-width" name="providerType" v-model="providerType">
<option value="">[服务商厂家]</option>
<option v-for="p in providerTypes" :value="p.code">{{p.name}}({{p.count}})</option>
</select>
</div>
<div class="ui field">
<button class="ui button" type="submit">搜索</button>
&nbsp;
<a :href="Tea.url('.')" v-if="keyword.length > 0 || domain.length > 0 || providerType.length > 0">[清除条件]</a>
</div>
</div>
</form>
<p class="comment" v-if="providers.length == 0">暂时还没有第三方DNS服务商。</p>
<table class="ui table selectable celled" v-if="providers.length > 0">
<thead>
<tr>
<th>账号说明</th>
<th class="three wide">服务商</th>
<th class="width5 center">域名</th>
<th class="two op">操作</th>
</tr>
</thead>
<tr v-for="(provider, index) in providers">
<td><a :href="'/dns/providers/provider?providerId=' + provider.id"><keyword :v-word="keyword">{{provider.name}}</keyword></a></td>
<td>{{provider.typeName}}</td>
<td class="center">
<span v-if="provider.countDomains == 0" class="disabled">0</span>
<span v-else>{{provider.countDomains}}</span>
</td>
<td>
<a :href="'/dns/providers/provider?providerId=' + provider.id">详情</a> &nbsp; &nbsp; <a href="" @click.prevent="deleteProvider(provider.id)">删除</a>
</td>
</tr>
</table>
<div class="page" v-html="page"></div>

View File

@@ -0,0 +1,23 @@
Tea.context(function () {
this.createProvider = function () {
teaweb.popup(Tea.url(".createPopup"), {
height: "28em",
callback: function () {
teaweb.success("保存成功", function () {
teaweb.reload()
})
}
})
}
this.deleteProvider = function (providerId) {
let that = this
teaweb.confirm("确定要删除这个DNS服务商账号吗", function () {
that.$post(".delete")
.params({
providerId: providerId
})
.refresh()
})
}
})

View File

@@ -0,0 +1,356 @@
{$layout}
<first-menu>
<a href="/dns/providers" class="item">DNS账号列表</a>
<span class="item">|</span>
<a :href="'/dns/providers/provider?providerId=' + provider.id" class="item active">{{provider.name}}</a>
</first-menu>
<h3>账号信息 <a href="" @click.prevent="updateProvider(provider.id)">[修改]</a> </h3>
<table class="ui table selectable definition">
<tr>
<td class="title">账号说明</td>
<td>{{provider.name}}</td>
</tr>
<tr>
<td>服务商</td>
<td>{{provider.typeName}}</td>
</tr>
<!-- DNSPod -->
<tbody v-if="provider.type == 'dnspod'">
<tr>
<td class="color-border">密钥类型</td>
<td>
<span v-if="provider.apiParams.apiType == 'tencentDNS'">腾讯云API密钥</span>
<span v-else>DNSPod Token</span>
</td>
</tr>
<tr v-if="provider.apiParams.apiType == 'tencentDNS'">
<td class="color-border">SecretId</td>
<td>{{provider.apiParams.accessKeyId}}</td>
</tr>
<tr v-if="provider.apiParams.apiType == 'tencentDNS'">
<td class="color-border">SecretKey</td>
<td>{{provider.apiParams.accessKeySecret}}</td>
</tr>
<tr v-if="provider.apiParams.apiType != 'tencentDNS'">
<td class="color-border">密钥ID</td>
<td>{{provider.apiParams.id}}</td>
</tr>
<tr v-if="provider.apiParams.apiType != 'tencentDNS'">
<td class="color-border">密钥Token</td>
<td>{{provider.apiParams.token}}</td>
</tr>
<tr v-if="provider.apiParams.apiType != 'tencentDNS'">
<td class="color-border">区域</td>
<td>
<span v-if="provider.apiParams.region == 'international'">国际站</span>
<span v-else>中国站</span>
</td>
</tr>
</tbody>
<!-- AliDNS -->
<tbody v-if="provider.type == 'alidns'">
<tr>
<td>AccessKeyId</td>
<td>{{provider.apiParams.accessKeyId}}</td>
</tr>
<tr>
<td>AccessKeySecret</td>
<td>{{provider.apiParams.accessKeySecret}}</td>
</tr>
<tr>
<td>区域ID</td>
<td>
<span v-if="provider.apiParams.regionId != null && provider.apiParams.regionId.length > 0">{{provider.apiParams.regionId}}</span>
<span v-else class="disabled">没有设置。</span>
</td>
</tr>
</tbody>
<!-- HuaweiDNS -->
<tbody v-if="provider.type == 'huaweiDNS'">
<tr>
<td>AccessKeyId</td>
<td>{{provider.apiParams.accessKeyId}}</td>
</tr>
<tr>
<td>AccessKeySecret</td>
<td>{{provider.apiParams.accessKeySecret}}</td>
</tr>
<tr>
<td>终端节点</td>
<td>
<span v-if="provider.apiParams.endpoint != null && provider.apiParams.endpoint.length > 0">{{provider.apiParams.endpoint}}</span>
<span v-else class="disabled">默认</span>
</td>
</tr>
</tbody>
<!-- CloudFlare -->
<tbody v-if="provider.type == 'cloudFlare'">
<tr>
<td class="color-border">API密钥</td>
<td>
{{provider.apiParams.apiKey}}
</td>
</tr>
<tr>
<td class="color-border">账号邮箱</td>
<td>{{provider.apiParams.email}}</td>
</tr>
</tbody>
<!-- GoDaddy -->
<tbody v-if="provider.type == 'godaddy'">
<tr>
<td class="color-border">Key</td>
<td>
{{provider.apiParams.key}}
</td>
</tr>
<tr>
<td class="color-border">Secret</td>
<td>{{provider.apiParams.secret}}</td>
</tr>
</tbody>
<!-- ClouDNS -->
<tbody v-if="provider.type == 'cloudns'">
<tr v-if="provider.apiParams.authId > 0">
<td class="color-border">用户认证ID<em>auth-id</em></td>
<td>{{provider.apiParams.authId}}</td>
</tr>
<tr v-if="provider.apiParams.subAuthId > 0">
<td class="color-border">子用户认证ID<em>sub-auth-id</em></td>
<td>{{provider.apiParams.subAuthId}}</td>
</tr>
<tr>
<td class="color-border">认证密码<em>auth-password</em></td>
<td>{{provider.apiParams.authPassword}}</td>
</tr>
</tbody>
<!-- DNS.COM -->
<tbody v-if="provider.type == 'dnscom'">
<tr>
<td class="color-border">API Key</td>
<td>{{provider.apiParams.key}}</td>
</tr>
<tr>
<td class="color-border">API Secret</td>
<td>{{provider.apiParams.secret}}</td>
</tr>
</tbody>
<!-- DNS.LA -->
<tbody v-if="provider.type == 'dnsla'">
<tr>
<td class="color-border">API ID</td>
<td>{{provider.apiParams.apiId}}</td>
</tr>
<tr>
<td class="color-border">API密钥</td>
<td>{{provider.apiParams.secret}}</td>
</tr>
</tbody>
<!-- VolcEngine -->
<tbody v-if="provider.type == 'volcEngine'">
<tr>
<td class="color-border">Access Key ID</td>
<td>{{provider.apiParams.accessKeyId}}</td>
</tr>
<tr>
<td class="color-border">Secret Access Key</td>
<td>{{provider.apiParams.accessKeySecret}}</td>
</tr>
</tbody>
<!-- Amazon Route 53 -->
<tbody v-if="provider.type == 'amazonRoute53'">
<tr>
<td class="color-border">Access Key ID</td>
<td>{{provider.apiParams.accessKeyId}}</td>
</tr>
<tr>
<td class="color-border">Secret Access Key</td>
<td>{{provider.apiParams.accessKeySecret}}</td>
</tr>
<tr>
<td class="color-border">API区域</td>
<td>
<span v-if="provider.apiParams.region != null && provider.apiParams.region.length > 0">{{provider.apiParams.region}}</span>
<span v-else class="disabled">暂未设置</span>
</td>
</tr>
</tbody>
<tbody v-if="provider.type == 'azureDNS'">
<tr>
<td class="color-border">订阅ID <br/><em>(Subscription ID)</em></td>
<td>
{{provider.apiParams.subscriptionId}}
</td>
</tr>
<tr>
<td class="color-border">目录(租户) ID <br/><em>(Directory Tenant ID)</em></td>
<td>
{{provider.apiParams.tenantId}}
</td>
</tr>
<tr>
<td class="color-border">应用程序(客户端) ID <br/><em>(Client ID)</em></td>
<td>
{{provider.apiParams.clientId}}
</td>
</tr>
<tr>
<td class="color-border">客户端密码值 <br/><em>(Client Secret Value)</em></td>
<td>
{{provider.apiParams.clientSecret}}
</td>
</tr>
<tr>
<td class="color-border">资源组 <br/><em>(Resource Group Name)</em></td>
<td>
{{provider.apiParams.resourceGroupName}}
</td>
</tr>
</tbody>
<!-- bunny.net -->
<tbody v-if="provider.type == 'bunnyNet'">
<tr>
<td class="color-border">API密钥</td>
<td>
{{provider.apiParams.apiKey}}
</td>
</tr>
</tbody>
<!-- Local EdgeDNS -->
<tbody v-if="provider.type == 'localEdgeDNS'">
<tr>
<td class="color-border">域名服务集群</td>
<td>
{{provider.localEdgeDNS.name}}
</td>
</tr>
</tbody>
<!-- EdgeDNS API -->
<tbody v-if="provider.type == 'edgeDNSAPI'">
<tr>
<td class="color-border">API地址</td>
<td>{{provider.apiParams.host}}</td>
</tr>
<tr>
<td class="color-border">AccessKey类型</td>
<td>
<span v-if="provider.apiParams.role == 'user'">平台用户</span>
<span v-if="provider.apiParams.role == 'admin'">管理员</span>
</td>
</tr>
<tr>
<td class="color-border">AccessKey ID</td>
<td>{{provider.apiParams.accessKeyId}}</td>
</tr>
<tr>
<td class="color-border">AccessKey密钥</td>
<td>{{provider.apiParams.accessKeySecret}}</td>
</tr>
</tbody>
<!-- CustomHTTP -->
<tbody v-if="provider.type == 'customHTTP'">
<tr>
<td class="color-border">HTTP URL</td>
<td>{{provider.apiParams.url}}</td>
</tr>
<tr>
<td class="color-border">私钥</td>
<td>{{provider.apiParams.secret}}</td>
</tr>
</tbody>
<tr v-if="provider.minTTL > 0">
<td>最小TTL</td>
<td>{{provider.minTTL}}秒</td>
</tr>
</table>
<h4>管理的域名 &nbsp; <a href="" @click.prevent="syncDomains()" style="font-size: 0.8em">[刷新域名]</a> &nbsp; <a href="" @click.prevent="createDomain()" style="font-size: 0.8em">[添加域名]</a></h4>
<p class="ui message blue" v-if="isUpdatingDomains">正在检查域名状态...</p>
<second-menu>
<menu-item :href="'/dns/providers/provider?providerId=' + provider.id + '&filter='" :active="filter == ''">正常状态</menu-item>
<menu-item :href="'/dns/providers/provider?providerId=' + provider.id + '&filter=down'" :active="filter == 'down'">已下线</menu-item>
<menu-item :href="'/dns/providers/provider?providerId=' + provider.id + '&filter=deleted'" :active="filter == 'deleted'">已删除</menu-item>
</second-menu>
<p class="comment" v-if="domains.length == 0">暂时还没有<span v-if="filter == 'deleted'">已删除</span><span v-if="filter == 'down'">已下线</span><span v-if="filter == ''">可以管理</span>的域名。</p>
<table class="ui table selectable celled" v-if="domains.length > 0">
<thead>
<tr>
<th>域名</th>
<th class="center" style="width: 7em">线路</th>
<th class="center" style="width: 6em">集群</th>
<th class="center" style="width: 7em">节点域名</th>
<th class="center" style="width: 7em">网站域名</th>
<th>数据更新时间</th>
<th class="center width10">状态</th>
<th class="three op">操作</th>
</tr>
</thead>
<tr v-for="(domain, index) in domains">
<td>{{domain.name}}</td>
<td class="center">
<a href="" v-if="domain.countRoutes > 0" @click.prevent="showRoutes(domain.id)">{{domain.countRoutes}}个<popup-icon></popup-icon></a>
<span v-else class="disabled">0个</span>
</td>
<td class="center">
<a href="" v-if="domain.countClusters > 0" @click.prevent="viewClusters(domain.id)">{{domain.countClusters}}<popup-icon></popup-icon></a>
<span v-else class="disabled">0个</span>
</td>
<td class="center">
<a href="" v-if="domain.countAllNodes > 0" @click.prevent="viewNodes(domain.id)">{{domain.countNodeRecords}}/{{domain.countAllNodes}}个<popup-icon></popup-icon></a>
<span v-else class="disabled">0个</span>
</td>
<td class="center">
<a href="" v-if="domain.countAllServers > 0" @click.prevent="viewServers(domain.id)">{{domain.countServerRecords}}/{{domain.countAllServers}}个<popup-icon></popup-icon></a>
<span v-else class="disabled">0个</span>
</td>
<td>
<span v-if="domain.dataUpdatedTime.length > 0">{{domain.dataUpdatedTime}}</span>
<span v-else class="disabled">尚未更新</span>
</td>
<td class="center">
<span v-if="!domain.isOn"><label-on :v-is-on="domain.isOn"></label-on></span>
<div v-else-if="domain.countRoutes == 0 || domain.nodesChanged || domain.serversChanged">
<a href="" style="border-bottom: 1px #db2828 dashed" title="点击和DNS服务商系统同步" @click.prevent="syncDomain(index,domain)" v-if="!domain.isSyncing"><span class="red">需要同步</span></a>
<span v-else>正在同步...</span>
</div>
<div v-else-if="!domain.isUp">
<a href="" style="border-bottom: 1px #db2828 dashed" @click.prevent="alertDown"><span class="red">已下线</span></a>
</div>
</td>
<td>
<a href="" @click.prevent="syncDomain(index, domain)" v-if="!domain.isSyncing">同步</a>
<span v-else>正在同步...</span>&nbsp;
<a href="" @click.prevent="updateDomain(domain.id)" v-if="!domain.isSyncing">修改</a> &nbsp;
<a href="" @click.prevent="deleteDomain(domain)" v-if="!domain.isSyncing && !domain.isDeleted">删除</a>
<a href="" @click.prevent="recoverDomain(domain)" v-if="!domain.isSyncing && domain.isDeleted">恢复</a>
</td>
</tr>
</table>
<page-box></page-box>

View File

@@ -0,0 +1,139 @@
Tea.context(function () {
this.isUpdatingDomains = false
this.hasDeletedDomains = this.domains.$find(function (k, v) {
return v.isDeleted
}) != null
this.$delay(function () {
if (this.pageNo <= 1 && this.filter.length == 0) {
this.syncDomains()
}
})
this.syncDomains = function () {
this.isUpdatingDomains = true
this.$post(".syncDomains")
.params({
providerId: this.provider.id
})
.success(function (resp) {
if (resp.data.hasChanges) {
teaweb.reload()
}
})
.done(function () {
this.$delay(function () {
this.isUpdatingDomains = false
}, 1000)
})
}
this.updateProvider = function (providerId) {
teaweb.popup(Tea.url(".updatePopup?providerId=" + providerId), {
height: "28em",
callback: function () {
teaweb.success("保存成功", function () {
teaweb.reload()
})
}
})
}
this.createDomain = function () {
teaweb.popup("/dns/domains/createPopup?providerId=" + this.provider.id, {
callback: function () {
teaweb.success("保存成功", function () {
teaweb.reload()
})
}
})
}
this.updateDomain = function (domainId) {
teaweb.popup("/dns/domains/updatePopup?domainId=" + domainId, {
callback: function () {
teaweb.success("保存成功", function () {
teaweb.reload()
})
}
})
}
this.deleteDomain = function (domain) {
let that = this
teaweb.confirm("确定要删除域名\"" + domain.name + "\"吗?", function () {
that.$post("/dns/domains/delete")
.params({
domainId: domain.id
})
.post()
.refresh()
})
}
this.recoverDomain = function (domain) {
let that = this
teaweb.confirm("确定要恢复域名\"" + domain.name + "\"吗?", function () {
that.$post("/dns/domains/recover")
.params({
domainId: domain.id
})
.post()
.refresh()
})
}
this.syncDomain = function (index, domain) {
let that = this
teaweb.confirm("确定要同步此域名下的所有解析记录吗?", function () {
domain.isSyncing = true
Vue.set(that.domains, index, domain)
this.$post("/dns/domains/sync")
.params({
domainId: domain.id
})
.success(function () {
teaweb.success("同步成功", function () {
teaweb.reload()
})
})
.fail(function (resp) {
teaweb.warn(resp.message, function () {
if (resp.data.shouldFix) {
window.location = "/dns/issues"
}
})
})
.done(function () {
Vue.set(that.domains, index, domain)
})
})
}
this.showRoutes = function (domainId) {
teaweb.popup("/dns/domains/routesPopup?domainId=" + domainId)
}
this.viewClusters = function (domainId) {
teaweb.popup("/dns/domains/clustersPopup?domainId=" + domainId)
}
this.viewNodes = function (domainId) {
teaweb.popup("/dns/domains/nodesPopup?domainId=" + domainId, {
width: "50em",
height: "30em"
})
}
this.viewServers = function (domainId) {
teaweb.popup("/dns/domains/serversPopup?domainId=" + domainId, {
width: "50em",
height: "30em"
})
}
this.alertDown = function () {
teaweb.popupTip("当前域名已从服务商下线")
}
})

View File

@@ -0,0 +1,418 @@
{$layout "layout_popup"}
<h3>修改DNS服务商账号</h3>
<form class="ui form" data-tea-action="$" data-tea-success="success">
<csrf-token></csrf-token>
<input type="hidden" name="providerId" :value="provider.id"/>
<input type="hidden" name="type" :value="provider.type"/>
<table class="ui table definition selectable">
<tr>
<td class="title">账号说明 *</td>
<td>
<input type="text" name="name" maxlength="50" ref="focus" v-model="provider.name"/>
<p class="comment">用来方便区分不同的账号。</p>
</td>
</tr>
<tr>
<td>服务商厂家 *</td>
<td>
{{provider.typeName}}
<p class="comment">{{typeDescription}}创建后无法修改此选项。</p>
</td>
</tr>
<tr>
<td colspan="2">API参数</td>
</tr>
<!-- DNSPod -->
<tbody v-if="provider.type == 'dnspod'">
<tr>
<td>密钥类型 *</td>
<td>
<select class="ui dropdown auto-width" name="paramDNSPodAPIType" v-model="provider.params.apiType">
<option value="tencentDNS">腾讯云API密钥</option>
<option value="dnsPodToken">DNSPod Token</option>
</select>
</td>
</tr>
<tr v-show="provider.params.apiType == 'tencentDNS'">
<td>SecretId *</td>
<td>
<input type="text" name="paramDNSPodAccessKeyId" maxlength="100" v-model="provider.params.accessKeyId"/>
<p class="comment">在DNSPod控制台“账号中心--API密钥”中获取。</p>
</td>
</tr>
<tr v-show="provider.params.apiType == 'tencentDNS'">
<td>SecretKey *</td>
<td>
<input type="text" name="paramDNSPodAccessKeySecret" maxlength="100" v-model="provider.params.accessKeySecret"/>
<p class="comment">在DNSPod控制台“账号中心--API密钥”中获取。<mask-warning></mask-warning></p>
</td>
</tr>
<tr v-show="provider.params.apiType == null || provider.params.apiType.length == 0 || provider.params.apiType == 'dnsPodToken'">
<td>密钥ID *</td>
<td>
<input type="text" name="paramDNSPodId" maxlength="100" v-model="provider.params.id"/>
<p class="comment">在DNSPod控制台“账号中心--API密钥--DNSPod Token”中获取。</p>
</td>
</tr>
<tr v-show="provider.params.apiType == null || provider.params.apiType.length == 0 || provider.params.apiType == 'dnsPodToken'">
<td>密钥Token *</td>
<td>
<input type="text" name="paramDNSPodToken" maxlength="100" v-model="provider.params.token" spellcheck="false"/>
<p class="comment">在DNSPod控制台“账号中心--API密钥--DNSPod Token”中获取。<mask-warning></mask-warning></p>
</td>
</tr>
<tr v-if="provider.params.apiType == null || provider.params.apiType.length == 0 || provider.params.apiType == 'dnsPodToken'">
<td>区域</td>
<td>
<select class="ui dropdown auto-width" name="paramDNSPodRegion" v-model="provider.params.region">
<option value="">中国站</option>
<option value="international">国际站</option>
</select>
</td>
</tr>
</tbody>
<!-- AliDNS -->
<tbody v-if="provider.type == 'alidns'">
<tr>
<td>AccessKeyId *</td>
<td>
<input type="text" name="paramAliDNSAccessKeyId" maxlength="100" v-model="provider.params.accessKeyId" spellcheck="false"/>
<p class="comment">登录阿里云控制台 -- 在"访问控制"中创建和获取。</p>
</td>
</tr>
<tr>
<td>AccessKeySecret *</td>
<td>
<input type="text" name="paramAliDNSAccessKeySecret" maxlength="100" v-model="provider.params.accessKeySecret" spellcheck="false"/>
<p class="comment">登录阿里云控制台 -- 在"访问控制"中创建和获取。<mask-warning></mask-warning></p>
</td>
</tr>
<tr>
<td>区域ID<optional-label></optional-label></td>
<td>
<input type="text" name="paramAliDNSRegionId" maxlength="100" v-model="provider.params.regionId"/>
<p class="comment">阿里云产品所在区域代号,通常不需要填写。</p>
</td>
</tr>
</tbody>
<!-- 华为云 -->
<tbody v-if="provider.type == 'huaweiDNS'">
<tr>
<td>AccessKeyId *</td>
<td>
<input type="text" name="paramHuaweiAccessKeyId" maxlength="100" v-model="provider.params.accessKeyId" spellcheck="false"/>
<p class="comment">登录华为云控制台 -- 在"我的凭证 -- 访问密钥"中创建和获取。</p>
</td>
</tr>
<tr>
<td>AccessKeySecret *</td>
<td>
<input type="text" name="paramHuaweiAccessKeySecret" maxlength="100" v-model="provider.params.accessKeySecret" spellcheck="false"/>
<p class="comment">登录华为云控制台 -- 在"我的凭证 -- 访问密钥"中创建和获取。<mask-warning></mask-warning></p>
</td>
</tr>
<tr>
<td>终端节点</td>
<td>
<input type="text" name="paramHuaweiEndpoint" maxlength="100" v-model="provider.params.endpoint" spellcheck="false"/>
<p class="comment">选填项。可以填写终端节点Endpoint区域代号或者域名参考 <a href="https://developer.huaweicloud.com/endpoint?DNS" target="_blank">https://developer.huaweicloud.com/endpoint?DNS</a>(如果此链接失效,请到华为云开发者中心自行查找)。</p>
</td>
</tr>
</tbody>
<!-- CloudFlare -->
<tbody v-if="provider.type == 'cloudFlare'">
<tr>
<td>API密钥 *</td>
<td>
<input type="text" name="paramCloudFlareAPIKey" maxlength="100" v-model="provider.params.apiKey" spellcheck="false"/>
<p class="comment">在个人资料中的"API令牌"--"API密钥"--"Global API Key"中获取。<mask-warning></mask-warning></p>
</td>
</tr>
<tr>
<td>账号邮箱 *</td>
<td>
<input type="text" name="paramCloudFlareEmail" maxlength="100" v-model="provider.params.email" spellcheck="false"/>
<p class="comment">登录账号使用的邮箱。</p>
</td>
</tr>
</tbody>
<!-- GoDaddy -->
<tbody v-if="provider.type == 'godaddy'">
<tr>
<td>Key *</td>
<td>
<input type="text" name="paramGoDaddyKey" maxlength="100" v-model="provider.params.key" spellcheck="false"/>
<p class="comment">可以在GoDaddy<a href="https://developer.godaddy.com/keys" target="_blank">开发者中心</a>创建创建时Environment选择Production。</p>
</td>
</tr>
<tr>
<td>Secret *</td>
<td>
<input type="text" name="paramGoDaddySecret" maxlength="100" v-model="provider.params.secret" spellcheck="false"/>
<p class="comment"><mask-warning></mask-warning></p>
</td>
</tr>
</tbody>
<!-- ClouDNS -->
<tbody v-if="provider.type == 'cloudns'">
<tr>
<td>用户认证ID<em>auth-id</em></td>
<td>
<input type="text" name="paramClouDNSAuthId" maxlength="20" v-model="provider.params.authId" spellcheck="false"/>
<p class="comment">和子用户认证ID二选一。可以在ClouDNS<a href="https://www.cloudns.net/api-settings/" target="_blank">API设置页面</a>添加。</p>
</td>
</tr>
<tr>
<td>子用户认证ID<em>sub-auth-id</em></td>
<td>
<input type="text" name="paramClouDNSSubAuthId" maxlength="20" v-model="provider.params.subAuthId"/>
<p class="comment">和用户认证ID二选一。可以在ClouDNS<a href="https://www.cloudns.net/api-settings/" target="_blank">API设置页面</a>添加。</p>
</td>
</tr>
<tr>
<td>认证密码 *<em>auth-password</em></td>
<td>
<input type="password" name="paramClouDNSAuthPassword" maxlength="100" v-model="provider.params.authPassword" spellcheck="false"/>
<p class="comment">用户或者子用户的认证密码。<mask-warning></mask-warning></p>
</td>
</tr>
</tbody>
<!-- DNS.COM -->
<tbody v-if="provider.type == 'dnscom'">
<tr>
<td>API Key *</td>
<td>
<input type="text" name="paramDNSComKey" maxlength="100" v-model="provider.params.key" spellcheck="false"/>
<p class="comment">在51DNS.COM控制台账号中心--API设置中创建和查看。</p>
</td>
</tr>
<tr>
<td>API Secret *</td>
<td>
<input type="text" name="paramDNSComSecret" maxlength="100" v-model="provider.params.secret" spellcheck="false"/>
<p class="comment">在51DNS.COM控制台账号中心--API设置中创建和查看。<mask-warning></mask-warning></p>
</td>
</tr>
</tbody>
<!-- DNS.LA -->
<tbody v-if="provider.type == 'dnsla'">
<tr>
<td>API ID *</td>
<td>
<input type="text" name="paramDNSLaAPIId" maxlength="100" v-model="provider.params.apiId" spellcheck="false"/>
<p class="comment">在DNS.LA控制台--账户信息中查看。</p>
</td>
</tr>
<tr>
<td>API密钥 *</td>
<td>
<input type="text" name="paramDNSLaSecret" maxlength="100" v-model="provider.params.secret" spellcheck="false"/>
<p class="comment">在DNS.LA控制台--账户信息中查看。<mask-warning></mask-warning></p>
</td>
</tr>
</tbody>
<!-- VolcEngine -->
<tbody v-if="provider.type == 'volcEngine'">
<tr>
<td>Access Key ID *</td>
<td>
<input type="text" name="paramVolcEngineAccessKeyId" maxlength="100" v-model="provider.params.accessKeyId" spellcheck="false"/>
<p class="comment">在火山引擎“访问控制--API访问密钥”中获取。</p>
</td>
</tr>
<tr>
<td>Secret Access Key *</td>
<td>
<input type="text" name="paramVolcEngineAccessKeySecret" maxlength="100" v-model="provider.params.accessKeySecret" spellcheck="false"/>
<p class="comment"><mask-warning></mask-warning></p>
</td>
</tr>
</tbody>
<!-- Amazon Route 53 -->
<tbody v-if="provider.type == 'amazonRoute53'">
<tr>
<td>Access Key ID *</td>
<td>
<input type="text" name="paramAmazonRoute53AccessKeyId" maxlength="100" v-model="provider.params.accessKeyId" spellcheck="false"/>
</td>
</tr>
<tr>
<td>Secret Access Key *</td>
<td>
<input type="text" name="paramAmazonRoute53AccessKeySecret" maxlength="100" v-model="provider.params.accessKeySecret" spellcheck="false"/>
<p class="comment"><mask-warning></mask-warning></p>
</td>
</tr>
<tr>
<td>API区域</td>
<td>
<input type="text" name="paramAmazonRoute53Region" maxlength="100" v-model="provider.params.region" spellcheck="false"/>
<p class="comment">通常不需要填写。</p>
</td>
</tr>
</tbody>
<!-- Microsoft Azure DNS -->
<tbody v-if="provider.type == 'azureDNS'">
<tr>
<td>订阅ID <br/><em>(Subscription ID)</em> *</td>
<td>
<input type="text" name="paramAzureDNSSubscriptionId" maxlength="100" v-model="provider.params.subscriptionId" spellcheck="false"/>
<p class="comment">可以在订阅Subscriptions服务中查看。</p>
</td>
</tr>
<tr>
<td>目录(租户) ID <br/><em>(Directory Tenant ID)</em> *</td>
<td>
<input type="text" name="paramAzureDNSTenantId" maxlength="100" v-model="provider.params.tenantId" spellcheck="false"/>
<p class="comment">可以在应用注册App registrations中对应应用概述Overview中查看。</p>
</td>
</tr>
<tr>
<td>应用程序(客户端) ID <br/><em>(Client ID)</em> *</td>
<td><input type="text" name="paramAzureDNSClientId" maxlength="100" v-model="provider.params.clientId" spellcheck="false"/>
<p class="comment">需要在应用注册App registrations中新注册应用程序获得。</p>
</td>
</tr>
<tr>
<td>客户端密码值 <br/><em>(Client Secret Value)</em> *</td>
<td>
<input type="text" name="paramAzureDNSClientSecret" maxlength="100" v-model="provider.params.clientSecret" spellcheck="false"/>
<p class="comment">可以在应用注册App registrations中对应应用的“证书和密码Certificates &amp; secrets”--“客户端密码Client secrets”中创建和查看。<mask-warning></mask-warning></p>
</td>
</tr>
<tr>
<td>资源组 <br/><em>(Resource Group Name)</em> *</td>
<td>
<input type="text" name="paramAzureDNSResourceGroupName" maxlength="100" v-model="provider.params.resourceGroupName" spellcheck="false"/>
<p class="comment">权限设置帮助你需要在对应资源组Resource group-- 访问控制Access control (IAM)-- 角色分配Role assignments中添加一个角色分配Role assignment其中作业职能角色Job function roles为"DNS 区域参与者(DNS Zone Contributor)"成员Members为应用注册App registrations中的应用程序application有时需要在选择成员select members界面搜索应用程序application名称才能看到</p>
</td>
</tr>
</tbody>
<!-- bunny.net -->
<tbody v-if="provider.type == 'bunnyNet'">
<tr>
<td>API密钥 *</td>
<td>
<input type="text" name="paramBunnyNetAPIKey" maxlength="100" spellcheck="false" v-model="provider.params.apiKey"/>
<p class="comment">在"Edit account details" -- "API Key"中获取。<mask-warning></mask-warning></p>
</td>
</tr>
</tbody>
<!-- Gname -->
<tbody v-if="provider.type == 'gname'">
<tr>
<td>APPID *</td>
<td>
<input type="text" name="paramGnameAppid" maxlength="100" v-model="provider.params.appid" spellcheck="false"/>
<p class="comment">在Gname控制台API设置中获取。</p>
</td>
</tr>
<tr>
<td>API Secret *</td>
<td>
<input type="text" name="paramGnameSecret" maxlength="100" v-model="provider.params.secret" spellcheck="false"/>
<p class="comment">在Gname控制台API设置中获取。<mask-warning></mask-warning></p>
</td>
</tr>
</tbody>
<!-- EdgeDNS -->
<tbody v-if="provider.type == 'localEdgeDNS'">
<tr>
<td>选择域名服务集群 *</td>
<td>
<select class="ui dropdown auto-width" name="paramLocalEdgeDNSClusterId" v-model="provider.params.clusterId">
<option value="0">[选择域名服务集群]</option>
<option v-for="cluster in nsClusters" :value="cluster.id">{{cluster.name}}</option>
</select>
</td>
</tr>
</tbody>
<!-- EdgeDNS API -->
<tbody v-if="provider.type == 'edgeDNSAPI'">
<tr>
<td>API地址 *</td>
<td>
<input type="text" name="paramEdgeDNSAPIHost" maxlength="100" v-model="provider.params.host"/>
</td>
</tr>
<tr>
<td>AccessKey类型 *</td>
<td>
<select class="ui dropdown auto-width" name="paramEdgeDNSAPIRole" v-model="provider.params.role">
<option value="user">平台用户</option>
<option value="admin">管理员</option>
</select>
</td>
</tr>
<tr>
<td>AccessKey ID *</td>
<td>
<input type="text" name="paramEdgeDNSAPIAccessKeyId" maxlength="64" v-model="provider.params.accessKeyId"/>
</td>
</tr>
<tr>
<td>AccessKey密钥 *</td>
<td>
<input type="text" name="paramEdgeDNSAPIAccessKeySecret" maxlength="64" v-model="provider.params.accessKeySecret"/>
<p class="comment"><mask-warning></mask-warning></p>
</td>
</tr>
</tbody>
<!-- 自定义HTTP-->
<tbody v-if="provider.type == 'customHTTP'">
<tr>
<td>HTTP URL *</td>
<td>
<input type="text" name="paramCustomHTTPURL" maxlength="200" v-model="provider.params.url"/>
<p class="comment">HTTP URL完整地址DNS所有操作都会以POST的方式转发到此地址。</p>
</td>
</tr>
<tr>
<td>私钥 *</td>
<td>
<input type="text" name="paramCustomHTTPSecret" maxlength="64" v-model="provider.params.secret"/>
<p class="comment">通讯用的私钥转发请求时会在Header中加入相关信息方便开发者校验请求是否合法。</p>
</td>
</tr>
</tbody>
<!-- 更多选项 -->
<tr>
<td colspan="2"><more-options-indicator></more-options-indicator></td>
</tr>
<tbody v-show="moreOptionsVisible">
<tr>
<td>最小TTL</td>
<td>
<div class="ui right labeled input">
<input type="text" name="minTTL" size="4" maxlength="6" style="width: 6em" v-model="provider.minTTL"/>
<span class="ui label"></span>
</div>
<p class="comment">生成的DNS时可以使用的最小TTL请根据你选择的服务商和你在服务商中的账号等级进行填写不填写或者0表示默认。</p>
</td>
</tr>
</tbody>
</table>
<submit-btn></submit-btn>
</form>

View File

@@ -0,0 +1,15 @@
Tea.context(function () {
this.typeDescription = ""
let that = this
this.types.forEach(function (v) {
if (v.code == that.provider.type) {
that.typeDescription = v.description
}
})
// DNSPod
if (this.provider.type == "dnspod" && this.provider.params != null && (this.provider.params.apiType == null || this.provider.params.apiType.length == 0)) {
this.provider.params.apiType = "dnsPodToken"
}
})