前端页面

This commit is contained in:
robin
2026-02-24 22:43:49 +08:00
parent 2eb32b9f1f
commit 4d275c921d
18 changed files with 611 additions and 485 deletions

View File

@@ -1,23 +0,0 @@
package apps
import (
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
"github.com/iwind/TeaGo/actions"
)
type AppSettingsResetAESSecretAction struct {
actionutils.ParentAction
}
func (this *AppSettingsResetAESSecretAction) RunPost(params struct {
AppId int64
Must *actions.Must
CSRF *actionutils.CSRF
}) {
params.Must.Field("appId", params.AppId).Gt(0, "请选择应用")
app := pickApp(params.AppId)
resetAESSecret(app)
this.Success()
}

View File

@@ -17,7 +17,6 @@ var appSettingsStore = struct {
func defaultAppSettings(app maps.Map) maps.Map {
signSecretPlain := randomPlainSecret("ss")
aesSecretPlain := randomPlainSecret("as")
return maps.Map{
"appId": app.GetString("appId"),
"primaryClusterId": app.GetInt64("clusterId"),
@@ -25,9 +24,6 @@ func defaultAppSettings(app maps.Map) maps.Map {
"signSecretPlain": signSecretPlain,
"signSecretMasked": maskSecret(signSecretPlain),
"signSecretUpdatedAt": "2026-02-20 12:30:00",
"aesSecretPlain": aesSecretPlain,
"aesSecretMasked": maskSecret(aesSecretPlain),
"aesSecretUpdatedAt": "2026-02-12 09:45:00",
"appStatus": app.GetBool("isOn"),
"defaultTTL": 30,
"fallbackTimeoutMs": 300,
@@ -52,9 +48,6 @@ func cloneSettings(settings maps.Map) maps.Map {
"signSecretPlain": settings.GetString("signSecretPlain"),
"signSecretMasked": settings.GetString("signSecretMasked"),
"signSecretUpdatedAt": settings.GetString("signSecretUpdatedAt"),
"aesSecretPlain": settings.GetString("aesSecretPlain"),
"aesSecretMasked": settings.GetString("aesSecretMasked"),
"aesSecretUpdatedAt": settings.GetString("aesSecretUpdatedAt"),
"appStatus": settings.GetBool("appStatus"),
"defaultTTL": settings.GetInt("defaultTTL"),
"fallbackTimeoutMs": settings.GetInt("fallbackTimeoutMs"),
@@ -110,16 +103,6 @@ func resetSignSecret(app maps.Map) maps.Map {
return settings
}
func resetAESSecret(app maps.Map) maps.Map {
settings := loadAppSettings(app)
aesSecretPlain := randomPlainSecret("as")
settings["aesSecretPlain"] = aesSecretPlain
settings["aesSecretMasked"] = maskSecret(aesSecretPlain)
settings["aesSecretUpdatedAt"] = nowDateTime()
saveAppSettings(app.GetInt64("id"), settings)
return settings
}
func nowDateTime() string {
return time.Now().Format("2006-01-02 15:04:05")
}
@@ -182,21 +165,6 @@ func ensureSettingsFields(settings maps.Map) bool {
changed = true
}
aesSecretPlain := settings.GetString("aesSecretPlain")
if len(aesSecretPlain) == 0 {
aesSecretPlain = randomPlainSecret("as")
settings["aesSecretPlain"] = aesSecretPlain
changed = true
}
if len(settings.GetString("aesSecretMasked")) == 0 {
settings["aesSecretMasked"] = maskSecret(aesSecretPlain)
changed = true
}
if len(settings.GetString("aesSecretUpdatedAt")) == 0 {
settings["aesSecretUpdatedAt"] = nowDateTime()
changed = true
}
if len(settings.GetString("sniPolicy")) == 0 {
settings["sniPolicy"] = "level2"
changed = true

View File

@@ -19,7 +19,6 @@ func init() {
GetPost("/app/settings", new(AppSettingsAction)).
Post("/app/settings/toggleSignEnabled", new(AppSettingsToggleSignEnabledAction)).
Post("/app/settings/resetSignSecret", new(AppSettingsResetSignSecretAction)).
Post("/app/settings/resetAESSecret", new(AppSettingsResetAESSecretAction)).
Get("/domains", new(DomainsAction)).
Get("/customRecords", new(CustomRecordsAction)).
GetPost("/createPopup", new(CreatePopupAction)).

View File

@@ -45,7 +45,7 @@ func (this *ClusterSettingsAction) RunGet(params struct {
cid := strconv.FormatInt(params.ClusterId, 10)
this.Data["leftMenuItems"] = []map[string]interface{}{
{"name": "基础设置", "url": "/httpdns/clusters/cluster/settings?clusterId=" + cid + "&section=basic", "isActive": section == "basic"},
{"name": "TLS", "url": "/httpdns/clusters/cluster/settings?clusterId=" + cid + "&section=tls", "isActive": section == "tls"},
{"name": "端口设置", "url": "/httpdns/clusters/cluster/settings?clusterId=" + cid + "&section=tls", "isActive": section == "tls"},
}
settings["isDefaultCluster"] = (policies.LoadDefaultClusterID() == cluster.GetInt64("id"))
@@ -88,7 +88,8 @@ func (this *ClusterSettingsAction) RunGet(params struct {
}
} else {
sslPolicy = &sslconfigs.SSLPolicy{
IsOn: true,
IsOn: true,
MinVersion: "TLS 1.1",
}
}

View File

@@ -3,6 +3,7 @@ package sandbox
import (
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/httpdns/httpdnsutils"
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/httpdns/policies"
)
type IndexAction struct {
@@ -15,21 +16,29 @@ func (this *IndexAction) Init() {
func (this *IndexAction) RunGet(params struct{}) {
httpdnsutils.AddLeftMenu(this.Parent())
this.Data["clusters"] = policies.LoadAvailableDeployClusters()
this.Data["apps"] = []map[string]interface{}{
{
"id": int64(1),
"name": "主站移动业务",
"appId": "ab12xc34s2",
"id": int64(1),
"name": "主站移动业务",
"appId": "ab12xc34s2",
"clusterId": int64(1),
"domains": []string{"api.business.com", "www.aliyun.com"},
},
{
"id": int64(2),
"name": "视频网关业务",
"appId": "vd8992ksm1",
"id": int64(2),
"name": "支付网关业务",
"appId": "vd8992ksm1",
"clusterId": int64(2),
"domains": []string{"payment.business.com"},
},
{
"id": int64(3),
"name": "海外灰度测试",
"appId": "ov7711hkq9",
"id": int64(3),
"name": "海外灰度测试",
"appId": "ov7711hkq9",
"clusterId": int64(1),
"domains": []string{"global.example.com", "edge.example.com"},
},
}
this.Show()

View File

@@ -6,6 +6,7 @@ import (
"strconv"
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/httpdns/policies"
"github.com/iwind/TeaGo/maps"
)
@@ -14,10 +15,11 @@ type TestAction struct {
}
func (this *TestAction) RunPost(params struct {
AppId string
Domain string
ClientIp string
Qtype string
AppId string
ClusterId int64
Domain string
ClientIp string
Qtype string
}) {
if len(params.ClientIp) == 0 {
params.ClientIp = "203.0.113.100"
@@ -40,7 +42,11 @@ func (this *TestAction) RunPost(params struct {
query.Set("dn", params.Domain)
query.Set("cip", params.ClientIp)
query.Set("qtype", params.Qtype)
requestURL := "https://api.httpdns.example.com/resolve?" + query.Encode()
clusterServiceDomain := policies.LoadClusterGatewayByID(params.ClusterId)
if len(clusterServiceDomain) == 0 {
clusterServiceDomain = "gw.httpdns.example.com"
}
requestURL := "https://" + clusterServiceDomain + "/resolve?" + query.Encode()
this.Data["result"] = maps.Map{
"code": 0,

View File

@@ -116,26 +116,8 @@
<p class="comment httpdns-note">用于生成鉴权接口的安全密钥。</p>
</td>
</tr>
<tr>
<td class="title">数据加密 Secret</td>
<td>
<div class="httpdns-secret-line">
<code>{{aesSecretVisible ? settings.aesSecretPlain : settings.aesSecretMasked}}</code>
<a href="" class="httpdns-mini-icon" @click.prevent="aesSecretVisible = !aesSecretVisible"
:title="aesSecretVisible ? '隐藏明文' : '查看明文'"><i class="icon"
:class="aesSecretVisible ? 'eye slash' : 'eye'"></i></a>
<a href="" class="httpdns-mini-icon" title="复制数据加密 Secret"
@click.prevent="copySecret(settings.aesSecretPlain, 'AES Secret')"><i
class="copy outline icon"></i></a>
<a href="" class="httpdns-mini-icon" title="重置数据加密 Secret" @click.prevent="resetAESSecret"><i
class="redo icon"></i></a>
</div>
<p class="comment httpdns-note">最近更新:{{settings.aesSecretUpdatedAt}}</p>
<p class="comment httpdns-note">用于解析接口数据加密的密钥。</p>
</td>
</tr>
</table>
<submit-btn></submit-btn>
</form>
</div>
</div>

View File

@@ -2,14 +2,13 @@ Tea.context(function () {
this.activeSection = this.activeSection || "basic";
this.success = NotifyReloadSuccess("保存成功");
this.signSecretVisible = false;
this.aesSecretVisible = false;
this.toggleSignEnabled = function () {
let that = this;
let targetIsOn = !this.settings.signEnabled;
if (targetIsOn) {
teaweb.confirm("html:开启后,服务端会对解析请求进行签名鉴权,<span class='red'>未签名、签名无效或过期的请求都解析失败</span>,确认开启吗?", function () {
teaweb.confirm("html:开启后,服务端会对解析请求进行签名鉴权,<span class='red'>未签名、签名无效或过期的请求都解析失败</span>,确认开启吗?", function () {
that.$post("/httpdns/apps/app/settings/toggleSignEnabled")
.params({
appId: that.app.id,
@@ -93,20 +92,4 @@ Tea.context(function () {
});
});
};
this.resetAESSecret = function () {
let that = this;
teaweb.confirm("确定要重置 AES Secret 吗?", function () {
that.$post("/httpdns/apps/app/settings/resetAESSecret")
.params({
appId: that.app.id
})
.success(function () {
teaweb.success("AES Secret 已重置", function () {
teaweb.reload();
});
});
});
};
});

View File

@@ -8,8 +8,8 @@
return;
}
teaweb.popup("/httpdns/apps/customRecords/createPopup?appId=" + this.app.id + "&domainId=" + this.domain.id, {
width: "56em",
height: "40em",
width: "42em",
height: "33em",
title: "新增自定义解析规则"
});
};
@@ -19,8 +19,8 @@
return;
}
teaweb.popup("/httpdns/apps/customRecords/createPopup?appId=" + this.app.id + "&domainId=" + this.domain.id + "&recordId=" + recordId, {
width: "56em",
height: "40em",
width: "42em",
height: "33em",
title: "编辑自定义解析规则"
});
};

View File

@@ -1,32 +1,37 @@
{$layout "layout_popup"}
<style>
.httpdns-inline-actions {
margin-top: .6em;
}
.httpdns-inline-actions .count {
color: #8f9aa6;
margin-left: .4em;
}
.httpdns-row {
display: flex;
align-items: center;
gap: .5em;
margin-bottom: .45em;
}
.httpdns-row .field {
margin: 0 !important;
}
.httpdns-row .field.flex {
flex: 1;
}
.httpdns-line-row {
display: flex !important;
align-items: center;
flex-wrap: nowrap;
gap: .5em;
white-space: nowrap;
}
.httpdns-inline-actions {
margin-top: .6em;
}
.httpdns-inline-actions .count {
color: #8f9aa6;
margin-left: .4em;
}
.httpdns-row {
display: flex;
align-items: center;
gap: .5em;
margin-bottom: .45em;
}
.httpdns-row .field {
margin: 0 !important;
}
.httpdns-row .field.flex {
flex: 1;
}
.httpdns-line-row {
display: flex !important;
align-items: center;
flex-wrap: nowrap;
gap: .5em;
white-space: nowrap;
}
</style>
<h3 v-if="isEditing">编辑自定义解析规则</h3>
@@ -40,98 +45,116 @@
<input type="hidden" name="recordId" :value="record.id" />
<input type="hidden" name="recordItemsJSON" :value="JSON.stringify(recordItems)" />
<table class="ui table definition selectable">
<tr>
<td class="title">域名 *</td>
<td><strong>{{record.domain}}</strong></td>
</tr>
<tr>
<td class="title">规则名称 *</td>
<td>
<input type="text" name="ruleName" maxlength="50" v-model="record.ruleName" ref="focus" />
<p class="comment">例如:上海电信灰度-v2。</p>
</td>
</tr>
<tr>
<td class="title">线路</td>
<td>
<div class="httpdns-line-row">
<select class="ui dropdown auto-width" style="display:inline-block !important;width:auto !important;margin:0 !important;" name="lineScope" v-model="record.lineScope" @change="onLineScopeChange">
<option value="china">中国大陆</option>
<option value="overseas">港澳台及境外</option>
</select>
<table class="ui table definition selectable small">
<tbody>
<tr>
<td class="title">域名 *</td>
<td><strong>{{record.domain}}</strong></td>
</tr>
<tr>
<td class="title">规则名称 *</td>
<td>
<input type="text" name="ruleName" maxlength="50" v-model="record.ruleName" ref="focus" />
<p class="comment">例如:上海电信灰度-v2。</p>
</td>
</tr>
<tr>
<td class="title">线路</td>
<td>
<div class="httpdns-line-row">
<select class="ui dropdown auto-width"
style="display:inline-block !important;width:auto !important;margin:0 !important;"
name="lineScope" v-model="record.lineScope" @change="onLineScopeChange">
<option value="china">中国地区</option>
<option value="overseas">境外</option>
</select>
<select class="ui dropdown auto-width"
style="display:inline-block !important;width:auto !important;margin:0 !important;"
name="lineCarrier" v-if="record.lineScope == 'china'" v-model="record.lineCarrier">
<option v-for="carrier in chinaCarriers" :value="carrier">{{carrier}}</option>
</select>
<select class="ui dropdown auto-width"
style="display:inline-block !important;width:auto !important;margin:0 !important;"
name="lineRegion" v-if="record.lineScope == 'china'" v-model="record.lineRegion"
@change="onChinaRegionChange">
<option v-for="region in chinaRegions" :value="region">{{region}}</option>
</select>
<select class="ui dropdown auto-width"
style="display:inline-block !important;width:auto !important;margin:0 !important;"
name="lineProvince" v-if="record.lineScope == 'china'" v-model="record.lineProvince">
<option v-for="province in provinceOptions" :value="province">{{province}}</option>
</select>
<select class="ui dropdown auto-width" style="display:inline-block !important;width:auto !important;margin:0 !important;" name="lineCarrier" v-if="record.lineScope == 'china'" v-model="record.lineCarrier">
<option v-for="carrier in chinaCarriers" :value="carrier">{{carrier}}</option>
</select>
<select class="ui dropdown auto-width" style="display:inline-block !important;width:auto !important;margin:0 !important;" name="lineRegion" v-if="record.lineScope == 'china'" v-model="record.lineRegion" @change="onChinaRegionChange">
<option v-for="region in chinaRegions" :value="region">{{region}}</option>
</select>
<select class="ui dropdown auto-width" style="display:inline-block !important;width:auto !important;margin:0 !important;" name="lineProvince" v-if="record.lineScope == 'china'" v-model="record.lineProvince">
<option v-for="province in provinceOptions" :value="province">{{province}}</option>
</select>
<select class="ui dropdown auto-width" style="display:inline-block !important;width:auto !important;margin:0 !important;" name="lineContinent" v-if="record.lineScope == 'overseas'" v-model="record.lineContinent" @change="onContinentChange">
<option v-for="continent in continents" :value="continent">{{continent}}</option>
</select>
<select class="ui dropdown auto-width" style="display:inline-block !important;width:auto !important;margin:0 !important;" name="lineCountry" v-if="record.lineScope == 'overseas'" v-model="record.lineCountry">
<option v-for="country in countryOptions" :value="country">{{country}}</option>
</select>
</div>
</td>
</tr>
<tr>
<td class="title">解析记录值 *</td>
<td>
<div style="float:right;">
<div class="ui checkbox">
<input type="checkbox" name="weightEnabled" value="1" v-model="record.weightEnabled" />
<label>按权重调度</label>
</div>
</div>
<div class="httpdns-row" v-for="(item, index) in recordItems">
<div class="field">
<select class="ui dropdown auto-width" v-model="item.type">
<option value="A">A</option>
<option value="AAAA">AAAA</option>
<select class="ui dropdown auto-width"
style="display:inline-block !important;width:auto !important;margin:0 !important;"
name="lineContinent" v-if="record.lineScope == 'overseas'" v-model="record.lineContinent"
@change="onContinentChange">
<option v-for="continent in continents" :value="continent">{{continent}}</option>
</select>
<select class="ui dropdown auto-width"
style="display:inline-block !important;width:auto !important;margin:0 !important;"
name="lineCountry" v-if="record.lineScope == 'overseas'" v-model="record.lineCountry">
<option v-for="country in countryOptions" :value="country">{{country}}</option>
</select>
</div>
<div class="field flex">
<input type="text" placeholder="记录值(与记录类型匹配)" v-model="item.value" />
</td>
</tr>
<tr>
<td class="title">解析记录值 *</td>
<td>
<div style="margin-bottom: 0.5em;">
<div class="ui checkbox" style="margin-bottom: 0.5em;">
<input type="checkbox" name="weightEnabled" value="1" v-model="record.weightEnabled" />
<label>开启权重调度设置</label>
</div>
</div>
<div class="field" v-if="record.weightEnabled">
<input type="text" style="width:8em;" placeholder="权重(1-100)" v-model="item.weight" />
<div class="httpdns-row" v-for="(item, index) in recordItems">
<div class="field">
<select class="ui dropdown auto-width" v-model="item.type">
<option value="A">A</option>
<option value="AAAA">AAAA</option>
</select>
</div>
<div class="field flex">
<input type="text" placeholder="记录值" v-model="item.value" />
</div>
<div class="field" v-if="record.weightEnabled">
<input type="text" style="width:7em;" placeholder="权重1-100" v-model="item.weight" />
</div>
<div class="field">
<a href="" @click.prevent="removeRecordItem(index)" title="删除"><i
class="icon trash alternate outline"></i></a>
</div>
</div>
<a href="" @click.prevent="removeRecordItem(index)" title="删除"><i class="icon trash alternate outline"></i></a>
</div>
<div class="httpdns-inline-actions">
<a href="" @click.prevent="addRecordItem" :class="{disabled: recordItems.length >= 10}">
<i class="icon plus circle"></i>添加记录值
</a>
<span class="count">{{recordItems.length}}/10</span>
</div>
<p class="comment" v-if="record.weightEnabled">开启后每条记录可配置权重,范围 1-100。</p>
</td>
</tr>
<tr>
<td class="title">TTL *</td>
<td>
<div class="ui input right labeled">
<input type="text" name="ttl" maxlength="5" style="width:8em;" v-model="record.ttl" />
<span class="ui basic label"></span>
</div>
</td>
</tr>
<tr>
<td class="title">规则状态</td>
<td>
<div class="ui checkbox">
<input type="checkbox" name="isOn" value="1" v-model="record.isOn" />
<label>启用</label>
</div>
</td>
</tr>
<div class="httpdns-inline-actions">
<a href="" @click.prevent="addRecordItem" :class="{disabled: recordItems.length >= 10}">
<i class="icon plus circle"></i>添加记录值
</a>
<span class="count">{{recordItems.length}}/10</span>
</div>
</td>
</tr>
<tr>
<td class="title">TTL *</td>
<td>
<div class="ui input right labeled">
<input type="text" name="ttl" maxlength="5" style="width:8em;" v-model="record.ttl" />
<span class="ui basic label"></span>
</div>
</td>
</tr>
<tr>
<td class="title">状态</td>
<td>
<div class="ui checkbox">
<input type="checkbox" name="isOn" value="1" v-model="record.isOn" />
<label>启用当前规则</label>
</div>
</td>
</tr>
</tbody>
</table>
<submit-btn></submit-btn>
</form>
</form>

View File

@@ -26,11 +26,11 @@
<table class="ui table selectable celled httpdns-apps-table" v-if="apps.length > 0">
<colgroup>
<col style="width:34%;" />
<col style="width:28%;" />
<col style="width:32%;" />
<col style="width:26%;" />
<col style="width:12%;" />
<col style="width:10%;" />
<col style="width:16%;" />
<col style="width:20%;" />
</colgroup>
<thead>
<tr>

View File

@@ -87,14 +87,6 @@
<a href="" class="httpdns-mini-action" title="复制加签 Secret" @click.prevent="copyText(selectedApp.signSecret, '加签 Secret')"><i class="copy outline icon"></i></a>
</td>
</tr>
<tr>
<td>AES 数据加密 Secret</td>
<td>
<code>{{aesSecretVisible ? selectedApp.aesSecret : selectedApp.aesSecretMasked}}</code>
<a href="" class="httpdns-mini-action" @click.prevent="aesSecretVisible = !aesSecretVisible" :title="aesSecretVisible ? '隐藏明文' : '查看明文'"><i class="icon" :class="aesSecretVisible ? 'eye slash' : 'eye'"></i></a>
<a href="" class="httpdns-mini-action" title="复制 AES 数据加密 Secret" @click.prevent="copyText(selectedApp.aesSecret, 'AES Secret')"><i class="copy outline icon"></i></a>
</td>
</tr>
<tr>
<td>请求验签</td>
<td>

View File

@@ -3,7 +3,6 @@
this.selectedApp = {}
this.currentStep = 1
this.signSecretVisible = false
this.aesSecretVisible = false
if (typeof this.apps == "undefined") {
this.apps = []
@@ -29,7 +28,6 @@
}
this.signSecretVisible = false
this.aesSecretVisible = false
this.currentStep = 1
}

View File

@@ -4,21 +4,31 @@
<div>
<div class="ui grid stackable">
<!-- Left: 解析配置 -->
<!-- Left: 解析测试 -->
<div class="six wide column">
<div class="ui segment">
<h4 class="ui header" style="margin-top:0;">解析配置</h4>
<h4 class="ui header" style="margin-top:0;">解析测试</h4>
<div class="ui form">
<div class="field">
<label>目标应用 *</label>
<select class="ui dropdown" name="appId" v-model="request.appId">
<select class="ui dropdown" name="appId" v-model="request.appId" @change="onAppChanged">
<option value="">[请选择应用]</option>
<option v-for="app in apps" :value="app.appId">{{app.name}} ({{app.appId}})</option>
</select>
</div>
<div class="field">
<label>所属集群 *</label>
<select class="ui dropdown" name="clusterId" v-model="request.clusterId">
<option value="">[请选择所属集群]</option>
<option v-for="cluster in clusters" :value="String(cluster.id)">{{cluster.name}}</option>
</select>
</div>
<div class="field">
<label>解析域名 *</label>
<input type="text" v-model="request.domain" placeholder="例如 www.example.com" />
<select class="ui dropdown" name="domain" v-model="request.domain">
<option value="">[请选择域名]</option>
<option v-for="domain in currentDomains" :value="domain">{{domain}}</option>
</select>
</div>
<div class="field">
<label>模拟客户端 IP</label>
@@ -134,4 +144,4 @@
</div>
</div>
</div>
</div>
</div>

View File

@@ -2,6 +2,7 @@ Tea.context(function () {
this.newRequest = function () {
return {
appId: "",
clusterId: "",
domain: "",
clientIp: "",
qtype: "A"
@@ -20,13 +21,48 @@ Tea.context(function () {
}
this.isRequesting = false
this.currentDomains = []
if (typeof this.apps == "undefined") {
if (typeof this.apps === "undefined") {
this.apps = []
}
if (typeof this.clusters === "undefined") {
this.clusters = []
}
this.onAppChanged = function () {
let selectedApp = null
for (let i = 0; i < this.apps.length; i++) {
if (this.apps[i].appId === this.request.appId) {
selectedApp = this.apps[i]
break
}
}
if (selectedApp == null) {
this.currentDomains = []
this.request.domain = ""
this.request.clusterId = ""
return
}
this.currentDomains = Array.isArray(selectedApp.domains) ? selectedApp.domains : []
if (this.currentDomains.length > 0) {
if (this.currentDomains.indexOf(this.request.domain) < 0) {
this.request.domain = this.currentDomains[0]
}
} else {
this.request.domain = ""
}
if (typeof selectedApp.clusterId !== "undefined" && selectedApp.clusterId !== null) {
this.request.clusterId = String(selectedApp.clusterId)
}
}
this.normalizeResultRows = function (data) {
if (typeof data == "undefined" || data == null) {
if (typeof data === "undefined" || data == null) {
return []
}
@@ -35,10 +71,7 @@ Tea.context(function () {
}
let rows = []
let ips = []
if (Array.isArray(data.ips)) {
ips = data.ips
}
let ips = Array.isArray(data.ips) ? data.ips : []
let domain = this.request.domain
let qtype = this.request.qtype
let ttl = data.ttl || 0
@@ -55,16 +88,21 @@ Tea.context(function () {
line: line
})
})
return rows
}
this.sendTestRequest = function () {
if (this.request.appId.length == 0) {
teaweb.warn("请选择目标应用")
if (this.request.appId.length === 0) {
teaweb.warn("Please select target app")
return
}
if (this.request.domain.length == 0) {
teaweb.warn("请填写解析域名")
if (this.request.clusterId.length === 0) {
teaweb.warn("Please select cluster")
return
}
if (this.request.domain.length === 0) {
teaweb.warn("Please select domain")
return
}
@@ -87,6 +125,7 @@ Tea.context(function () {
this.resetForm = function () {
this.request = this.newRequest()
this.currentDomains = []
this.response = {
hasResult: false,
code: -1,