doc/Dsign.md
run.com.getjobs.api.GetJobsApplication 是一个基于 Spring Boot + Next.js + Playwright 的自动化智能求职系统, 用于在多个招聘网站上自动执行岗位搜索、筛选、投递和状态跟踪。
系统提供从「任务创建 → 平台投递 → 结果落库 → 状态回显」的完整闭环。
系统采用 三层分离架构:
┌──────────────────────────────────────────┐
│ 前端层(Front) - Next.js, port=6680 │
│ - 任务创建、投递监控、配置管理界面 │
└──────────────────────────────────────────┘
│ HTTP / SSE
▼
┌──────────────────────────────────────────┐
│ 后端层(API) - Spring Boot 3.5.7, port=8888 │
│ - 任务调度、数据库访问、状态推送 │
│ - 整合 Worker 模块执行自动化逻辑 │
│ - 提供 REST / SSE 接口供前端使用 │
└──────────────────────────────────────────┘
│ 内部模块调用
▼
┌──────────────────────────────────────────┐
│ 执行层(Worker) - Java + Playwright │
│ - 负责自动登录、岗位抓取、智能投递 │
│ - 每个平台封装为独立模块(boss、51等) │
│ - 提供 Runner 接口供 Spring 调度 │
└──────────────────────────────────────────┘
| 模块 | 技术 | 功能 |
|---|---|---|
| 任务中心 | Next.js + React | 用户选择平台、关键词、城市并创建任务 |
| 执行监控 | SSE + React 状态流 | 实时显示投递进度与结果 |
| 配置管理 | 前端调用后端 Config API | 管理 API Key、Cookie、代理配置 |
| 任务日志 | Tail 模式 | 展示执行结果、错误、时间统计 |
端口: 6680
交互方式:
POST /com.getjobs.run.api/runs 创建任务GET /com.getjobs.run.api/runs/{id}/events 订阅指定运行的 SSE 实时推送| 模块 | 主要类 | 职责 |
|---|---|---|
| JobController | com.getjobs.com.getjobs.run.api.controller.JobController | 接收前端任务请求、分配任务 ID、落库 |
| WorkerController | com.getjobs.com.getjobs.run.worker.controller.WorkerController | 提供执行触发入口 |
| WorkerService | com.getjobs.com.getjobs.run.worker.service.WorkerService | 调度各平台执行器(Runner) |
| Database 模块 | SQLite(持久层方案待定:JDBC/JOOQ/MyBatis-Plus) | 存储任务、配置、日志、黑名单 |
| SSE 模块 | Spring MVC SSEEmitter | 向前端推送任务状态 |
| ConfigService | 统一管理 API Key / Cookie / Token 等敏感配置 |
端口: 8888
职责:
| 子模块 | 功能 | 主要类 |
|---|---|---|
| boss/ | Boss直聘自动化逻辑 | Boss.java, BossConfig |
| job51/ | 前程无忧 | Job51.java, Job51Config |
| liepin/ | 猎聘 | Liepin.java |
| lagou/ | 拉勾 | Lagou.java |
| zhilian/ | 智联招聘 | Zhilian.java |
| ai/ | AI 打招呼语 | AiService |
| utils/ | 通用工具类 | PlaywrightUtil, JobUtils, Bot |
| core/ | 调度接口层 | BossRunner, Job51Runner 等 |
技术栈: 全量使用 Playwright;不再依赖 Selenium/chromedriver。
执行逻辑:
/data/getjobs.db # 任务与日志数据
/config/config.db # 敏感配置数据(API Key、Cookie)
| 表名 | 用途 | 主要字段 |
|---|---|---|
task | 投递任务表 | id, platform, payload_json, status, created_at |
run | 运行实例表 | id, task_id, status, started_at, finished_at |
run_event | 运行事件表 | id, run_id, level, code, message, data_json, ts |
job_result | 投递结果表 | id, run_id, platform, jobTitle, company, success, salary, city, recruiter, msg, href, ts |
config_global | 全局配置 | id, key, value_json, updated_at |
config_platform | 平台配置 | id, platform, key, value_json, updated_at |
ai_secret | AI 密钥 | id, name, enc_value, updated_at |
session_store | 会话存储 | id, platform, user_data_dir, cookies_json, updated_at |
敏感字段(API Key、Cookie) 存储在独立数据库文件 config.db;
Git 忽略规则:
data/
config/config.db
初始化文件:
config/schema.sql(仅含表结构)config/init_data.sql(占位符配置)VACUUM 优化文件体积用户点击投递 ▶ 前端调用 /com.getjobs.run.api/runs ▶
Spring Boot 创建 runId ▶
保存任务与运行记录到数据库 ▶
WorkerService 调用对应 Runner ▶
Runner 执行 Playwright 自动化投递 ▶
Runner 通过事件流 emit 上报进度与结果 ▶
数据库更新状态与结果 ▶
SSE 推送前端 ▶ 前端刷新任务状态
RunID 格式:
{PLATFORM}-{yyyyMMdd}-{HHmmss}-{SEQ}
例如:BOSS-20251028-153010-001
config.yaml 或 .env 文件。config_global(id, key, value_json, updated_at)config_platform(id, platform, key, value_json, updated_at)ai_secret(id, name, enc_value, updated_at)session_store(id, platform, user_data_dir, cookies_json, updated_at)./target/data/{cookies,results,snapshots}。./target/logs,文件名通过系统属性 log.name 区分模块。config.yaml/.env;相关依赖与文档将移除或标注过渡。| 模式 | 描述 | 使用场景 |
|---|---|---|
| 开发模式(单进程) | Worker 嵌入 Spring Boot | 本地调试 |
| 生产模式(双进程) | Worker 独立运行(端口 5668) | 部署分布式执行 |
| 独立 Worker 模式 | 直接运行 Runner 类 | 单机批量任务 |
| 模块 | 日志位置 | 说明 |
|---|---|---|
| Playwright | ./target/logs | 按 log.name 生成平台独立日志 |
| API | ./target/logs | 统一由 logback 滚动输出 |
| SSE 通信 | 内存流 + 数据库事件 | 实时任务状态与关键节点追踪 |
| 报错记录 | 数据库 run_event/job_result | 用于前端展示与审计 |
| 扩展方向 | 内容 | 说明 |
|---|---|---|
| 新增平台 | 新建模块 com.getjobs.run.worker/newsite | 实现 Runner 接口即可接入 |
| 数据分析 | 对接 DuckDB / PostgreSQL | 支持批量投递统计 |
| 安全加密 | 集成 SQLCipher | 防止配置泄露 |
| 调度系统 | 支持 Quartz / Redis 队列 | 异步并行执行任务 |
| 容器化部署 | Dockerfile + Compose | 一键启动全栈环境 |
| 模块 | 技术栈 | 特点 |
|---|---|---|
| 前端 | Next.js + React | 动态交互、SSE 实时推送 |
| 后端 | Spring Boot 3.5.7 +(持久层方案待定) | 调度、数据库、状态服务 |
| 执行层 | Java + Playwright | 多平台自动化脚本 |
| 数据层 | SQLite (可加密) | 单文件存储、轻量安全 |
POST /runs、GET /runs/{id}/events(SSE)、GET /runs/{id}/results、GET/PUT /config。RunEvent 模型,Runner 通过 emit 上报,SSE 推送前端并入库。Embedded 模式(嵌入式):
next export 生成纯静态产物。classpath:/static/app/(或 public/app/)。http://<host>:8888/app/ 即可打开 UI,前端通过相对路径访问同源 API/SSE。External 模式(外置式):
next dev(如 http://localhost:6680)。/com.getjobs.run.api/* 转发到 http://localhost:8888,避免跨域与 CORS 配置复杂度。next export)。/app/** 非文件路径转发到 /app/index.html。index.html 禁缓存,/app/_next/* 与图片等开启长缓存。/com.getjobs.run.api/... 调用后端。NEXT_PUBLIC_API_BASE 指定 API 根地址(例如 http://localhost:8888)。getApiBase():优先环境变量,否则回退 window.location.origin。next.config.js 中配置代理:
/com.getjobs.run.api/:path* 重写到 http://localhost:8888/com.getjobs.run.api/:path*;SSE 路径同理。next build && next export 生成 out/。package 阶段调用前端构建,并将 out/ 拷贝到 src/main/resources/static/app/(或直接拷贝到 target/classes/static/app/)。/app/ 加载 UI,使用同源 API 与 SSE。EventSource('/com.getjobs.run.api/runs/{id}/events') 订阅事件。text/event-stream 头的透传与连接保持。