Files
dns-server/static/index.html
Alex Yang 85320611cb web重做
2025-11-24 01:53:26 +08:00

423 lines
20 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<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管理">
<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="https://cdn.jsdelivr.net/npm/chart.js@4.4.0/dist/chart.umd.min.css">
<link rel="stylesheet" href="css/style.css">
</head>
<body>
<div class="container">
<header class="header-container">
<div class="logo">
<i class="fas fa-server fa-2x"></i>
<h1>DNS服务器管理控制台</h1>
</div>
<p>高性能DNS服务器支持规则屏蔽和Hosts管理</p>
</header>
<div class="main-layout">
<nav class="sidebar">
<ul class="nav-menu">
<li class="nav-item active" data-target="dashboard">
<i class="fas fa-tachometer-alt"></i>
<span>概览</span>
</li>
<li class="nav-item" data-target="rules">
<i class="fas fa-ban"></i>
<span>屏蔽规则</span>
</li>
<li class="nav-item" data-target="hosts">
<i class="fas fa-list-ul"></i>
<span>Hosts管理</span>
</li>
<li class="nav-item" data-target="blacklists">
<i class="fas fa-shield-alt"></i>
<span>远程黑名单</span>
</li>
<li class="nav-item" data-target="query">
<i class="fas fa-search"></i>
<span>DNS查询</span>
</li>
<li class="nav-item" data-target="config">
<i class="fas fa-cog"></i>
<span>配置管理</span>
</li>
</ul>
</nav>
</nav>
<main class="content">
<!-- 概览面板 -->
<div id="dashboard" class="panel active">
<div class="panel-header">
<h2>服务器状态</h2>
<div class="status-indicator">
<span class="status-dot"></span>
<span id="server-status">加载中...</span>
</div>
</div>
<div class="stats-grid">
<div class="stat-card">
<i class="fas fa-ban"></i>
<div class="stat-value" id="blocked-count">--</div>
<div class="stat-label">屏蔽请求</div>
</div>
<div class="stat-card">
<i class="fas fa-check-circle"></i>
<div class="stat-value" id="allowed-count">--</div>
<div class="stat-label">允许请求</div>
</div>
<div class="stat-card">
<i class="fas fa-question-circle"></i>
<div class="stat-value" id="error-count">--</div>
<div class="stat-label">错误请求</div>
</div>
<div class="stat-card">
<i class="fas fa-history"></i>
<div class="stat-value" id="total-queries">--</div>
<div class="stat-label">总请求数</div>
</div>
<div class="stat-card">
<i class="fas fa-list"></i>
<div class="stat-value" id="rules-count">--</div>
<div class="stat-label">屏蔽规则数</div>
</div>
<div class="stat-card">
<i class="fas fa-globe"></i>
<div class="stat-value" id="hosts-count">--</div>
<div class="stat-label">Hosts条目</div>
</div>
</div>
<div class="charts-container">
<div class="chart-card">
<h3>24小时屏蔽统计</h3>
<canvas id="hourly-chart"></canvas>
</div>
<div class="chart-card">
<h3>请求类型分布</h3>
<canvas id="requests-pie-chart"></canvas>
</div>
</div>
<div class="tables-container">
<div class="table-card">
<h3>最常屏蔽的域名</h3>
<div class="table-wrapper">
<table id="top-blocked-table">
<thead>
<tr>
<th>域名</th>
<th>屏蔽次数</th>
</tr>
</thead>
<tbody>
<tr><td colspan="2" class="loading">加载中...</td></tr>
</tbody>
</table>
</div>
</div>
<div class="table-card">
<h3>最常解析的域名</h3>
<div class="table-wrapper">
<table id="top-resolved-table">
<thead>
<tr>
<th>域名</th>
<th>解析次数</th>
</tr>
</thead>
<tbody>
<tr><td colspan="2" class="loading">加载中...</td></tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<!-- 屏蔽规则面板 -->
<div id="rules" class="panel">
<div class="panel-header">
<h2>屏蔽规则管理</h2>
<button id="reload-rules-btn" class="btn btn-secondary">
<i class="fas fa-sync-alt"></i> 重新加载
</button>
</div>
<div class="rules-management">
<div class="rules-input">
<input type="text" id="rule-input" placeholder="输入要屏蔽的域名或正则表达式">
<button id="add-rule-btn" class="btn btn-primary">
<i class="fas fa-plus"></i> 添加规则
</button>
</div>
<div class="rules-filter">
<input type="text" id="rule-search" placeholder="搜索规则...">
</div>
<div class="rules-list">
<div id="rules-panel">
<div class="table-wrapper">
<table>
<thead>
<tr>
<th>序号</th>
<th>规则内容</th>
<th>操作</th>
</tr>
</thead>
<tbody id="rules-list">
<tr><td colspan="4" class="loading">加载中...</td></tr>
</tbody>
</table>
</div>
</div>
<!-- 分页控件 -->
<div class="pagination-controls">
<div class="pagination-info" id="pagination-info">
共0条规则
</div>
<div class="pagination-buttons">
<div class="items-per-page">
<label for="items-per-page">每页显示:</label>
<select id="items-per-page">
<option value="20">20条</option>
<option value="50" selected>50条</option>
<option value="100">100条</option>
<option value="200">200条</option>
</select>
</div>
<div class="nav-buttons">
<button id="first-page-btn" class="btn btn-sm btn-secondary" disabled>
<i class="fas fa-angle-double-left"></i> 首页
</button>
<button id="prev-page-btn" class="btn btn-sm btn-secondary" disabled>
<i class="fas fa-angle-left"></i> 上一页
</button>
<button id="next-page-btn" class="btn btn-sm btn-secondary" disabled>
下一页 <i class="fas fa-angle-right"></i>
</button>
<button id="last-page-btn" class="btn btn-sm btn-secondary" disabled>
末页 <i class="fas fa-angle-double-right"></i>
</button>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Hosts管理面板 -->
<div id="hosts" class="panel">
<div class="panel-header">
<h2>Hosts管理</h2>
</div>
<div class="hosts-management">
<div class="hosts-form">
<div class="form-row">
<div class="form-group">
<label for="hosts-ip">IP地址</label>
<input type="text" id="hosts-ip" placeholder="127.0.0.1">
</div>
<div class="form-group">
<label for="hosts-domain">域名</label>
<input type="text" id="hosts-domain" placeholder="example.com">
</div>
<div class="form-group">
<label>&nbsp;</label>
<button id="add-hosts" class="btn btn-primary w-full">
<i class="fas fa-plus"></i> 添加
</button>
</div>
</div>
</div>
<div class="hosts-filter">
<input type="text" id="hosts-filter" placeholder="搜索域名...">
</div>
<div class="hosts-list">
<div class="table-wrapper">
<table id="hosts-table">
<thead>
<tr>
<th>IP地址</th>
<th>域名</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<tr><td colspan="3" class="loading">加载中...</td></tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<!-- 远程黑名单面板 -->
<div id="blacklists" class="panel">
<div class="panel-header">
<h2>远程黑名单管理</h2>
<button id="update-all-blacklists" class="btn btn-secondary">
<i class="fas fa-sync-alt"></i> 更新所有
</button>
</div>
<div class="blacklists-management">
<div class="blacklists-form">
<div class="form-row">
<div class="form-group">
<label for="blacklist-name">名称</label>
<input type="text" id="blacklist-name" placeholder="黑名单名称">
</div>
<div class="form-group">
<label for="blacklist-url">URL</label>
<input type="text" id="blacklist-url" placeholder="https://example.com/rules.txt">
</div>
<div class="form-group">
<label>&nbsp;</label>
<button id="add-blacklist" class="btn btn-primary w-full">
<i class="fas fa-plus"></i> 添加
</button>
</div>
</div>
</div>
<div class="blacklists-list">
<div class="table-wrapper">
<table id="blacklists-table">
<thead>
<tr>
<th>名称</th>
<th>URL</th>
<th>状态</th>
<th>规则数</th>
<th>最后更新</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<tr><td colspan="6" class="loading">加载中...</td></tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<!-- DNS查询面板 -->
<div id="query" class="panel">
<div class="panel-header">
<h2>DNS查询测试</h2>
</div>
<div class="query-form">
<div class="form-group">
<label for="query-domain">域名</label>
<input type="text" id="query-domain" placeholder="example.com">
<button id="run-query" class="btn btn-primary">
<i class="fas fa-search"></i> 查询
</button>
</div>
</div>
<div class="query-result">
<div id="query-result-container" class="hidden">
<div class="result-header">
<h3>查询结果</h3>
</div>
<div class="result-content">
<div class="result-item">
<strong>域名:</strong> <span id="result-domain"></span>
</div>
<div class="result-item">
<strong>状态:</strong> <span id="result-status"></span>
</div>
<div class="result-item">
<strong>规则类型:</strong> <span id="result-rule-type"></span>
</div>
<div class="result-item">
<strong>匹配规则:</strong> <span id="result-rule"></span>
</div>
<div class="result-item">
<strong>Hosts记录:</strong> <span id="result-hosts"></span>
</div>
<div class="result-item">
<strong>查询时间:</strong> <span id="result-time"></span>
</div>
</div>
</div>
</div>
</div>
<!-- 配置管理面板 -->
<div id="config" class="panel">
<div class="panel-header">
<h2>系统配置</h2>
</div>
<div class="config-form">
<div class="config-section">
<h3>屏蔽设置</h3>
<div class="form-group">
<label for="block-method">屏蔽方法</label>
<select id="block-method">
<option value="NXDOMAIN">NXDOMAIN (域名不存在)</option>
<option value="refused">REFUSED (拒绝请求)</option>
<option value="emptyIP">Empty IP (0.0.0.0)</option>
<option value="customIP">自定义IP</option>
</select>
</div>
<div class="form-group">
<label for="custom-block-ip">自定义屏蔽IP</label>
<input type="text" id="custom-block-ip" placeholder="127.0.0.1">
</div>
<div class="form-group">
<label for="update-interval">远程规则更新间隔 (秒)</label>
<input type="number" id="update-interval" min="60" value="3600">
</div>
</div>
<div class="config-actions">
<button id="save-config" class="btn btn-primary">
<i class="fas fa-save"></i> 保存配置
</button>
</div>
</div>
</div>
</main>
</div>
</div>
<!-- 通知组件 -->
<div id="notification" class="notification hidden">
<div class="notification-content">
<i class="fas fa-info-circle"></i>
<span id="notification-message"></span>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.0/dist/chart.umd.min.js"></script>
<script src="js/app.js"></script>
<script src="js/modules/dashboard.js"></script>
<script src="js/modules/rules.js"></script>
<script src="js/modules/hosts.js"></script>
<script src="js/modules/blacklists.js"></script>
<script src="js/modules/query.js"></script>
<script src="js/modules/config.js"></script>
</body>
</html>