Files
waf-platform/EdgeAdmin/web/views/@default/httpdns/sandbox/index.html
2026-02-27 10:35:22 +08:00

148 lines
7.5 KiB
HTML

{$layout}
<div class="ui margin"></div>
<div>
<div class="ui grid stackable">
<!-- Left: 解析测试 -->
<div class="six wide column">
<div class="ui segment">
<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" @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 currentClusters" :value="String(cluster.id)">{{cluster.name}}</option>
</select>
</div>
<div class="field">
<label>解析域名 *</label>
<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>
<input type="text" v-model="request.clientIp" placeholder="留空使用当前 IP" />
<p class="comment">用于测试 ECS 掩码与区域调度效果。</p>
</div>
<div class="field">
<label>解析类型</label>
<div class="ui buttons mini">
<button class="ui button" :class="{primary: request.qtype=='A'}"
@click.prevent="request.qtype='A'" type="button">A</button>
<button class="ui button" :class="{primary: request.qtype=='AAAA'}"
@click.prevent="request.qtype='AAAA'" type="button">AAAA</button>
</div>
</div>
<div class="ui divider"></div>
<button class="ui button primary" type="button" @click.prevent="sendTestRequest"
:class="{loading: isRequesting, disabled: isRequesting}">
<i class="icon search"></i> 在线解析
</button>
<button class="ui button basic" type="button" @click.prevent="resetForm">重置</button>
</div>
</div>
</div>
<!-- Right: 解析结果 -->
<div class="ten wide column">
<!-- Empty state -->
<div v-show="!response.hasResult && !isRequesting" class="ui segment placeholder">
<p class="grey" style="text-align:center;">请在左侧配置参数后点击「在线解析」。</p>
</div>
<!-- Loading -->
<div v-show="isRequesting" class="ui segment" style="min-height:200px;">
<div class="ui active dimmer">
<div class="ui text loader">解析中...</div>
</div>
</div>
<!-- Result -->
<div v-show="response.hasResult && !isRequesting">
<!-- Status banner -->
<div class="ui message small" :class="{positive: response.code === 0, negative: response.code !== 0}">
<div class="header">
<span v-if="response.code === 0"><i class="icon check circle"></i> 解析成功</span>
<span v-else><i class="icon times circle"></i> 解析失败 ({{response.code}})</span>
</div>
<p v-if="response.code !== 0">{{response.message}}</p>
<p class="grey small" style="margin-top:.3em;">Request ID: <code>{{response.requestId}}</code></p>
</div>
<!-- Result details -->
<div v-if="response.code === 0 && response.data" style="margin-top: 1em;">
<h5 class="ui header">解析结果</h5>
<div class="ui segment" style="margin-top:.4em;">
<div style="font-weight: 600; margin-bottom: .5em;">请求URL</div>
<div style="word-break: break-all;">
<code>{{response.data.request_url || '-'}}</code>
</div>
</div>
<h5 class="ui header" style="margin-top:1.2em;">解析结果详情</h5>
<div class="ui three column stackable grid" style="margin-top:0;">
<div class="column">
<div class="ui segment">
<div class="grey">客户端 IP</div>
<div style="margin-top:.4em;">
<code>{{response.data.client_ip || request.clientIp || '-'}}</code></div>
</div>
</div>
<div class="column">
<div class="ui segment">
<div class="grey">地区</div>
<div style="margin-top:.4em;">{{response.data.client_region || '-'}}</div>
</div>
</div>
<div class="column">
<div class="ui segment">
<div class="grey">线路</div>
<div style="margin-top:.4em;">{{response.data.line_name || '-'}}</div>
</div>
</div>
</div>
<!-- IP results table -->
<h5 class="ui header" style="margin-top:1.2em;">解析记录</h5>
<table class="ui table celled compact">
<thead>
<tr>
<th>解析域名</th>
<th>解析类型</th>
<th>IP地址</th>
<th>TTL</th>
<th>地区</th>
<th>线路</th>
</tr>
</thead>
<tbody>
<tr v-for="(row, idx) in response.resultRows">
<td v-if="idx === 0" :rowspan="response.resultRows.length">{{row.domain ||
request.domain}}</td>
<td>{{row.type || request.qtype}}</td>
<td><code>{{row.ip}}</code></td>
<td>{{row.ttl}}s</td>
<td>{{row.region || '-'}}</td>
<td>{{row.line || '-'}}</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>