2025-05-11 23:06:57 +08:00

644 lines
39 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">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Cursor账号管理系统</title>
<!-- Bootstrap 5 CSS -->
<link href="static/css/bootstrap.min.css" rel="stylesheet">
<!-- Font Awesome 图标 -->
<link rel="stylesheet" href="static/css/all.min.css">
<!-- 自定义样式 -->
<link href="static/css/styles.css" rel="stylesheet">
<!-- 添加现代字体 -->
<link href="static/css/css2" rel="stylesheet">
<!-- 添加动画库 -->
<link href="static/css/animate.min.css" rel="stylesheet">
</head>
<body class="app-layout">
<!-- 烟花动画画布 -->
<canvas id="fireworks-canvas"></canvas>
<!-- 加载中遮罩 -->
<div class="loading-overlay" id="loading-overlay">
<div class="spinner-container">
<div class="spinner-border text-primary" role="status">
<span class="visually-hidden">加载中...</span>
</div>
<p class="mt-2 mb-0">加载中,请稍候...</p>
</div>
</div>
<!-- 通知容器 -->
<div id="alert-container"></div>
<!-- 侧边栏菜单 -->
<div id="sidebar">
<div class="sidebar-header">
<!-- <img src="static/img/logo.png" alt="Cursor Logo" class="logo-img"> -->
<h4>Cursor账号管理</h4>
</div>
<ul class="nav-menu">
<li class="nav-item">
<a href="#" class="nav-link active" data-page="tasks-accounts">
<i class="fas fa-users"></i>
<span>账号管理</span>
</a>
</li>
<li class="nav-item">
<a href="#" class="nav-link" data-page="system-config">
<i class="fas fa-cog"></i>
<span>系统配置</span>
</a>
</li>
</ul>
<div class="sidebar-footer">
<span>版本: 1.0.0</span>
</div>
</div>
<!-- 主内容区域 -->
<div id="content">
<!-- 保留原有的页面结构,只添加页面包装器 -->
<div id="tasks-accounts" class="page-content active">
<div class="row mb-4">
<div class="col-12">
<div class="card">
<div class="card-header bg-white d-flex justify-content-between align-items-center">
<h5 class="mb-0">任务控制</h5>
<div id="registration-status" class="badge bg-success">空闲中</div>
</div>
<div class="card-body">
<div class="row align-items-center">
<div class="col-md-6">
<div id="task-status">
<div class="d-flex align-items-center">
<i class="fas fa-check-circle text-success me-2"></i>
<span id="task-status-text">系统空闲中,可以开始新任务</span>
</div>
<!-- 账号使用情况显示 -->
<div class="usage-info mt-2">
<div class="usage-numbers">
<span class="used-count" id="current-count">0</span>
<span class="separator">/</span>
<span class="total-count" id="max-accounts">10</span>
<span class="remaining-count" id="remaining-slots">剩余: 10</span>
</div>
<div class="battery-progress mt-1" data-percent="0">
<div class="battery-bars">
<span class="battery-bar"></span>
<span class="battery-bar"></span>
<span class="battery-bar"></span>
<span class="battery-bar"></span>
<span class="battery-bar"></span>
<span class="battery-bar"></span>
<span class="battery-bar"></span>
<span class="battery-bar"></span>
<span class="battery-bar"></span>
<span class="battery-bar"></span>
</div>
<span class="battery-percent">0%</span>
</div>
</div>
</div>
</div>
<div class="col-md-6 text-md-end mt-3 mt-md-0">
<button id="refresh-btn" class="btn btn-outline-secondary me-2"
style="display: none;">
<i class="fas fa-sync-alt me-1"></i> 刷新数据
</button>
<button id="start-registration" class="btn btn-primary me-2">
<i class="fas fa-user-plus me-1"></i> 注册新账号
</button>
<button id="stop-registration" class="btn btn-danger" style="display: none;">
<i class="fas fa-stop-circle me-1"></i> 停止任务
</button>
</div>
</div>
<!-- 任务详细信息 -->
<div id="task-details" class="mt-4">
<div class="card border-0 bg-light">
<div class="card-body py-2">
<div class="row">
<div class="col-md-6">
<div class="small mb-2">
<span class="text-muted">上次运行: </span>
<span id="last-run">从未运行</span>
</div>
<div class="small mb-2">
<span class="text-muted">下次运行: </span>
<span id="next-run">未排程</span>
</div>
</div>
<div class="col-md-6">
<div class="small mb-2">
<span class="text-muted">总运行次数: </span>
<span id="total-runs">0</span>
</div>
<div class="small">
<span class="text-muted">成功率: </span>
<span id="success-rate">N/A</span>
<span class="ms-2">
(<span class="text-success" id="successful-runs">0</span> 成功 /
<span class="text-danger" id="failed-runs">0</span> 失败)
</span>
</div>
</div>
</div>
</div>
</div>
</div>
<div id="registration-details" class="mt-3" style="display: none;">
<div class="alert alert-info">
<div class="d-flex align-items-center">
<i class="fas fa-info-circle me-2"></i>
<div>
<strong>注册进度: </strong><span id="registration-progress">0%</span>
<div id="registration-message">正在初始化注册流程...</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- 在搜索栏旁边添加排序控件 -->
<div class="row mb-3 align-items-center">
<div class="col-md-6">
<div class="d-flex align-items-center">
<label class="me-2 text-muted mb-0">排序方式:</label>
<select id="sort-field" class="form-select form-select-sm me-2" style="width: auto;">
<option value="created_at">创建时间</option>
<option value="email">邮箱</option>
<option value="usage_limit">余量</option>
</select>
<select id="sort-order" class="form-select form-select-sm" style="width: auto;">
<option value="desc">降序</option>
<option value="asc">升序</option>
</select>
</div>
</div>
<div class="col-md-6 text-end">
<button id="import-accounts-btn" class="btn btn-outline-secondary btn-sm me-1">
<i class="fas fa-file-import me-1"></i>导入账号
</button>
<button id="export-accounts-btn" class="btn btn-outline-secondary btn-sm me-1">
<i class="fas fa-file-export me-1"></i>导出账号
</button>
<button id="update-all-usage-btn" class="btn btn-primary btn-sm">
<i class="fas fa-sync-alt me-1"></i>更新所有余量
</button>
</div>
</div>
<!-- 添加隐藏的文件输入 -->
<input type="file" id="import-file-input" accept=".json" style="display: none;">
<!-- 添加导入确认对话框 -->
<div class="modal fade" id="import-confirm-modal" tabindex="-1" aria-hidden="true">
<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" aria-label="Close"></button>
</div>
<div class="modal-body">
<p>即将导入 <span id="import-count">0</span> 个账号。</p>
<p>注意:同名账号将被更新覆盖。确定要继续吗?</p>
<div class="form-check mt-3">
<input class="form-check-input" type="checkbox" id="import-overwrite-check" checked>
<label class="form-check-label" for="import-overwrite-check">
允许覆盖现有账号
</label>
</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" id="confirm-import-btn">确认导入</button>
</div>
</div>
</div>
</div>
<!-- 账号列表 -->
<div class="row">
<div class="col-12">
<div class="card">
<div class="card-header bg-white">
<h5 class="mb-0">账号列表</h5>
</div>
<div class="card-body p-0">
<div class="table-responsive">
<table class="table table-hover align-middle mb-0">
<thead>
<tr>
<th>邮箱</th>
<th>密码</th>
<th>TOKEN</th>
<th>高级使用</th>
<th>创建时间</th>
<th>余量</th>
<th>操作</th>
</tr>
</thead>
<tbody id="accounts-tbody">
<!-- 账号数据将通过JavaScript动态填充 -->
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
<!-- 重新设计分页控件 -->
<div class="pagination-container mt-3">
<div class="d-flex justify-content-between align-items-center">
<div class="pagination-info">
<span id="total-accounts" class="fw-bold text-primary">0</span> 个账号,
<span id="current-page" class="fw-bold">1</span>/<span id="total-pages">1</span>
</div>
<nav aria-label="账号分页">
<ul class="pagination mb-0">
<li class="page-item" id="prev-page">
<a class="page-link" href="#" aria-label="上一页">
<i class="fas fa-angle-left"></i>
</a>
</li>
<li class="page-item page-number active"><a class="page-link" href="#" data-page="1">1</a>
</li>
<!-- 页码会动态生成 -->
<li class="page-item" id="next-page">
<a class="page-link" href="#" aria-label="下一页">
<i class="fas fa-angle-right"></i>
</a>
</li>
</ul>
</nav>
<div class="per-page-selector">
<select id="per-page" class="form-select form-select-sm">
<option value="10">每页10条</option>
<option value="20">每页20条</option>
<option value="50">每页50条</option>
<option value="100">每页100条</option>
</select>
</div>
</div>
</div>
</div>
<!-- 系统配置页面 -->
<div id="system-config" class="page-content">
<div class="row">
<div class="col-12">
<div class="card">
<div class="card-header bg-white d-flex justify-content-between align-items-center">
<h5 class="mb-0">系统配置</h5>
</div>
<div class="card-body">
<!-- 保留原有的配置表单 -->
<form id="config-form">
<div class="row">
<div class="col-md-6">
<div class="mb-3">
<label for="browser-headless" class="form-label">浏览器无头模式</label>
<select id="browser-headless" class="form-control" disabled>
<option value="true">是 (无界面)</option>
<option value="false">否 (有界面)</option>
</select>
<small class="text-muted">True=无界面运行浏览器False=显示浏览器界面</small>
</div>
<div class="mb-3">
<label for="dynamic-useragent" class="form-label">动态User-Agent先不要配置</label>
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" role="switch"
id="dynamic-useragent" disabled>
<label class="form-check-label"
for="dynamic-useragent">启用动态User-Agent</label>
</div>
<small class="text-muted">建议不要启用后将从预设的UA列表中随机选择无需手动配置User-Agent</small>
</div>
<div class="mb-3" id="useragent-input-container">
<label for="browser-useragent" class="form-label">浏览器User-Agent</label>
<input type="text" id="browser-useragent" class="form-control" disabled>
<small class="text-muted">浏览器模拟的用户代理字符串</small>
</div>
<div class="mb-3">
<label for="browser-path" class="form-label">浏览器路径 (可选)</label>
<input type="text" id="browser-path" class="form-control" disabled>
<small class="text-muted">Windows下浏览器可执行文件的完整路径(示例C:\Users\Administrator\AppData\Local\Google\Chrome\Bin\chrome.exe)</small>
</div>
<div class="mb-3">
<label for="accounts-limit" class="form-label">最大账号数量</label>
<input type="number" id="accounts-limit" class="form-control" min="1"
disabled>
<small class="text-muted">系统允许创建的最大账号数量</small>
</div>
<!-- 验证码获取方式 -->
<div class="mb-3">
<label for="captcha-method" class="form-label">验证码获取方式</label>
<select id="captcha-method" class="form-control" disabled>
<option value="API">API自动获取</option>
<option value="INPUT">控制台手动输入</option>
</select>
<small class="text-muted">选择验证码的获取方式API自动获取或通过控制台手动输入</small>
</div>
</div>
<div class="col-md-6">
<div class="mb-3">
<label for="email-type" class="form-label">邮箱类型</label>
<select id="email-type" class="form-control" disabled>
<option value="tempemail">TempEmailhttps://tempmail.plus/</option>
<option value="zmail">ZMailhttps://zmail.plus/</option>
</select>
<small class="text-muted">选择用于注册的临时邮箱服务类型</small>
</div>
<div class="mb-3">
<label for="email-domains" class="form-label">邮箱域名</label>
<input type="text" id="email-domains" class="form-control" disabled>
<small class="text-muted">用于注册的邮箱域名,多个域名用逗号分隔</small>
</div>
<!-- TempEmail相关字段 -->
<div id="tempemail-fields">
<div class="mb-3">
<label for="email-username" class="form-label">临时邮箱用户名</label>
<input type="text" id="email-username" class="form-control" disabled
placeholder="加载中...">
<small class="text-muted">用于接收验证码的临时邮箱用户名(不需要输入@及后面的部分)</small>
</div>
<div class="mb-3">
<label for="email-pin" class="form-label">临时邮箱PIN</label>
<input type="text" id="email-pin" class="form-control" disabled>
<small class="text-muted">临时邮箱PIN码如果需要</small>
</div>
</div>
<!-- ZMail相关字段 -->
<div id="zmail-fields" style="display: none;">
<div class="mb-3">
<label for="email-api" class="form-label">邮箱API</label>
<input type="text" id="email-api" class="form-control" disabled>
<small class="text-muted">ZMail API地址</small>
</div>
<div class="mb-3">
<label for="email-proxy-enabled" class="form-label">邮箱代理</label>
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" role="switch"
id="email-proxy-enabled" disabled>
<label class="form-check-label"
for="email-proxy-enabled">启用邮箱代理</label>
</div>
<small class="text-muted">是否启用邮箱API代理</small>
</div>
<div class="mb-3" id="email-proxy-address-container">
<label for="email-proxy-address" class="form-label">邮箱代理地址</label>
<input type="text" id="email-proxy-address" class="form-control"
disabled>
<small class="text-muted">邮箱API代理服务器地址</small>
</div>
</div>
<div class="mb-3">
<label for="cursor-path" class="form-label">Cursor路径 (可选)</label>
<input type="text" id="cursor-path" class="form-control" disabled>
<small class="text-muted">Cursor安装目录的完整路径(示例D:\devtools\cursor)</small>
</div>
</div>
<!-- 在系统配置表单中添加代理设置部分 -->
<div class="config-section card mb-3">
<div class="card-header bg-light">
<h5 class="mb-0">代理服务器设置</h5>
</div>
<div class="card-body">
<div class="form-check form-switch mb-3">
<input class="form-check-input" type="checkbox" role="switch"
id="use-proxy" disabled name="USE_PROXY">
<label class="form-check-label" for="use-proxy">启用代理服务器</label>
</div>
<div id="proxy-settings" class="mb-3">
<div class="row mb-3">
<div class="col-md-6">
<label for="proxy-type" class="form-label">代理类型</label>
<select class="form-select" id="proxy-type" disabled
name="PROXY_TYPE">
<option value="http">HTTP</option>
<option value="https">HTTPS</option>
<option value="socks4">SOCKS4</option>
<option value="socks5">SOCKS5</option>
</select>
</div>
<div class="col-md-6">
<label for="proxy-host" class="form-label">代理服务器地址</label>
<input type="text" class="form-control" id="proxy-host" disabled
name="PROXY_HOST" placeholder="例如: 127.0.0.1">
</div>
</div>
<div class="row mb-3">
<div class="col-md-6">
<label for="proxy-port" class="form-label">代理服务器端口</label>
<input type="number" class="form-control" id="proxy-port"
disabled name="PROXY_PORT" placeholder="例如: 7890">
</div>
<div class="col-md-6">
<label for="proxy-timeout" class="form-label">超时时间 (秒)</label>
<input type="number" class="form-control" id="proxy-timeout"
disabled name="PROXY_TIMEOUT" value="10">
</div>
</div>
<div class="row">
<div class="col-md-6">
<label for="proxy-username" class="form-label">用户名 (可选)</label>
<input type="text" class="form-control" id="proxy-username"
disabled name="PROXY_USERNAME" placeholder="认证用户名">
</div>
<div class="col-md-6">
<label for="proxy-password" class="form-label">密码 (可选)</label>
<input type="password" class="form-control" id="proxy-password"
disabled name="PROXY_PASSWORD" placeholder="认证密码">
</div>
</div>
</div>
</div>
</div>
<!-- 将按钮容器从text-end改为新的栅格布局 -->
<div class="row config-actions" id="config-actions" style="display:none">
<div class="col-6 pe-1">
<button type="button" id="cancel-config-btn"
class="btn btn-secondary w-100">取消</button>
</div>
<div class="col-6 ps-1">
<button type="submit" id="save-config-btn"
class="btn btn-success w-100">保存配置</button>
</div>
</div>
</form>
<div class="text-center">
<button id="edit-config-btn" class="btn btn-warning position-relative">
<i class="fas fa-edit me-1"></i> 编辑配置
<span class="position-absolute badge rounded-pill bg-danger">
<i class="fas fa-pencil-alt fa-xs"></i>
<span class="visually-hidden">编辑提示</span>
</span>
</button>
</div>
</div>
<!-- 在系统配置区域添加重置机器ID按钮 -->
<div class="config-section card mb-3">
<div class="card-header bg-light">
<h5 class="mb-0">系统维护</h5>
</div>
<div class="card-body">
<div class="row">
<div class="col-md-6">
<button id="restart-service-btn" class="btn btn-primary w-100">
<i class="fas fa-sync-alt me-2"></i>重启服务
</button>
<p class="text-muted small mt-1">某些配置更改需要重启服务才能生效</p>
</div>
<div class="col-md-6">
<button id="reset-machine-btn" class="btn btn-danger w-100">
<i class="fas fa-microchip me-2"></i>重置机器ID慎用实测切换了一下账号直接被Cursor封了。。。
</button>
<p class="text-muted small mt-1">解决设备绑定或配额限制问题</p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- 删除确认对话框 -->
<div class="modal fade" id="deleteConfirmModal" tabindex="-1" aria-labelledby="deleteConfirmModalLabel"
aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="deleteConfirmModalLabel">确认删除</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<p>确定要删除此账号吗?此操作不可恢复。</p>
<p class="text-danger fw-bold">邮箱: <span id="deleteEmailConfirm"></span></p>
<p class="text-muted">ID: <span id="deleteIdConfirm"></span></p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">取消</button>
<button type="button" class="btn btn-danger" id="confirmDeleteBtn">删除</button>
</div>
</div>
</div>
</div>
<!-- Token查看模态框 -->
<div class="modal fade" id="tokenViewModal" tabindex="-1" aria-labelledby="tokenViewModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="tokenViewModalLabel">查看Token</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<div class="mb-3">
<label for="tokenFullText" class="form-label">完整Token:</label>
<div class="input-group">
<textarea id="tokenFullText" class="form-control" rows="5" readonly></textarea>
<button class="btn btn-outline-primary copy-btn" type="button" id="copyTokenBtn"
title="复制Token">
<i class="fas fa-copy"></i>
</button>
</div>
</div>
<div class="text-muted small">此Token用于Cursor客户端身份验证请妥善保管</div>
</div>
<div class="modal-footer">
<div class="form-check mb-2">
<input class="form-check-input" type="checkbox" id="resetMachineIdCheck">
<label class="form-check-label" for="resetMachineIdCheck">
同时重置机器ID
</label>
</div>
<button type="button" class="btn btn-primary" id="useTokenBtn" data-account-id="">
<i class="fas fa-plug"></i> 使用此Token
</button>
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">关闭</button>
</div>
</div>
</div>
</div>
<!-- 账号使用记录模态框 -->
<div class="modal fade" id="usageRecordModal" tabindex="-1" aria-labelledby="usageRecordModalLabel" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="usageRecordModalLabel">账号使用记录</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<div class="mb-3">
<strong>账号邮箱:</strong> <span id="recordEmail"></span>
</div>
<div class="table-responsive">
<table class="table table-hover table-sm align-middle">
<thead>
<tr>
<th>使用时间</th>
<th>使用者IP</th>
<th>使用者UA</th>
</tr>
</thead>
<tbody id="usageRecordBody">
<!-- 记录将被动态填充 -->
</tbody>
</table>
</div>
<div id="no-records" class="text-center p-4" style="display: none;">
<i class="fas fa-history fa-2x text-muted mb-2"></i>
<p>暂无使用记录</p>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">关闭</button>
</div>
</div>
</div>
</div>
<!-- 自动刷新指示器 -->
<div class="position-fixed bottom-0 end-0 p-3" style="z-index: 5">
<div class="d-flex align-items-center small text-muted">
<span class="me-2">自动刷新60秒/次)</span>
<div class="spinner-border spinner-border-sm text-secondary" role="status"
style="width: 0.8rem; height: 0.8rem;">
<span class="visually-hidden">Loading...</span>
</div>
</div>
</div>
<!-- Bootstrap JS -->
<script src="static/js/bootstrap.bundle.min.js"></script>
<!-- jQuery -->
<script src="static/js/jquery-3.6.0.min.js"></script>
<!-- 原有业务逻辑 JS -->
<script src="static/js/app.js"></script>
<!-- 添加菜单交互 JS -->
<script src="static/js/menu.js"></script>
</body>
</html>