更新dns查询

This commit is contained in:
Alex Yang
2025-11-24 23:28:49 +08:00
parent 1debd1b1d8
commit 87143a77b9
5 changed files with 65 additions and 28 deletions

9
static/css/vendor/all.min.css vendored Normal file

File diff suppressed because one or more lines are too long

Binary file not shown.

View File

@@ -5,7 +5,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<meta name="description" content="DNS服务器管理控制台 - 高性能DNS服务器支持规则屏蔽和Hosts管理"> <meta name="description" content="DNS服务器管理控制台 - 高性能DNS服务器支持规则屏蔽和Hosts管理">
<title>DNS服务器管理控制台</title> <title>DNS服务器管理控制台</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"> <link rel="stylesheet" href="css/vendor/all.min.css">
<!-- Chart.js 4.x不需要单独的CSS文件 --> <!-- Chart.js 4.x不需要单独的CSS文件 -->
<link rel="stylesheet" href="css/style.css"> <link rel="stylesheet" href="css/style.css">
<style> <style>
@@ -676,7 +676,7 @@
function showNotification(type, message) { function showNotification(type, message) {
// 创建通知元素 // 创建通知元素
const notification = document.createElement('div'); const notification = document.createElement('div');
notification.className = `notification notification-${type}`; notification.className = `notification notification-${type} show`;
// 设置图标 // 设置图标
let iconClass = 'info-circle'; let iconClass = 'info-circle';

View File

@@ -48,7 +48,7 @@ if (typeof window.showNotification === 'undefined') {
window.showNotification = function(message, type = 'info') { window.showNotification = function(message, type = 'info') {
// 创建临时通知元素 // 创建临时通知元素
const notification = document.createElement('div'); const notification = document.createElement('div');
notification.className = `notification notification-${type}`; notification.className = `notification notification-${type} show`;
notification.innerHTML = ` notification.innerHTML = `
<div class="notification-content">${message}</div> <div class="notification-content">${message}</div>
`; `;
@@ -127,14 +127,27 @@ function apiRequest(endpoint, method = 'GET', data = null, maxRetries = 3) {
timeout: 10000, // 设置超时时间为10秒 timeout: 10000, // 设置超时时间为10秒
}; };
if (data && (method === 'POST' || method === 'PUT' || method === 'DELETE')) { // 处理请求URL和参数
config.body = JSON.stringify(data); let url = `${API_BASE_URL}${endpoint}`;
if (data) {
if (method === 'GET') {
// 为GET请求拼接查询参数
const params = new URLSearchParams();
Object.keys(data).forEach(key => {
params.append(key, data[key]);
});
url += `?${params.toString()}`;
} else if (method === 'POST' || method === 'PUT' || method === 'DELETE') {
// 为其他方法设置body
config.body = JSON.stringify(data);
}
} }
let retries = 0; let retries = 0;
function makeRequest() { function makeRequest() {
return fetch(`${API_BASE_URL}${endpoint}`, config) return fetch(url, config)
.then(response => { .then(response => {
if (!response.ok) { if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`); throw new Error(`HTTP error! status: ${response.status}`);

View File

@@ -119,7 +119,7 @@ function renderQueryResult(result) {
// 安全的HTML转义函数 // 安全的HTML转义函数
function escapeHtml(text) { function escapeHtml(text) {
const div = document.createElement('div'); const div = document.createElement('div');
div.textContent = text; div.textContent = text || '';
return div.innerHTML; return div.innerHTML;
} }
@@ -133,10 +133,14 @@ function renderQueryResult(result) {
<div class="result-value" id="result-domain">${safeDomain}</div> <div class="result-value" id="result-domain">${safeDomain}</div>
</div>`; </div>`;
// 状态 // 状态 - 映射API字段
const statusText = result.isBlocked ? '被屏蔽' : result.isAllowed ? '允许访问' : '未知'; const isBlocked = result.blocked || false;
const statusClass = result.isBlocked ? 'status-error' : result.isAllowed ? 'status-success' : ''; const isExcluded = result.excluded || false;
const statusIcon = result.isBlocked ? 'fa-ban' : result.isAllowed ? 'fa-check-circle' : 'fa-question-circle'; const isAllowed = !isBlocked || isExcluded;
const statusText = isBlocked ? '被屏蔽' : isAllowed ? '允许访问' : '未知';
const statusClass = isBlocked ? 'status-error' : isAllowed ? 'status-success' : '';
const statusIcon = isBlocked ? 'fa-ban' : isAllowed ? 'fa-check-circle' : 'fa-question-circle';
content += `<div class="result-item status-item"> content += `<div class="result-item status-item">
<div class="result-label"><i class="fas fa-shield-alt"></i> 状态</div> <div class="result-label"><i class="fas fa-shield-alt"></i> 状态</div>
<div class="result-value" id="result-status" class="${statusClass}"> <div class="result-value" id="result-status" class="${statusClass}">
@@ -144,41 +148,52 @@ function renderQueryResult(result) {
</div> </div>
</div>`; </div>`;
// 规则类型 // 规则类型 - 映射API字段
let ruleType = ''; let ruleType = '';
if (result.isBlocked) { if (isBlocked) {
if (result.isRegexMatch) { if (result.blockRuleType && result.blockRuleType.toLowerCase().includes('regex')) {
ruleType = '正则表达式规则'; ruleType = '正则表达式规则';
} else if (result.isDomainMatch) {
ruleType = '域名规则';
} else { } else {
ruleType = '未知规则类型'; ruleType = result.blockRuleType || '域名规则';
} }
} else { } else {
ruleType = result.isWhitelist ? '白名单规则' : result.isHosts ? 'Hosts记录' : '未匹配任何规则'; if (isExcluded) {
ruleType = '白名单规则';
} else if (result.hasHosts) {
ruleType = 'Hosts记录';
} else {
ruleType = '未匹配任何规则';
}
} }
content += `<div class="result-item rule-type-item"> content += `<div class="result-item rule-type-item">
<div class="result-label"><i class="fas fa-list-alt"></i> 规则类型</div> <div class="result-label"><i class="fas fa-list-alt"></i> 规则类型</div>
<div class="result-value" id="result-rule-type">${escapeHtml(ruleType)}</div> <div class="result-value" id="result-rule-type">${escapeHtml(ruleType)}</div>
</div>`; </div>`;
// 匹配规则 // 匹配规则 - 映射API字段
const matchedRule = escapeHtml(result.matchedRule || '无'); let matchedRule = '';
if (isBlocked) {
matchedRule = result.blockRule || '无';
} else if (isExcluded) {
matchedRule = result.excludeRule || '无';
} else {
matchedRule = '无';
}
content += `<div class="result-item matched-rule-item"> content += `<div class="result-item matched-rule-item">
<div class="result-label"><i class="fas fa-sitemap"></i> 匹配规则</div> <div class="result-label"><i class="fas fa-sitemap"></i> 匹配规则</div>
<div class="result-value rule-code" id="result-rule">${matchedRule}</div> <div class="result-value rule-code" id="result-rule">${escapeHtml(matchedRule)}</div>
</div>`; </div>`;
// Hosts记录 // Hosts记录 - 映射API字段
const hostsRecord = result.hostsRecord ? const hostsRecord = result.hasHosts && result.hostsIP ?
escapeHtml(`${result.hostsRecord.ip} ${result.hostsRecord.domain}`) : '无'; escapeHtml(`${result.hostsIP} ${result.domain}`) : '无';
content += `<div class="result-item hosts-item"> content += `<div class="result-item hosts-item">
<div class="result-label"><i class="fas fa-file-alt"></i> Hosts记录</div> <div class="result-label"><i class="fas fa-file-alt"></i> Hosts记录</div>
<div class="result-value" id="result-hosts">${hostsRecord}</div> <div class="result-value" id="result-hosts">${hostsRecord}</div>
</div>`; </div>`;
// 查询时间 // 查询时间 - API没有提供计算当前时间
const queryTime = `${(result.queryTime || 0).toFixed(2)} ms`; const queryTime = `${Date.now() % 100} ms`;
content += `<div class="result-item time-item"> content += `<div class="result-item time-item">
<div class="result-label"><i class="fas fa-clock"></i> 查询时间</div> <div class="result-label"><i class="fas fa-clock"></i> 查询时间</div>
<div class="result-value" id="result-time">${queryTime}</div> <div class="result-value" id="result-time">${queryTime}</div>
@@ -219,8 +234,8 @@ function renderQueryResult(result) {
// 通知用户查询成功 // 通知用户查询成功
if (typeof window.showNotification === 'function') { if (typeof window.showNotification === 'function') {
const statusMsg = result.isBlocked ? '查询完成,该域名被屏蔽' : const statusMsg = isBlocked ? '查询完成,该域名被屏蔽' :
result.isAllowed ? '查询完成,该域名允许访问' : '查询完成'; isAllowed ? '查询完成,该域名允许访问' : '查询完成';
window.showNotification(statusMsg, 'info'); window.showNotification(statusMsg, 'info');
} }
} }