mirror of
https://github.com/cnlimiter/codex-register.git
synced 2026-07-10 06:51:19 +08:00
4
This commit is contained in:
@@ -6,6 +6,33 @@
|
||||
<title>账号管理 - OpenAI 注册系统</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>">
|
||||
<style>
|
||||
.password-cell {
|
||||
font-family: var(--font-mono);
|
||||
font-size: 0.75rem;
|
||||
}
|
||||
.password-hidden {
|
||||
filter: blur(4px);
|
||||
cursor: pointer;
|
||||
transition: filter 0.2s;
|
||||
}
|
||||
.password-hidden:hover {
|
||||
filter: blur(0);
|
||||
}
|
||||
.token-status {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
}
|
||||
.token-status .dot {
|
||||
width: 8px;
|
||||
height: 8px;
|
||||
border-radius: 50%;
|
||||
}
|
||||
.token-status .dot.healthy { background: var(--success-color); }
|
||||
.token-status .dot.warning { background: var(--warning-color); }
|
||||
.token-status .dot.expired { background: var(--danger-color); }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
@@ -17,6 +44,7 @@
|
||||
<div class="nav-links">
|
||||
<a href="/" class="nav-link">注册</a>
|
||||
<a href="/accounts" class="nav-link active">账号管理</a>
|
||||
<a href="/email-services" class="nav-link">邮箱服务</a>
|
||||
<a href="/settings" class="nav-link">设置</a>
|
||||
</div>
|
||||
<button class="theme-toggle" onclick="theme.toggle()" title="切换主题">
|
||||
@@ -77,6 +105,12 @@
|
||||
<button class="btn btn-ghost" id="refresh-btn" title="刷新">
|
||||
🔄 刷新
|
||||
</button>
|
||||
<button class="btn btn-warning" id="batch-refresh-btn" disabled title="批量刷新Token">
|
||||
🔄 刷新Token
|
||||
</button>
|
||||
<button class="btn btn-info" id="batch-validate-btn" disabled title="批量验证Token">
|
||||
✅ 验证Token
|
||||
</button>
|
||||
<button class="btn btn-danger" id="batch-delete-btn" disabled>
|
||||
🗑️ 批量删除
|
||||
</button>
|
||||
@@ -103,15 +137,16 @@
|
||||
<th style="width: 40px;"><input type="checkbox" id="select-all"></th>
|
||||
<th style="width: 60px;">ID</th>
|
||||
<th>邮箱</th>
|
||||
<th style="width: 100px;">密码</th>
|
||||
<th style="width: 120px;">邮箱服务</th>
|
||||
<th style="width: 100px;">状态</th>
|
||||
<th style="width: 160px;">注册时间</th>
|
||||
<th style="width: 80px;">状态</th>
|
||||
<th style="width: 140px;">最后刷新</th>
|
||||
<th style="width: 140px;">操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="accounts-table">
|
||||
<tr>
|
||||
<td colspan="7">
|
||||
<td colspan="8">
|
||||
<div class="empty-state">
|
||||
<div class="skeleton skeleton-text" style="width: 60%;"></div>
|
||||
<div class="skeleton skeleton-text" style="width: 80%;"></div>
|
||||
|
||||
240
templates/email_services.html
Normal file
240
templates/email_services.html
Normal file
@@ -0,0 +1,240 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>邮箱服务 - OpenAI 注册系统</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">
|
||||
<!-- 导航栏 -->
|
||||
<nav class="navbar">
|
||||
<div class="nav-brand">
|
||||
<h1>OpenAI 注册系统</h1>
|
||||
</div>
|
||||
<div class="nav-links">
|
||||
<a href="/" class="nav-link">注册</a>
|
||||
<a href="/accounts" class="nav-link">账号管理</a>
|
||||
<a href="/email-services" class="nav-link active">邮箱服务</a>
|
||||
<a href="/settings" class="nav-link">设置</a>
|
||||
</div>
|
||||
<button class="theme-toggle" onclick="theme.toggle()" title="切换主题">
|
||||
🌙
|
||||
</button>
|
||||
</nav>
|
||||
|
||||
<!-- 主内容区 -->
|
||||
<main class="main-content">
|
||||
<div class="page-header">
|
||||
<h2>邮箱服务管理</h2>
|
||||
<p class="subtitle">配置和管理注册所需的邮箱服务</p>
|
||||
</div>
|
||||
|
||||
<!-- 统计卡片 -->
|
||||
<div class="stats-grid">
|
||||
<div class="stat-card info">
|
||||
<div class="stat-value" id="outlook-count">0</div>
|
||||
<div class="stat-label">Outlook 账户</div>
|
||||
</div>
|
||||
<div class="stat-card success">
|
||||
<div class="stat-value" id="custom-count">0</div>
|
||||
<div class="stat-label">自定义域名</div>
|
||||
</div>
|
||||
<div class="stat-card warning">
|
||||
<div class="stat-value" id="tempmail-status">可用</div>
|
||||
<div class="stat-label">临时邮箱</div>
|
||||
</div>
|
||||
<div class="stat-card">
|
||||
<div class="stat-value" id="total-enabled">0</div>
|
||||
<div class="stat-label">已启用服务</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Outlook 管理 -->
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<h3>📥 Outlook 批量导入</h3>
|
||||
<button class="btn btn-ghost btn-sm" id="toggle-outlook-import">展开</button>
|
||||
</div>
|
||||
<div class="card-body" id="outlook-import-body" style="display: none;">
|
||||
<div class="import-info">
|
||||
<p><strong>支持格式:</strong></p>
|
||||
<ul>
|
||||
<li><code>邮箱----密码</code> (密码认证)</li>
|
||||
<li><code>邮箱----密码----client_id----refresh_token</code> (XOAUTH2 认证,推荐)</li>
|
||||
</ul>
|
||||
<p>每行一个账户,使用四个连字符(----)分隔字段。以 # 开头的行将被忽略。</p>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="outlook-import-data">批量导入数据</label>
|
||||
<textarea id="outlook-import-data" rows="8" placeholder="example@outlook.com----password123 test@outlook.com----password456----client_id----refresh_token"></textarea>
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<div class="form-group">
|
||||
<label>
|
||||
<input type="checkbox" id="outlook-import-enabled" checked>
|
||||
导入后启用
|
||||
</label>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="outlook-import-priority">优先级</label>
|
||||
<input type="number" id="outlook-import-priority" value="0" min="0">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-actions">
|
||||
<button type="button" class="btn btn-primary" id="outlook-import-btn">📥 开始导入</button>
|
||||
<button type="button" class="btn btn-secondary" id="clear-import-btn">清空</button>
|
||||
</div>
|
||||
<div id="import-result" style="display: none; margin-top: var(--spacing-md);"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 自定义域名管理 -->
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<h3>🔗 自定义域名服务</h3>
|
||||
<button class="btn btn-primary btn-sm" id="add-custom-btn">➕ 添加服务</button>
|
||||
</div>
|
||||
<div class="card-body" style="padding: 0;">
|
||||
<div class="table-container">
|
||||
<table class="data-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th style="width: 40px;"><input type="checkbox" id="select-all-custom"></th>
|
||||
<th>名称</th>
|
||||
<th style="width: 200px;">API 地址</th>
|
||||
<th style="width: 100px;">状态</th>
|
||||
<th style="width: 80px;">优先级</th>
|
||||
<th style="width: 160px;">最后使用</th>
|
||||
<th style="width: 180px;">操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="custom-services-table">
|
||||
<tr>
|
||||
<td colspan="7">
|
||||
<div class="empty-state">
|
||||
<div class="skeleton skeleton-text"></div>
|
||||
<div class="skeleton skeleton-text" style="width: 80%;"></div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Outlook 账户列表 -->
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<h3>📧 Outlook 账户列表</h3>
|
||||
<button class="btn btn-danger btn-sm" id="batch-delete-outlook-btn" disabled>🗑️ 批量删除</button>
|
||||
</div>
|
||||
<div class="card-body" style="padding: 0;">
|
||||
<div class="table-container">
|
||||
<table class="data-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th style="width: 40px;"><input type="checkbox" id="select-all-outlook"></th>
|
||||
<th>邮箱</th>
|
||||
<th style="width: 100px;">认证方式</th>
|
||||
<th style="width: 100px;">状态</th>
|
||||
<th style="width: 80px;">优先级</th>
|
||||
<th style="width: 160px;">最后使用</th>
|
||||
<th style="width: 140px;">操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="outlook-accounts-table">
|
||||
<tr>
|
||||
<td colspan="7">
|
||||
<div class="empty-state">
|
||||
<div class="skeleton skeleton-text"></div>
|
||||
<div class="skeleton skeleton-text" style="width: 80%;"></div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 临时邮箱配置 -->
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<h3>🌐 临时邮箱配置</h3>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form id="tempmail-form">
|
||||
<div class="form-group">
|
||||
<label for="tempmail-api">Tempmail.lol API 地址</label>
|
||||
<input type="text" id="tempmail-api" name="api_url" placeholder="https://tempmail.lol/api">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label>
|
||||
<input type="checkbox" id="tempmail-enabled" checked>
|
||||
启用临时邮箱
|
||||
</label>
|
||||
</div>
|
||||
<div class="form-actions">
|
||||
<button type="submit" class="btn btn-primary">💾 保存设置</button>
|
||||
<button type="button" class="btn btn-secondary" id="test-tempmail-btn">🔌 测试连接</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
</div>
|
||||
|
||||
<!-- 添加自定义域名模态框 -->
|
||||
<div class="modal" id="add-custom-modal">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h3>➕ 添加自定义域名服务</h3>
|
||||
<button class="modal-close" id="close-custom-modal">×</button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<form id="add-custom-form">
|
||||
<div class="form-group">
|
||||
<label for="custom-name">服务名称</label>
|
||||
<input type="text" id="custom-name" name="name" required placeholder="例如:我的域名邮箱">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="custom-api-url">API 地址</label>
|
||||
<input type="text" id="custom-api-url" name="api_url" required placeholder="https://api.example.com">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="custom-api-key">API 密钥 (可选)</label>
|
||||
<input type="text" id="custom-api-key" name="api_key" placeholder="API Key">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="custom-domain">邮箱域名</label>
|
||||
<input type="text" id="custom-domain" name="domain" placeholder="example.com">
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<div class="form-group">
|
||||
<label for="custom-priority">优先级</label>
|
||||
<input type="number" id="custom-priority" name="priority" value="0" min="0">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label>
|
||||
<input type="checkbox" id="custom-enabled" name="enabled" checked>
|
||||
启用服务
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-actions">
|
||||
<button type="submit" class="btn btn-primary">添加</button>
|
||||
<button type="button" class="btn btn-secondary" id="cancel-add-custom">取消</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="/static/js/utils.js"></script>
|
||||
<script src="/static/js/email_services.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -6,6 +6,94 @@
|
||||
<title>注册控制台 - OpenAI 注册系统</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>">
|
||||
<style>
|
||||
/* 两栏布局 */
|
||||
.two-column-layout {
|
||||
display: grid;
|
||||
grid-template-columns: 30% 70%;
|
||||
gap: var(--spacing-lg);
|
||||
align-items: start;
|
||||
}
|
||||
|
||||
.left-panel {
|
||||
position: sticky;
|
||||
top: calc(60px + var(--spacing-lg));
|
||||
}
|
||||
|
||||
.right-panel {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--spacing-lg);
|
||||
}
|
||||
|
||||
/* 任务状态行 */
|
||||
.task-status-row {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(4, 1fr);
|
||||
gap: var(--spacing-sm);
|
||||
padding: var(--spacing-md);
|
||||
background: var(--surface-hover);
|
||||
border-radius: var(--radius);
|
||||
margin-bottom: var(--spacing-md);
|
||||
}
|
||||
|
||||
.task-status-item {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.task-status-item .label {
|
||||
font-size: 0.75rem;
|
||||
color: var(--text-muted);
|
||||
}
|
||||
|
||||
.task-status-item .value {
|
||||
font-weight: 600;
|
||||
color: var(--text-primary);
|
||||
font-size: 0.875rem;
|
||||
}
|
||||
|
||||
/* 已注册账号列表 */
|
||||
.recent-accounts-table {
|
||||
max-height: 300px;
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
.recent-accounts-table table {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.recent-accounts-table th,
|
||||
.recent-accounts-table td {
|
||||
padding: var(--spacing-sm) var(--spacing-md);
|
||||
font-size: 0.8125rem;
|
||||
}
|
||||
|
||||
.password-cell {
|
||||
font-family: var(--font-mono);
|
||||
font-size: 0.75rem;
|
||||
}
|
||||
|
||||
.password-hidden {
|
||||
filter: blur(4px);
|
||||
cursor: pointer;
|
||||
transition: filter 0.2s;
|
||||
}
|
||||
|
||||
.password-hidden:hover {
|
||||
filter: blur(0);
|
||||
}
|
||||
|
||||
/* 响应式 */
|
||||
@media (max-width: 1024px) {
|
||||
.two-column-layout {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
|
||||
.left-panel {
|
||||
position: static;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
@@ -17,6 +105,7 @@
|
||||
<div class="nav-links">
|
||||
<a href="/" class="nav-link active">注册</a>
|
||||
<a href="/accounts" class="nav-link">账号管理</a>
|
||||
<a href="/email-services" class="nav-link">邮箱服务</a>
|
||||
<a href="/settings" class="nav-link">设置</a>
|
||||
</div>
|
||||
<button class="theme-toggle" onclick="theme.toggle()" title="切换主题">
|
||||
@@ -24,132 +113,153 @@
|
||||
</button>
|
||||
</nav>
|
||||
|
||||
<!-- 主内容区 -->
|
||||
<!-- 主内容区 - 两栏布局 -->
|
||||
<main class="main-content">
|
||||
<div class="page-header">
|
||||
<h2>注册控制台</h2>
|
||||
<p class="subtitle">启动新的 OpenAI/Codex CLI 账号注册任务</p>
|
||||
</div>
|
||||
|
||||
<!-- 注册表单 -->
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<h3>📝 新建注册任务</h3>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form id="registration-form">
|
||||
<div class="form-row">
|
||||
<div class="form-group">
|
||||
<label for="email-service">邮箱服务</label>
|
||||
<select id="email-service" name="email_service" required>
|
||||
<option value="tempmail">Tempmail.lol (临时邮箱)</option>
|
||||
<option value="outlook">Outlook</option>
|
||||
<option value="custom_domain">自定义域名</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="proxy">代理地址 (可选)</label>
|
||||
<input type="text" id="proxy" name="proxy" placeholder="http://127.0.0.1:7890">
|
||||
</div>
|
||||
<div class="two-column-layout">
|
||||
<!-- 左侧面板 - 注册设置 -->
|
||||
<div class="left-panel">
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<h3>📝 注册设置</h3>
|
||||
</div>
|
||||
|
||||
<div class="form-row">
|
||||
<div class="form-group">
|
||||
<label for="reg-mode">注册模式</label>
|
||||
<select id="reg-mode" name="reg_mode">
|
||||
<option value="single">单次注册</option>
|
||||
<option value="batch">批量注册</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="form-group" id="batch-count-group" style="display: none;">
|
||||
<label for="batch-count">注册数量 (1-100)</label>
|
||||
<input type="number" id="batch-count" name="batch_count" min="1" max="100" value="5">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="batch-options" style="display: none;">
|
||||
<div class="form-row">
|
||||
<div class="card-body">
|
||||
<form id="registration-form">
|
||||
<div class="form-group">
|
||||
<label for="interval-min">最小间隔 (秒)</label>
|
||||
<input type="number" id="interval-min" name="interval_min" min="0" max="300" value="5">
|
||||
<label for="email-service">邮箱服务</label>
|
||||
<select id="email-service" name="email_service" required>
|
||||
<option value="tempmail">Tempmail.lol (临时邮箱)</option>
|
||||
<option value="outlook">Outlook</option>
|
||||
<option value="custom_domain">自定义域名</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="interval-max">最大间隔 (秒)</label>
|
||||
<input type="number" id="interval-max" name="interval_max" min="1" max="600" value="30">
|
||||
<label for="reg-mode">注册模式</label>
|
||||
<select id="reg-mode" name="reg_mode">
|
||||
<option value="single">单次注册</option>
|
||||
<option value="batch">批量注册</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="form-group" id="batch-count-group" style="display: none;">
|
||||
<label for="batch-count">注册数量 (1-100)</label>
|
||||
<input type="number" id="batch-count" name="batch_count" min="1" max="100" value="5">
|
||||
</div>
|
||||
|
||||
<div id="batch-options" style="display: none;">
|
||||
<div class="form-group">
|
||||
<label for="interval-min">最小间隔 (秒)</label>
|
||||
<input type="number" id="interval-min" name="interval_min" min="0" max="300" value="5">
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="interval-max">最大间隔 (秒)</label>
|
||||
<input type="number" id="interval-max" name="interval_max" min="1" max="600" value="30">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-actions" style="flex-direction: column;">
|
||||
<button type="submit" class="btn btn-primary btn-lg" id="start-btn" style="width: 100%;">
|
||||
🚀 开始注册
|
||||
</button>
|
||||
<button type="button" class="btn btn-secondary" id="cancel-btn" disabled style="width: 100%;">
|
||||
取消任务
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 右侧面板 -->
|
||||
<div class="right-panel">
|
||||
<!-- 监控台 -->
|
||||
<div class="card" id="console-card">
|
||||
<div class="card-header">
|
||||
<h3>💻 监控台</h3>
|
||||
<div style="display: flex; gap: var(--spacing-sm); align-items: center;">
|
||||
<span id="task-status-badge" class="status-badge pending" style="display: none;">等待中</span>
|
||||
<button class="btn btn-ghost btn-sm" id="clear-log-btn">清空</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-body" style="padding: 0;">
|
||||
<!-- 任务状态行 -->
|
||||
<div class="task-status-row" id="task-status-row" style="display: none;">
|
||||
<div class="task-status-item">
|
||||
<div class="label">任务 ID</div>
|
||||
<div class="value" id="task-id">-</div>
|
||||
</div>
|
||||
<div class="task-status-item">
|
||||
<div class="label">邮箱</div>
|
||||
<div class="value" id="task-email">-</div>
|
||||
</div>
|
||||
<div class="task-status-item">
|
||||
<div class="label">邮箱服务</div>
|
||||
<div class="value" id="task-service">-</div>
|
||||
</div>
|
||||
<div class="task-status-item">
|
||||
<div class="label">状态</div>
|
||||
<div class="value" id="task-status">-</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-actions">
|
||||
<button type="submit" class="btn btn-primary btn-lg" id="start-btn">
|
||||
🚀 开始注册
|
||||
</button>
|
||||
<button type="button" class="btn btn-secondary" id="cancel-btn" disabled>
|
||||
取消任务
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 批量进度 -->
|
||||
<div id="batch-progress-section" style="display: none; padding: var(--spacing-md); border-bottom: 1px solid var(--border-light);">
|
||||
<div style="display: flex; justify-content: space-between; margin-bottom: var(--spacing-sm);">
|
||||
<span id="batch-progress-text">0/0</span>
|
||||
<span id="batch-progress-percent">0%</span>
|
||||
</div>
|
||||
<div class="progress-bar-container">
|
||||
<div id="progress-bar" class="progress-bar" style="width: 0%"></div>
|
||||
</div>
|
||||
<div class="batch-stats" style="margin-top: var(--spacing-sm);">
|
||||
<span>✅ <strong id="batch-success">0</strong></span>
|
||||
<span>❌ <strong id="batch-failed">0</strong></span>
|
||||
<span>⏳ <strong id="batch-remaining">0</strong></span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 批量任务状态 -->
|
||||
<div class="card" id="batch-status-card" style="display: none;">
|
||||
<div class="card-header">
|
||||
<h3>📊 批量任务进度</h3>
|
||||
<span id="batch-progress" class="status-badge">0/0</span>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="progress-bar-container">
|
||||
<div id="progress-bar" class="progress-bar" style="width: 0%"></div>
|
||||
</div>
|
||||
<div class="batch-stats">
|
||||
<span>✅ 成功: <strong id="batch-success">0</strong></span>
|
||||
<span>❌ 失败: <strong id="batch-failed">0</strong></span>
|
||||
<span>⏳ 剩余: <strong id="batch-remaining">0</strong></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 任务状态 -->
|
||||
<div class="card" id="task-status-card" style="display: none;">
|
||||
<div class="card-header">
|
||||
<h3>⚡ 任务状态</h3>
|
||||
<span id="task-status-badge" class="status-badge pending">等待中</span>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="info-grid">
|
||||
<div class="info-item">
|
||||
<span class="label">任务 ID</span>
|
||||
<span id="task-id" class="value">-</span>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<span class="label">邮箱</span>
|
||||
<span id="task-email" class="value">-</span>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<span class="label">状态</span>
|
||||
<span id="task-status" class="value">-</span>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<span class="label">邮箱服务</span>
|
||||
<span id="task-service" class="value">-</span>
|
||||
<!-- 控制台日志 -->
|
||||
<div id="console-log" class="console-log">
|
||||
<div class="log-line info">[系统] 准备就绪,等待开始注册...</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 控制台日志 -->
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<h3>💻 控制台日志</h3>
|
||||
<button class="btn btn-ghost btn-sm" id="clear-log-btn">清空</button>
|
||||
</div>
|
||||
<div class="card-body" style="padding: 0;">
|
||||
<div id="console-log" class="console-log">
|
||||
<div class="log-line info">[系统] 准备就绪,等待开始注册...</div>
|
||||
<!-- 已注册账号列表 -->
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<h3>📋 已注册账号</h3>
|
||||
<div style="display: flex; gap: var(--spacing-sm);">
|
||||
<button class="btn btn-ghost btn-sm" id="refresh-accounts-btn">🔄 刷新</button>
|
||||
<a href="/accounts" class="btn btn-secondary btn-sm">查看全部</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-body" style="padding: 0;">
|
||||
<div class="recent-accounts-table">
|
||||
<table class="data-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th style="width: 50px;">ID</th>
|
||||
<th>邮箱</th>
|
||||
<th style="width: 120px;">密码</th>
|
||||
<th style="width: 80px;">状态</th>
|
||||
<th style="width: 80px;">操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="recent-accounts-table">
|
||||
<tr>
|
||||
<td colspan="5">
|
||||
<div class="empty-state" style="padding: var(--spacing-md);">
|
||||
<div class="empty-state-icon">📭</div>
|
||||
<div class="empty-state-title">暂无已注册账号</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
<div class="nav-links">
|
||||
<a href="/" class="nav-link">注册</a>
|
||||
<a href="/accounts" class="nav-link">账号管理</a>
|
||||
<a href="/email-services" class="nav-link">邮箱服务</a>
|
||||
<a href="/settings" class="nav-link active">设置</a>
|
||||
</div>
|
||||
<button class="theme-toggle" onclick="theme.toggle()" title="切换主题">
|
||||
@@ -34,16 +35,17 @@
|
||||
<!-- 设置标签页 -->
|
||||
<div class="tabs">
|
||||
<button class="tab-btn active" data-tab="proxy">🌐 代理设置</button>
|
||||
<button class="tab-btn" data-tab="email">📧 邮箱服务</button>
|
||||
<button class="tab-btn" data-tab="registration">⚙️ 注册配置</button>
|
||||
<button class="tab-btn" data-tab="database">💾 数据库</button>
|
||||
</div>
|
||||
|
||||
<!-- 代理设置 -->
|
||||
<div class="tab-content active" id="proxy-tab">
|
||||
<!-- 默认代理配置 -->
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<h3>代理配置</h3>
|
||||
<h3>默认代理配置</h3>
|
||||
<span class="hint">当代理列表为空时使用此配置</span>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form id="proxy-form">
|
||||
@@ -93,74 +95,37 @@
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 邮箱服务 -->
|
||||
<div class="tab-content" id="email-tab">
|
||||
<!-- Outlook 批量导入 -->
|
||||
<div class="card" id="outlook-import-card">
|
||||
<!-- 代理列表 -->
|
||||
<div class="card" style="margin-top: var(--spacing-lg);">
|
||||
<div class="card-header">
|
||||
<h3>📥 Outlook 批量导入</h3>
|
||||
<button class="btn btn-ghost btn-sm" id="toggle-import-btn">展开</button>
|
||||
</div>
|
||||
<div class="card-body" id="outlook-import-body" style="display: none;">
|
||||
<div class="import-info">
|
||||
<p><strong>支持格式:</strong></p>
|
||||
<ul>
|
||||
<li><code>邮箱----密码</code> (密码认证)</li>
|
||||
<li><code>邮箱----密码----client_id----refresh_token</code> (XOAUTH2 认证,推荐)</li>
|
||||
</ul>
|
||||
<p>每行一个账户,使用四个连字符(----)分隔字段。以 # 开头的行将被忽略。</p>
|
||||
<h3>代理列表</h3>
|
||||
<div style="display: flex; gap: var(--spacing-sm);">
|
||||
<button class="btn btn-secondary btn-sm" id="test-all-proxies-btn">🔌 测试全部</button>
|
||||
<button class="btn btn-primary btn-sm" id="add-proxy-btn">➕ 添加代理</button>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="outlook-import-data">批量导入数据</label>
|
||||
<textarea id="outlook-import-data" rows="8" placeholder="example@outlook.com----password123 test@outlook.com----password456----client_id----refresh_token"></textarea>
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<div class="form-group">
|
||||
<label>
|
||||
<input type="checkbox" id="outlook-import-enabled" checked>
|
||||
导入后启用
|
||||
</label>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="outlook-import-priority">优先级</label>
|
||||
<input type="number" id="outlook-import-priority" value="0" min="0">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-actions">
|
||||
<button type="button" class="btn btn-primary" id="outlook-import-btn">📥 开始导入</button>
|
||||
<button type="button" class="btn btn-secondary" id="clear-import-btn">清空</button>
|
||||
</div>
|
||||
<div id="import-result" style="display: none; margin-top: var(--spacing-md);"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<h3>邮箱服务配置</h3>
|
||||
<button class="btn btn-primary btn-sm" id="add-email-service-btn">➕ 添加服务</button>
|
||||
</div>
|
||||
<div class="card-body" style="padding: 0;">
|
||||
<div class="table-container">
|
||||
<table class="data-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th style="width: 40px;"><input type="checkbox" id="select-all-services"></th>
|
||||
<th style="width: 50px;">ID</th>
|
||||
<th>名称</th>
|
||||
<th style="width: 120px;">类型</th>
|
||||
<th style="width: 100px;">状态</th>
|
||||
<th style="width: 80px;">优先级</th>
|
||||
<th style="width: 160px;">最后使用</th>
|
||||
<th style="width: 180px;">操作</th>
|
||||
<th>类型</th>
|
||||
<th>地址</th>
|
||||
<th style="width: 80px;">状态</th>
|
||||
<th style="width: 120px;">最后使用</th>
|
||||
<th style="width: 150px;">操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="email-services-table">
|
||||
<tbody id="proxies-table">
|
||||
<tr>
|
||||
<td colspan="7">
|
||||
<div class="empty-state">
|
||||
<div class="skeleton skeleton-text"></div>
|
||||
<div class="skeleton skeleton-text" style="width: 80%;"></div>
|
||||
<div class="empty-state-icon">🌐</div>
|
||||
<div class="empty-state-title">暂无代理</div>
|
||||
<div class="empty-state-description">点击"添加代理"按钮添加代理服务器</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
@@ -171,6 +136,56 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 添加代理模态框 -->
|
||||
<div class="modal" id="add-proxy-modal">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h3 id="proxy-modal-title">添加代理</h3>
|
||||
<button class="modal-close" id="close-proxy-modal">×</button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<form id="proxy-item-form">
|
||||
<input type="hidden" id="proxy-item-id">
|
||||
<div class="form-group">
|
||||
<label for="proxy-item-name">名称</label>
|
||||
<input type="text" id="proxy-item-name" name="name" required placeholder="例如:美国代理 1">
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<div class="form-group">
|
||||
<label for="proxy-item-type">类型</label>
|
||||
<select id="proxy-item-type" name="type">
|
||||
<option value="http">HTTP</option>
|
||||
<option value="socks5">SOCKS5</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="proxy-item-host">主机地址</label>
|
||||
<input type="text" id="proxy-item-host" name="host" required placeholder="127.0.0.1">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="proxy-item-port">端口</label>
|
||||
<input type="number" id="proxy-item-port" name="port" required placeholder="7890">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<div class="form-group">
|
||||
<label for="proxy-item-username">用户名 (可选)</label>
|
||||
<input type="text" id="proxy-item-username" name="username" autocomplete="off">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="proxy-item-password">密码 (可选)</label>
|
||||
<input type="password" id="proxy-item-password" name="password" autocomplete="new-password">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-actions">
|
||||
<button type="button" class="btn btn-secondary" id="cancel-proxy-btn">取消</button>
|
||||
<button type="submit" class="btn btn-primary">💾 保存</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 注册配置 -->
|
||||
<div class="tab-content" id="registration-tab">
|
||||
<div class="card">
|
||||
@@ -252,42 +267,6 @@
|
||||
</main>
|
||||
</div>
|
||||
|
||||
<!-- 添加邮箱服务模态框 -->
|
||||
<div class="modal" id="add-service-modal">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h3>➕ 添加邮箱服务</h3>
|
||||
<button class="modal-close" id="close-service-modal">×</button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<form id="add-service-form">
|
||||
<div class="form-group">
|
||||
<label for="service-type">服务类型</label>
|
||||
<select id="service-type" name="service_type" required>
|
||||
<option value="tempmail">Tempmail.lol</option>
|
||||
<option value="outlook">Outlook</option>
|
||||
<option value="custom_domain">自定义域名</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="service-name">服务名称</label>
|
||||
<input type="text" id="service-name" name="name" required placeholder="例如:我的 Outlook 账号">
|
||||
</div>
|
||||
|
||||
<div id="service-config-fields">
|
||||
<!-- 根据类型动态加载 -->
|
||||
</div>
|
||||
|
||||
<div class="form-actions">
|
||||
<button type="submit" class="btn btn-primary">添加</button>
|
||||
<button type="button" class="btn btn-secondary" id="cancel-add-service">取消</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="/static/js/utils.js"></script>
|
||||
<script src="/static/js/settings.js"></script>
|
||||
</body>
|
||||
|
||||
Reference in New Issue
Block a user