|
12 套中文模板按 通用求职、应届校招、技术研发、产品运营、设计创意、商务职能、学术教育、医疗健康 八个求职方向分类; 单栏、双栏等版式作为模板标签。新建简历会按方向填入对应示例内容,打开即可直接修改。 10 种内容模块(基本信息 / 个人总结 / 实习 / 工作 / 项目 / 教育 / 技能 / 奖项 / 证书 / 自定义),
基于
每个长文本模块可在 Markdown 与 富文本 之间一键切换, 预览与导出同时支持 HTML / Markdown / 纯文本三态渲染。 |
Puppeteer 无头 Chrome 渲染 A4 PDF(794 × 1123 px), 与编辑器预览遵循同一套排版规则,并由 21 项渲染契约断言校验两者行为一致。 内容润色、个人总结、ATS 体检、JD 解析、面试题预测、简历翻译、技能匹配共 7 项主要能力。 未配置任何大模型密钥时自动降级为本地规则引擎,功能不中断、页面不报错。 手动存档、时间线回溯、一键回退; 生成随机令牌链接,HR 无需登录即可查看,且内容实时同步。 |
13 个容器 · 5 个 Java 微服务 · 3 个异构应用服务 · 5 个中间件 · 单域名同源
graph TB
Browser(["浏览器"])
subgraph Edge["边缘层"]
NGX["nginx<br/>TLS 终止 · 同源反代"]
end
subgraph FE["前端"]
VITE["React 18 + Vite<br/>静态站点"]
end
subgraph GW["接入层"]
GATE["gateway :8080<br/>Spring Cloud Gateway<br/>路由 · CORS · JWT 透传"]
end
subgraph SVC["业务微服务"]
AUTH["auth-service<br/>:8081"]
RES["resume-service<br/>:8082"]
TPL["template-service<br/>:8083"]
FILE["file-service<br/>:8084"]
end
subgraph HET["异构服务"]
EXP["export-service :8085<br/>Node + Puppeteer"]
AI["ai-service :8086<br/>Python + FastAPI"]
end
subgraph INFRA["中间件"]
NACOS[("Nacos<br/>服务发现")]
PG[("PostgreSQL 16<br/>JSONB + pgvector")]
MINIO[("MinIO<br/>对象存储")]
REDIS[("Redis 7<br/>缓存")]
MQ[("RabbitMQ<br/>导出异步队列")]
end
Browser -->|HTTPS| NGX
NGX -->|/| VITE
NGX -->|/api| GATE
NGX -->|/export| EXP
NGX -->|/api/ai| AI
GATE --> AUTH & RES & TPL & FILE
GATE -.->|负载均衡| EXP
GATE -.->|负载均衡| AI
AUTH & RES & TPL --> PG
FILE --> MINIO
AI --> REDIS
EXP --> MQ
SVC & GATE -.->|注册/发现| NACOS
classDef edge fill:#4F46E5,stroke:#4338CA,color:#fff
classDef fe fill:#7C3AED,stroke:#6D28D9,color:#fff
classDef gw fill:#6366F1,stroke:#4F46E5,color:#fff
classDef svc fill:#EEF2FF,stroke:#C7D2FE,color:#312E81
classDef het fill:#F5F3FF,stroke:#DDD6FE,color:#4C1D95
classDef infra fill:#F1F5F9,stroke:#CBD5E1,color:#0F172A
class NGX edge
class VITE fe
class GATE gw
class AUTH,RES,TPL,FILE svc
class EXP,AI het
class NACOS,PG,MINIO,REDIS,MQ infra
sequenceDiagram
autonumber
participant U as 浏览器
participant N as nginx
participant F as 前端容器
participant G as Gateway
participant S as resume-service
participant D as PostgreSQL
U->>N: POST /api/resumes (Bearer token)
N->>F: 反代到 127.0.0.1:8000
F->>G: proxy_pass http://gateway:8080
G->>G: 校验 JWT,解析出 userId
G->>S: 转发 + 注入 X-UserId 头
S->>D: 写入 JSONB 简历数据
D-->>S: 主键与时间戳
S-->>G: { code: 200, message: "success", data }
G-->>U: 原样透传
关键设计:网关在转发时把 JWT 里的
userId解析出来,以X-UserId请求头传给下游。微服务只需@RequestAttribute UUID userId即可拿到当前用户,不必各自解析 token。
Node.js 18+ · JDK 17+ · Maven 3.8+ · Docker · Python 3.11+
保留热重载,改代码即时生效:
# 只启动 PostgreSQL / Nacos / MinIO
docker compose up -d postgres nacos minio然后按下方「本地开发」分别启动各服务。
本地开发时,Java 核心服务需要 PostgreSQL 与 Nacos;文件服务还需要 MinIO。 RabbitMQ 当前用于导出异步队列(HTTP 直出接口仍可单独使用);Redis 已编排但当前业务代码未依赖。
cp .env.example .env # 可选:改 JWT_SECRET / 填大模型密钥
docker compose up -d --build构建并启动全部 13 个服务,访问 http://localhost:8000。 首次构建需下载依赖,耗时较长。
完整的部署说明、免费托管方案与安全清单见 DEPLOY.md。 国内服务器构建请务必先读其中的「国内服务器构建必读」一节。
1. Java 后端(点击展开)
# 必须先构建 common —— 其它服务把它当作兄弟模块依赖
mvn clean install -pl services/common -am -DskipTests
# 按顺序启动(Nacos 必须先在)
mvn spring-boot:run -pl services/gateway
mvn spring-boot:run -pl services/auth-service
mvn spring-boot:run -pl services/resume-service
mvn spring-boot:run -pl services/template-service
mvn spring-boot:run -pl services/file-service2. AI 服务(点击展开)
cd ai-service
pip install -r requirements.txt
cp .env.example .env # 可选:填入大模型密钥
uvicorn app.main:app --reload --port 8086无需密钥即可运行 —— 未配置时自动使用本地规则引擎,所有 AI 功能依然可用, 响应中的
engine字段会标记为rule。
切换大模型厂商只需改 .env 三个变量,零代码改动:
| 厂商 | OPENAI_BASE_URL |
LLM_MODEL |
|---|---|---|
| 通义千问(默认) | https://dashscope.aliyuncs.com/compatible-mode/v1 |
qwen-max |
| DeepSeek | https://api.deepseek.com/v1 |
deepseek-chat |
| OpenAI | https://api.openai.com/v1 |
gpt-4o-mini |
千问可选:qwen3-max(旗舰)> qwen-max(默认)> qwen-plus(均衡)> qwen-turbo(最快)。
Key 在阿里云百炼控制台申请。
3. 导出服务(点击展开)
cd export-service
npm install # 会自动下载 Chromium
npm run dev若跳过 Chromium 下载(如
PUPPETEER_SKIP_DOWNLOAD=true), 需手动安装:npx puppeteer browsers install chrome。 未安装时导出接口返回Could not find Chrome。
# 基础设施(两个都应返回 200)
curl -o /dev/null -w "%{http_code}\n" http://localhost:4348/nacos/
curl -o /dev/null -w "%{http_code}\n" http://localhost:9100/minio/health/live
# 网关注册的微服务列表(应为 5 个)
curl -s "http://localhost:4348/nacos/v1/ns/service/list?pageNo=1&pageSize=50"端口非默认值说明:Nacos 为
4348(映射4348:8848), MinIO 为9100/9101—— 都是为避开本机已占用的端口而改。 详见下方「服务端口」。
| 分层 | 技术选型 |
|---|---|
| 前端 |
React 18 TypeScript 5 Vite 5 Ant Design 5
Zustand TipTap 2 @dnd-kit
|
| 后端 |
Java 17 Spring Boot 3.2.5 Spring Cloud Alibaba 2023.0.1.0
MyBatis-Plus 3.5.7
|
| 数据 |
PostgreSQL 16 JSONB pgvector Redis 7
MinIO
|
| 基础设施 |
Nacos RabbitMQ 3.13 Docker Compose Nginx
|
| 智能与导出 |
Python 3.11+ FastAPI LangChain 0.2
Node.js Express Puppeteer 22
|
ResumeAssistant/
├── services/ # Java 微服务
│ ├── common/ # 共享 DTO、R<T>、异常处理
│ ├── gateway/ # Spring Cloud Gateway(:8080)
│ ├── auth-service/ # JWT 认证(:8081)
│ ├── resume-service/ # 简历 CRUD + JSONB(:8082)
│ ├── template-service/ # 模板管理(:8083)
│ └── file-service/ # MinIO 文件上传(:8084)
├── export-service/ # Node.js PDF 导出(:8085)
│ ├── src/renderer.js # 渲染器(与前端预览引擎规则镜像)
│ └── scripts/contract-test.mjs # 渲染契约测试(21 项断言)
├── ai-service/ # Python FastAPI AI(:8086)
│ ├── app/services/ai_service.py # LLM 优先
│ ├── app/services/rule_engine.py # 本地规则降级
│ └── scripts/rule_engine_test.py # 降级测试(6 项)
├── frontend/ # React 前端(:5173)
│ └── src/
│ ├── components/
│ │ ├── editor/ # 编辑器组件(受控,不直接读写 store)
│ │ ├── viewer/ # 渲染引擎 + 富文本
│ │ ├── dashboard/ # 工作台组件
│ │ ├── templates/ # 模板预览
│ │ ├── layout/ # 全局外壳
│ │ └── common/ # 通用原子组件
│ ├── pages/ # Home / Login / Dashboard / Editor / Templates / Profile / SharedResume
│ ├── services/api.ts # Axios 封装 + 全部接口
│ ├── stores/ # resumeStore / authStore
│ ├── styles/ # tokens.ts(设计令牌唯一来源)+ global.css
│ ├── constants/sections.ts # 模块元数据
│ └── types/resume.ts # 领域模型
├── docs/
│ ├── FRONTEND.md # 前端设计系统规范
│ ├── assets/ # README 视觉资源(banner / 截图)
│ ├── conf/rabbitmq.conf # 低内存服务器的 RabbitMQ 配置
│ ├── sql/init.sql # 建表 + 触发器 + 12 个种子模板
│ ├── sql/add-templates.sql # 为旧数据库幂等补齐缺少模板
│ └── sql/migrate-template-categories.sql # 已有数据库分类迁移
├── docker-compose.yml # 全栈编排
├── docker-compose.server.yml # 低内存服务器覆盖层
└── DEPLOY.md # 部署指南
| 服务 | 端口 | 说明 |
|---|---|---|
| Gateway | 8080 |
前端统一入口 |
| auth-service | 8081 |
JWT 认证 |
| resume-service | 8082 |
简历 CRUD |
| template-service | 8083 |
模板管理 |
| file-service | 8084 |
文件上传 |
| export-service | 8085 |
PDF 导出 |
| ai-service | 8086 |
AI 能力 |
| frontend (Vite) | 5173 |
开发服务器 |
| frontend (容器) | 8000 |
nginx 托管 |
| Nacos | 4348 |
映射 4348:8848,控制台 /nacos |
| PostgreSQL | 5432 |
— |
| MinIO API / 控制台 | 9100 / 9101 |
避免与本机其它实例冲突 |
| Redis / RabbitMQ | 6379 / 5672 |
— |
⚠️ 改 MinIO 端口时必须同步两处:docker-compose.yml的 minioports与services/file-service/src/main/resources/application.yml的minio.endpoint。 两处不一致会导致头像/附件上传失败。
Vite 已配置代理:/api → http://localhost:8080,/export → http://localhost:8085。
网关统一入口 http://localhost:8080,响应格式 { code, message, data }。
| 端点 | 服务 | 说明 |
|---|---|---|
POST /api/auth/register /login |
auth | 公开 |
GET/PATCH /api/auth/me |
auth | 资料读写 |
POST /api/auth/change-password |
auth | 修改密码 |
/api/resumes/** |
resume | 简历 CRUD、模块、排序、版本、统计 |
POST /api/resumes/{id}/share |
resume | 开启分享(返回 token) |
GET /api/public/resumes/{token} |
resume | 公开,只读分享 |
/api/templates/** |
template | 模板列表 / 分类 / 详情 |
/api/files/** |
file | 文件上传、头像 |
/api/ai/** |
ai | 7 项主要 AI 能力 |
/api/export/** |
export | PDF 导出 |
除注册、登录、/api/public/** 外,均需 Authorization: Bearer <token>。
| 能力 | 端点 | 引擎 |
|---|---|---|
| 要点润色 | /api/ai/optimize-bullet、/api/ai/optimize-bullets |
大模型 |
| 个人总结 | /api/ai/generate-summary |
大模型 |
| ATS 评分 | /api/ai/ats-score |
大模型 |
| JD 解析 | /api/ai/parse-jd |
大模型 |
| 面试题预测 | /api/ai/interview-questions |
大模型 |
| 简历翻译 | /api/ai/translate |
大模型 |
| 技能匹配 | /api/ai/match-skills |
纯规则(精确匹配,更快更稳) |
除技能匹配外,其余能力调用失败时都会自动降级到本地规则引擎。
响应中的 engine 字段标识实际使用的引擎:llm / rule / none。
# 渲染契约测试(21 项)—— 校验 PDF 与预览的排版契约
cd export-service && npm run test:contract
# 模板分类与示例简历选择单测
mvn -pl services/template-service,services/resume-service -am test
# AI 规则引擎降级测试(6 项)—— 保证无密钥时功能可用
cd ai-service && python scripts/rule_engine_test.py
# 前端类型检查 + 生产构建
cd frontend && npm run build修改任一渲染器后,务必运行契约测试。 详见 docs/FRONTEND.md 的「渲染契约」一节。
PostgreSQL,默认连接 resume / resume123 @ localhost:5432/resume_assistant。
| 表 | 说明 |
|---|---|
users |
账号 |
resumes |
简历主表(含 share_token / share_enabled / view_count / status) |
resume_sections |
模块内容,data 为 JSONB(业务字段 + _config 样式),带 GIN 索引 |
resume_versions |
版本快照 |
templates |
模板 |
ai_operations |
AI 调用审计 |
docs/sql/init.sql 含建表语句、触发器与 12 个种子模板。已有数据库升级时,先执行
docs/sql/add-templates.sql 补齐缺少的模板,再执行
docs/sql/migrate-template-categories.sql 迁移分类,然后更新应用。
| 约定 | 说明 |
|---|---|
| 设计令牌单一来源 | frontend/src/styles/tokens.ts,组件内不写魔法色值 |
| 渲染器必须同步 | ResumePreviewEngine.tsx ↔ export-service/src/renderer.js |
| 编辑器单一编排者 | pages/Editor.tsx 是唯一读写 resumeStore 的地方 |
_config 不可丢失 |
内容编辑不得覆盖模块样式配置 |
| A4 尺寸固定 | 794 × 1123 px,缩放只作用于 transform: scale() |
| UUID 主键 | 全表使用 MyBatis-Plus ASSIGN_UUID |
完整前端规范见 docs/FRONTEND.md。
欢迎提交 Issue 与 Pull Request。
git clone https://github.com/ZxlDragonDoctor/resume-assistant.git
cd resume-assistant
git checkout -b feat/your-feature- 改动渲染器请同时修改前端预览与导出渲染器,并跑通契约测试
- 新增颜色请先判断归属:UI 语义色 →
tokens.ts令牌;用户可选色 → 调色板 - 提交前请确保
cd frontend && npm run build通过
以 MIT 协议开源。



