三步上手
-
下载并解压
从官网下载
ResumeForge-0.11.0.zip(仅含程序源码,不含任何个人数据),解压到任意目录;能访问 GitHub 的话也可以git clone仓库。 -
双击 start.cmd
启动器会自动准备 Python 与 Node.js 环境、安装依赖、拉起前后端并打开页面(默认
http://127.0.0.1:5173)。首次需要联网,通常几分钟。 -
按需配置大模型
要用 AI 生成简历、岗位需求解读、求职助手与面试相关功能时,去「设置 → AI 模型」填接口与 API Key 并测试连接。只是维护资料、管理岗位、手写简历与导出的话,可以跳过这一步。
先跑一遍演示数据,是最快的上手方式。在「设置 → 数据 → 导入备份为新数据集」里导入官网提供的演示数据包,切换过去就能看到 24 个岗位、15 份简历、15 条事实主张、14 条求职进度、8 场面试经验、8 条投递队列、6 条内推、13 条提醒、10 篇知识库笔记、10 份资料箱材料,另有题库与复盘历史、面试深挖会话,以及回收站里的 10 类条目。导入只会新增一份数据集,不动你现有的数据。
不用安装,先在线点一遍
在决定要不要下载之前,可以先到 在线体验页 真实点一点:那里嵌着一个跑在浏览器里的演示实例, 界面、导航、列表、详情抽屉全是真的,只有数据是虚构的。 屏幕区右上角有全屏开关,点一下会铺满整个窗口(再按一次或按 Esc 退出), 小屏笔记本和平板上看得更清楚。
体验版没有接入真实的大模型。AI 相关的输出(求职助手回复、AI 生成简历) 都是提前录好的回放——你输入什么都不会得到新回答。它只是让你熟悉界面和流程, 不是一个能在浏览器里干活的替代品。
体验版能做什么
- 翻遍全部页面:工作台、岗位管理、需求解读、事实台账、简历生成、求职进度、统计、面试准备、求职助手、资料箱、知识库、回收站、设置……
- 打开任意岗位、简历、投递记录的详情抽屉,看清楚每个字段长什么样、关系是怎么串起来的。
- 看一眼 AI 输出长什么样(回放的助手分析、回放的简历草稿,逐字吐出来的效果与真实版一致)。
- 在体验页左上角的六步引导里点一下,内嵌实例会直接跳到对应页面。
体验版不能做什么
- 不能真的用 AI。没有接入任何模型接口,回复是预录回放。
- 不能改任何东西。它是只读快照,新增、修改、删除都会被拒绝并提示你下载完整版。
- 不能导出文件。只能看版面,拿不到 PDF / Word / Markdown / JSON。
- 自动投递台不可用。那条链路要驱动你本机的浏览器,只能装在你自己电脑上。
- 不要往里填真实信息。页面上的数据全是虚构的,你填的任何内容也不会被保存。
想真的用它,去下载完整版
完整版装在你自己电脑上:接你自己的模型接口真实流式生成与分析、数据只存在本机、 可导出 PDF / Word / Markdown / 纯文本 / JSON 并一键脱敏、自动投递台能真的投出去并分类诊断失败原因。 同样免费、MIT 开源,只有你自己调模型产生的费用。
体验完直接到 下载页 拿最新版本, 或者回 在线体验页的下载区 看完整的能力对照表。
项目在持续更新
这个项目还在持续开发中,功能、界面和文档都会不断变化,体验版的快照也会跟着一起更新。 觉得哪一步别扭、想要什么功能、遇到报错,都欢迎到 发表议题; 如果它对你有一点用,顺手在 GitHub 仓库 点个 Star 就是最实在的支持。
1. 安装与启动
系统要求
- 操作系统:一键启动器面向 Windows 10 / 11。macOS 与 Linux 可手动启动前后端,见本节末尾。
- 运行环境:不需要预装 Python 或 Node.js——启动器会自己在
runtime/下准备一套,不污染系统环境。 - 磁盘:程序本体很小,运行环境与依赖约数百 MB;数据(数据库、照片、附件)另计。
- 网络:首次启动需要联网下载运行环境与依赖;日常使用中只有你主动触发的 AI 调用、联网搜索与招聘网站操作需要出网。
- 端口:后端默认监听
8005,前端开发模式用5173。被占用时用启动参数换端口。
一键启动(推荐)
- 解压后进入目录,双击
start.cmd。 - 首次运行会依次完成:准备 Python → 建立虚拟环境 → 安装后端依赖 → 准备 Node.js → 安装前端依赖 → 启动前后端 → 打开浏览器。整个过程会有中文进度提示。
- 看到浏览器自动打开页面即算成功。窗口不要关,它就是这个应用的进程。
首次安装失败时,提示会告诉你怎么做,而不是只丢一句英文报错。最常见的是网络被拦导致依赖装不上,启动器会给出可直接粘贴的国内镜像命令,例如:
backend\.venv\Scripts\python.exe -m pip install -i https://mirrors.aliyun.com/pypi/simple -r backend\requirements.txt
「打不开这个地址就是网络被拦了」这类可自查的判据也一并写在提示里。
启动参数
| 参数 | 作用 | 示例 |
|---|---|---|
-BackendPort | 指定后端端口(默认 8005) | start.cmd -BackendPort 8010 |
-NoBrowser | 启动后不自动打开浏览器 | start.cmd -NoBrowser |
-Reinstall | 强制重建运行环境与依赖(排错用) | start.cmd -Reinstall |
关闭服务
双击 stop.cmd,或在启动器窗口按 Ctrl + C。直接关闭窗口也可以,但用 stop.cmd 会先把后端进程收干净,避免端口残留占用。
手动启动(开发、排错或 macOS / Linux)
后端在 backend 目录:
python -m venv .venv
.venv\Scripts\python.exe -m pip install -r requirements.txt # macOS/Linux 用 .venv/bin/python
.venv\Scripts\python.exe -m uvicorn app.main:app --port 8005
前端在 frontend 目录:
npm install
npm run dev # 开发模式,默认 5173
npm run build # 构建生产版本
手动启动时前端需要知道后端在哪:设置环境变量 VITE_BACKEND_URL=http://127.0.0.1:8005 再运行 npm run dev。默认值是 http://127.0.0.1:8000,与一键启动器的 8005 不同,这是最容易踩的一处。
2. 配置大模型(可选)
进入「设置 → AI 模型」。这里既能用内置预设,也能填任意 OpenAI 兼容接口。
使用内置预设
下拉里有 16 个常见服务:DeepSeek、Claude(Anthropic 原生协议)、豆包、Kimi、通义、智谱、MiniMax、硅基流动、OpenRouter、OpenAI、Gemini、Grok、Groq、Mistral、Ollama、LM Studio。选择预设会自动填好 Base URL、模型名与接口协议。
接口协议不是可选项,而是必须跟着服务走的一项。选了 Claude 的原生预设就会把协议切到 Anthropic 原生;只填地址不改协议的话,会拿一整套 Messages 协议去发 Chat Completions 请求,而错误信息只会说「接口返回 404」,看不出是协议选错了。
填写参数
- 接口协议:OpenAI 兼容(绝大多数服务)或 Anthropic 原生(支持扩展思考与独立 system 字段)。
- Base URL / 模型名:预设会填好;自定义时按服务商文档填,注意有些服务的 Base URL 需要带
/v1。 - API Key:本地无需鉴权的服务(如 Ollama)可以留空。
- 温度:默认 0.1。简历生成更看重事实稳定性,不建议调高。
- 输出上限:默认「不限制」,即使用服务商与模型的默认上限,避免被一个手写的 4096 悄悄截断。
- 高级参数(按需展开):top_p、频率惩罚、存在惩罚、随机种子、top_k、重复惩罚、停止词(最多 4 条)、Anthropic 扩展思考预算,以及一个「额外请求体字段」的口子,用来传各家自创的长尾参数。
填完点 测试连接,通过后再 保存当前配置。获取可用模型 会按当前账号实际可用的模型列出来,比自己猜模型名可靠。
保存多套配置记录
「保存当前配置」可以命名保存,同一名字会覆盖更新。列表里每套显示模型名、温度、Base URL 与更新时间,点「使用」即切换为当前配置。常见用法:一套线上主力模型 + 一套本地 Ollama(断网或不想花钱时切换)。
API Key 是怎么存的
Key 存在本机的应用设置里(SQLite 数据库),不上传任何服务器。在 Windows 上会用系统 DPAPI 加密后落库(密文绑定当前用户与机器),非 Windows 平台保持明文。导出数据集时会自动剥离 Key,所以含 Key 的数据不会跟着备份包出门。要重填时用「重新填写」即可。
不配模型也能做什么
- 岗位的手动录入、编辑、筛选、批量操作与来源标注;
- 本地规则解析岗位文本(技能标签、字段拆分);
- 匹配度分析的五类结论与准入建议(参考分需要模型,本地降级时不产分数);
- 版式渲染、五种内置样式、格式模板、A4 预览与版面诊断;
- 全部导出格式(HTML / PDF / Word / Markdown / 纯文本 / JSON);
- 简历版本差异对比、ATS 本地检测;
- 资料、台账、资料箱、知识库、提醒、内推、回收站与数据集备份的全部管理操作。
需要模型才能用的是:AI 生成简历、岗位需求解读、匹配度分析的参考分、写作增强四件套、质量检查里的夸大与深挖风险点、求职助手、模拟面试、题库、复盘与面试深挖。
3. 我的资料与照片
「我的资料」是所有简历的数据来源。这里填一次,之后每一份简历、每一次生成都复用它。
基本信息
姓名、性别、出生年份、手机号、邮箱、所在城市、期望城市、求职意向、个人网站、GitHub 与一段自我介绍。这些字段会直接进入简历头部,也会用于导出时的完整性检查。
教育 / 工作 / 校园 / 项目 / 技能 / 获奖
- 每类经历都是一组结构化字段(单位、角色、起止时间、描述等),用「添加一条」新增。
- 校园经历(学生会、社团、竞赛)单独一类,应届生版本主要靠它撑起来。
- 每条经历都可以附一份 Markdown / TXT 参考文件:把当时的结项说明、数据截图说明、复盘笔记放进去,生成简历时模型会读到它。附上文件名与字数会显示在字段旁,点「查看内容」可以核对。
简历照片
「选择照片」打开照片库,最多保存 8 张,点缩略图切换当前使用哪一张。照片只留在本机数据库里,不会发送给模型,导出的 HTML / PDF / Word 会带上它(JSON 与纯文本导出不含照片,这是格式本身的限制)。
整段粘贴识别
不想一条条填?把已有的简历全文粘进识别框(也可以贴截图、传 pdf/docx),识别后回填成可编辑草稿。识别结果一定要逐条核对——尤其是日期、数字与公司全称,这几个字段最容易错。
生成通用简历
页面底部可以生成或手写一份不针对任何岗位的跨行业简历:各方向经历都会保留,适合方向还没定的时候先有一份底稿。可以生成多份、各自命名,同样会进简历中心并能导出。
4. 截图与文档识别
岗位录入与资料录入共用同一套识别能力。凡是「粘贴 / 识别」出现的地方,都支持下面三种输入,并且可以混着用。
怎么把内容给进去
- 粘贴文本:复制招聘信息原文,直接粘进文本框。
- 截图:按 Ctrl + V 直接贴图,或点「添加截图或文档」选文件。贴进来的图会先显示成缩略图,可以逐个删掉再识别。
- 文档:选本地的
pdf或docx文件。 - 拖拽:岗位识别、备选截图、资料附件、个人照片、助手附件、经历参考文件、技能包、模板 HTML、数据集备份,都支持把文件从资源管理器直接拖进对应区域。
支持哪些格式与限制
| 类型 | 格式 | 限制 |
|---|---|---|
| 图片 | png / jpg / webp / gif / bmp / tiff | 一次最多 4 个,合计 ≤ 5 MB;bmp / tiff 会自动转为 png |
| 文档 | pdf / docx | 文字在本机提取;扫描版 PDF(纯图片)提取不到文字,需要改为贴图 |
| 文本 | 纯文本 | 与图片、文档一起参与同一次识别 |
扩展名和内容不一致也能用。把 .docx 改名成 .pdf 之类的常见误操作不会直接失败,应用会按内容判断真实类型。反过来,上传图片时如果内容与扩展名都不像图片,会提示「内容与扩展名不符」并拒绝,避免把不可解析的内容送去识别。
两条识别路径的差别
- 配了模型:图片与文档一起交给模型做多模态识别,字段拆分更准,能处理排版复杂的招聘长图。
- 没配模型:文本部分用本地规则解析出部分字段(能识别常见的「岗位 / 公司 / 城市 / 薪资」结构)。图片识别在没有多模态模型时会提示「当前模型不支持图片输入」——这是诚实的失败,而不是假装识别成功给你一份空草稿。
识别后要核对什么
- 日期:起止时间最容易被识别成邻近的数字。
- 数字:薪资、人数、比例建议回原文对一遍。
- 专有名词:公司全称、项目名、技术名词。
- 字段归属:粘进来的一段内容有没有被分到正确的字段(职责 vs 要求)。
保存岗位时在备注里会自动标注来源(粘贴文本 / 图片 / 文档识别),方便日后回查这份内容是识别的还是手填的。
5. 岗位管理与采集
手动填写
在「岗位广场」点「手动添加」,可以只填标题与公司,也可以把整段招聘信息粘进去让它自动拆成「职位描述 / 任职要求 / 其他信息」。一次粘贴多份招聘信息时,应用会先拆分成多条草稿,让你逐条确认后再入库——批量导入最怕的就是把两条岗位粘成一条。
备选岗位(暂存区)
还没核对的招聘信息先放进「备选岗位」:粘贴一段文本、贴一张截图都可以。自动采集的结果也先落在这里,勾选后再导入岗位广场,而不是直接把宽泛关键词采到的东西一股脑塞进正式列表。已导入的条目会标成「已导入」并记下导入到了哪一条岗位。
列表与筛选
- 支持按关键词搜索(标题、公司、城市、描述、备注)、按状态与岗位类型筛选、按列排序。
- 保存时自动提取技能标签,标签会参与后续搜索与匹配分析。悬停职位格可以看到导入时间。
- 行内操作(详情 / 生成简历 / 自行编写 / 相关简历 / 编辑 / 删除)收进「更多操作」下拉,行更紧凑;长文本硬截断,不再撑出横向滚动条。
- 点「选择」进入多选模式,可以批量修改投递状态或批量删除。
补齐详情
历史遗留的岗位可能只有链接没有 JD 正文(早年采集时详情页抓不到)。「补齐详情」只做一件事:按岗位 id 重新打开详情页补抓 JD。它只补空——已有描述的直接跳过,不会覆盖你改过的内容;跳过回收站里的条目;跳过没有投递链接的条目。补到正文后会重算技能标签。选择模式下可以只补勾选的那几条;单批上限 200 条(补详情要逐个打开页面,很慢),超过会拒绝并提示分批。
收藏夹
岗位与简历都可以收藏,「收藏夹」页分两个页签分页查看,可跳详情或取消收藏。它跟「岗位广场」的关系是:广场是全集,收藏夹是你挑出来的那一小撮。
回收站里的岗位
删除岗位是软删除:先进回收站,可在那里恢复或彻底删除。详见 27. 回收站。
6. 需求解读与匹配度分析
这两个功能长得像,用途完全不同,别混用:
| 岗位需求解读 | 岗位匹配度分析 | |
|---|---|---|
| 看什么 | 只读招聘原文 | 你的个人资料 + 简历 + 事实台账 |
| 给出什么 | 结构化需求总结、原文证据、通用的求职准备建议 | 逐条匹配结论 + 投递建议 + 参考分 |
| 不做什么 | 不碰你的资料,不给匹配结论 | 不给百分比评分(参考分明确不参与准入) |
| 什么时候用 | 刚拿到 JD,想先快速看懂它在要什么 | 准备投之前,判断该不该投、差在哪 |
匹配度的五类结论
分析结果把每一条 JD 要求归入五类之一,每一类都配 JD 原文摘录与你的证据:
- 已匹配:你的资料里有对应的事实。
- 表达缺口:事实有,但简历里没写清楚。
- 证据不足:资料里提到了,但没有可验证的具体内容。
- 真实缺口:确实不具备。
- 待确认:信息不够,需要你自己判断。
结论汇总成投递准入建议:能投 / 需确认 / 不投。硬性门槛(学历、年限、专业等)任一命中「真实缺口」即判为不满足;不确定时不会替你拍板,而是标成「需确认」。
匹配度参考分
五类结论之后另有一个 0–100 的参考分与 5 个分项(技能覆盖 / 年限 / 项目相关度 / 硬性门槛 / JD 关键词覆盖),每条带一句可读依据,例如「核心与加分项共 18 条,已匹配 6 条」。三条口径必须说清楚:
- 它是纯本地规则现算的派生值,不调模型、不落库;
- 不参与投递准入——能投 / 需确认 / 不投仍然只看五类结论;
- 固定携带免责文案:不代表真实 ATS 解析结果或投递成功概率。
分数用单一色相绘制、不按高低变色,因为后端没有定义档位,前端自己划「好 / 差」的线就是在编造一个它没有的判断。它放在结论区之后也是同一个理由:不能让它盖过准入结论。
7. 事实台账
这一节是简历通跟其他工具差别最大的地方,值得完整读一遍。
台账记录的不是"我有什么经历",而是一条条可对外表达的主张。每条主张写清四件事:
| 字段 | 写什么 | 作用 |
|---|---|---|
| 原始事实 | 照实写,不包装。例如「活动后台报名 12,400 人,去重后约 11,000,到场约 6,000」 | 这是唯一的事实基线,生成简历时只认这里 |
| 简历表述 | 准备怎么写进简历。例如「主导季度主题营销活动,参与人数 1.2 万」 | 模型润色时不会越过这条表述的强度 |
| 承担程度 | 参与 / 负责模块 / 主导方案或交付 / 项目负责人 | 约束表述强度:「参与」不能写成「主导」 |
| 个人边界 | 团队做了什么、你做了什么。例如「不含线下到场人数」 | 面试被追问时你知道该说到哪 |
核实状态决定用途,而不是决定好坏
- 已确认:可以作为事实写进正式简历,也是生成简历时唯一进入提示词的部分。
- 待确认:只能进草稿,且正文里必须保留【待补】之类的占位符。
- 已过期:内容会随时间变化(如去年的报价),更新前不作为最新事实。
- 不采用:保留原因供复盘,不进入任何对外材料。例如「把团队成果写成个人成果」这种写法可以留一条作为反面记录。
与生成、导出的联动
- 生成简历时:只有「已确认」的条目会作为事实基线进入提示词;未确认的说法会被列成「禁止使用」;承担程度与个人边界会约束表述强度。台账为空时生成链路的行为与以前完全一致,不会因为多了这个模块而变样。
- 导出时:正文里还留着【待补】【待确认】【待补充】【待核实】这类标记的简历会被拦下,并指出具体位置。拦下不等于堵死——弹窗里可以选「仍要导出草稿」。四种导出格式与浏览器打印都适用这条规则。
- 助手侧:助手能查台账,但不能替你确认:写入路径一律不接受核实状态,新建的条目都是「待确认」。让模型把自己新建的条目标成「已确认」,等于让它自己给自己发通行证。
从资料生成条目
已有资料不想重新敲一遍?点「从资料生成」,应用会读你的教育 / 工作 / 项目经历,生成一批待确认的条目草稿。它们默认是「待确认」,需要你逐条核对后手动确认。
8. AI 生成简历
在「简历中心」点「AI 生成」,或在岗位详情里点「生成简历」,都会打开生成弹窗。生成会读取:岗位 JD + 你的个人资料 + 事实台账里已确认的条目 + 你补充的自定义要求。
生成前要选的几项
| 选项 | 取值 | 怎么选 |
|---|---|---|
| 美化拓展强度 | 轻度 / 均衡 / 深度 | 轻度:只调整措辞,几乎不扩写;均衡:补齐表达与结构;深度:在不超出事实边界的前提下充分展开。三档都不会越过台账里写的事实与承担程度。悬停任一档位标签会显示这一档具体做什么。 |
| 最大篇幅 | 1 / 2 / 3 页 A4 | 应届或经历较少选 1 页;内容多再放宽。 |
| 字号 | 小 / 标准 / 大 | 内容偏多选小字号提高密度,内容少选大字号避免显得空。 |
| 样式模板 | 经典 / 现代 / 精简 / 优雅 / 技术 / 极简 | 决定版式观感。工作台里可以用真实缩略图预览(见 25 节)。 |
| 格式模板 | 内置若干 + 你自制的 | 在样式之上叠加版式参数(强调色、行高、页边距、区块间距、字号系数)。 |
| 自定义要求 | 自由文本 | 例如「突出可核对的数字,不要形容词堆砌」「这段经历按 STAR 展开」。 |
生成过程:后台任务 + 真实阶段条
生成是一个后台任务,不是一段锁死界面的转圈:
- 弹窗里有结构化阶段条:整理资料 → 筛选资料 → 调用模型生成 → 校验修复 → 完成。阶段由后端下发的 progress 文案映射,映射不上的只显示原文,不硬凑。
- 进度显示「已接收 N 字」,刻意不做百分比——模型是流式逐字输出,后端无法预知总长,任何百分比都只能靠猜。
- 关掉弹窗不会中断生成,它会继续在后台跑,并持续轮询进度。
- 可以点取消。取消后不落库、不留半成品简历。
- 完成后弹出「简历已生成」通知,并直接打开结果预览。
- 已经有进行中的生成任务时,再点会返回 409 提示,连点两次不会造出两份简历。
已知限制:原生 Anthropic 协议 + 开启「思考强度」+ 多轮工具调用时,官方要求把上一轮的思考块原样回传,这一步尚未实现,该组合的第二轮可能被服务端以 HTTP 400 拒绝。遇到时把「思考强度」调回「关闭」,或改用 OpenAI 兼容协议即可;只回答、不调用工具时不受影响。
防虚构校验
生成结果里的学校、公司、项目名会自动与资料库逐条比对,不一致的在记录上标记警告,提醒你核对。配合事实台账的「已确认才可用」规则,这两道闸门一起把「AI 替你编」挡在简历之外。
9. 自行编写与写作增强
结构化编辑器
在简历中心点「自行编写」,或从岗位详情的对应入口进入。编辑器左边是按板块划分的字段(基本信息、教育、经历、项目、技能、获奖),右边常驻目标岗位参考面板:职责、任职要求、技能标签与其他信息都在那里,写的时候不用来回切窗口。
四个就地变换(写作增强)
对某一段经历描述,选中后可以直接做四种变换。四种都是「一段文本进、一段文本出」,结果自动回填到对应字段。
| 功能 | 做什么 | 注意 |
|---|---|---|
| STAR 量化改写 | 把「负责市场活动执行」改写成「情境 → 任务 → 行动 → 结果」,并尽量量化。 | 可以挂一条台账主张作为事实边界:改写不会越过你当时写的承担程度与边界。这是它与普通"润色"最大的区别。 |
| 话术生成器 | 同一段事实一次生成三种表达:简历版 / STAR 版 / 面试口述版。 | 面试口述版可以当作追问时的答题稿。 |
| 多风格润色 | 大厂严谨 / 简洁干练 / 应届校园三种风格。 | 风格只改语气与用词,不改事实。 |
| 中英互译 | 忠实原意地翻译,数字、日期、术语不篡改。 | 需要投英文岗位或多语言版本的简历时用。 |
四个变换都不做本地降级:未配置模型时接口会返回清晰的中文错误,而不是给你一段伪造的"改写结果"。宁可明确告诉你没模型,也不假装做了 AI 处理。
版本差异对比
在简历中心任选两份简历做对比。结果按字段分区,只显示有变化的区块:字符串行内做词级高亮,列表条目用 + / − 标记,照片显示为 [图片]。想看原始差异时展开「查看原始差异」作为兜底。这个对比用本地算法计算,不调用模型。
10. 质量与合规检查
简历编辑页的质量检查面板把「这份简历投出去会不会踩坑」拆成六类。前三类在本机用确定性规则做,后三类里凡涉及判断的会有明确免责。
| 检查项 | 查什么 | 是否用模型 |
|---|---|---|
| 查重 | 同一份内容在库里是否重复出现 | 否,本地规则 |
| 敏感词 | 不适合出现在简历里的表述 | 否,本地规则 |
| 夸大风险 | 表述强度是否超出台账里写的承担程度 | 是,联动事实台账 |
| 面试深挖风险点 | 哪些说法一旦被追问就会露馅 | 是,联动事实台账 |
| 合规校验 | 保密义务、NDA、违规表述等红线 | 是 |
| ATS 本地检测 | 格式、关键词覆盖、信息位置三类静态检查 | 否,本地规则 |
ATS 检测带明确免责:它不是招聘系统的真实解析结果。不同的 ATS 实现差异极大,任何声称"通过 ATS 检测"的说法都无法验证。这里只做能在本地确定的三类静态检查,并如实标注它的边界。
11. 版面诊断与自动一页
简历预览上方有一个「版面诊断」面板。它把「看起来空 / 挤」这类主观感受变成可测的数字。
诊断口径
- 单页简历:正文占用 82% ~ 96% 算合适;超过 96% 判为偏高(接近溢出);低于 82% 判为偏空。
- 多页简历:额外看末页——低于 70% 说明最后一张几乎是空的,读者会有一种"内容不够"的印象。
- 高度由浏览器实测提供(版面只有真正排版之后才存在),但规则全在后端:多少算满、先动哪个旋钮、缩到哪为止,是可以被逐条测住的判断。
建议的顺序本身就是规则
诊断会给出一组按固定顺序排列的建议:
- 重排:内容顺序调整(把最相关的经历提前)。
- 结构:合并或拆分区块。
- 间距 / 字号:调格式参数。
- 精简内容:删减文字。
- 扩页:放宽页数限制。
顺序不能颠倒:先让人调间距、调不好再让人删内容等于让人白改一轮;反过来先说「精简内容」,用户又可能删掉本来放得下的经历。
自动一页
内容溢出时会出现「自动一页」按钮。它逐档试、够放下就停,而不是一步把字号缩到最小:按「页边距 → 区块间距 → 行高 → 字号」共十几档逐次尝试,每试一档只是往预览里注入一段 CSS 再量一次(没有网络往返)。
- 字号有绝对下限:不低于 12px(≈9pt)。按绝对像素算而不是按比例——同一个系数在小字号档上会缩得更狠,只盯比例会让小字号档一路缩到 10px 以下。
- 收到底仍放不下时,会如实说明「只能精简内容或增加页数」,绝不假装成功。
- 方案的目的是按简历的版式覆盖:结果只写在当前这份简历上,不会去改具名格式模板——后者会让所有引用它的简历一起变。
- 预览、导出 HTML、服务端 PDF 三处走同一个解析函数,避免出现「预览收紧了、导出的 PDF 没变」这种下载之后才发现的不一致。
12. 预览、导出与脱敏
预览
在简历中心点「预览 / 导出」打开预览。要点:
- A4 版式实时渲染,支持按钮缩放与滚轮缩放,放大后可按住拖动。
- 内容超出所选页数时不再直接裁掉看不见,而是向右并排展开成第 2、3… 张 A4,每页边界画虚线并标注「第 N 页 / 共 M 页(近似)」。各列共用同一个缩放系数,所以第 2 页的字号、边距与第 1 页天然一致。
- 屏幕上始终标注这是「按 A4 高度切分的近似分页」,真实分页以浏览器打印或下载 PDF 为准。浏览器不向 JS 暴露打印页数,应用内算不出真实打印页数,所以只能如实说明「打印是权威、屏幕是近似」。
- 多页只是展示,不会改你存的页数设置,也不影响导出。
六种导出格式
| 格式 | 用途 | 说明 |
|---|---|---|
| HTML | 看版式 / 二次编辑 | 与服务端渲染的 A4 成品是同一份,含内联样式 |
| 直接投递 | 可直接下载:服务端用系统中文字体生成,不依赖浏览器打印 | |
| Word | 对方要求 docx 时 | 复用同一套版式口径,不引入第二套排版引擎 |
| Markdown | 留档 / 进笔记 | 结构化纯文本 |
| 纯文本 | 填在线表单 | 把内容粘进招聘网站的输入框时最实用 |
| JSON | 备份 / 迁移 | 无损结构,可用于再导入 |
另有浏览器打印 / 另存为 PDF 入口,入口处有悬停提示:打印分页以浏览器为准,可能与屏幕上的近似分页略有不同。
自定义水印
可以给导出加上一段水印文字(例如「草稿·请勿外传」)。实现方式随格式区分:HTML 用 CSS 覆盖层、PDF 用 pypdf 叠加、Word 写页眉。纯文本与 JSON 没有版面概念,请求加水印时会返回明确错误,而不是静默忽略。
一键隐私脱敏
勾选脱敏后,可逐项选择遮罩范围:姓名、电话、邮箱、公司、学校、项目名、产品名。默认遮罩前四项(可直接识别身份的部分)。脱敏后导出的内容始终基于脱敏结果,不会出现"脱敏只脱了一半、另一半还是原文"的情况。
导出被拦下时怎么办
如果正文里还有【待补】【待确认】之类标记,导出会被拦下并指出具体位置。两种处理方式:回去补完这些占位符,或在弹窗里选择「仍要导出草稿」。后者是给"先发给朋友看看"这种场景留的口子。
14. 自动采集
入口在「投递台 → 自动采集」。采集负责把岗位批量收进库里,但不会直接写进岗位广场。
三步流程
- 填条件:关键词 + 城市 + 页数,另外可以叠加站点自己的筛选条件。
- 采集:在后台线程里跑,切到别的页面不打断,回来照样看进度;可以暂停 / 继续 / 停止。
- 挑选导入:结果先落在「本次采集结果」里,勾选后再点「导入选中的岗位」才进岗位广场。
页面顶部常驻一条流程说明:采集 → 挑选导入 → 投递队列 → 投递记录。任务完成的文案也是「已暂存 N 个岗位,请在下方勾选…」,而不是含糊的「已完成」。
「按招聘网站的条件筛」
这一组筛选(求职类型 / 薪资待遇 / 工作经验 / 学历要求 / 公司行业 / 公司规模 / 融资阶段)是站点自己的筛选参数,网站在搜索时就替你筛掉了,比「采回来再按本地字段筛」更准、也少翻很多页。它与「我的期望薪资 / 我的经验 / 我的学历」语义不同,可以同时用。
选项清单读自站点,不写死。写死的一份在站点改编码之后会静默筛错——你以为按「本科」筛了,实际发出去的是另一个编码。清单有三条来源并按可信度降级:你的登录会话(页面筛选栏,最准)→ 全网通用清单(免登录接口)→ 内置快照(离线兜底,只覆盖 6 个短清单)。界面上会如实标注当前用的是哪一份。
「求职类型」必须读登录态:实测这个标签的选项因人而异——登录后能看到「不限 / 全职 / 兼职 / 实习」,未登录时只能拿到「不限 / 全职 / 兼职」。写死一份就等于替所有用户决定了他们能选什么。
采集开始前会拿当次读到的清单逐项校验编码,核对不过的不发给站点,并如实计入「未能生效」单独提示——旧编码在站点看来同样"合法",发出去会静默筛错,那比不筛更糟。
采集记录
每次采集都有记录:按时间倒序列出条件与结果(已暂存 / 重复 / 失败原因),展开就能看那一次采到了哪些岗位,也可以在那里直接挑着导入。采集是个「跑完就看不见过程」的动作,没有这份记录,第二天就不知道上次按什么关键词、哪个城市采的。
采集条件历史
保存条件后会记一份快照(去重、上限 20),下次从「历史条件」下拉一键回填,也可清空。
保存本次抓到的站点原文
「开始采集」旁有一个默认不勾选的复选框「保存本次抓到的站点原文(用于排查解析问题)」。勾选后本次采集会把搜索与详情两个接口的响应原文存到 backend/data/captures/<站点>/。三条底线:
- 默认关闭、每次采集显式勾选——绝不默默记录。
- 不落任何凭据:URL 只保留 path,丢掉 query 与 fragment(query 里可能有站点内部参数甚至令牌),也不记录请求头、Cookie 与请求体。
- 只写进
backend/data/captures/:该目录不进仓库、不进备份、也不跟着数据集切换,绝不写进投递浏览器的登录态目录。
限额为一个采集最多 30 份、单份最大 2 MB,超限会记日志说明已停止保存,而不是静默丢弃。
15. 自动投递台
投递台驱动你本机的浏览器完成投递。它是最需要把边界说清楚的一个模块,下面按操作顺序讲。
投递专用浏览器
- 顶部标明当前对接的招聘网站(目前仅支持一个站点,后续会陆续增加)。
- 可以选自动 / Chrome / Edge / 自定义路径,并使用独立窗口运行。
- 显示调试端口与运行状态;可以「打开招聘网站」、启动或关闭浏览器、刷新状态。
- 登录由你自己做:应用不读取也不保存你的招聘网站账号密码,投递浏览器用的是独立的用户数据目录。
判断浏览器"是否在运行"的依据是调试端口能不能通,而不是应用是否持有进程句柄——哪怕窗口好端端开着、端口答得好好的,句柄也可能早就失效。另外「归谁」是一个独立事实:如果不是本次运行拉起的浏览器,应用不会按 PID 去猜进程(免得误关你自己的浏览器),「关闭浏览器」会返回 409 并提示你直接关掉那个窗口。
队列页的四步说明
队列页顶部常驻四步流程,这条说明是被用户反馈"点进来不知道下一步干什么"逼出来的:
- 岗位从哪来:岗位广场 → 岗位详情 → 加入投递台;自动采集导入也是同一个入口。
- 在这里核对什么:准入结论;不确定的先做匹配度分析。
- 需要时怎么改:点岗位名看详情 / 编辑,换简历、改招呼语。
- 什么时候才真的投出去:勾选后点「开始投递」;在那之前不会打开任何招聘网站。不勾选=按顺序投整个队列。
准入闸门:只接纳来源在招聘网站内的岗位
判据是「岗位的来源或投递链接能否归属到已注册的站点」,在入队与开始投递两处都拦一次:
- 不满足的岗位不会写进队列,并返回明确说明(当前支持哪些站点、请到对应网站手动投递)。
- 手动录入但贴了招聘网站投递链接的岗位照常允许——这比"必须用采集"更贴合实际用法。
- 队列里若有来源不支持的条目(只可能是闸门上线前的历史数据),在建批次之前一次性拦下并点名是哪几个岗位、怎么处理(移出队列),不会留下一批注定失败的条目。
- 失败分类里有专门的
site_unsupported(「岗位来源不支持自动投递」)。万一真漏到执行层,记录里写的是真实原因,而不是含糊的「未知失败」。 - 岗位详情的「加入投递台」对这类岗位直接禁用并把原因写在页面上,还给出出路:把投递链接改成该岗位在招聘网站上的地址即可自动投递。
开始投递与过程控制
- 一次「开始投递」=一个批次。批次在后台线程执行,切页面不打断。
- 逐岗位显示进度与当前步骤(打开页面 / 填表 / 招呼语 / 上传简历 / 提交 / 校验)。
- 支持暂停 / 继续 / 停止,以及连续失败熔断(避免在一串注定失败的岗位上耗时间)。
- 本会话里见过某批次进行中、随后进入终态时,会弹应用内通知(成功 / 失败 / 停止各有文案与统计),并尽力发一条系统桌面通知——仅在已授予通知权限时,绝不主动弹权限框。点通知跳回投递台。
- 按「同公司只投一个岗位」这类规则被跳过的条目会写明为什么跳过。
投递记录
投递记录按批次分组展示:组头显示批次号、时间、状态与该批次自己的统计(成功 / 失败 / 跳过),点击展开看组内每条记录。筛选(关键词 / 结果)作用在记录上、分页按批次计,没有命中记录的批次整体不出现。
每条失败记录都带:失败分类、失败详情、页面 URL 与标题、批次号、第几次尝试。失败分类取值如下:
| 分类 | 含义 | 通常怎么处理 |
|---|---|---|
login_required | 需要登录 | 到投递浏览器里重新登录 |
captcha_required | 需要验证码或安全验证 | 在浏览器里人工处理一次 |
selector_invalid | 页面结构变化 / 选择器失效 | 站点改版,需要等适配更新 |
greeting_missing | 招呼语缺失 | 给该岗位补一条招呼语 |
network_timeout | 网络超时 | 稍后重试 |
file_upload_failed | 简历上传失败 | 检查简历文件与格式 |
site_unsupported | 岗位来源不支持自动投递 | 移出队列,或把投递链接改成站内地址 |
unknown | 未知失败 | 看页面 URL 与详情判断 |
队列的编辑操作
- 可以改招呼语与所用简历;右键呼出操作菜单(编辑 / 移出队列)。
- 来源不支持的条目在「岗位」列标红,勾选框禁用,队列顶部给出一次性说明与两种处理方式。
- 后端拒收时弹提示而不给「仍然加入」按钮——这一类确认也没用。
16. 求职进度
侧栏在「投递台」之后。「投递台」记录的是动作(这个岗位投出去了、失败了),「求职进度」记录的是结果(对方走到哪一步了)。一家公司一个岗位一条记录。
状态与前进规则
状态走「已投递 → 筛选中 → 测评/笔试 → 面试 → Offer」,另有「已结束」(含拒信)与「待确认」两个不参与推进的状态。两条硬规则在界面与接口里共用同一份实现:
- 状态只能前进,拒信除外:乱序粘贴三个月前的「申请已收到」不会把已经在面试的进度打回去。
- 普通自动回执只能算「已投递」:不能从「感谢投递」推断出面试或 Offer。识别不出来就是「待确认」,由你自己判断。这两条是"漏斗只有一个口径"的保证。
录入与更新
- 自动记录:投递台投成功的岗位会自动记一条「已投递」(用条目上的快照字段,岗位被删掉也记得住)。
- 手动添加:直接填公司、岗位、状态、投递日期、下一步与备注。
- 从通知导入:把邮件、短信、站内通知粘进来,也支持截图与 pdf/docx。识别结果先预览再确认——面板上每条写明「会新增 / 会更新 / 没变化」和原因。识别接口只算不写,点确认才落库,且预览与执行用的是同一份合并计划。
- 合并按「公司 + 岗位」:同一组合只有一条记录。
列表与导出
- 顶部有四档状态统计(已投递 / 筛选中 / 测评笔试 / 面试 / Offer)与搜索框(公司、岗位、备注或下一步)。
- 每条显示投递日期、状态更新日期、来源(投递台自动记录 / 手动添加 / 识别导入)与依据(例如「9/19 收到一面反馈邮件」)。
- 导出 CSV / JSON:CSV 带 BOM,Excel 打开不乱码。
17. 日历提醒
提醒不只是「求职进度」页里的一个面板——首页也会展示近期提醒。
类型与紧急度
- 类型:面试、测评截止、HR 回复、其他。
- 紧急度分色:逾期 / 24 小时内 / 3 天内三档,一眼看出哪件最急。
- 绑定对象:可以关联到某条求职进度(点进去能看到绑定对象与备注)。
列表与月历
两种视图,偏好会被记住。月历里点任意一天就弹出那一天的完整安排:标题、类型、状态、时间与备注;没有安排时也会明确说「这一天没有安排」。明细内建在组件里,所以首页与进度页的行为不会漂移。
打开应用时弹出提醒
「设置 → 应用」里有「打开应用时弹出提醒」开关(默认开)。关掉之后启动不再弹近期提醒,需要自己进页面看。
18. 内推管理
记录通过人脉拿到的推荐机会,字段包括:内推人姓名、联系方式、与你的关系、对方职位、渠道(同事 / 朋友 / 校友 / 其他)、内推码与备注图片(内推海报截图之类)。
- 列表按状态分色:进行中 / 已投递 / 已关闭 / 无效,一眼区分哪些还在跟进。
- 状态可以推进到「已投递」「已关闭」;点卡片看详情,联系方式、内推码与备注大图都在抽屉里。
- 顶部统计内推转化率:口径由关联的求职进度派生——只有走到面试及以上才算转化。写入侧不接受手填 converted,避免"自己声明转化成功"这种不可信的数字。
19. 求职统计
侧栏「求职统计」,按四个主题汇总。趋势图的统计区间可选近 1 / 3 / 6 个月 / 1 年。
四个主题区块
| 区块 | 看什么 |
|---|---|
| 概览与转化 | 有效投递数、进面试数、Offer 率,以及六阶段漏斗。 |
| 转化与卡点 | 进行中的条数、超过 7 天没有更新的条数、没有下一步的条数。这个指标刻意不叫「面试卡住」——因为「最后更新时间」会被任何一次编辑刷新,它证明不了"面试官一直没联系"。 |
| 时间与节奏 | 月度趋势、周内投递分布、最近 7 / 30 天新增、待办提醒四档紧急度。 |
| 渠道与去向 | 内推转化与内推状态分布、投递最多的公司(按公司归并)、记录来源。 |
| 简历与健康度 | 简历份数、带一致性提醒与带【待补】的份数、待确认主张数、投递与简历的关联覆盖率。 |
诚实口径:没有数据的图不画零
这是这一页最值得说的一条设计:
- 有记录没填投递日期时,页面会单独提示「有 N 条未填、未计入」,而不是让它们消失。
- 当一张图的输入全空时,渲染明确空态,不画一排零轴——一张全零的趋势图会被读成「这几个月真的一份都没投」。
- 刻意不提供的指标会写明原因,而不是给一个编的数字:平均「投递 → 面试」天数、各阶段流失率、面试通过率(因为库里只有当前状态 + 一个状态日期,没有状态历史表,算不出来);按行业分布(全库无此字段);按岗位类型或每份简历看转化(录入界面上没有关联入口,属结构性为空)。后者的关联覆盖率会显示出来,让这个缺口可见。
20. 模拟面试
「模拟面试」页有三个页签:题库、面经、面试复盘(后两个见下一节)。这里讲面试本身。
开始一场面试
- 关联岗位:选了岗位后,问题会围绕这个 JD 与相关简历。
- 类型:技术面 / 项目深挖 / 行为面(STAR)/ HR 面 / 综合面 / 案例分析 / 英语面试 / 压力面。默认是综合面——技术面只是八种之一,把它当默认等于让非技术岗每次先改一次。
- 难度:初级 / 中级 / 高级。
- 面试官风格:严谨专业 / 温和引导 / 持续追问 / 压力质询。
- 轮数:3 ~ 12 轮。
- 面试官人设与考察重点:可留空,留空则按面试类型通用考察。
逐轮作答
面试官先提问,你作答,面试官会点评上一答并追问,然后问下一轮。每轮都显示当前进度(第几轮 / 共几轮)。中途可以结束。
结束后的报告
走完全部轮数或手动结束后,生成一份报告:
- 总分(0–100);
- 维度评分:每个维度带一句评语,例如「专业能力 80:活动策划与转化分析的链路讲得完整,会员分层是加分项」;
- 优势与改进建议列表;
- 总结一段。
报告生成失败时不会给一份空壳,而是标明失败原因,界面按「无报告」处理。面试记录可以一键存进资料箱,方便日后复盘。
21. 个性化题库与面试复盘
个性化题库
按关联岗位与资料生成三类题目:基础 / 项目深挖 / 反问 HR。每道题都带:
- 考察意图(这道题在验什么);
- 一句话回答提示(回答的落脚点);
- 可选的详细参考答案:点单题的「生成参考答案」,得到正文 + 要点 + 一句可套用的话术。
生成完成会自动写入历史记录,不用手点保存。之后从历史打开时,交互与刚生成时完全一致——参考答案能点、能补生成,新生成的结果会回写到同一条历史。旧版纯文本历史仍可查看并提示「仅可查看」,不会崩。
面经(面试经验)
沉淀面试经验:公司、岗位、轮次类型、难度、面试日期、来源(自己 / 同学 / 公开)、题目清单、复盘正文与标签。可按公司、岗位、标签检索。点卡片看详情:正文与完整问题清单在抽屉里。
面试复盘
把真实面试里遇到的问题录进来,得到:
- 答题框架:把几个问题归到同一个考点上讲清回答顺序;
- 要点:回答里必须出现的内容;
- 可能的追问;
- 常见误区:哪些说法会让你被追着打;
- 反向优化简历:把面试暴露的短板与高频追问,转成具体的简历改写建议(只产出建议列表,不直接改你的正文)。
复盘结果同样生成即自动存历史,可回看、可删除(删除进回收站)。
22. 面试深挖
入口在「事实台账」页的「拿去深挖」按钮。它按台账里已确认的条目逐条做压力测试,回答的是:这条主张我到底讲不讲得清、哪里还站不住。
三条刻意的设计
- 提问前先锁定评分契约。每道题在生成时就把「要验证什么、必须听到哪些证据、什么情况该追问、什么情况可以结束」写进库里,之后不因回答得流利而放宽。这是防"事后改标准"的唯一办法,也是它与"给个分数"最根本的区别。
- 用证据状态代替分数。判定只有五种:已验证 / 部分验证 / 未验证 / 存在矛盾 / 未覆盖。界面与接口都不出现任何总分。
- 不做推断。模型只能依据你真实说过的内容给状态;说「这次算过了」却列不出任何证据时,一律不判成「已验证」。
逐轮追问怎么决定
追问类型按缺口选,而不是机械遍历:背景 / 职责 / 结构 / 实现 / 决策 / 替代方案 / 失败与排查 / 指标口径 / 代价 / 复盘。答得清楚就换下一条主张,答不清楚就沿缺口继续追问(有追问深度上限)。
两种反馈模式
- 真实模拟(默认):每题后不念判定,只在结束时统一复盘。念了会让人按判分标准答题,而不像真面试。
- 训练模式:每题后立刻给一段简短反馈,适合第一次练。
判定本身在两种模式下都会如实记录。
复盘与复练
- 结束时给出「该去补什么」的清单,行动项落到三选一:补事实 / 补知识 / 降表述。
- 复练队列只收「部分验证 / 未验证 / 存在矛盾」的主张。
- 复练不重复原题——换角度出变体题、反事实题、故障题、证据题或压缩表达题。把上次的答案背一遍不算会了。
- 求职助手可以读深挖记录帮你复盘(
list_drill_sessions/get_drill_report),但开不了新的深挖:标准必须先按主张锁定,且需要你自己逐轮作答。
23. 求职助手
用「设置」里配置的模型做流式问答,会话历史保存在本地。
上下文由你决定
- 关联岗位 / 简历:勾选后把这部分内容作为上下文带进回答。
- 包含个人资料:开关式,默认关闭。
- 附件:可以上传文本或图片,一并参与回答。
- 联网搜索:按需开启,来源、抓取正文条数等在「设置」里可调;多个来源会并发查询后合并去重。
- 思考强度:可选档位;开启后回复下方会出现默认折叠的「思考过程」面板,流式生成过程中就能展开看,历史消息里也能回看。没有思考内容时整块不渲染。
- 来源可点击:开启联网后正文里的
[来源N]编号可以点击跳到原文。编号是全局稳定的(跨自动预搜与所有工具搜索共用一个计数器,并持久化进消息),所以模型当时看到的第 N 条就是你点到的第 N 条。映射缺失或编号越界时退化成纯文本——宁可不可点,也不跳错。
它能查什么、能改什么
助手的读工具覆盖:岗位、简历、事实台账、资料箱、知识库、提醒、内推、面经、题库历史、复盘历史、深挖记录、求职统计看板与分享包列表。写工具只有三类:增改知识库、新增提醒,以及在模板工作台里新建或修改格式模板。
它的行为准则写在系统提示最前面:不知道就说不知道;只在明确要求时才写数据;涉及用户数据必须用工具查证后再答;绝不编造。
它没有任何删除能力。这一条是产品边界,不是能力缺失——让一个会误解指令的模型掌握删除权限,代价远大于收益。它也不能替你确认台账条目,也不能生成完整 HTML 样式模板(模型长篇写 HTML 容易出错,且保存前会做安全清洗,用户可能拿到"看起来生成了、其实不对"的结果)。
会话管理
- 支持重命名、置顶、收藏、复制分享链接、在新对话中继续、移动到分组、归档与删除(删除进回收站)。
- 导出为 Markdown,或一键存进资料箱。
- 消息带发送时间、可引用追问、可单条删除或多选批量删除。
- 首次进入有内置引导对话,帮你理解它能做什么。
24. 工作台:助手技能
「工作台 → 助手技能」用来把反复交代的偏好固定下来。一个技能由两部分组成:
- 提示词:约束助手的作答风格与角色,例如「你是严格的面试官,优先追问数字口径」。
- 知识文件(可选):随技能携带的参考内容,助手按需读取,不会一直占用上下文。限制是单文件 ≤ 20000 字符、合计 ≤ 60000 字符、最多 10 个文件。
新建、导入与启用
- 新建技能:填名称、描述、提示词,可以加知识文件。
- 导入:支持
.md单文件或.zip技能包(也可以把文件直接拖进对应区域)。 - 启用:列表里显示每个技能带几个知识文件、是启用还是停用。
- 在助手页勾选开关:同一时间启用哪些技能由你在对话页决定。
25. 工作台:简历模板
「工作台 → 简历模板」分两类,这个区分很重要:
| 样式模板 | 格式模板 | |
|---|---|---|
| 管什么 | 简历长什么样(HTML + Jinja 语法) | 一组版式参数 |
| 参数 | — | 强调色、正文颜色、辅助文字颜色、分隔线颜色、字号系数(0.88–1.16)、行高(1.2–2.2)、页边距(8–26mm)、区块间距(0.6–2.2) |
| 怎么来 | 复制内置改一份,或导入自己的 HTML | 新建,或在助手页让求职助手创建 / 修改 |
| 用在哪 | 生成或编辑简历时选择 | 叠加在任意样式之上 |
内置样式用真实缩略图
「内置样式」不是一排文字标签,而是每个样式一张真实效果的 A4 同比例缩略图,点开看大图。这些缩略图是由同一条渲染接口加内置示例简历生成的真实模板缩放 iframe,不是另画的示意图——示意图会随模板演进悄悄脱节。每张独立成败:某张渲染失败只留占位,不会把整块墙打掉。
自制样式模板的注意事项
- 自制模板会注入与内置模板相同的正文片段与样式变量,所以点击纸面上的字段定位编辑照旧可用。
- 模板里的
<script>会被剥离:预览与导出都在浏览器里执行,模板不需要脚本,而脚本是最容易被写坏的一环。 - 同名视为改同一份模板(upsert)。
- 内置模板不在这个表里——它们是随包发送的模板文件。放在表里会让「升级应用」变成「覆盖用户数据」。
让求职助手帮你做
模板工作台的「格式模板(版式)」卡片上有「找求职助手制作」入口(格式模板行还有「找助手改这个模板」)。跳转时会在助手页预填提问——只预填、不自动发送,你可以改完再发。助手只能新建 / 修改格式模板,不能改样式模板,原因见上一节。
26. 资料箱与知识库
两个模块长得像,分工要分清:资料箱放还没成体系的零散材料,知识库放已经整理成文、愿意反复看的内容。
| 资料箱 | 知识库 | |
|---|---|---|
| 放什么 | 证书、作品、链接、笔记、实习材料、校园材料 | 面经总结、简历技巧、求职策略、面试问答、公司信息、行业知识 |
| 字段 | 标题、分类、正文、URL、附件、备注 | 标题、分类、标签、Markdown 正文 |
| 典型用法 | 「这张证书扫描件放哪了」 | 「这条经验我想反复看」 |
共同的操作
- 搜索:标题、正文或备注都能搜到。
- 分类与标签筛选。
- 点卡片看详情:右侧抽屉里显示正文全文、备注与附件清单/正文;抽屉里带「编辑」等后续动作。卡片用
role="button"而不是<button>(卡片里还有编辑/删除按钮,按钮套按钮是无效 HTML),点击时会跳过内层可交互元素——否则点「删除」会顺带打开详情。键盘 Enter / 空格同样可打开。 - 删除进回收站,可恢复。
- 助手可检索:助手能读取资料箱与知识库,也能增改知识库(新建与更新),但不能删除。
27. 回收站
十类内容删除后都不会真的消失,而是先进回收站:岗位、简历记录、投递记录、事实台账、资料箱材料、助手会话、内推、提醒、面经、分享包(题库历史与面试复盘历史同样在其中)。
怎么用
- 十类内容混排在一张表里,带类型标签与删除时间——用户来找的往往是"前几天删掉的那个",只有标题没有时间等于让他一条条点开看。
- 可按类型筛选,并显示每类的条数。
- 恢复一键就行(安全操作,不做二次确认);彻底删除与清空都要二次确认,确认文案把后果说白:「将被永久删除,无法恢复」。
- 删除成功的提示是「已移入回收站,可在「回收站」里恢复」——措辞说成「已删除」等于告诉用户东西没了,而它其实在等着。
升级应用不会把你以前的数据"送进回收站"。给六张表各加一列 deleted_at 时,旧记录的新列必须是 NULL——若默认成时间戳,升级后用户所有历史数据会一次性全部出现在回收站里,看起来就像"数据全被删了"。这一条有专门的测试钉住。
28. 全局搜索
首页顶部的搜索框是一个入口,覆盖 8 类内容:岗位、简历、内推、提醒、面经、事实台账、资料箱、助手技能。输入关键词回车即可。
它的价值在于「不用先想这东西在哪个模块」:你记得住的往往不是标题,而是备注里或正文里的那一句话,所以只搜标题的搜索框基本等于没有。
29. 数据、备份与隐私
数据存在哪
- 主数据库:
backend/data/resume_forge.db(SQLite),保存岗位、资料、照片、简历、台账、会话、提醒、内推等全部内容。 - 多份数据集:
backend/data/datasets/,每份数据集各占一个数据库文件。 - 投递浏览器登录态:
backend/data/browser-profile/(独立目录,应用不读取其中内容)。 - 采集原文(仅在勾选时):
backend/data/captures/。 - 备份:
backend/data/backups/(部分修复脚本写库前会自动整体复制一份)。
数据集:多份数据与备份
- 新建空白数据集:从零开始一份。
- 导出:导出当前预览到的那一份。
- 导出全部数据集:列表里不止一份时出现,把当前这份加上其余每一份装进同一个包。
- 导入备份为新数据集:导入后列表里会多出一份,点「切换」把应用切过去,页面会自动重新加载。恢复出来的数据集用全新标识——沿用包里的 id 会覆盖本机早已存在的那一份,不可逆。
格式号随内容变化。只有活动数据集时仍是格式 1(老版本照常可读、旧备份照常可导入);一旦带上其余数据集就标成 2,老版本会明确拒收(「请先升级应用再导入」),而不是安静地只恢复一份——放行就等于让用户以为恢复成功了。
导入是「要么全成、要么不动」:包里所有数据集先全部校验完再开始写盘。边写边验的下场是——后面某份不合法时前面几份已经落盘,用户看到一次失败、列表里却多出几份半截的数据集。
包内路径不可信:清单里的 file 只认 datasets/<合法 id>.db 这一种形状,指向主库成员或带 .. 的一律拒收。
哪些内容会离开本机
| 动作 | 会不会出网 | 发出去什么 |
|---|---|---|
| AI 生成简历 / 需求解读 / 匹配分析参考分 | 会 | 岗位 JD、资料中相关字段、台账里「已确认」的条目 |
| 写作增强四件套 / 质量检查中需模型的部分 | 会 | 你要变换的那段文本与必要的背景 |
| 求职助手对话 | 会(开启联网搜索时另加搜索请求) | 你的提问 + 你选择关联的上下文 |
| 模拟面试 / 题库 / 复盘 / 面试深挖 | 会 | 岗位与资料的相关部分、你的作答 |
| 自动采集 / 自动投递 | 会 | 招聘网站的搜索与投递请求(你本机发起的) |
| 本机资料管理 / 岗位管理 / 手写简历 / 版式渲染 / 导出 | 不会 | — |
| 照片 | 不会 | 照片不发送给模型;导出时才会写进文件 |
补充两条边界:文档识别时文档文字在本机提取,原始文件不上传、不入库;导出数据集时自动剥离 API Key。默认只监听回环地址(127.0.0.1),不对外提供访问。
30. 升级与回滚
用压缩包更新
在项目目录下运行 update.cmd:它会备份当前程序文件、拉取新版本并替换程序文件,data/ 与 .env 不受影响。数据库结构变化由迁移脚本自动处理,旧备份仍可导入。
用 Git 更新
git pull
# 依赖有变化时
cd backend && .venv\Scripts\python.exe -m pip install -r requirements.txt
cd frontend && npm install
回滚要留意
- 回滚程序文件不会自动回滚数据库结构。如果新版本跑过迁移、往库里加了表或列,退回旧版本后这些表列仍在——通常无害(旧版本不认),但不会自动消失。
- 反过来的情况更要小心:新格式的备份包在旧版本里会被明确拒收,而不是只恢复一部分。看到「请先升级应用再导入」,就说明包里带了旧版本读不懂的内容。
- 升级前把「导出全部数据集」做一次,是最省事的保险。
卸载
运行 uninstall.cmd。默认保留数据(data/ 与 .env),需要一并删除时按提示确认。
31. 常见问题排查
点「检查更新」报 GitHub 返回了 HTTP 301
这是 v0.10.0 的已知问题,已在 v0.10.1 修掉。项目仓库从 Magicapple-Coder/ResumeForge 改名为 magicapple123/ResumeForge 后,GitHub 对旧地址返回 301 重定向;而应用获取新版本信息时刻意不跟随重定向(这样「仓库不存在」这类情况会被如实报出来,而不是被重定向悄悄带到别处),于是检查更新就失败了。
坏掉的正是「获取新版本信息」这条路本身,所以没有别的补救途径——直接到官网或 Releases 页面下载 v0.11.0 手动更新一次即可,之后的检查更新就正常了。用 update.cmd 更新不会动 data/ 与 .env。
双击 start.cmd 后一直打不开页面
看启动器窗口最后几行提示。常见原因:首次安装的依赖还没装完(首次通常几分钟);端口被占用(换 -BackendPort 8010);网络被拦导致依赖装不上(提示里会给国内镜像命令)。手动访问 http://127.0.0.1:8005/api/health,能看到 {"status":"ok"} 说明后端正常,问题在前端。
提示 Python 版本不支持
Python 3.14 暂不支持。用一键启动器的话它会自动准备一个 3.12,无需你手动处理;手动启动时请用 3.12 或 3.13 建虚拟环境。
自定义模型连接失败
按顺序检查:Base URL 是否与协议匹配(Claude 原生协议要用 https://api.anthropic.com,走 OpenAI 兼容层则带 /v1);模型名是否在「获取可用模型」的列表里;API Key 是否有效;代理是否拦截。设置变更后记得点「测试连接」,界面会回显服务端返回的原始错误,比"失败"两个字有用得多。
提示「当前模型不支持图片输入」
你选用的模型不具备多模态能力。换成支持图片的模型,或把截图里的文字手动敲进文本框——后者用本地规则也能解析出部分字段。
上传图片提示「内容与扩展名不符」
文件本身既不是图片、扩展名也不像图片,应用拒绝了这次识别请求。确认文件是否损坏,或改用正确的文件。
上传的文档没有被识别出内容
多半是扫描版 PDF(整页都是图片,没有文字层)。这种情况本机提取不到文字,请改为贴图识别,或先在别处做一次 OCR。
识别后的字段不准确
识别是"草稿"不是"结果"。日期、数字、公司全称这几类字段请逐条核对,尤其是从长图或复杂排版里识别的。
AI 功能提示未配置或输出中断
未配置:去「设置 → AI 模型」填配置并测试连接。输出中断:多数是网络或服务商的限流,可以重试;生成任务支持取消后重来,不会留下半成品简历。
生成简历时关掉弹窗了,白跑了吗
没有。生成是后台任务,关掉弹窗会继续跑,完成后弹通知并打开预览。想确认进度可以看「简历中心」里该条目下的生成任务状态。
导出被拦下,说正文里有【待补】标记
这是设计而非故障。回去补完占位符,或在弹窗里选「仍要导出草稿」。标记只有这四种写法会被拦:【待补…】【待确认】【待补充】【待核实】——正文里正常出现的"待补充说明"之类不会被误伤。
浏览器打印的页数和屏幕上不一样
屏幕上的多页是按 A4 高度切分的近似分页,浏览器打印是权威结果。浏览器不向 JS 暴露真实打印页数,应用内算不出来,所以只能如实说明这个差别。要完全一致,用「导出 PDF」(服务端生成)而不是浏览器打印。
自动采集没采到东西
看「采集记录」里那一次的失败原因。常见:关键词太窄或城市选错;站点筛选条件核验未通过(界面上会单独提示「未能生效」);需要登录(去投递浏览器里登录一次)。采集结果也会进「本次采集结果」,别忘了去那里勾选导入。
自动投递一直失败
看投递记录里每条的失败分类。需要登录 / 验证码的,去投递浏览器里人工处理一次;选择器失效说明站点改版,需要等适配更新;来源不支持的,把投递链接改成该岗位在招聘网站上的地址。
「关闭浏览器」点了但窗口还开着
那个浏览器不是本次运行拉起的,应用只会关自己持有的句柄,绝不按 PID 猜进程(免得误关你自己的浏览器)。直接关掉那个窗口即可。
打开后数据像是空的
多半是不小心切到了另一份数据集。「设置 → 数据」里标着「当前」的那一份才是正在使用的。切回去即可。
求职统计里的图是空的
图上是空态说明而不是零轴,这是诚实口径:没有可画的数据时不画一张全是 0 的图。看页面上的提示,它一般会说明是哪几个字段没填(最常见是投递日期)。
助手回答里有些地方说"不知道"
这是它的行为准则要求的结果:不知道就说不知道,而不是编一个。如果你觉得它该知道,检查一下相关内容是否已经录进系统(换一种问法、或明确让它去查某个模块试试)。
32. 界面细节与快捷键
键盘
| 按键 | 作用 |
|---|---|
| Ctrl + V | 在识别区粘贴截图 |
| Enter / 空格 | 在列表卡片上打开详情抽屉(可点击卡片有焦点描边) |
| 右键 | 投递队列行的操作菜单(编辑 / 移出队列) |
| 方向键 / 拖拽 | 首页界面画廊左右滚动 |
到处都一样的几处细节
- 日期字段都是日历点选(投递日期、发布日期、核实日期、内推提交日期等),不用手敲格式。
- 列表与卡片点一下就能看详情:内推、资料箱、面经、提醒、知识库、投递队列、投递记录统一用同一种抽屉,排版与关闭方式一致。
- 含义不自明的标签都有悬停说明(美化档位、来源标记、状态标签等)。
- 滚动条统一样式:只调外观、不动尺寸语义——滚动条仍按需出现,不会因为样式而消失(那会让「这里能不能滚」变得无法判断)。
- 应用内通知:批次完成、保存成功等会以通知形式给出,并说明下一步去哪。
- 侧栏顺序即分组:找岗位 → 做简历 → 投递跟进 → 面试准备 → 我的数据 → 系统。不加分组标题——侧栏只有 200px,加标题会把 16 项挤成两屏。
开发与排错相关
- 本地
npm run dev时按住 Alt + Shift 点击页面元素,会自动在 VS Code 里定位到对应源码行(仅开发环境生效)。 - 截图与动图都是脚本从真实运行的实例采集的,脚本在官网仓库的
tools/下:seed_demo_full.py(造演示数据)、capture_shots.py(采集)、build_images.py(生成部署图片)。
还没解决?
文档没覆盖到的问题,欢迎到 GitHub 提 Issue。仓库里还有更偏技术的文档:架构设计、提示词清单、升级与数据安全说明。