WhispeRre/CareerHelper

GitHub: WhispeRre/CareerHelper

一款集 AI 简历生成、JD 匹配分析、语法优化及模拟面试于一体的全流程求职辅助工具。

Stars: 40 | Forks: 1

CareerHelper **AI 驱动的智能简历生成器** 通过拖放编辑、实时 AI 优化、50 款模板以及多格式导出来构建专业简历。 [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](LICENSE) [![Next.js](https://img.shields.io/badge/Next.js-16-black)](https://nextjs.org/) [![React](https://img.shields.io/badge/React-19-61dafb)](https://react.dev/) [![TypeScript](https://img.shields.io/badge/TypeScript-5-3178c6)](https://www.typescriptlang.org/) [![Docker](https://img.shields.io/badge/Docker-Ready-2496ed)](https://hub.docker.com/r/whisperre/careerhelper) [中文文档](./README.zh-CN.md)
## 功能 ### 简历编辑 - **拖放式编辑器** — 可视化排列和重新排序简历各个板块和内容项 - **内联编辑** — 点击任意字段即可在画布上直接编辑 - **50 款专业模板** — 经典、现代、极简、创意、ATS 友好、时间轴、北欧、瑞士等 - **主题自定义** — 颜色、字体、间距和边距,支持实时预览 - **撤销 / 重做** — 完整的编辑历史记录(最多 50 步) - **自动保存** — 可配置的保存间隔(0.3s–5s),也可选择手动保存 - **Markdown 支持** — 在文本字段中使用 Markdown 语法格式化内容(例如,使用 `**bold**` 表示 **粗体文本**) ### Markdown 格式化 以下简历板块支持 Markdown 语法: | 板块 | 支持的字段 | |---------|-----------------| | 个人简介 | 内容文本 | | 工作经历 | 描述、亮点 | | 教育背景 | 亮点 | | 项目经历 | 描述、亮点 | | 自定义板块 | 描述 | | 语言能力 | 描述 | | GitHub | 描述 | **支持的语法:** ``` **bold text** → bold `code text` → inline code - item → bullet list ``` ### AI 功能 - **AI 聊天助手** — 集成在编辑器中的对话式 AI,支持多会话和永久历史记录 - **AI 简历生成** — 根据职位、经验和技能生成完整的简历 - **简历解析** — 上传现有的 PDF 或图片,AI 自动提取所有内容 - **JD 匹配分析** — 将简历与职位描述进行对比:关键词匹配、ATS 评分及改进建议 - **求职信生成** — 根据简历和 JD 由 AI 定制求职信,支持语气选择(正式 / 友好 / 自信) - **语法与写作检查** — 检测弱动词、模糊描述和语法问题;返回质量评分 - **翻译** — 在 10 种语言之间翻译简历内容,同时保留专业术语 - **灵活的 AI 提供商** — 支持 OpenAI、Anthropic 和自定义 API endpoint;每个用户在应用内配置自己的 key ### 模拟面试 - **基于 JD 的面试模拟** — 粘贴职位描述,AI 会依次扮演不同的面试官角色 - **6 种预设面试官** — HR、技术、场景、行为、项目深度挖掘、领导 —— 每位都有独特的人格和提问风格 - **自定义面试官** — 创建具有自定义关注领域和风格的面​​试官 - **智能追问** — AI 根据回答质量调整问题,并在需要时深入挖掘 - **面试控制** — 跳过问题、请求提示、标记待复查、暂停/恢复 - **详细报告** — 每题评分、能力雷达图、带资源的改进计划 - **历史比较** — 跟踪历次面试的分数趋势和各维度进步 - **PDF 和 Markdown 导出** — 导出面试报告以便离线查看 ### 导出与分享 - **多格式导出** — PDF(Puppeteer + Chromium)、智能单页 PDF(自动适应单页)、DOCX、HTML、TXT、JSON - **JSON 导入** — 导入之前导出的 JSON 文件以恢复或创建简历;在编辑器中(覆盖当前内容)和仪表板(创建新简历)上均受支持 - **链接分享** — 基于 token 的可分享链接,可选密码保护 - **浏览量统计** — 跟踪共享简历的浏览次数 ### 管理 - **多简历仪表板** — 网格和列表视图、搜索、排序(按日期、名称) - **从 JSON 导入** — 直接在仪表板上从 JSON 导出文件创建新简历 - **复制与重命名** — 快捷的简历管理操作 - **交互式引导** — 为首次使用的用户提供分步上手指南 ### 其他 - **双语界面** — 完整的中文 和英文 界面 - **深色模式** — 支持浅色、深色和系统主题 - **灵活的身份验证** — Google OAuth 或浏览器指纹(零配置) - **双数据库** — SQLite(默认,零配置)或 PostgreSQL ## 截图 | 模板库 | 简历编辑器 | |:---:|:---:| | ![模板库](https://static.pigsec.cn/wp-content/uploads/repos/cas/19/192aad35c8f9d132270f86e05fd6fe4a20d72beb78d79d0020eee07471bd3844.png) | ![简历编辑器](https://raw.githubusercontent.com/WhispeRre/CareerHelper/main/images/resume-edit.png) | | AI 简历生成 | AI 简历解析(图片) | |:---:|:---:| | ![AI 简历生成](https://static.pigsec.cn/wp-content/uploads/repos/cas/34/34c7502b161b90596c2dc26a06cfdd68bf9f98d27e53beff0ebab0ef3edfd016.gif) | ![AI 简历解析](https://static.pigsec.cn/wp-content/uploads/repos/cas/8d/8de12b2f293ae4bfbb42de02317e0b1364e8f9f2a61d36ebf721a968facaf3c8.gif) | | AI 优化 | 语法检查 | |:---:|:---:| | ![AI 优化](https://static.pigsec.cn/wp-content/uploads/repos/cas/65/659c37583663e1778d5872fc7f78bb043596b90dfc15b1f4876a617776a52d47.png) | ![语法检查](https://static.pigsec.cn/wp-content/uploads/repos/cas/71/717b461b25ef95075870b5bb4b01f1b4d8a224418276f7b02b792fa16bd09604.png) | | 语法自动修复 | JD 匹配分析 | |:---:|:---:| | ![语法自动修复](https://static.pigsec.cn/wp-content/uploads/repos/cas/a5/a5a4af8f5b7e5ccd268b372388108b60a479fc124c943ba4048418dd04600f44.png) | ![JD 匹配分析](https://static.pigsec.cn/wp-content/uploads/repos/cas/e1/e15f7a724f94827340640b103eee02d5dbbac00da1de305a8745f6f916a71c30.png) | | 多格式导出 | 分享链接 | |:---:|:---:| | ![多格式导出](https://static.pigsec.cn/wp-content/uploads/repos/cas/54/548497d8bc34a5a6d0e8bdc3d8393263e85b289eb3e83751b2de94079ced2a05.png) | ![分享链接](https://static.pigsec.cn/wp-content/uploads/repos/cas/57/573beb76ba614b93173ae8e0933073f22b10657fc95dfee9e2afdc1e8ca35e8e.png) | | 分享简历页 | AI 职业照 | |:---:|:---:| | ![分享简历页](https://static.pigsec.cn/wp-content/uploads/repos/cas/73/73947f16236d273cc3c7f641d8a4451187906be6a4b367b62f8c0b0fdbe7961c.png) | ![AI 职业照](https://static.pigsec.cn/wp-content/uploads/repos/cas/17/176907f6352d6c3720921af274bd07204ed51c879072d9551db72af6809902d7.png) | | 二维码板块 | |:---:| | ![二维码板块](https://static.pigsec.cn/wp-content/uploads/repos/cas/79/7981beb0b63e57aefd703ce83c6397e3e97ac052d8c0b4f0e6d1c79c5c3ee06f.png) | | 面试设置 | 模拟面试 | |:---:|:---:| | ![面试设置](https://static.pigsec.cn/wp-content/uploads/repos/cas/69/69ee629a78a9bae679d0aa296ac2575691a89e7cf83e1253b4791b0e33251b77.png) | ![模拟面试](https://static.pigsec.cn/wp-content/uploads/repos/cas/d8/d85716ae397f640a176d456b8d73bfa8c17b65ca73870f3ef90d17f4e95e2364.png) | | 面试列表 | 面试报告 | |:---:|:---:| | ![面试列表](https://static.pigsec.cn/wp-content/uploads/repos/cas/ee/eeca38e3d1fc0c9e9dd4c929dbe461c3edd6374036f09625bc7e2443c2241cf6.png) | ![面试报告](https://static.pigsec.cn/wp-content/uploads/repos/cas/11/11bb922b222641b4940a24daefd0ee9a368d90cd964b436919f80e0bef74fc39.png) | ## 技术栈 | 层级 | 技术 | |-------|-----------| | 框架 | Next.js 16 (App Router, Turbopack) | | UI | React 19, Tailwind CSS 4, shadcn/ui, Radix UI | | 拖放 | @dnd-kit | | 状态 | Zustand | | 数据库 | Drizzle ORM (SQLite / PostgreSQL) | | 身份验证 | NextAuth.js v5 + FingerprintJS | | AI | Vercel AI SDK v6 + OpenAI / Anthropic | | PDF | Puppeteer Core + @sparticuz/chromium | | 国际化 | next-intl | | 校验 | Zod v4 | ## 快速开始 ### Docker(推荐) ``` # 首先生成 secret key openssl rand -base64 32 docker run -d -p 3000:3000 \ -e AUTH_SECRET= \ -v careerhelper-data:/app/data \ whisperre/careerhelper:latest ``` 打开 [http://localhost:3000](http://localhost:3000)。数据库会在首次启动时自动迁移并填充初始数据。
使用 PostgreSQL ``` docker run -d -p 3000:3000 \ -e AUTH_SECRET= \ -e DB_TYPE=postgresql \ -e DATABASE_URL=postgresql://user:pass@host:5432/careerhelper \ whisperre/careerhelper:latest ```
使用 Google OAuth ``` docker run -d -p 3000:3000 \ -e AUTH_ENABLED=true \ -e AUTH_SECRET=your-secret \ -e GOOGLE_CLIENT_ID=xxx \ -e GOOGLE_CLIENT_SECRET=xxx \ -v careerhelper-data:/app/data \ whisperre/careerhelper:latest ```
### 本地开发 #### 前置条件 - Node.js 18+ - pnpm 9+ #### 安装 ``` git clone https://github.com/WhispeRre/CareerHelper.git cd careerhelper pnpm install cp .env.example .env.local ``` #### 配置环境变量 编辑 `.env.local`: ``` # Database(默认为 SQLite,无需配置) DB_TYPE=sqlite # Auth(默认为 fingerprint 模式,无需配置) AUTH_ENABLED=false ``` 有关所有可用选项,请参见 `.env.example`(Google OAuth、PostgreSQL 等)。 #### 初始化数据库并运行 ``` # 生成并运行 migrations pnpm db:generate pnpm db:migrate # (可选)使用示例数据 seed pnpm db:seed # 启动 dev server pnpm dev ``` 打开 [http://localhost:3000](http://localhost:3000)。 ## 环境变量 | 变量 | 必需 | 默认值 | 描述 | |----------|----------|---------|-------------| | `AUTH_SECRET` | 是 | — | 用于会话加密的密钥 | | `DB_TYPE` | 否 | `sqlite` | 数据库类型:`sqlite` 或 `postgresql` | | `DATABASE_URL` | PostgreSQL 时必需 | — | PostgreSQL 连接字符串 | | `SQLITE_PATH` | 否 | `./data/careerhelper.db` | SQLite 数据库文件路径 | | `AUTH_ENABLED` | 否 | `false` | 启用 Google OAuth (`true`) 或使用指纹模式 (`false`) | | `GOOGLE_CLIENT_ID` | OAuth 时必需 | — | Google OAuth 客户端 ID | | `GOOGLE_CLIENT_SECRET` | OAuth 时必需 | — | Google OAuth 客户端密钥 | | `APP_NAME` | 否 | `careerhelper` | 应用程序显示名称 | | `DEFAULT_LOCALE` | 否 | `zh` | 默认语言:`zh` 或 `en` | ## 脚本命令 | 命令 | 描述 | |---------|-------------| | `pnpm dev` | 使用 Turbopack 启动开发服务器 | | `pnpm build` | 生产环境构建 | | `pnpm start` | 启动生产服务器 | | `pnpm lint` | 运行 ESLint | | `pnpm type-check` | TypeScript 类型检查 | | `pnpm db:generate` | 生成 Drizzle 迁移文件 | | `pnpm db:generate:pg` | 生成 Drizzle 迁移文件 | | `pnpm db:migrate` | 执行数据库迁移 | | `pnpm db:studio` | 打开 Drizzle Studio(数据库 GUI) | | `pnpm db:seed` | 填充示例数据到数据库 | ## 项目结构 ``` src/ ├── app/ # Next.js App Router │ ├── [locale]/ # i18n routes (/zh/..., /en/...) │ │ ├── dashboard/ # Resume list & management │ │ ├── editor/[id]/ # Resume editor │ │ ├── preview/[id]/ # Full-screen preview │ │ ├── templates/ # Template gallery │ │ └── share/[token]/ # Public shared resume viewer │ └── api/ │ ├── ai/ # AI endpoints │ │ ├── chat/ # Streaming chat with tool calls │ │ ├── generate-resume/# AI resume generation │ │ ├── jd-analysis/ # JD match analysis │ │ ├── grammar-check/ # Grammar & writing check │ │ ├── cover-letter/ # Cover letter generation │ │ ├── translate/ # Resume translation │ │ └── models/ # List available AI models │ ├── resume/ # Resume CRUD, export, parse, share │ ├── share/ # Public share access │ ├── user/ # User profile & settings │ └── auth/ # NextAuth handlers ├── components/ │ ├── ui/ # shadcn/ui base components │ ├── editor/ # Editor canvas, sections, fields, dialogs │ ├── ai/ # AI chat panel & bubble │ ├── preview/templates/ # 50 resume templates │ ├── dashboard/ # Dashboard cards, grid, dialogs │ └── layout/ # Header, theme provider, locale switcher ├── lib/ │ ├── db/ # Schema, repositories, migrations, adapters │ ├── auth/ # Auth configuration │ └── ai/ # AI prompts, tools, model config ├── hooks/ # Custom React hooks (7 hooks) ├── stores/ # Zustand stores (resume, editor, settings, UI, tour) └── types/ # TypeScript type definitions ``` ## 模板 careerhelper 包含 **50 款精心设计的专业简历模板**,涵盖广泛的风格和行业:
查看全部 50 款模板 | # | 模板 | # | 模板 | # | 模板 | |---|----------|---|----------|---|----------| | 1 | Classic | 18 | Clean | 35 | Material | | 2 | Modern | 19 | Bold | 36 | Medical | | 3 | Minimal | 20 | Timeline | 37 | Luxe | | 4 | Professional | 21 | Nordic | 38 | Retro | | 5 | Two-Column | 22 | Gradient | 39 | Card | | 6 | ATS | 23 | Magazine | 40 | Rose | | 7 | Academic | 24 | Corporate | 41 | Teacher | | 8 | Creative | 25 | Consultant | 42 | Coder | | 9 | Elegant | 26 | Swiss | 43 | Zigzag | | 10 | Executive | 27 | Metro | 44 | Neon | | 11 | Developer | 28 | Architect | 45 | Scientist | | 12 | Designer | 29 | Japanese | 46 | Blocks | | 13 | Startup | 30 | Artistic | 47 | Ribbon | | 14 | Formal | 31 | Sidebar | 48 | Engineer | | 15 | Infographic | 32 | Finance | 49 | Watercolor | | 16 | Compact | 33 | Berlin | 50 | Mosaic | | 17 | Euro | 34 | Legal | | |
## API 参考
查看所有 API endpoint ### 简历 | 方法 | Endpoint | 描述 | |--------|----------|-------------| | `GET` | `/api/resume` | 列出当前用户的所有简历 | | `POST` | `/api/resume` | 创建新简历 | | `GET` | `/api/resume/[id]` | 获取包含所有板块的简历详情 | | `PUT` | `/api/resume/[id]` | 更新简历元数据或板块 | | `DELETE` | `/api/resume/[id]` | 删除简历 | | `POST` | `/api/resume/[id]/duplicate` | 复制简历 | | `GET` | `/api/resume/[id]/export` | 导出简历(pdf, docx, html, txt, json) | | `POST` | `/api/resume/parse` | 通过上传 PDF 或图片解析简历 | | `POST` | `/api/resume/[id]/share` | 创建分享链接 | | `GET` | `/api/resume/[id]/share` | 获取分享设置 | | `DELETE` | `/api/resume/[id]/share` | 移除分享链接 | ### 分享 | 方法 | Endpoint | 描述 | |--------|----------|-------------| | `GET` | `/api/share/[]` | 访问公开分享的简历 | ### AI | 方法 | Endpoint | 描述 | |--------|----------|-------------| | `POST` | `/api/ai/chat` | 结合简历上下文流式传输聊天消息 | | `GET` | `/api/ai/chat/sessions` | 列出简历的聊天会话 | | `POST` | `/api/ai/chat/sessions` | 创建新的聊天会话 | | `GET` | `/api/ai/chat/sessions/[id]` | 获取某个会话的分页消息 | | `DELETE` | `/api/ai/chat/sessions/[id]` | 删除聊天会话 | | `POST` | `/api/ai/generate-resume` | 根据职位和经验生成简历 | | `POST` | `/api/ai/jd-analysis` | 根据职位描述分析简历 | | `POST` | `/api/ai/grammar-check` | 检查语法和写作质量 | | `POST` | `/api/ai/cover-letter` | 生成定制的求职信 | | `POST` | `/api/ai/translate` | 翻译简历内容 | | `GET` | `/api/ai/models` | 列出可用的 AI 模型 | ### 用户 | 方法 | Endpoint | 描述 | |--------|----------|-------------| | `GET` | `/api/user` | 获取当前用户资料 | | `PUT` | `/api/user` | 更新用户资料 | | `GET` | `/api/user/settings` | 获取用户设置 | | `PUT` | `/api/user/settings` | 更新用户设置 |
## 常见问题
AI 配置是如何工作的? careerhelper 不需要服务器端的 AI API key。每个用户都可以在应用的 **设置 > AI** 中配置自己的 AI 提供商(OpenAI、Anthropic 或自定义 endpoint)、API key 和模型。API key 存储在浏览器的本地存储中,绝不发送到服务器进行存储。
我可以在 SQLite 和 PostgreSQL 之间切换吗? 可以。将 `DB_TYPE` 环境变量设置为 `sqlite` 或 `postgresql`。SQLite 是默认选项,零配置。对于 PostgreSQL,还需要设置 `DATABASE_URL`。请注意,数据库类型之间的数据不会自动迁移。
没有 OAuth 时身份验证是如何工作的? 当 `AUTH_ENABLED=false`(默认)时,careerhelper 会通过 FingerprintJS 使用浏览器指纹识别。系统会为每个浏览器生成一个唯一的指纹 ID,并以此作为用户标识。无需显示登录界面 —— 用户可以直接开始构建简历。
PDF 导出是如何实现的? PDF 导出使用了 Puppeteer Core 和 @sparticuz/chromium。50 款模板中的每一款都有专门的服务器端导出处理器,能将简历渲染为高保真的 PDF。此外还支持 DOCX、HTML、TXT 和 JSON 导出。
## 许可证 [Apache License 2.0](LICENSE)
标签:AI辅助, React, Syscalls, TypeScript, 安全插件, 简历生成器, 自动化攻击, 请求拦截