dailiip/public/proxies.html

315 lines
15 KiB
HTML
Raw Permalink 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>代理IP管理系统 - 代理管理</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.7.2/font/bootstrap-icons.css" rel="stylesheet">
<link href="css/dashboard.css" rel="stylesheet">
</head>
<body>
<!-- 导航栏 -->
<nav class="navbar navbar-expand-lg navbar-dark bg-primary">
<div class="container-fluid">
<a class="navbar-brand" href="index.html">
<i class="bi bi-shield-check"></i>
代理IP管理系统
</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav me-auto">
<li class="nav-item">
<a class="nav-link" href="index.html">
<i class="bi bi-speedometer2"></i> 仪表板
</a>
</li>
<li class="nav-item">
<a class="nav-link active" href="proxies.html">
<i class="bi bi-list-ul"></i> 代理管理
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="history.html">
<i class="bi bi-clock-history"></i> 执行历史
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="monitoring.html">
<i class="bi bi-activity"></i> 系统监控
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="logs.html">
<i class="bi bi-journal-text"></i> 实时日志
</a>
</li>
</ul>
<div class="navbar-nav">
<button class="btn btn-outline-light btn-sm" onclick="refreshProxies()">
<i class="bi bi-arrow-clockwise"></i> 刷新
</button>
</div>
</div>
</div>
</nav>
<!-- 主要内容 -->
<div class="container-fluid mt-4">
<!-- 统计信息和操作按钮 -->
<div class="row mb-4">
<div class="col-md-8">
<div class="row">
<div class="col-md-4 mb-3">
<div class="card bg-primary text-white">
<div class="card-body text-center">
<h4 id="totalCount">-</h4>
<p class="mb-0">总代理数</p>
</div>
</div>
</div>
<div class="col-md-4 mb-3">
<div class="card bg-success text-white">
<div class="card-body text-center">
<h4 id="validCount">-</h4>
<p class="mb-0">可用代理</p>
</div>
</div>
</div>
<div class="col-md-4 mb-3">
<div class="card bg-danger text-white">
<div class="card-body text-center">
<h4 id="invalidCount">-</h4>
<p class="mb-0">无效代理</p>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-4">
<div class="card h-100">
<div class="card-body">
<div class="btn-group w-100 mb-2" role="group">
<button class="btn btn-primary" onclick="refreshProxies()">
<i class="bi bi-arrow-clockwise"></i> 刷新
</button>
<button class="btn btn-success" onclick="validateAll()">
<i class="bi bi-check2-square"></i> 验证
</button>
<button class="btn btn-warning" onclick="cleanupInvalid()">
<i class="bi bi-trash"></i> 清理
</button>
<button class="btn btn-info" onclick="exportProxies()">
<i class="bi bi-download"></i> 导出
</button>
</div>
<div class="btn-group w-100" role="group">
<button class="btn btn-outline-primary" onclick="document.getElementById('importFileInput').click()">
<i class="bi bi-upload"></i> 导入JSON
</button>
<button class="btn btn-outline-secondary" onclick="showImportModal()">
<i class="bi bi-pencil-square"></i> 粘贴导入
</button>
<input type="file" id="importFileInput" accept=".json" style="display: none;" onchange="handleImportFile(event)">
</div>
</div>
</div>
</div>
</div>
<!-- 搜索和筛选 -->
<div class="row mb-4">
<div class="col-12">
<div class="card">
<div class="card-body">
<form id="searchForm" class="row g-3">
<div class="col-md-3">
<input type="text" class="form-control" id="searchIp" placeholder="搜索IP地址">
</div>
<div class="col-md-2">
<input type="number" class="form-control" id="searchPort" placeholder="端口">
</div>
<div class="col-md-2">
<input type="text" class="form-control" id="searchLocation" placeholder="位置">
</div>
<div class="col-md-2">
<select class="form-select" id="filterStatus">
<option value="">全部状态</option>
<option value="1">可用</option>
<option value="0">不可用</option>
</select>
</div>
<div class="col-md-2">
<select class="form-select" id="sortBy">
<option value="created_at">创建时间</option>
<option value="response_time">响应时间</option>
<option value="ip">IP地址</option>
<option value="updated_at">更新时间</option>
</select>
</div>
<div class="col-md-1">
<button type="submit" class="btn btn-outline-primary w-100">
<i class="bi bi-search"></i>
</button>
</div>
</form>
</div>
</div>
</div>
</div>
<!-- 代理列表 -->
<div class="row">
<div class="col-12">
<div class="card">
<div class="card-header d-flex justify-content-between align-items-center">
<h5 class="card-title mb-0">
<i class="bi bi-list-ul"></i> 代理列表
</h5>
<div>
<span class="badge bg-secondary">显示 <span id="showingCount">0</span> 条记录</span>
</div>
</div>
<div class="card-body">
<div class="table-responsive">
<table class="table table-hover">
<thead>
<tr>
<th>
<input type="checkbox" id="selectAll" onchange="toggleSelectAll()">
</th>
<th>IP地址</th>
<th>端口</th>
<th>位置</th>
<th>状态</th>
<th>响应时间</th>
<th>最后验证</th>
<th>创建时间</th>
<th>操作</th>
</tr>
</thead>
<tbody id="proxyTableBody">
<tr>
<td colspan="9" class="text-center p-4">
<div class="spinner-border text-primary" role="status">
<span class="visually-hidden">加载中...</span>
</div>
<p class="mt-2">正在加载代理列表...</p>
</td>
</tr>
</tbody>
</table>
</div>
<!-- 分页 -->
<nav aria-label="代理列表分页">
<ul class="pagination justify-content-center" id="pagination">
<!-- 分页按钮将通过JavaScript动态生成 -->
</ul>
</nav>
</div>
</div>
</div>
</div>
</div>
<!-- 验证结果模态框 -->
<div class="modal fade" id="validationModal" tabindex="-1">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">验证代理</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body">
<div id="validationProgress" style="display: none;">
<div class="progress mb-3">
<div class="progress-bar" id="validationProgressBar" role="progressbar" style="width: 0%"></div>
</div>
<p id="validationStatus">正在验证中...</p>
</div>
<div id="validationResults"></div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">关闭</button>
</div>
</div>
</div>
</div>
<!-- 代理详情模态框 -->
<div class="modal fade" id="proxyDetailModal" tabindex="-1">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">代理详情</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body" id="proxyDetailContent">
<!-- 详情内容将通过JavaScript动态生成 -->
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">关闭</button>
<button type="button" class="btn btn-primary" id="validateSingleProxy">验证代理</button>
</div>
</div>
</div>
</div>
<!-- 导入代理模态框 -->
<div class="modal fade" id="importModal" tabindex="-1">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">导入代理列表</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body">
<div class="mb-3">
<label for="proxyJsonInput" class="form-label">粘贴JSON格式的代理列表</label>
<textarea class="form-control" id="proxyJsonInput" rows="10" placeholder='[
{
"ip_address": "47.254.36.213",
"port": 1081
},
{
"ip_address": "8.137.62.53",
"port": 9080
}
]'></textarea>
</div>
<div class="alert alert-info">
<h6><i class="bi bi-info-circle"></i> 支持的格式:</h6>
<ul class="mb-0">
<li><code>ip_address</code><code>ip</code><code>host</code> - IP地址</li>
<li><code>port</code> - 端口号</li>
<li><code>location</code><code>area</code> - 位置(可选)</li>
<li><code>speed</code> - 速度(可选)</li>
</ul>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">取消</button>
<button type="button" class="btn btn-primary" onclick="importProxiesFromModal()">
<i class="bi bi-upload"></i> 导入并验证
</button>
</div>
</div>
</div>
</div>
<!-- 提示消息容器 -->
<div class="position-fixed top-0 end-0 p-3" style="z-index: 1050">
<div id="alertContainer"></div>
</div>
<!-- JavaScript -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js"></script>
<script src="js/proxies.js"></script>
</body>
</html>