Files
boss_dp/页面模板.html
Your Name 87f915819f 哈哈
2026-02-14 17:58:29 +08:00

3695 lines
151 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>Boss自动化助手 - 控制面板</title>
<style>
/* 基础样式 */
:root {
--primary-color: #1e40af;
--secondary-color: #3b82f6;
--success-color: #10b981;
--warning-color: #f59e0b;
--danger-color: #ef4444;
--info-color: #0ea5e9;
--bg-color: #f8fafc;
--card-bg: #ffffff;
--border-color: #e2e8f0;
--text-primary: #1e293b;
--text-secondary: #64748b;
--sidebar-width: 260px;
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
font-family: 'Segoe UI', 'Microsoft YaHei', sans-serif;
}
body {
background-color: var(--bg-color);
color: var(--text-primary);
line-height: 1.6;
overflow-x: hidden;
}
/* 布局 */
.app-container {
display: flex;
min-height: 100vh;
}
/* 侧边栏 */
.sidebar {
width: var(--sidebar-width);
background: linear-gradient(180deg, #1e293b, #0f172a);
color: white;
padding: 25px 0;
position: fixed;
height: 100vh;
overflow-y: auto;
box-shadow: 2px 0 15px rgba(0, 0, 0, 0.1);
z-index: 1000;
}
.logo {
text-align: center;
padding: 0 20px 25px;
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
}
.logo h1 {
font-size: 22px;
font-weight: 700;
margin-bottom: 5px;
color: #60a5fa;
}
.logo span {
font-size: 12px;
opacity: 0.8;
}
.nav-menu {
margin-top: 25px;
}
.nav-item {
padding: 14px 25px;
display: flex;
align-items: center;
cursor: pointer;
transition: all 0.3s;
border-left: 3px solid transparent;
font-size: 15px;
}
.nav-item:hover {
background: rgba(255, 255, 255, 0.08);
}
.nav-item.active {
background: rgba(255, 255, 255, 0.12);
border-left-color: #60a5fa;
color: #60a5fa;
}
.nav-item i {
margin-right: 12px;
font-size: 16px;
width: 20px;
text-align: center;
}
.nav-badge {
margin-left: auto;
background: rgba(96, 165, 250, 0.2);
color: #60a5fa;
padding: 2px 8px;
border-radius: 10px;
font-size: 12px;
}
/* 主内容区 */
.main-content {
flex: 1;
margin-left: var(--sidebar-width);
padding: 25px;
min-height: 100vh;
background: var(--bg-color);
}
.header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 30px;
padding-bottom: 20px;
border-bottom: 1px solid var(--border-color);
}
.header h2 {
color: var(--primary-color);
font-size: 24px;
font-weight: 600;
}
.header-controls {
display: flex;
gap: 15px;
align-items: center;
}
/* 通用组件 */
.card {
background: var(--card-bg);
border-radius: 12px;
padding: 25px;
margin-bottom: 25px;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05);
border: 1px solid var(--border-color);
}
.card-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 25px;
}
.card-header h3 {
color: var(--primary-color);
font-size: 18px;
font-weight: 600;
}
.btn {
padding: 10px 20px;
border: none;
border-radius: 8px;
font-weight: 600;
cursor: pointer;
transition: all 0.3s;
font-size: 14px;
display: inline-flex;
align-items: center;
justify-content: center;
gap: 8px;
}
.btn-primary {
background: linear-gradient(135deg, var(--primary-color), #1e3a8a);
color: white;
}
.btn-primary:hover {
transform: translateY(-2px);
box-shadow: 0 5px 15px rgba(30, 64, 175, 0.3);
}
.btn-success {
background: linear-gradient(135deg, var(--success-color), #059669);
color: white;
}
.btn-danger {
background: linear-gradient(135deg, var(--danger-color), #dc2626);
color: white;
}
.btn-warning {
background: linear-gradient(135deg, var(--warning-color), #d97706);
color: white;
}
.btn-secondary {
background: var(--bg-color);
color: var(--text-primary);
border: 1px solid var(--border-color);
}
.btn-secondary:hover {
background: #e2e8f0;
}
.btn-sm {
padding: 6px 12px;
font-size: 12px;
}
/* 统计数据卡片 */
.stats-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
gap: 20px;
margin-bottom: 30px;
}
.stat-card {
background: var(--card-bg);
padding: 20px;
border-radius: 12px;
border: 1px solid var(--border-color);
transition: transform 0.3s;
}
.stat-card:hover {
transform: translateY(-5px);
}
.stat-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 15px;
}
.stat-icon {
width: 50px;
height: 50px;
border-radius: 10px;
display: flex;
align-items: center;
justify-content: center;
font-size: 24px;
color: white;
}
.icon-blue { background: linear-gradient(135deg, #3b82f6, #1d4ed8); }
.icon-green { background: linear-gradient(135deg, #10b981, #059669); }
.icon-orange { background: linear-gradient(135deg, #f59e0b, #d97706); }
.icon-purple { background: linear-gradient(135deg, #8b5cf6, #7c3aed); }
.stat-value {
font-size: 28px;
font-weight: 700;
color: var(--text-primary);
margin-bottom: 5px;
}
.stat-label {
color: var(--text-secondary);
font-size: 14px;
}
/* 账号控制区域 */
.account-control-area {
margin-top: 30px;
}
/* 账号表格布局(水平排列) */
.account-table-container {
overflow-x: auto;
margin-top: 20px;
}
.account-table {
width: 100%;
border-collapse: collapse;
min-width: 1000px;
}
.account-table th {
background: var(--bg-color);
padding: 15px;
text-align: left;
font-weight: 600;
color: var(--text-secondary);
border-bottom: 2px solid var(--border-color);
white-space: nowrap;
}
.account-table td {
padding: 15px;
border-bottom: 1px solid var(--border-color);
}
.account-table tr:hover {
background: var(--bg-color);
}
.account-table tr.selected {
background: rgba(30, 64, 175, 0.05);
}
/* 表格中的复选框 */
.table-checkbox {
width: 20px;
height: 20px;
border: 2px solid var(--border-color);
border-radius: 4px;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
}
.table-checkbox.checked {
background: var(--primary-color);
border-color: var(--primary-color);
}
.table-checkbox.checked:after {
content: "✓";
color: white;
font-size: 14px;
}
/* 账号状态 */
.account-status {
display: flex;
align-items: center;
gap: 8px;
}
.status-dot {
width: 10px;
height: 10px;
border-radius: 50%;
}
.status-online {
background-color: var(--success-color);
box-shadow: 0 0 10px var(--success-color);
}
.status-offline {
background-color: var(--danger-color);
}
.status-badge {
display: inline-block;
padding: 4px 12px;
border-radius: 20px;
font-size: 12px;
font-weight: 600;
text-align: center;
}
.status-running { background: #d1fae5; color: #065f46; }
.status-paused { background: #fef3c7; color: #92400e; }
.status-stopped { background: #fee2e2; color: #991b1b; }
/* 进度条 */
.progress-bar {
height: 8px;
background: var(--border-color);
border-radius: 4px;
overflow: hidden;
margin-top: 5px;
}
.progress-fill {
height: 100%;
background: linear-gradient(90deg, var(--primary-color), var(--secondary-color));
border-radius: 4px;
}
/* 批量操作栏 */
.batch-controls {
background: var(--card-bg);
border-radius: 12px;
padding: 20px;
margin-top: 20px;
border: 1px solid var(--border-color);
display: flex;
justify-content: space-between;
align-items: center;
}
.batch-info {
display: flex;
align-items: center;
gap: 15px;
}
.batch-actions {
display: flex;
gap: 15px;
}
/* 运行日志 */
.running-logs {
margin-top: 30px;
}
.log-container {
background: #1e293b;
color: #e2e8f0;
padding: 20px;
border-radius: 8px;
font-family: 'Consolas', 'Monaco', monospace;
font-size: 13px;
max-height: 300px;
overflow-y: auto;
margin-top: 20px;
}
.log-entry {
padding: 5px 0;
border-bottom: 1px solid #334155;
}
.log-time {
color: #94a3b8;
margin-right: 15px;
}
.log-info { color: #60a5fa; }
.log-success { color: #34d399; }
.log-warning { color: #fbbf24; }
.log-error { color: #f87171; }
/* 页面切换 */
.page {
display: none;
}
.page.active {
display: block;
}
/* 表单样式 */
.form-group {
margin-bottom: 20px;
}
.form-label {
display: block;
margin-bottom: 8px;
font-weight: 600;
color: var(--text-primary);
}
.form-control {
width: 100%;
padding: 12px;
border: 1px solid var(--border-color);
border-radius: 8px;
font-size: 14px;
transition: border-color 0.3s;
}
.form-control:focus {
outline: none;
border-color: var(--primary-color);
}
.form-row {
display: flex;
gap: 20px;
margin-bottom: 20px;
}
.form-col {
flex: 1;
}
.checkbox-group {
display: flex;
flex-wrap: wrap;
gap: 15px;
margin-top: 10px;
}
.checkbox-label {
display: flex;
align-items: center;
cursor: pointer;
}
.checkbox-label input {
margin-right: 8px;
}
/* 任务管理 */
.task-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(350px, 1fr));
gap: 20px;
margin-top: 20px;
}
.task-card {
background: var(--card-bg);
border-radius: 12px;
padding: 20px;
border: 1px solid var(--border-color);
transition: all 0.3s;
}
.task-card:hover {
transform: translateY(-3px);
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1);
}
.task-card-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 15px;
padding-bottom: 15px;
border-bottom: 1px solid var(--border-color);
}
.task-card-title {
font-size: 16px;
font-weight: 600;
color: var(--primary-color);
}
.task-card-status {
padding: 4px 10px;
border-radius: 20px;
font-size: 12px;
font-weight: 600;
}
.task-card-body {
color: var(--text-secondary);
font-size: 14px;
margin-bottom: 15px;
}
.task-card-footer {
display: flex;
justify-content: space-between;
align-items: center;
margin-top: 15px;
}
.task-card-actions {
display: flex;
gap: 10px;
}
/* 数据表格 */
.data-table {
width: 100%;
border-collapse: collapse;
margin-top: 20px;
}
.data-table th {
background: var(--bg-color);
padding: 15px;
text-align: left;
font-weight: 600;
color: var(--text-secondary);
border-bottom: 2px solid var(--border-color);
}
.data-table td {
padding: 15px;
border-bottom: 1px solid var(--border-color);
}
.data-table tr:hover {
background: var(--bg-color);
}
/* 响应式 */
@media (max-width: 1200px) {
.sidebar {
width: 220px;
}
.main-content {
margin-left: 220px;
}
.form-row {
flex-direction: column;
}
.task-grid {
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
}
}
@media (max-width: 768px) {
.sidebar {
width: 70px;
padding: 20px 0;
}
.sidebar .logo h1,
.sidebar .logo span,
.sidebar .nav-item span:not(.nav-badge) {
display: none;
}
.sidebar .nav-item {
justify-content: center;
padding: 15px;
}
.sidebar .nav-item i {
margin-right: 0;
font-size: 18px;
}
.main-content {
margin-left: 70px;
padding: 15px;
}
.batch-controls {
flex-direction: column;
gap: 15px;
align-items: stretch;
}
.batch-actions {
flex-wrap: wrap;
}
.task-grid {
grid-template-columns: 1fr;
}
.data-table {
font-size: 14px;
}
.data-table th,
.data-table td {
padding: 10px;
}
}
/* 动画 */
@keyframes pulse {
0% { opacity: 1; }
50% { opacity: 0.5; }
100% { opacity: 1; }
}
.pulse {
animation: pulse 2s infinite;
}
/* 侧边栏状态 */
.sidebar-status {
padding: 20px;
margin-top: auto;
}
.system-status {
display: flex;
align-items: center;
gap: 8px;
margin-bottom: 10px;
}
/* 筛选条件标签 */
.filter-tags {
display: flex;
flex-wrap: wrap;
gap: 10px;
margin-top: 20px;
}
.filter-tag {
background: var(--bg-color);
padding: 8px 15px;
border-radius: 20px;
font-size: 14px;
display: flex;
align-items: center;
gap: 8px;
}
.filter-tag i {
cursor: pointer;
color: var(--danger-color);
}
/* 话术卡片 */
.script-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
gap: 20px;
margin-top: 20px;
}
.script-card {
background: var(--card-bg);
border-radius: 12px;
padding: 20px;
border: 1px solid var(--border-color);
}
.script-card-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 15px;
padding-bottom: 15px;
border-bottom: 1px solid var(--border-color);
}
.script-card-title {
font-weight: 600;
color: var(--primary-color);
}
.script-card-body {
color: var(--text-secondary);
line-height: 1.6;
margin-bottom: 15px;
}
/* 图表容器 */
.chart-container {
height: 300px;
margin-top: 20px;
}
.chart-placeholder {
background: linear-gradient(135deg, #f8fafc, #e2e8f0);
border-radius: 8px;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
color: var(--text-secondary);
font-size: 18px;
}
/* 设置项 */
.settings-group {
margin-bottom: 30px;
}
.settings-item {
display: flex;
justify-content: space-between;
align-items: center;
padding: 15px 0;
border-bottom: 1px solid var(--border-color);
}
.settings-label {
font-weight: 600;
color: var(--text-primary);
}
.settings-description {
color: var(--text-secondary);
font-size: 14px;
margin-top: 5px;
}
/* 开关按钮 */
.switch {
position: relative;
display: inline-block;
width: 50px;
height: 24px;
}
.switch input {
opacity: 0;
width: 0;
height: 0;
}
.slider {
position: absolute;
cursor: pointer;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: #ccc;
transition: .4s;
border-radius: 34px;
}
.slider:before {
position: absolute;
content: "";
height: 16px;
width: 16px;
left: 4px;
bottom: 4px;
background-color: white;
transition: .4s;
border-radius: 50%;
}
input:checked + .slider {
background-color: var(--success-color);
}
input:checked + .slider:before {
transform: translateX(26px);
}
</style>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
</head>
<body>
<div class="app-container">
<!-- 侧边栏 -->
<div class="sidebar">
<div class="logo">
<h1>Boss助手</h1>
<span>专业自动化系统</span>
</div>
<div class="nav-menu">
<div class="nav-item active" data-page="dashboard">
<i class="fas fa-tachometer-alt"></i>
<span>控制面板</span>
</div>
<div class="nav-item" data-page="accounts">
<i class="fas fa-user-circle"></i>
<span>账号管理</span>
<span class="nav-badge" id="accountCount">5</span>
</div>
<div class="nav-item" data-page="filters">
<i class="fas fa-filter"></i>
<span>筛选设置</span>
</div>
<div class="nav-item" data-page="tasks">
<i class="fas fa-tasks"></i>
<span>任务管理</span>
<span class="nav-badge" id="taskCount">8</span>
</div>
<div class="nav-item" data-page="rechat">
<i class="fas fa-comments"></i>
<span>复聊管理</span>
</div>
<div class="nav-item" data-page="data">
<i class="fas fa-database"></i>
<span>数据管理</span>
</div>
<div class="nav-item" data-page="analytics">
<i class="fas fa-chart-bar"></i>
<span>统计分析</span>
</div>
<div class="nav-item" data-page="settings">
<i class="fas fa-cog"></i>
<span>系统设置</span>
</div>
</div>
<div class="sidebar-status">
<div class="system-status">
<div class="status-dot status-online pulse"></div>
<span>系统就绪</span>
</div>
<small style="opacity: 0.7; display: block;">v2.1.0</small>
</div>
</div>
<!-- 主内容区 -->
<div class="main-content" id="mainContent">
<!-- 控制面板页面 -->
<div class="page active" id="dashboard">
<div class="header">
<h2>控制面板</h2>
<div class="header-controls">
<div class="btn btn-secondary" id="refreshData">
<i class="fas fa-sync-alt"></i>
刷新数据
</div>
<div class="btn btn-primary" id="addAccountBtn">
<i class="fas fa-plus"></i>
添加账号
</div>
</div>
</div>
<!-- 数据统计 -->
<div class="stats-grid">
<div class="stat-card">
<div class="stat-header">
<div>
<div class="stat-value" id="totalContacts">3,248</div>
<div class="stat-label">累计联系</div>
</div>
<div class="stat-icon icon-blue">
<i class="fas fa-handshake"></i>
</div>
</div>
<div style="font-size: 13px; color: var(--text-secondary);">
今日: <span id="todayContacts">142</span>
</div>
</div>
<div class="stat-card">
<div class="stat-header">
<div>
<div class="stat-value" id="totalReplies">487</div>
<div class="stat-label">收到回复</div>
</div>
<div class="stat-icon icon-green">
<i class="fas fa-comment-dots"></i>
</div>
</div>
<div style="font-size: 13px; color: var(--text-secondary);">
回复率: <span id="replyRate">15.0%</span>
</div>
</div>
<div class="stat-card">
<div class="stat-header">
<div>
<div class="stat-value" id="totalWechat">216</div>
<div class="stat-label">微信交换</div>
</div>
<div class="stat-icon icon-orange">
<i class="fas fa-weixin"></i>
</div>
</div>
<div style="font-size: 13px; color: var(--text-secondary);">
成功率: <span id="wechatRate">44.4%</span>
</div>
</div>
<div class="stat-card">
<div class="stat-header">
<div>
<div class="stat-value" id="totalCollections">89</div>
<div class="stat-label">收藏人数</div>
</div>
<div class="stat-icon icon-purple">
<i class="fas fa-star"></i>
</div>
</div>
<div style="font-size: 13px; color: var(--text-secondary);">
今日新增: <span id="todayCollections">12</span>
</div>
</div>
</div>
<!-- 账号选择和控制 -->
<div class="account-control-area">
<div class="card">
<div class="card-header">
<h3>账号选择与运行控制</h3>
<div class="batch-info">
<span id="selectedCount">已选择 2 个账号</span>
<button class="btn btn-secondary" id="selectAll">
<i class="fas fa-check-square"></i>
全选
</button>
<button class="btn btn-secondary" id="clearSelection">
<i class="fas fa-times"></i>
清空选择
</button>
</div>
</div>
<!-- 账号表格(水平排列) -->
<div class="account-table-container">
<table class="account-table" id="accountTable">
<thead>
<tr>
<th style="width: 50px;">
<div class="table-checkbox" id="selectAllCheckbox"></div>
</th>
<th>账号名称</th>
<th>Boss账号</th>
<th>线程数</th>
<th>今日联系</th>
<th>微信交换</th>
<th>状态</th>
<th>操作</th>
</tr>
</thead>
<tbody id="accountTableBody">
<!-- 账号行会动态生成 -->
</tbody>
</table>
</div>
<!-- 批量操作栏 -->
<div class="batch-controls">
<div class="batch-info">
<span id="selectedAccountsInfo">已选择 2 个账号</span>
<span id="selectedStatusInfo">状态: 2运行中 0已暂停 0已停止</span>
</div>
<div class="batch-actions">
<button class="btn btn-success" id="startSelected">
<i class="fas fa-play"></i>
启动选中账号
</button>
<button class="btn btn-warning" id="pauseSelected">
<i class="fas fa-pause"></i>
暂停选中账号
</button>
<button class="btn btn-danger" id="stopSelected">
<i class="fas fa-stop"></i>
停止选中账号
</button>
<button class="btn btn-primary" id="startAllAccounts">
<i class="fas fa-rocket"></i>
启动全部账号
</button>
</div>
</div>
</div>
</div>
<!-- 运行日志 -->
<div class="running-logs">
<div class="card">
<div class="card-header">
<h3>实时运行日志</h3>
<div>
<button class="btn btn-secondary" id="clearLogs">
<i class="fas fa-trash-alt"></i>
清空日志
</button>
<button class="btn btn-secondary" id="pauseLogs">
<i class="fas fa-pause"></i>
暂停更新
</button>
</div>
</div>
<div class="log-container" id="realtimeLogs">
<div class="log-entry">
<span class="log-time">14:25:32</span>
<span class="log-info">[INFO]</span>
系统初始化完成,准备开始运行
</div>
<div class="log-entry">
<span class="log-time">14:25:45</span>
<span class="log-success">[SUCCESS]</span>
成功启动3个自动化线程
</div>
<div class="log-entry">
<span class="log-time">14:26:10</span>
<span class="log-info">[INFO]</span>
开始执行筛选年龄22-35学历本科3天内活跃
</div>
<div class="log-entry">
<span class="log-time">14:26:35</span>
<span class="log-success">[SUCCESS]</span>
账号"张三的账号"成功发送5条招呼
</div>
<div class="log-entry">
<span class="log-time">14:27:05</span>
<span class="log-info">[INFO]</span>
检测到2条新回复消息
</div>
<div class="log-entry">
<span class="log-time">14:27:30</span>
<span class="log-success">[SUCCESS]</span>
成功与候选人交换微信
</div>
</div>
</div>
</div>
<!-- 快速操作 -->
<div class="card">
<div class="card-header">
<h3>快速操作</h3>
</div>
<div style="display: flex; gap: 15px; flex-wrap: wrap;">
<button class="btn btn-secondary" onclick="quickAction('export')">
<i class="fas fa-download"></i>
导出今日数据
</button>
<button class="btn btn-secondary" onclick="quickAction('pauseAll')">
<i class="fas fa-pause-circle"></i>
暂停所有任务
</button>
<button class="btn btn-secondary" onclick="quickAction('checkUpdate')">
<i class="fas fa-sync"></i>
检查更新
</button>
<button class="btn btn-secondary" onclick="quickAction('backup')">
<i class="fas fa-database"></i>
立即备份
</button>
<button class="btn btn-secondary" onclick="quickAction('report')">
<i class="fas fa-chart-pie"></i>
生成日报
</button>
</div>
</div>
</div>
<!-- 账号管理页面 -->
<div class="page" id="accounts">
<div class="header">
<h2>账号管理</h2>
<div class="header-controls">
<button class="btn btn-primary" id="addNewAccount">
<i class="fas fa-plus"></i>
添加账号
</button>
</div>
</div>
<div class="card">
<div class="card-header">
<h3>账号列表</h3>
<div class="header-controls">
<button class="btn btn-secondary" id="exportAccounts">
<i class="fas fa-download"></i>
导出账号
</button>
</div>
</div>
<div class="account-table-container">
<table class="account-table">
<thead>
<tr>
<th>账号名称</th>
<th>Boss账号</th>
<th>密码</th>
<th>线程数</th>
<th>每日上限</th>
<th>状态</th>
<th>操作</th>
</tr>
</thead>
<tbody id="accountsTableBody">
<!-- 账号行会动态生成 -->
</tbody>
</table>
</div>
</div>
<div class="card" id="addAccountForm" style="display: none;">
<div class="card-header">
<h3>添加新账号</h3>
</div>
<div class="form-row">
<div class="form-col">
<div class="form-group">
<label class="form-label">账号名称</label>
<input type="text" class="form-control" id="accountName" placeholder="例如:张三的账号">
</div>
</div>
<div class="form-col">
<div class="form-group">
<label class="form-label">Boss账号</label>
<input type="text" class="form-control" id="bossAccount" placeholder="手机号码">
</div>
</div>
</div>
<div class="form-row">
<div class="form-col">
<div class="form-group">
<label class="form-label">密码</label>
<input type="password" class="form-control" id="accountPassword" placeholder="Boss账号密码">
</div>
</div>
<div class="form-col">
<div class="form-group">
<label class="form-label">确认密码</label>
<input type="password" class="form-control" id="confirmPassword" placeholder="再次输入密码">
</div>
</div>
</div>
<div class="form-row">
<div class="form-col">
<div class="form-group">
<label class="form-label">线程数</label>
<input type="number" class="form-control" id="threadCount" min="1" max="10" value="3">
</div>
</div>
<div class="form-col">
<div class="form-group">
<label class="form-label">每日联系上限</label>
<input type="number" class="form-control" id="dailyLimit" min="10" max="500" value="150">
</div>
</div>
</div>
<div class="form-group">
<label class="form-label">备注信息</label>
<textarea class="form-control" id="accountNotes" rows="3" placeholder="账号备注信息"></textarea>
</div>
<div style="display: flex; gap: 15px; justify-content: flex-end;">
<button class="btn btn-secondary" id="cancelAddAccount">
<i class="fas fa-times"></i>
取消
</button>
<button class="btn btn-primary" id="saveAccount">
<i class="fas fa-save"></i>
保存账号
</button>
</div>
</div>
</div>
<!-- 筛选设置页面 -->
<div class="page" id="filters">
<div class="header">
<h2>筛选设置</h2>
<div class="header-controls">
<button class="btn btn-primary" id="saveFilters">
<i class="fas fa-save"></i>
保存设置
</button>
</div>
</div>
<div class="card">
<div class="card-header">
<h3>基础筛选条件</h3>
</div>
<div class="form-row">
<div class="form-col">
<div class="form-group">
<label class="form-label">年龄范围</label>
<div style="display: flex; align-items: center; gap: 10px;">
<input type="number" class="form-control" id="minAge" min="18" max="60" placeholder="最小" value="22">
<span></span>
<input type="number" class="form-control" id="maxAge" min="18" max="60" placeholder="最大" value="35">
</div>
</div>
</div>
<div class="form-col">
<div class="form-group">
<label class="form-label">性别</label>
<div class="checkbox-group">
<label class="checkbox-label">
<input type="checkbox" id="genderMale" checked>
</label>
<label class="checkbox-label">
<input type="checkbox" id="genderFemale" checked>
</label>
<label class="checkbox-label">
<input type="checkbox" id="genderOther"> 不限
</label>
</div>
</div>
</div>
</div>
<div class="form-row">
<div class="form-col">
<div class="form-group">
<label class="form-label">学历要求</label>
<select class="form-control" id="educationLevel">
<option value="不限">不限</option>
<option value="大专">大专</option>
<option value="本科" selected>本科</option>
<option value="硕士">硕士</option>
<option value="博士">博士</option>
</select>
</div>
</div>
<div class="form-col">
<div class="form-group">
<label class="form-label">活跃度</label>
<select class="form-control" id="activityLevel">
<option value="不限">不限</option>
<option value="3天内活跃" selected>3天内活跃</option>
<option value="1周内活跃">1周内活跃</option>
<option value="2周内活跃">2周内活跃</option>
<option value="1月内活跃">1月内活跃</option>
</select>
</div>
</div>
</div>
<div class="form-group">
<label class="form-label">期望岗位</label>
<div class="checkbox-group">
<label class="checkbox-label">
<input type="checkbox" id="positionJava" checked> Java开发
</label>
<label class="checkbox-label">
<input type="checkbox" id="positionFrontend" checked> 前端开发
</label>
<label class="checkbox-label">
<input type="checkbox" id="positionBackend"> 后端开发
</label>
<label class="checkbox-label">
<input type="checkbox" id="positionTest"> 软件测试
</label>
<label class="checkbox-label">
<input type="checkbox" id="positionProduct"> 产品经理
</label>
<label class="checkbox-label">
<input type="checkbox" id="positionUI"> UI设计
</label>
</div>
</div>
</div>
<div class="card">
<div class="card-header">
<h3>高级设置</h3>
</div>
<div class="form-row">
<div class="form-col">
<div class="form-group">
<label class="form-label">打招呼数量</label>
<div style="display: flex; align-items: center; gap: 10px;">
<input type="number" class="form-control" id="minMessages" min="1" max="50" placeholder="最少" value="5">
<span></span>
<input type="number" class="form-control" id="maxMessages" min="1" max="50" placeholder="最多" value="20">
<span>条/天</span>
</div>
</div>
</div>
<div class="form-col">
<div class="form-group">
<label class="form-label">休息时间</label>
<div style="display: flex; align-items: center; gap: 10px;">
<input type="number" class="form-control" id="restMinutes" min="1" max="120" placeholder="分钟" value="30">
<span>分钟(每轮间隔)</span>
</div>
</div>
</div>
</div>
<div class="form-row">
<div class="form-col">
<div class="form-group">
<label class="form-label">收藏数量</label>
<div style="display: flex; align-items: center; gap: 10px;">
<input type="number" class="form-control" id="minCollections" min="0" max="100" placeholder="最少" value="10">
<span></span>
<input type="number" class="form-control" id="maxCollections" min="0" max="100" placeholder="最多" value="50">
<span>个/天</span>
</div>
</div>
</div>
<div class="form-col">
<div class="form-group">
<label class="form-label">打招呼间隔</label>
<div style="display: flex; align-items: center; gap: 10px;">
<input type="number" class="form-control" id="messageInterval" min="5" max="300" placeholder="秒" value="30">
<span>秒/次</span>
</div>
</div>
</div>
</div>
<div class="form-group">
<label class="form-label">已保存的筛选条件</label>
<div class="filter-tags" id="filterTags">
<div class="filter-tag">
年龄22-35本科3天内活跃
<i class="fas fa-times" onclick="removeFilterTag(this)"></i>
</div>
<div class="filter-tag">
Java/前端开发,活跃用户
<i class="fas fa-times" onclick="removeFilterTag(this)"></i>
</div>
</div>
</div>
</div>
</div>
<!-- 任务管理页面 -->
<div class="page" id="tasks">
<div class="header">
<h2>任务管理</h2>
<div class="header-controls">
<button class="btn btn-primary" id="createNewTask">
<i class="fas fa-plus"></i>
创建任务
</button>
</div>
</div>
<div class="card">
<div class="card-header">
<h3>最近创建的任务</h3>
<div class="header-controls">
<select class="form-control" id="taskFilter" style="width: 200px;">
<option value="all">全部任务</option>
<option value="running">运行中</option>
<option value="paused">已暂停</option>
<option value="stopped">已停止</option>
</select>
</div>
</div>
<div class="task-grid" id="taskGrid">
<!-- 任务卡片会动态生成 -->
</div>
</div>
<div class="card">
<div class="card-header">
<h3>运行任务选择</h3>
</div>
<div class="form-group">
<label class="form-label">选择要运行的任务体系</label>
<div id="taskSelectionArea">
<!-- 任务选择选项会动态生成 -->
</div>
</div>
<div style="display: flex; gap: 15px; margin-top: 20px;">
<button class="btn btn-success" id="runSelectedTasks">
<i class="fas fa-play"></i>
运行选中任务
</button>
<button class="btn btn-secondary" id="selectAllTasks">
<i class="fas fa-check-square"></i>
全选
</button>
<button class="btn btn-secondary" id="clearTaskSelection">
<i class="fas fa-times"></i>
清空选择
</button>
</div>
</div>
<div class="card" id="taskForm" style="display: none;">
<div class="card-header">
<h3>创建新任务</h3>
</div>
<div class="form-row">
<div class="form-col">
<div class="form-group">
<label class="form-label">任务名称</label>
<input type="text" class="form-control" id="taskName" placeholder="例如:自动化打招呼任务">
</div>
</div>
<div class="form-col">
<div class="form-group">
<label class="form-label">任务类型</label>
<select class="form-control" id="taskType">
<option value="greeting">自动化打招呼</option>
<option value="rechat">复聊任务</option>
<option value="collection">收藏任务</option>
<option value="monitoring">监测消息</option>
</select>
</div>
</div>
</div>
<div class="form-row">
<div class="form-col">
<div class="form-group">
<label class="form-label">执行时间</label>
<input type="time" class="form-control" id="taskTime" value="09:00">
</div>
</div>
<div class="form-col">
<div class="form-group">
<label class="form-label">重复周期</label>
<select class="form-control" id="taskRepeat">
<option value="daily">每天</option>
<option value="weekdays">工作日</option>
<option value="weekly">每周</option>
<option value="monthly">每月</option>
<option value="once">仅一次</option>
</select>
</div>
</div>
</div>
<div class="form-group">
<label class="form-label">任务描述</label>
<textarea class="form-control" id="taskDescription" rows="3" placeholder="任务详细描述"></textarea>
</div>
<div class="form-group">
<label class="form-label">执行账号</label>
<div id="accountSelection" class="checkbox-group">
<!-- 账号选择会动态生成 -->
</div>
</div>
<div style="display: flex; gap: 15px; justify-content: flex-end;">
<button class="btn btn-secondary" id="cancelTask">
<i class="fas fa-times"></i>
取消
</button>
<button class="btn btn-primary" id="saveTask">
<i class="fas fa-save"></i>
创建任务
</button>
</div>
</div>
</div>
<!-- 复聊管理页面 -->
<div class="page" id="rechat">
<div class="header">
<h2>复聊管理</h2>
<div class="header-controls">
<button class="btn btn-primary" id="addScript">
<i class="fas fa-plus"></i>
添加话术
</button>
</div>
</div>
<div class="card">
<div class="card-header">
<h3>复聊策略配置</h3>
</div>
<div class="form-group">
<label class="form-label">复聊触发条件</label>
<div class="checkbox-group">
<label class="checkbox-label">
<input type="checkbox" id="triggerReply" checked> 对方回复消息
</label>
<label class="checkbox-label">
<input type="checkbox" id="triggerNoReply" checked> 24小时未回复
</label>
<label class="checkbox-label">
<input type="checkbox" id="triggerWechat"> 对方询问微信
</label>
<label class="checkbox-label">
<input type="checkbox" id="triggerInterest"> 对方表示感兴趣
</label>
</div>
</div>
<div class="form-group">
<label class="form-label">微信交换规则</label>
<div class="form-row">
<div class="form-col">
<label class="checkbox-label">
<input type="checkbox" id="ruleImmediate" checked> 立即交换
</label>
</div>
<div class="form-col">
<label class="checkbox-label">
<input type="checkbox" id="ruleDelay"> 延迟交换(沟通后)
</label>
</div>
<div class="form-col">
<label class="checkbox-label">
<input type="checkbox" id="ruleVerify"> 需验证身份
</label>
</div>
</div>
</div>
</div>
<div class="card">
<div class="card-header">
<h3>岗位对应话术</h3>
</div>
<div class="script-grid" id="scriptGrid">
<!-- 话术卡片会动态生成 -->
</div>
</div>
<div class="card" id="scriptForm" style="display: none;">
<div class="card-header">
<h3>添加/编辑话术</h3>
</div>
<div class="form-row">
<div class="form-col">
<div class="form-group">
<label class="form-label">岗位类型</label>
<select class="form-control" id="scriptPosition">
<option value="Java开发">Java开发</option>
<option value="前端开发">前端开发</option>
<option value="后端开发">后端开发</option>
<option value="软件测试">软件测试</option>
<option value="产品经理">产品经理</option>
<option value="UI设计">UI设计</option>
</select>
</div>
</div>
<div class="form-col">
<div class="form-group">
<label class="form-label">回复类型</label>
<select class="form-control" id="scriptType">
<option value="first">首次回复</option>
<option value="followup">跟进回复</option>
<option value="wechat">微信交换</option>
<option value="closing">结束语</option>
</select>
</div>
</div>
</div>
<div class="form-group">
<label class="form-label">回复内容</label>
<textarea class="form-control" id="scriptContent" rows="5" placeholder="请输入回复话术内容..."></textarea>
</div>
<div class="form-group">
<label class="form-label">关键词触发</label>
<input type="text" class="form-control" id="scriptKeywords" placeholder="用逗号分隔关键词,例如:薪资,经验,微信">
</div>
<div style="display: flex; gap: 15px; justify-content: flex-end;">
<button class="btn btn-secondary" id="cancelScript">
<i class="fas fa-times"></i>
取消
</button>
<button class="btn btn-primary" id="saveScript">
<i class="fas fa-save"></i>
保存话术
</button>
</div>
</div>
</div>
<!-- 数据管理页面 -->
<div class="page" id="data">
<div class="header">
<h2>数据管理</h2>
<div class="header-controls">
<button class="btn btn-primary" id="exportData">
<i class="fas fa-download"></i>
导出数据
</button>
<button class="btn btn-secondary" id="refreshData">
<i class="fas fa-sync-alt"></i>
刷新数据
</button>
</div>
</div>
<div class="card">
<div class="card-header">
<h3>用户信息记录</h3>
<div class="header-controls">
<input type="text" class="form-control" id="dataSearch" placeholder="搜索用户..." style="width: 200px;">
</div>
</div>
<div class="account-table-container">
<table class="data-table" id="dataTable">
<thead>
<tr>
<th>用户ID</th>
<th>姓名</th>
<th>岗位</th>
<th>联系方式</th>
<th>联系时间</th>
<th>回复状态</th>
<th>微信交换</th>
<th>操作</th>
</tr>
</thead>
<tbody id="dataTableBody">
<!-- 数据行会动态生成 -->
</tbody>
</table>
</div>
<div style="display: flex; justify-content: space-between; align-items: center; margin-top: 20px;">
<div>
显示 <span id="dataStart">1</span> - <span id="dataEnd">10</span> 条,共 <span id="dataTotal">50</span>
</div>
<div style="display: flex; gap: 10px;">
<button class="btn btn-secondary btn-sm" id="prevPage">
<i class="fas fa-chevron-left"></i>
</button>
<button class="btn btn-secondary btn-sm" id="nextPage">
<i class="fas fa-chevron-right"></i>
</button>
</div>
</div>
</div>
<div class="card">
<div class="card-header">
<h3>数据导出选项</h3>
</div>
<div class="form-row">
<div class="form-col">
<div class="form-group">
<label class="form-label">导出格式</label>
<select class="form-control" id="exportFormat">
<option value="excel">Excel文件 (.xlsx)</option>
<option value="csv">CSV文件 (.csv)</option>
<option value="pdf">PDF文件 (.pdf)</option>
</select>
</div>
</div>
<div class="form-col">
<div class="form-group">
<label class="form-label">数据范围</label>
<select class="form-control" id="exportRange">
<option value="all">全部数据</option>
<option value="today">今天</option>
<option value="week">本周</option>
<option value="month">本月</option>
</select>
</div>
</div>
</div>
<div class="form-group">
<label class="form-label">导出字段</label>
<div class="checkbox-group">
<label class="checkbox-label">
<input type="checkbox" id="fieldName" checked> 姓名
</label>
<label class="checkbox-label">
<input type="checkbox" id="fieldPosition" checked> 岗位
</label>
<label class="checkbox-label">
<input type="checkbox" id="fieldContact" checked> 联系方式
</label>
<label class="checkbox-label">
<input type="checkbox" id="fieldTime" checked> 联系时间
</label>
<label class="checkbox-label">
<input type="checkbox" id="fieldReply" checked> 回复状态
</label>
<label class="checkbox-label">
<input type="checkbox" id="fieldWechat" checked> 微信交换
</label>
<label class="checkbox-label">
<input type="checkbox" id="fieldNotes"> 备注
</label>
</div>
</div>
<div style="text-align: right;">
<button class="btn btn-success" id="confirmExport">
<i class="fas fa-file-export"></i>
开始导出
</button>
</div>
</div>
</div>
<!-- 统计分析页面 -->
<div class="page" id="analytics">
<div class="header">
<h2>统计分析</h2>
<div class="header-controls">
<select class="form-control" id="analyticsPeriod" style="width: 150px;">
<option value="today">今天</option>
<option value="week" selected>本周</option>
<option value="month">本月</option>
<option value="quarter">本季度</option>
<option value="year">本年</option>
</select>
</div>
</div>
<div class="stats-grid">
<div class="stat-card">
<div class="stat-header">
<div>
<div class="stat-value" id="analyticsContacts">3,248</div>
<div class="stat-label">累计联系</div>
</div>
<div class="stat-icon icon-blue">
<i class="fas fa-handshake"></i>
</div>
</div>
<div style="font-size: 13px; color: var(--text-secondary);">
日均: <span id="dailyContacts">142</span>
</div>
</div>
<div class="stat-card">
<div class="stat-header">
<div>
<div class="stat-value" id="analyticsReplies">487</div>
<div class="stat-label">收到回复</div>
</div>
<div class="stat-icon icon-green">
<i class="fas fa-comment-dots"></i>
</div>
</div>
<div style="font-size: 13px; color: var(--text-secondary);">
回复率: <span id="analyticsReplyRate">15.0%</span>
</div>
</div>
<div class="stat-card">
<div class="stat-header">
<div>
<div class="stat-value" id="analyticsWechat">216</div>
<div class="stat-label">微信交换</div>
</div>
<div class="stat-icon icon-orange">
<i class="fas fa-weixin"></i>
</div>
</div>
<div style="font-size: 13px; color: var(--text-secondary);">
成功率: <span id="analyticsWechatRate">44.4%</span>
</div>
</div>
<div class="stat-card">
<div class="stat-header">
<div>
<div class="stat-value" id="analyticsEfficiency">78%</div>
<div class="stat-label">系统效率</div>
</div>
<div class="stat-icon icon-purple">
<i class="fas fa-chart-line"></i>
</div>
</div>
<div style="font-size: 13px; color: var(--text-secondary);">
较上周: <span style="color: #10b981;">↑12%</span>
</div>
</div>
</div>
<div class="card">
<div class="card-header">
<h3>联系趋势分析</h3>
<div class="header-controls">
<select class="form-control" id="chartType" style="width: 150px;">
<option value="line">折线图</option>
<option value="bar">柱状图</option>
<option value="pie">饼图</option>
</select>
</div>
</div>
<div class="chart-container">
<div class="chart-placeholder">
<i class="fas fa-chart-bar" style="font-size: 48px; margin-right: 15px;"></i>
<div>
<div>联系趋势图表</div>
<small style="font-size: 14px;">显示每日联系人数和回复率变化</small>
</div>
</div>
</div>
</div>
<div class="card">
<div class="card-header">
<h3>成功率统计</h3>
</div>
<div class="chart-container">
<div class="chart-placeholder">
<i class="fas fa-chart-pie" style="font-size: 48px; margin-right: 15px;"></i>
<div>
<div>成功率分布图表</div>
<small style="font-size: 14px;">按岗位、年龄、学历等维度分析</small>
</div>
</div>
</div>
</div>
<div class="card">
<div class="card-header">
<h3>详细分析报告</h3>
<div class="header-controls">
<button class="btn btn-primary" id="generateReport">
<i class="fas fa-file-pdf"></i>
生成报告
</button>
</div>
</div>
<div class="form-group">
<div style="background: var(--bg-color); padding: 20px; border-radius: 8px; margin-top: 10px;">
<h4 style="margin-bottom: 15px;">本周数据分析</h4>
<ul style="color: var(--text-secondary); line-height: 1.8;">
<li>联系总人数:<strong>3,248</strong>人,较上周增长<strong style="color: #10b981;">15%</strong></li>
<li>平均回复率:<strong>15.0%</strong>,最佳账号回复率达<strong>22.5%</strong></li>
<li>微信交换成功率:<strong>44.4%</strong>,较上周提升<strong style="color: #10b981;">8%</strong></li>
<li>最活跃时间段:上午<strong>9:00-11:00</strong>,下午<strong>14:00-16:00</strong></li>
<li>最有效岗位:<strong>Java开发</strong>回复率18.2%)、<strong>前端开发</strong>回复率16.8%</li>
</ul>
</div>
</div>
</div>
</div>
<!-- 系统设置页面 -->
<div class="page" id="settings">
<div class="header">
<h2>系统设置</h2>
<div class="header-controls">
<button class="btn btn-primary" id="saveSettings">
<i class="fas fa-save"></i>
保存设置
</button>
</div>
</div>
<div class="card">
<div class="settings-group">
<h3 style="margin-bottom: 20px;">基本设置</h3>
<div class="settings-item">
<div>
<div class="settings-label">系统自动更新</div>
<div class="settings-description">自动下载并安装系统更新</div>
</div>
<label class="switch">
<input type="checkbox" id="autoUpdate" checked>
<span class="slider"></span>
</label>
</div>
<div class="settings-item">
<div>
<div class="settings-label">自动备份数据</div>
<div class="settings-description">每天自动备份用户数据到本地</div>
</div>
<label class="switch">
<input type="checkbox" id="autoBackup" checked>
<span class="slider"></span>
</label>
</div>
<div class="settings-item">
<div>
<div class="settings-label">系统通知</div>
<div class="settings-description">接收系统运行状态和异常通知</div>
</div>
<label class="switch">
<input type="checkbox" id="systemNotifications" checked>
<span class="slider"></span>
</label>
</div>
</div>
<div class="settings-group">
<h3 style="margin-bottom: 20px;">安全设置</h3>
<div class="settings-item">
<div>
<div class="settings-label">登录验证</div>
<div class="settings-description">启用双重验证增强账户安全</div>
</div>
<label class="switch">
<input type="checkbox" id="twoFactorAuth">
<span class="slider"></span>
</label>
</div>
<div class="settings-item">
<div>
<div class="settings-label">操作日志</div>
<div class="settings-description">记录所有关键操作日志</div>
</div>
<label class="switch">
<input type="checkbox" id="operationLogs" checked>
<span class="slider"></span>
</label>
</div>
<div class="settings-item">
<div>
<div class="settings-label">数据加密</div>
<div class="settings-description">加密存储敏感用户数据</div>
</div>
<label class="switch">
<input type="checkbox" id="dataEncryption" checked>
<span class="slider"></span>
</label>
</div>
</div>
<div class="settings-group">
<h3 style="margin-bottom: 20px;">性能设置</h3>
<div class="form-group">
<label class="form-label">最大并发线程数</label>
<input type="range" class="form-control" id="maxThreads" min="1" max="50" value="20" style="width: 100%;">
<div style="display: flex; justify-content: space-between; margin-top: 5px;">
<span>1线程</span>
<span id="threadValue">20线程</span>
<span>50线程</span>
</div>
</div>
<div class="form-group">
<label class="form-label">数据缓存时间</label>
<select class="form-control" id="cacheTime">
<option value="5">5分钟</option>
<option value="15">15分钟</option>
<option value="30" selected>30分钟</option>
<option value="60">1小时</option>
<option value="120">2小时</option>
</select>
</div>
</div>
<div class="settings-group">
<h3 style="margin-bottom: 20px;">通知设置</h3>
<div class="settings-item">
<div>
<div class="settings-label">微信交换通知</div>
<div class="settings-description">成功交换微信时发送通知</div>
</div>
<label class="switch">
<input type="checkbox" id="wechatNotification" checked>
<span class="slider"></span>
</label>
</div>
<div class="settings-item">
<div>
<div class="settings-label">异常报警通知</div>
<div class="settings-description">系统运行异常时发送报警</div>
</div>
<label class="switch">
<input type="checkbox" id="errorNotification" checked>
<span class="slider"></span>
</label>
</div>
<div class="settings-item">
<div>
<div class="settings-label">日报生成通知</div>
<div class="settings-description">每天生成运行报告并通知</div>
</div>
<label class="switch">
<input type="checkbox" id="dailyReport" checked>
<span class="slider"></span>
</label>
</div>
</div>
</div>
<div class="card">
<div class="card-header">
<h3>数据库管理</h3>
</div>
<div class="form-row">
<div class="form-col">
<div class="form-group">
<label class="form-label">数据库类型</label>
<select class="form-control" id="dbType">
<option value="mysql">MySQL</option>
<option value="sqlite" selected>SQLite</option>
<option value="postgresql">PostgreSQL</option>
</select>
</div>
</div>
<div class="form-col">
<div class="form-group">
<label class="form-label">连接地址</label>
<input type="text" class="form-control" id="dbHost" value="localhost">
</div>
</div>
</div>
<div class="form-row">
<div class="form-col">
<div class="form-group">
<label class="form-label">数据库名称</label>
<input type="text" class="form-control" id="dbName" value="boss_assistant">
</div>
</div>
<div class="form-col">
<div class="form-group">
<label class="form-label">用户名</label>
<input type="text" class="form-control" id="dbUser" value="admin">
</div>
</div>
</div>
<div class="form-group">
<label class="form-label">密码</label>
<input type="password" class="form-control" id="dbPassword" placeholder="数据库密码">
</div>
<div style="display: flex; gap: 15px; justify-content: flex-end;">
<button class="btn btn-secondary" id="testDbConnection">
<i class="fas fa-plug"></i>
测试连接
</button>
<button class="btn btn-primary" id="saveDbSettings">
<i class="fas fa-database"></i>
保存数据库设置
</button>
</div>
</div>
<div class="card">
<div class="card-header">
<h3>系统信息</h3>
</div>
<div class="form-row">
<div class="form-col">
<div class="form-group">
<label class="form-label">系统版本</label>
<input type="text" class="form-control" value="v2.1.0" readonly>
</div>
</div>
<div class="form-col">
<div class="form-group">
<label class="form-label">最后更新</label>
<input type="text" class="form-control" value="2023-10-15" readonly>
</div>
</div>
</div>
<div class="form-group">
<label class="form-label">运行状态</label>
<div style="display: flex; align-items: center; gap: 10px; margin-top: 10px;">
<div class="status-dot status-online pulse"></div>
<span>系统运行正常</span>
</div>
</div>
<div style="text-align: center; margin-top: 20px;">
<button class="btn btn-danger" id="systemRestart">
<i class="fas fa-redo"></i>
重启系统
</button>
<button class="btn btn-secondary" id="clearCache">
<i class="fas fa-broom"></i>
清除缓存
</button>
</div>
</div>
</div>
</div>
</div>
<script>
// 系统数据
let systemData = {
accounts: [
{
id: 1,
name: "张三的账号",
bossAccount: "138****1234",
threads: 3,
status: "running",
todayContacts: 78,
dailyLimit: 150,
wechatExchanged: 5,
selected: true
},
{
id: 2,
name: "李四的账号",
bossAccount: "139****5678",
threads: 2,
status: "paused",
todayContacts: 45,
dailyLimit: 100,
wechatExchanged: 3,
selected: false
},
{
id: 3,
name: "王五的账号",
bossAccount: "136****9012",
threads: 4,
status: "stopped",
todayContacts: 19,
dailyLimit: 200,
wechatExchanged: 1,
selected: true
},
{
id: 4,
name: "赵六的账号",
bossAccount: "137****3456",
threads: 3,
status: "running",
todayContacts: 56,
dailyLimit: 120,
wechatExchanged: 4,
selected: false
},
{
id: 5,
name: "孙七的账号",
bossAccount: "135****7890",
threads: 2,
status: "stopped",
todayContacts: 0,
dailyLimit: 80,
wechatExchanged: 0,
selected: false
}
],
tasks: [
{
id: 1,
name: "自动化打招呼任务",
type: "greeting",
status: "running",
description: "每天上午9点开始自动打招呼",
time: "09:00",
repeat: "daily",
accounts: [1, 2]
},
{
id: 2,
name: "复聊任务",
type: "rechat",
status: "paused",
description: "对未回复的用户进行复聊",
time: "14:00",
repeat: "daily",
accounts: [1, 3]
},
{
id: 3,
name: "收藏任务",
type: "collection",
status: "running",
description: "收藏有潜力的候选人",
time: "11:00",
repeat: "daily",
accounts: [2]
},
{
id: 4,
name: "监测消息任务",
type: "monitoring",
status: "stopped",
description: "监测候选人回复消息",
time: "全天",
repeat: "daily",
accounts: [1, 2, 3]
},
{
id: 5,
name: "周末打招呼任务",
type: "greeting",
status: "running",
description: "周末特别打招呼任务",
time: "10:00",
repeat: "weekly",
accounts: [4]
}
],
scripts: [
{
id: 1,
position: "Java开发",
type: "first",
content: "您好看到您的Java开发经验很丰富我们公司正在招聘高级Java开发薪资30-50K有兴趣了解一下吗",
keywords: "Java,经验,薪资"
},
{
id: 2,
position: "前端开发",
type: "first",
content: "您好我们公司正在招聘资深前端开发要求React/Vue经验薪资范围25-40K福利待遇优厚方便聊聊吗",
keywords: "前端,React,Vue,薪资"
},
{
id: 3,
position: "Java开发",
type: "wechat",
content: "感谢您的回复!我的微信号是 *******,添加后我们可以详细沟通岗位情况和面试安排。",
keywords: "微信,联系方式"
},
{
id: 4,
position: "软件测试",
type: "followup",
content: "您好,之前和您沟通的测试岗位还在招聘中,我们提供完善的培训和晋升空间,期待您的加入!",
keywords: "测试,培训,晋升"
}
],
userData: [
{
id: 1,
name: "张明",
position: "Java开发",
contact: "138****1111",
contactTime: "2023-10-15 09:30",
replyStatus: "已回复",
wechatExchanged: true
},
{
id: 2,
name: "李华",
position: "前端开发",
contact: "139****2222",
contactTime: "2023-10-15 10:15",
replyStatus: "未回复",
wechatExchanged: false
},
{
id: 3,
name: "王强",
position: "Java开发",
contact: "136****3333",
contactTime: "2023-10-15 11:20",
replyStatus: "已回复",
wechatExchanged: true
},
{
id: 4,
name: "赵敏",
position: "软件测试",
contact: "137****4444",
contactTime: "2023-10-15 14:05",
replyStatus: "已回复",
wechatExchanged: false
},
{
id: 5,
name: "孙伟",
position: "产品经理",
contact: "135****5555",
contactTime: "2023-10-15 15:40",
replyStatus: "未回复",
wechatExchanged: false
},
{
id: 6,
name: "周婷",
position: "UI设计",
contact: "134****6666",
contactTime: "2023-10-15 16:25",
replyStatus: "已回复",
wechatExchanged: true
},
{
id: 7,
name: "吴刚",
position: "后端开发",
contact: "133****7777",
contactTime: "2023-10-14 09:10",
replyStatus: "已回复",
wechatExchanged: true
},
{
id: 8,
name: "郑爽",
position: "前端开发",
contact: "132****8888",
contactTime: "2023-10-14 11:30",
replyStatus: "未回复",
wechatExchanged: false
},
{
id: 9,
name: "刘洋",
position: "Java开发",
contact: "131****9999",
contactTime: "2023-10-14 14:50",
replyStatus: "已回复",
wechatExchanged: true
},
{
id: 10,
name: "陈静",
position: "软件测试",
contact: "130****0000",
contactTime: "2023-10-14 16:15",
replyStatus: "已回复",
wechatExchanged: false
}
],
selectedAccountIds: [1, 3], // 默认选中两个账号
selectedTaskIds: [], // 选中的任务ID
logsPaused: false,
logSimulationInterval: null,
currentDataPage: 1,
dataPerPage: 10
};
// 页面切换功能
document.addEventListener('DOMContentLoaded', function() {
// 初始化所有页面数据
initDashboard();
initAccountsPage();
initFiltersPage();
initTasksPage();
initRechatPage();
initDataPage();
initAnalyticsPage();
initSettingsPage();
// 页面切换
document.querySelectorAll('.nav-item').forEach(item => {
item.addEventListener('click', function() {
const pageId = this.dataset.page;
// 更新导航状态
document.querySelectorAll('.nav-item').forEach(nav => nav.classList.remove('active'));
this.classList.add('active');
// 切换页面
document.querySelectorAll('.page').forEach(page => page.classList.remove('active'));
document.getElementById(pageId).classList.add('active');
// 更新标题
document.querySelector('.header h2').textContent = this.querySelector('span').textContent;
});
});
// 初始化控制面板日志
startLogSimulation();
});
// ========== 控制面板相关函数 ==========
function initDashboard() {
loadDashboardData();
// 刷新数据
document.getElementById('refreshData').addEventListener('click', refreshDashboardData);
// 添加账号
document.getElementById('addAccountBtn').addEventListener('click', function() {
addLog('点击添加账号按钮', 'info');
// 切换到账号管理页面
document.querySelectorAll('.nav-item').forEach(nav => nav.classList.remove('active'));
document.querySelector('.nav-item[data-page="accounts"]').classList.add('active');
document.querySelectorAll('.page').forEach(page => page.classList.remove('active'));
document.getElementById('accounts').classList.add('active');
document.querySelector('.header h2').textContent = '账号管理';
});
// 全选/取消全选
document.getElementById('selectAll').addEventListener('click', selectAllAccounts);
document.getElementById('clearSelection').addEventListener('click', clearSelection);
document.getElementById('selectAllCheckbox').addEventListener('click', toggleSelectAll);
// 批量操作
document.getElementById('startSelected').addEventListener('click', startSelectedAccounts);
document.getElementById('pauseSelected').addEventListener('click', pauseSelectedAccounts);
document.getElementById('stopSelected').addEventListener('click', stopSelectedAccounts);
document.getElementById('startAllAccounts').addEventListener('click', startAllAccounts);
// 日志控制
document.getElementById('clearLogs').addEventListener('click', clearLogs);
document.getElementById('pauseLogs').addEventListener('click', toggleLogPause);
}
function loadDashboardData() {
// 更新统计数据
const totalTodayContacts = systemData.accounts.reduce((sum, acc) => sum + acc.todayContacts, 0);
document.getElementById('todayContacts').textContent = totalTodayContacts;
document.getElementById('totalContacts').textContent = '3,248';
document.getElementById('totalReplies').textContent = '487';
document.getElementById('replyRate').textContent = '15.0%';
document.getElementById('totalWechat').textContent = '216';
document.getElementById('wechatRate').textContent = '44.4%';
document.getElementById('todayCollections').textContent = '12';
// 更新账号表格
const tableBody = document.getElementById('accountTableBody');
tableBody.innerHTML = '';
systemData.accounts.forEach(account => {
const isSelected = systemData.selectedAccountIds.includes(account.id);
const tableRow = createAccountTableRow(account, isSelected);
tableBody.appendChild(tableRow);
});
// 更新账号数量
document.getElementById('accountCount').textContent = systemData.accounts.length;
document.getElementById('taskCount').textContent = systemData.tasks.length;
// 更新全选复选框状态
updateSelectAllCheckbox();
updateSelectedAccountsInfo();
}
// 创建账号表格行
function createAccountTableRow(account, isSelected) {
const row = document.createElement('tr');
row.className = isSelected ? 'selected' : '';
row.dataset.accountId = account.id;
const statusText = account.status === 'running' ? '运行中' :
account.status === 'paused' ? '已暂停' : '已停止';
const statusClass = account.status === 'running' ? 'status-running' :
account.status === 'paused' ? 'status-paused' : 'status-stopped';
const progressPercent = Math.min((account.todayContacts / account.dailyLimit) * 100, 100);
row.innerHTML = `
<td>
<div class="table-checkbox ${isSelected ? 'checked' : ''}" onclick="toggleAccountSelection(${account.id}, event)"></div>
</td>
<td>
<div style="font-weight: 600;">${account.name}</div>
<div style="font-size: 12px; color: var(--text-secondary);">ID: ${account.id}</div>
</td>
<td>${account.bossAccount}</td>
<td>
<div style="font-weight: 600;">${account.threads}线程</div>
</td>
<td>
<div>${account.todayContacts}/${account.dailyLimit}</div>
<div class="progress-bar">
<div class="progress-fill" style="width: ${progressPercent}%;"></div>
</div>
</td>
<td>
<div style="font-weight: 600;">${account.wechatExchanged}</div>
<div style="font-size: 12px; color: var(--text-secondary);">成功率: ${Math.round((account.wechatExchanged / Math.max(account.todayContacts, 1)) * 100)}%</div>
</td>
<td>
<div class="account-status">
<div class="status-dot ${account.status === 'running' ? 'status-online' : 'status-offline'}"></div>
<span class="status-badge ${statusClass}">${statusText}</span>
</div>
</td>
<td>
<div style="display: flex; gap: 8px;">
<button class="btn btn-sm ${account.status === 'running' ? 'btn-warning' : 'btn-success'}" onclick="toggleAccountStatus(${account.id})" style="padding: 6px 12px; font-size: 12px;">
<i class="fas fa-${account.status === 'running' ? 'pause' : 'play'}"></i>
</button>
<button class="btn btn-sm btn-secondary" onclick="editAccount(${account.id})" style="padding: 6px 12px; font-size: 12px;">
<i class="fas fa-edit"></i>
</button>
</div>
</td>
`;
// 点击整行也可以选中(除了操作按钮区域)
row.addEventListener('click', function(e) {
if (!e.target.closest('.table-checkbox') &&
!e.target.closest('button') &&
!e.target.closest('.btn')) {
toggleAccountSelection(account.id);
}
});
return row;
}
// 切换账号选中状态
function toggleAccountSelection(accountId, event) {
if (event) event.stopPropagation();
const index = systemData.selectedAccountIds.indexOf(accountId);
if (index === -1) {
systemData.selectedAccountIds.push(accountId);
} else {
systemData.selectedAccountIds.splice(index, 1);
}
// 更新UI
const tableRow = document.querySelector(`tr[data-account-id="${accountId}"]`);
const checkbox = tableRow.querySelector('.table-checkbox');
if (index === -1) {
tableRow.classList.add('selected');
checkbox.classList.add('checked');
} else {
tableRow.classList.remove('selected');
checkbox.classList.remove('checked');
}
updateSelectedAccountsInfo();
updateSelectAllCheckbox();
}
// 更新全选复选框状态
function updateSelectAllCheckbox() {
const selectAllCheckbox = document.getElementById('selectAllCheckbox');
const allSelected = systemData.selectedAccountIds.length === systemData.accounts.length;
if (allSelected) {
selectAllCheckbox.classList.add('checked');
} else {
selectAllCheckbox.classList.remove('checked');
}
}
// 切换全选
function toggleSelectAll() {
const selectAllCheckbox = document.getElementById('selectAllCheckbox');
const isCurrentlyChecked = selectAllCheckbox.classList.contains('checked');
if (isCurrentlyChecked) {
// 取消全选
clearSelection();
} else {
// 全选
selectAllAccounts();
}
}
// 更新选中账号信息
function updateSelectedAccountsInfo() {
const selectedCount = systemData.selectedAccountIds.length;
// 获取选中账号的状态
const selectedAccounts = systemData.accounts.filter(acc =>
systemData.selectedAccountIds.includes(acc.id)
);
const runningCount = selectedAccounts.filter(acc => acc.status === 'running').length;
const pausedCount = selectedAccounts.filter(acc => acc.status === 'paused').length;
const stoppedCount = selectedAccounts.filter(acc => acc.status === 'stopped').length;
// 更新显示
document.getElementById('selectedCount').textContent = `已选择 ${selectedCount} 个账号`;
document.getElementById('selectedAccountsInfo').textContent = `已选择 ${selectedCount} 个账号`;
let statusText = '状态: ';
if (runningCount > 0) statusText += `${runningCount}运行中 `;
if (pausedCount > 0) statusText += `${pausedCount}已暂停 `;
if (stoppedCount > 0) statusText += `${stoppedCount}已停止`;
if (selectedCount === 0) statusText = '状态: 未选择账号';
document.getElementById('selectedStatusInfo').textContent = statusText;
}
// 全选账号
function selectAllAccounts() {
systemData.selectedAccountIds = systemData.accounts.map(acc => acc.id);
// 更新UI
systemData.accounts.forEach(account => {
const tableRow = document.querySelector(`tr[data-account-id="${account.id}"]`);
const checkbox = tableRow.querySelector('.table-checkbox');
tableRow.classList.add('selected');
checkbox.classList.add('checked');
});
updateSelectedAccountsInfo();
updateSelectAllCheckbox();
addLog('已选择所有账号', 'info');
}
// 清空选择
function clearSelection() {
systemData.selectedAccountIds = [];
// 更新UI
systemData.accounts.forEach(account => {
const tableRow = document.querySelector(`tr[data-account-id="${account.id}"]`);
const checkbox = tableRow.querySelector('.table-checkbox');
tableRow.classList.remove('selected');
checkbox.classList.remove('checked');
});
updateSelectedAccountsInfo();
updateSelectAllCheckbox();
addLog('已清空所有选择', 'info');
}
// 切换账号状态
function toggleAccountStatus(accountId) {
const account = systemData.accounts.find(acc => acc.id === accountId);
if (account) {
if (account.status === 'running') {
account.status = 'paused';
addLog(`账号"${account.name}"已暂停`, 'warning');
} else {
account.status = 'running';
addLog(`账号"${account.name}"已启动`, 'success');
}
// 重新加载数据
loadDashboardData();
updateSelectedAccountsInfo();
}
}
// 启动选中账号
function startSelectedAccounts() {
if (systemData.selectedAccountIds.length === 0) {
addLog('请先选择要启动的账号', 'warning');
return;
}
let startedCount = 0;
systemData.accounts.forEach(account => {
if (systemData.selectedAccountIds.includes(account.id) && account.status !== 'running') {
account.status = 'running';
startedCount++;
}
});
if (startedCount > 0) {
addLog(`已启动 ${startedCount} 个选中账号`, 'success');
loadDashboardData();
updateSelectedAccountsInfo();
} else {
addLog('选中的账号已全部在运行中', 'info');
}
}
// 暂停选中账号
function pauseSelectedAccounts() {
if (systemData.selectedAccountIds.length === 0) {
addLog('请先选择要暂停的账号', 'warning');
return;
}
let pausedCount = 0;
systemData.accounts.forEach(account => {
if (systemData.selectedAccountIds.includes(account.id) && account.status === 'running') {
account.status = 'paused';
pausedCount++;
}
});
if (pausedCount > 0) {
addLog(`已暂停 ${pausedCount} 个选中账号`, 'warning');
loadDashboardData();
updateSelectedAccountsInfo();
} else {
addLog('选中的账号没有正在运行的', 'info');
}
}
// 停止选中账号
function stopSelectedAccounts() {
if (systemData.selectedAccountIds.length === 0) {
addLog('请先选择要停止的账号', 'warning');
return;
}
let stoppedCount = 0;
systemData.accounts.forEach(account => {
if (systemData.selectedAccountIds.includes(account.id) && account.status !== 'stopped') {
account.status = 'stopped';
stoppedCount++;
}
});
if (stoppedCount > 0) {
addLog(`已停止 ${stoppedCount} 个选中账号`, 'info');
loadDashboardData();
updateSelectedAccountsInfo();
} else {
addLog('选中的账号已全部停止', 'info');
}
}
// 启动全部账号
function startAllAccounts() {
// 先全选所有账号
selectAllAccounts();
let startedCount = 0;
systemData.accounts.forEach(account => {
if (account.status !== 'running') {
account.status = 'running';
startedCount++;
}
});
if (startedCount > 0) {
addLog(`已启动全部 ${startedCount} 个账号`, 'success');
loadDashboardData();
updateSelectedAccountsInfo();
} else {
addLog('所有账号已在运行中', 'info');
}
}
// 刷新数据
function refreshDashboardData() {
// 模拟数据更新
systemData.accounts.forEach(account => {
if (account.status === 'running') {
// 随机增加联系人数
const increment = Math.floor(Math.random() * 3) + 1;
account.todayContacts = Math.min(account.todayContacts + increment, account.dailyLimit);
// 随机增加微信交换
if (Math.random() > 0.7 && account.todayContacts > 0) {
account.wechatExchanged = Math.min(account.wechatExchanged + 1, account.todayContacts);
}
}
});
loadDashboardData();
addLog('数据已刷新', 'info');
}
// 快速操作
function quickAction(action) {
switch(action) {
case 'export':
addLog('导出今日数据', 'info');
alert('今日数据导出成功!');
break;
case 'pauseAll':
systemData.accounts.forEach(account => {
if (account.status === 'running') {
account.status = 'paused';
}
});
loadDashboardData();
addLog('已暂停所有任务', 'warning');
break;
case 'checkUpdate':
addLog('检查系统更新', 'info');
alert('当前已是最新版本!');
break;
case 'backup':
addLog('立即备份数据', 'success');
alert('数据备份成功!');
break;
case 'report':
addLog('生成日报', 'info');
alert('日报生成成功!');
break;
}
}
// 添加日志
function addLog(message, type = 'info') {
const logContainer = document.getElementById('realtimeLogs');
if (!logContainer) return;
const now = new Date();
const time = `${now.getHours().toString().padStart(2, '0')}:${now.getMinutes().toString().padStart(2, '0')}:${now.getSeconds().toString().padStart(2, '0')}`;
let typeClass = 'log-info';
let typeText = '[INFO]';
switch(type) {
case 'success':
typeClass = 'log-success';
typeText = '[SUCCESS]';
break;
case 'warning':
typeClass = 'log-warning';
typeText = '[WARNING]';
break;
case 'error':
typeClass = 'log-error';
typeText = '[ERROR]';
break;
}
const logEntry = document.createElement('div');
logEntry.className = 'log-entry';
logEntry.innerHTML = `
<span class="log-time">${time}</span>
<span class="${typeClass}">${typeText}</span>
${message}
`;
logContainer.prepend(logEntry);
// 限制日志数量
if (logContainer.children.length > 50) {
logContainer.removeChild(logContainer.lastChild);
}
}
// 清空日志
function clearLogs() {
document.getElementById('realtimeLogs').innerHTML = '';
addLog('日志已清空', 'info');
}
// 切换日志暂停
function toggleLogPause() {
systemData.logsPaused = !systemData.logsPaused;
const button = document.getElementById('pauseLogs');
if (systemData.logsPaused) {
button.innerHTML = '<i class="fas fa-play"></i> 继续更新';
addLog('日志更新已暂停', 'warning');
} else {
button.innerHTML = '<i class="fas fa-pause"></i> 暂停更新';
addLog('日志更新已恢复', 'info');
}
}
// 模拟日志更新
function startLogSimulation() {
if (systemData.logSimulationInterval) {
clearInterval(systemData.logSimulationInterval);
}
systemData.logSimulationInterval = setInterval(() => {
if (systemData.logsPaused) return;
const runningAccounts = systemData.accounts.filter(acc => acc.status === 'running');
if (runningAccounts.length === 0) return;
// 随机选择一个运行的账号
const account = runningAccounts[Math.floor(Math.random() * runningAccounts.length)];
const actions = [
{msg: `${account.name}: 向新的候选人发送招呼语`, type: 'info'},
{msg: `${account.name}: 收到候选人的回复`, type: 'success'},
{msg: `${account.name}: 与候选人成功交换微信`, type: 'success'},
{msg: `${account.name}: 检测到冻结账号,已自动跳过`, type: 'warning'},
{msg: `${account.name}: 发现新消息,正在分析`, type: 'info'},
{msg: `${account.name}: 完成今日目标${Math.round((account.todayContacts/account.dailyLimit)*100)}%`, type: 'info'},
{msg: `系统运行正常,${runningAccounts.length}个账号工作中`, type: 'info'}
];
if (Math.random() > 0.3) {
const action = actions[Math.floor(Math.random() * actions.length)];
addLog(action.msg, action.type);
}
}, 3000);
}
// ========== 账号管理页面 ==========
function initAccountsPage() {
loadAccountsTable();
// 添加账号按钮
document.getElementById('addNewAccount').addEventListener('click', function() {
document.getElementById('addAccountForm').style.display = 'block';
this.style.display = 'none';
});
// 取消添加账号
document.getElementById('cancelAddAccount').addEventListener('click', function() {
document.getElementById('addAccountForm').style.display = 'none';
document.getElementById('addNewAccount').style.display = 'inline-flex';
clearAccountForm();
});
// 保存账号
document.getElementById('saveAccount').addEventListener('click', saveAccount);
// 导出账号
document.getElementById('exportAccounts').addEventListener('click', function() {
addLog('导出账号数据', 'info');
alert('账号数据导出成功!');
});
}
function loadAccountsTable() {
const tableBody = document.getElementById('accountsTableBody');
tableBody.innerHTML = '';
systemData.accounts.forEach(account => {
const row = document.createElement('tr');
row.innerHTML = `
<td>${account.name}</td>
<td>${account.bossAccount}</td>
<td>******</td>
<td>${account.threads}</td>
<td>${account.dailyLimit}</td>
<td>
<span class="status-badge ${account.status === 'running' ? 'status-running' : account.status === 'paused' ? 'status-paused' : 'status-stopped'}">
${account.status === 'running' ? '运行中' : account.status === 'paused' ? '已暂停' : '已停止'}
</span>
</td>
<td>
<div style="display: flex; gap: 8px;">
<button class="btn btn-sm btn-secondary" onclick="editAccountForm(${account.id})">
<i class="fas fa-edit"></i>
</button>
<button class="btn btn-sm btn-danger" onclick="deleteAccount(${account.id})">
<i class="fas fa-trash"></i>
</button>
</div>
</td>
`;
tableBody.appendChild(row);
});
}
function clearAccountForm() {
document.getElementById('accountName').value = '';
document.getElementById('bossAccount').value = '';
document.getElementById('accountPassword').value = '';
document.getElementById('confirmPassword').value = '';
document.getElementById('threadCount').value = '3';
document.getElementById('dailyLimit').value = '150';
document.getElementById('accountNotes').value = '';
}
function saveAccount() {
const name = document.getElementById('accountName').value;
const bossAccount = document.getElementById('bossAccount').value;
const password = document.getElementById('accountPassword').value;
const confirmPassword = document.getElementById('confirmPassword').value;
const threads = parseInt(document.getElementById('threadCount').value);
const dailyLimit = parseInt(document.getElementById('dailyLimit').value);
if (!name || !bossAccount || !password) {
alert('请填写完整的账号信息!');
return;
}
if (password !== confirmPassword) {
alert('两次输入的密码不一致!');
return;
}
// 创建新账号对象
const newAccount = {
id: systemData.accounts.length + 1,
name: name,
bossAccount: bossAccount,
threads: threads,
status: "stopped",
todayContacts: 0,
dailyLimit: dailyLimit,
wechatExchanged: 0,
selected: false
};
systemData.accounts.push(newAccount);
// 更新UI
loadAccountsTable();
document.getElementById('addAccountForm').style.display = 'none';
document.getElementById('addNewAccount').style.display = 'inline-flex';
clearAccountForm();
// 更新账号数量
document.getElementById('accountCount').textContent = systemData.accounts.length;
addLog(`已添加新账号: ${name}`, 'success');
alert('账号添加成功!');
}
function editAccountForm(accountId) {
addLog(`编辑账号 ID: ${accountId}`, 'info');
alert('编辑账号功能开发中...');
}
function deleteAccount(accountId) {
if (confirm('确定要删除这个账号吗?')) {
systemData.accounts = systemData.accounts.filter(acc => acc.id !== accountId);
loadAccountsTable();
document.getElementById('accountCount').textContent = systemData.accounts.length;
addLog(`已删除账号 ID: ${accountId}`, 'info');
}
}
// ========== 筛选设置页面 ==========
function initFiltersPage() {
// 保存筛选设置
document.getElementById('saveFilters').addEventListener('click', function() {
const minAge = document.getElementById('minAge').value;
const maxAge = document.getElementById('maxAge').value;
const education = document.getElementById('educationLevel').value;
const activity = document.getElementById('activityLevel').value;
// 获取选中的岗位
const positions = [];
if (document.getElementById('positionJava').checked) positions.push('Java开发');
if (document.getElementById('positionFrontend').checked) positions.push('前端开发');
if (document.getElementById('positionBackend').checked) positions.push('后端开发');
if (document.getElementById('positionTest').checked) positions.push('软件测试');
if (document.getElementById('positionProduct').checked) positions.push('产品经理');
if (document.getElementById('positionUI').checked) positions.push('UI设计');
// 创建筛选标签
const filterText = `年龄${minAge}-${maxAge}${education}${activity}`;
const positionText = positions.length > 0 ? positions.join('/') + ',活跃用户' : '';
// 添加到筛选标签区域
if (positionText) {
addFilterTag(`${filterText}${positionText}`);
} else {
addFilterTag(filterText);
}
addLog('筛选条件已保存', 'success');
alert('筛选设置保存成功!');
});
}
function addFilterTag(text) {
const filterTags = document.getElementById('filterTags');
const tag = document.createElement('div');
tag.className = 'filter-tag';
tag.innerHTML = `
${text}
<i class="fas fa-times" onclick="removeFilterTag(this)"></i>
`;
filterTags.appendChild(tag);
}
function removeFilterTag(element) {
element.parentElement.remove();
}
// ========== 任务管理页面 ==========
function initTasksPage() {
loadTaskGrid();
loadTaskSelection();
// 创建新任务按钮
document.getElementById('createNewTask').addEventListener('click', function() {
document.getElementById('taskForm').style.display = 'block';
this.style.display = 'none';
loadAccountSelection();
});
// 取消创建任务
document.getElementById('cancelTask').addEventListener('click', function() {
document.getElementById('taskForm').style.display = 'none';
document.getElementById('createNewTask').style.display = 'inline-flex';
clearTaskForm();
});
// 保存任务
document.getElementById('saveTask').addEventListener('click', saveTask);
// 任务筛选
document.getElementById('taskFilter').addEventListener('change', function() {
loadTaskGrid();
});
// 任务选择相关
document.getElementById('runSelectedTasks').addEventListener('click', runSelectedTasks);
document.getElementById('selectAllTasks').addEventListener('click', selectAllTasks);
document.getElementById('clearTaskSelection').addEventListener('click', clearTaskSelection);
}
function loadTaskGrid() {
const taskGrid = document.getElementById('taskGrid');
taskGrid.innerHTML = '';
const filter = document.getElementById('taskFilter').value;
let filteredTasks = systemData.tasks;
if (filter !== 'all') {
filteredTasks = systemData.tasks.filter(task => task.status === filter);
}
filteredTasks.forEach(task => {
const taskCard = document.createElement('div');
taskCard.className = 'task-card';
let statusClass = '';
let statusText = '';
switch(task.status) {
case 'running':
statusClass = 'status-running';
statusText = '运行中';
break;
case 'paused':
statusClass = 'status-paused';
statusText = '已暂停';
break;
case 'stopped':
statusClass = 'status-stopped';
statusText = '已停止';
break;
}
let typeText = '';
switch(task.type) {
case 'greeting':
typeText = '自动化打招呼';
break;
case 'rechat':
typeText = '复聊任务';
break;
case 'collection':
typeText = '收藏任务';
break;
case 'monitoring':
typeText = '监测消息';
break;
}
taskCard.innerHTML = `
<div class="task-card-header">
<div class="task-card-title">${task.name}</div>
<div class="task-card-status ${statusClass}">${statusText}</div>
</div>
<div class="task-card-body">
<p>${task.description}</p>
<div style="margin-top: 10px;">
<div><small>执行时间: ${task.time}</small></div>
<div><small>重复周期: ${task.repeat === 'daily' ? '每天' : task.repeat === 'weekly' ? '每周' : '仅一次'}</small></div>
<div><small>任务类型: ${typeText}</small></div>
</div>
</div>
<div class="task-card-footer">
<small>ID: ${task.id}</small>
<div class="task-card-actions">
<button class="btn btn-sm ${task.status === 'running' ? 'btn-warning' : 'btn-success'}" onclick="toggleTaskStatus(${task.id})">
<i class="fas fa-${task.status === 'running' ? 'pause' : 'play'}"></i>
</button>
<button class="btn btn-sm btn-secondary" onclick="editTask(${task.id})">
<i class="fas fa-edit"></i>
</button>
</div>
</div>
`;
taskGrid.appendChild(taskCard);
});
}
function loadTaskSelection() {
const selectionArea = document.getElementById('taskSelectionArea');
selectionArea.innerHTML = '';
systemData.tasks.forEach(task => {
const isSelected = systemData.selectedTaskIds.includes(task.id);
const div = document.createElement('div');
div.style.marginBottom = '10px';
div.innerHTML = `
<label class="checkbox-label">
<input type="checkbox" value="${task.id}" ${isSelected ? 'checked' : ''} onchange="toggleTaskSelection(${task.id})">
${task.name} (${task.type === 'greeting' ? '打招呼' : task.type === 'rechat' ? '复聊' : task.type === 'collection' ? '收藏' : '监测'})
</label>
`;
selectionArea.appendChild(div);
});
}
function loadAccountSelection() {
const selectionArea = document.getElementById('accountSelection');
selectionArea.innerHTML = '';
systemData.accounts.forEach(account => {
const div = document.createElement('div');
div.innerHTML = `
<label class="checkbox-label">
<input type="checkbox" value="${account.id}">
${account.name} (${account.bossAccount})
</label>
`;
selectionArea.appendChild(div);
});
}
function clearTaskForm() {
document.getElementById('taskName').value = '';
document.getElementById('taskDescription').value = '';
}
function saveTask() {
const name = document.getElementById('taskName').value;
const type = document.getElementById('taskType').value;
const time = document.getElementById('taskTime').value;
const repeat = document.getElementById('taskRepeat').value;
const description = document.getElementById('taskDescription').value;
if (!name || !description) {
alert('请填写任务名称和描述!');
return;
}
// 获取选中的账号
const selectedAccounts = [];
document.querySelectorAll('#accountSelection input[type="checkbox"]:checked').forEach(cb => {
selectedAccounts.push(parseInt(cb.value));
});
// 创建新任务对象
const newTask = {
id: systemData.tasks.length + 1,
name: name,
type: type,
status: "stopped",
description: description,
time: time,
repeat: repeat,
accounts: selectedAccounts
};
systemData.tasks.push(newTask);
// 更新UI
loadTaskGrid();
loadTaskSelection();
document.getElementById('taskForm').style.display = 'none';
document.getElementById('createNewTask').style.display = 'inline-flex';
clearTaskForm();
// 更新任务数量
document.getElementById('taskCount').textContent = systemData.tasks.length;
addLog(`已创建新任务: ${name}`, 'success');
alert('任务创建成功!');
}
function toggleTaskStatus(taskId) {
const task = systemData.tasks.find(t => t.id === taskId);
if (task) {
if (task.status === 'running') {
task.status = 'paused';
addLog(`任务"${task.name}"已暂停`, 'warning');
} else {
task.status = 'running';
addLog(`任务"${task.name}"已启动`, 'success');
}
loadTaskGrid();
}
}
function toggleTaskSelection(taskId) {
const index = systemData.selectedTaskIds.indexOf(taskId);
if (index === -1) {
systemData.selectedTaskIds.push(taskId);
} else {
systemData.selectedTaskIds.splice(index, 1);
}
}
function runSelectedTasks() {
if (systemData.selectedTaskIds.length === 0) {
alert('请先选择要运行的任务!');
return;
}
let count = 0;
systemData.selectedTaskIds.forEach(taskId => {
const task = systemData.tasks.find(t => t.id === taskId);
if (task && task.status !== 'running') {
task.status = 'running';
count++;
}
});
if (count > 0) {
loadTaskGrid();
addLog(`已启动 ${count} 个选中任务`, 'success');
alert(`已成功启动 ${count} 个任务!`);
} else {
alert('选中的任务已全部在运行中!');
}
}
function selectAllTasks() {
systemData.selectedTaskIds = systemData.tasks.map(task => task.id);
loadTaskSelection();
}
function clearTaskSelection() {
systemData.selectedTaskIds = [];
loadTaskSelection();
}
function editTask(taskId) {
addLog(`编辑任务 ID: ${taskId}`, 'info');
alert('编辑任务功能开发中...');
}
// ========== 复聊管理页面 ==========
function initRechatPage() {
loadScriptGrid();
// 添加话术按钮
document.getElementById('addScript').addEventListener('click', function() {
document.getElementById('scriptForm').style.display = 'block';
this.style.display = 'none';
});
// 取消添加话术
document.getElementById('cancelScript').addEventListener('click', function() {
document.getElementById('scriptForm').style.display = 'none';
document.getElementById('addScript').style.display = 'inline-flex';
clearScriptForm();
});
// 保存话术
document.getElementById('saveScript').addEventListener('click', saveScript);
// 保存复聊策略
document.getElementById('saveFilters').addEventListener('click', function() {
addLog('复聊策略已保存', 'success');
alert('复聊策略保存成功!');
});
}
function loadScriptGrid() {
const scriptGrid = document.getElementById('scriptGrid');
scriptGrid.innerHTML = '';
systemData.scripts.forEach(script => {
const scriptCard = document.createElement('div');
scriptCard.className = 'script-card';
let typeText = '';
switch(script.type) {
case 'first':
typeText = '首次回复';
break;
case 'followup':
typeText = '跟进回复';
break;
case 'wechat':
typeText = '微信交换';
break;
case 'closing':
typeText = '结束语';
break;
}
scriptCard.innerHTML = `
<div class="script-card-header">
<div class="script-card-title">${script.position} - ${typeText}</div>
<div>
<button class="btn btn-sm btn-secondary" onclick="editScript(${script.id})">
<i class="fas fa-edit"></i>
</button>
<button class="btn btn-sm btn-danger" onclick="deleteScript(${script.id})">
<i class="fas fa-trash"></i>
</button>
</div>
</div>
<div class="script-card-body">
<p>${script.content}</p>
</div>
<div class="script-card-footer">
<small>关键词: ${script.keywords || '无'}</small>
</div>
`;
scriptGrid.appendChild(scriptCard);
});
}
function clearScriptForm() {
document.getElementById('scriptContent').value = '';
document.getElementById('scriptKeywords').value = '';
}
function saveScript() {
const position = document.getElementById('scriptPosition').value;
const type = document.getElementById('scriptType').value;
const content = document.getElementById('scriptContent').value;
const keywords = document.getElementById('scriptKeywords').value;
if (!content) {
alert('请输入回复话术内容!');
return;
}
// 创建新话术对象
const newScript = {
id: systemData.scripts.length + 1,
position: position,
type: type,
content: content,
keywords: keywords
};
systemData.scripts.push(newScript);
// 更新UI
loadScriptGrid();
document.getElementById('scriptForm').style.display = 'none';
document.getElementById('addScript').style.display = 'inline-flex';
clearScriptForm();
addLog(`已添加新话术: ${position} - ${type}`, 'success');
alert('话术保存成功!');
}
function editScript(scriptId) {
addLog(`编辑话术 ID: ${scriptId}`, 'info');
alert('编辑话术功能开发中...');
}
function deleteScript(scriptId) {
if (confirm('确定要删除这个话术吗?')) {
systemData.scripts = systemData.scripts.filter(script => script.id !== scriptId);
loadScriptGrid();
addLog(`已删除话术 ID: ${scriptId}`, 'info');
}
}
// ========== 数据管理页面 ==========
function initDataPage() {
loadDataTable();
// 刷新数据
document.getElementById('refreshData').addEventListener('click', function() {
loadDataTable();
addLog('数据已刷新', 'info');
});
// 导出数据
document.getElementById('exportData').addEventListener('click', function() {
addLog('导出数据', 'info');
alert('数据导出成功!');
});
// 确认导出
document.getElementById('confirmExport').addEventListener('click', function() {
const format = document.getElementById('exportFormat').value;
const range = document.getElementById('exportRange').value;
addLog(`导出${range}数据,格式: ${format}`, 'success');
alert(`数据导出成功!格式: ${format}, 范围: ${range}`);
});
// 搜索数据
document.getElementById('dataSearch').addEventListener('input', function(e) {
loadDataTable(e.target.value);
});
// 分页控制
document.getElementById('prevPage').addEventListener('click', function() {
if (systemData.currentDataPage > 1) {
systemData.currentDataPage--;
loadDataTable();
}
});
document.getElementById('nextPage').addEventListener('click', function() {
const totalPages = Math.ceil(systemData.userData.length / systemData.dataPerPage);
if (systemData.currentDataPage < totalPages) {
systemData.currentDataPage++;
loadDataTable();
}
});
}
function loadDataTable(searchTerm = '') {
const tableBody = document.getElementById('dataTableBody');
tableBody.innerHTML = '';
// 筛选数据
let filteredData = systemData.userData;
if (searchTerm) {
filteredData = systemData.userData.filter(user =>
user.name.includes(searchTerm) ||
user.position.includes(searchTerm) ||
user.contact.includes(searchTerm)
);
}
// 计算分页
const startIndex = (systemData.currentDataPage - 1) * systemData.dataPerPage;
const endIndex = Math.min(startIndex + systemData.dataPerPage, filteredData.length);
const pageData = filteredData.slice(startIndex, endIndex);
// 填充表格
pageData.forEach(user => {
const row = document.createElement('tr');
row.innerHTML = `
<td>${user.id}</td>
<td>${user.name}</td>
<td>${user.position}</td>
<td>${user.contact}</td>
<td>${user.contactTime}</td>
<td>
<span class="status-badge ${user.replyStatus === '已回复' ? 'status-running' : 'status-stopped'}">
${user.replyStatus}
</span>
</td>
<td>
<span class="status-badge ${user.wechatExchanged ? 'status-running' : 'status-stopped'}">
${user.wechatExchanged ? '已交换' : '未交换'}
</span>
</td>
<td>
<button class="btn btn-sm btn-secondary" onclick="viewUserDetails(${user.id})">
<i class="fas fa-eye"></i>
</button>
</td>
`;
tableBody.appendChild(row);
});
// 更新分页信息
document.getElementById('dataStart').textContent = startIndex + 1;
document.getElementById('dataEnd').textContent = endIndex;
document.getElementById('dataTotal').textContent = filteredData.length;
}
function viewUserDetails(userId) {
addLog(`查看用户详情 ID: ${userId}`, 'info');
alert(`查看用户 ${userId} 的详细信息功能开发中...`);
}
// ========== 统计分析页面 ==========
function initAnalyticsPage() {
// 时间段选择
document.getElementById('analyticsPeriod').addEventListener('change', function() {
updateAnalyticsData(this.value);
});
// 图表类型选择
document.getElementById('chartType').addEventListener('change', function() {
addLog(`切换图表类型: ${this.value}`, 'info');
});
// 生成报告
document.getElementById('generateReport').addEventListener('click', function() {
addLog('生成分析报告', 'success');
alert('分析报告生成成功!');
});
// 初始化数据
updateAnalyticsData('week');
}
function updateAnalyticsData(period) {
// 这里可以添加根据时间段更新数据的逻辑
addLog(`更新统计分析数据,时间段: ${period}`, 'info');
}
// ========== 系统设置页面 ==========
function initSettingsPage() {
// 线程数滑块
const maxThreads = document.getElementById('maxThreads');
const threadValue = document.getElementById('threadValue');
maxThreads.addEventListener('input', function() {
threadValue.textContent = this.value + '线程';
});
// 测试数据库连接
document.getElementById('testDbConnection').addEventListener('click', function() {
addLog('测试数据库连接', 'info');
alert('数据库连接测试成功!');
});
// 保存数据库设置
document.getElementById('saveDbSettings').addEventListener('click', function() {
addLog('保存数据库设置', 'success');
alert('数据库设置保存成功!');
});
// 保存所有设置
document.getElementById('saveSettings').addEventListener('click', function() {
addLog('保存系统设置', 'success');
alert('系统设置保存成功!');
});
// 重启系统
document.getElementById('systemRestart').addEventListener('click', function() {
if (confirm('确定要重启系统吗?重启期间所有任务将暂停。')) {
addLog('系统重启中...', 'warning');
alert('系统正在重启,请稍候...');
setTimeout(() => {
addLog('系统重启完成', 'success');
alert('系统重启完成!');
}, 2000);
}
});
// 清除缓存
document.getElementById('clearCache').addEventListener('click', function() {
if (confirm('确定要清除系统缓存吗?')) {
addLog('清除系统缓存', 'info');
alert('系统缓存已清除!');
}
});
}
// 将部分函数暴露给全局作用域
window.removeFilterTag = removeFilterTag;
window.toggleTaskSelection = toggleTaskSelection;
window.toggleTaskStatus = toggleTaskStatus;
window.editTask = editTask;
window.editScript = editScript;
window.deleteScript = deleteScript;
window.viewUserDetails = viewUserDetails;
window.toggleAccountSelection = toggleAccountSelection;
window.toggleAccountStatus = toggleAccountStatus;
window.editAccount = editAccountForm;
window.quickAction = quickAction;
</script>
</body>
</html>