mosdns/coremain/web/templates/index.html
dengxiongjian ee06785e08
Some checks are pending
Test mosdns / build (push) Waiting to run
开发web管理
2025-10-15 22:20:27 +08:00

275 lines
13 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">
<title>MosDNS 管理面板</title>
<link rel="stylesheet" href="/static/css/style.css">
<link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>🌐</text></svg>">
</head>
<body>
<div class="container">
<!-- 头部 -->
<header class="header">
<div class="header-content">
<h1 class="logo">🌐 MosDNS 管理面板</h1>
<div class="header-info">
<span class="status-indicator online" id="status">在线</span>
<span class="version" id="version">v1.0.0</span>
</div>
</div>
</header>
<!-- 导航栏 -->
<nav class="nav">
<div class="nav-content">
<button class="nav-item active" data-tab="dashboard">
📊 仪表板
</button>
<button class="nav-item" data-tab="mikrotik">
🔧 MikroTik 管理
</button>
<button class="nav-item" data-tab="domains">
📝 域名文件
</button>
<button class="nav-item" data-tab="logs">
📋 日志查看
</button>
<button class="nav-item" data-tab="stats">
📈 统计信息
</button>
</div>
</nav>
<!-- 主要内容区域 -->
<main class="main">
<!-- 仪表板 -->
<div class="tab-content active" id="dashboard">
<div class="dashboard-grid">
<div class="card">
<div class="card-header">
<h3>服务状态</h3>
</div>
<div class="card-content">
<div class="stat-item">
<span class="stat-label">运行状态:</span>
<span class="stat-value" id="service-status">运行中</span>
</div>
<div class="stat-item">
<span class="stat-label">运行时间:</span>
<span class="stat-value" id="uptime">-</span>
</div>
<div class="stat-item">
<span class="stat-label">DNS 端口:</span>
<span class="stat-value" id="dns-ports">-</span>
</div>
<div class="stat-item">
<span class="stat-label">API 地址:</span>
<span class="stat-value" id="api-address">-</span>
</div>
</div>
</div>
<div class="card">
<div class="card-header">
<h3>查询统计</h3>
</div>
<div class="card-content">
<div class="stat-item">
<span class="stat-label">总查询数:</span>
<span class="stat-value" id="total-queries">-</span>
</div>
<div class="stat-item">
<span class="stat-label">缓存命中:</span>
<span class="stat-value" id="cache-hits">-</span>
</div>
<div class="stat-item">
<span class="stat-label">平均响应时间:</span>
<span class="stat-value" id="avg-response">-</span>
</div>
</div>
</div>
<div class="card">
<div class="card-header">
<h3>快速操作</h3>
</div>
<div class="card-content">
<div class="button-group">
<button class="btn btn-primary" onclick="flushCache()">清空缓存</button>
<button class="btn btn-secondary" onclick="refreshStats()">刷新统计</button>
<button class="btn btn-secondary" onclick="restartService()">重启服务</button>
</div>
</div>
</div>
</div>
</div>
<!-- MikroTik 管理 -->
<div class="tab-content" id="mikrotik">
<!-- 已添加的配置列表(移到前面) -->
<div class="card">
<div class="card-header">
<h3>📋 已添加的 MikroTik 配置</h3>
<div class="card-actions">
<button class="btn btn-secondary" onclick="loadMikrotikList()">
<span>🔄</span>
<span>刷新</span>
</button>
</div>
</div>
<div class="card-content">
<div id="mikrotik-list" class="mikrotik-list">
<div class="loading">加载中...</div>
</div>
</div>
</div>
<!-- 添加新配置表单 -->
<div class="card">
<div class="card-header">
<h3> 添加 MikroTik 配置</h3>
</div>
<div class="card-content">
<div class="mikrotik-form">
<div class="form-row">
<div class="form-group">
<label for="mikrotik-tag">
<span class="label-required">*</span>
<span>配置标签</span>
</label>
<input type="text" id="mikrotik-tag" placeholder="例如: mikrotik_openai" class="form-control">
<small class="form-hint">唯一标识,建议使用 mikrotik_ 前缀</small>
</div>
<div class="form-group">
<label for="mikrotik-addresslist">
<span class="label-required">*</span>
<span>地址列表名</span>
</label>
<input type="text" id="mikrotik-addresslist" placeholder="例如: OpenAI" class="form-control">
<small class="form-hint">MikroTik 中的地址列表名称</small>
</div>
</div>
<div class="form-row">
<div class="form-group">
<label for="mikrotik-host">
<span class="label-required">*</span>
<span>MikroTik 地址</span>
</label>
<input type="text" id="mikrotik-host" placeholder="例如: 10.248.0.1" class="form-control">
<small class="form-hint">MikroTik 设备的 IP 地址</small>
</div>
<div class="form-group">
<label for="mikrotik-port">
<span>API 端口</span>
</label>
<input type="number" id="mikrotik-port" value="9728" class="form-control">
<small class="form-hint">默认 API 端口为 9728</small>
</div>
</div>
<div class="form-row">
<div class="form-group">
<label for="mikrotik-username">
<span class="label-required">*</span>
<span>用户名</span>
</label>
<input type="text" id="mikrotik-username" placeholder="admin" value="admin" class="form-control">
</div>
<div class="form-group">
<label for="mikrotik-password">
<span class="label-required">*</span>
<span>密码</span>
</label>
<input type="password" id="mikrotik-password" class="form-control">
</div>
</div>
<div class="form-group">
<label for="mikrotik-domains">
<span class="label-required">*</span>
<span>域名文件路径</span>
</label>
<input type="text" id="mikrotik-domains" placeholder="例如: /usr/local/yltx-dns/config/openai.txt 或 ./mikrotik/openai.txt" class="form-control">
<small class="form-hint">支持绝对路径和相对路径(相对于运行目录)</small>
</div>
<div class="form-actions">
<button class="btn btn-primary btn-lg" onclick="saveMikrotikConfig()">
<span>💾</span>
<span>保存配置</span>
</button>
<button class="btn btn-secondary btn-lg" onclick="clearMikrotikForm()">
<span>🔄</span>
<span>清空表单</span>
</button>
</div>
</div>
</div>
</div>
</div>
<!-- 域名文件 -->
<div class="tab-content" id="domains">
<div class="card">
<div class="card-header">
<h3>域名文件管理</h3>
<div class="card-actions">
<button class="btn btn-primary" onclick="addDomainFile()">添加文件</button>
<button class="btn btn-secondary" onclick="refreshDomainFiles()">刷新列表</button>
</div>
</div>
<div class="card-content">
<div id="domain-files-list">
<div class="loading">加载中...</div>
</div>
</div>
</div>
</div>
<!-- 日志查看 -->
<div class="tab-content" id="logs">
<div class="card">
<div class="card-header">
<h3>系统日志</h3>
<div class="card-actions">
<button class="btn btn-secondary" onclick="clearLogs()">清空日志</button>
<button class="btn btn-secondary" onclick="refreshLogs()">刷新日志</button>
</div>
</div>
<div class="card-content">
<div class="logs-container">
<pre id="logs-content">日志内容将在这里显示...</pre>
</div>
</div>
</div>
</div>
<!-- 统计信息 -->
<div class="tab-content" id="stats">
<div class="card">
<div class="card-header">
<h3>详细统计</h3>
<div class="card-actions">
<button class="btn btn-secondary" onclick="exportStats()">导出统计</button>
<button class="btn btn-secondary" onclick="refreshDetailedStats()">刷新统计</button>
</div>
</div>
<div class="card-content">
<div id="detailed-stats">
<div class="loading">加载中...</div>
</div>
</div>
</div>
</div>
</main>
</div>
<!-- 消息提示 -->
<div id="message-container"></div>
<script src="/static/js/app.js"></script>
</body>
</html>