OfferNow —— 面试刷题助手,助你快速拿 Offer
基于大模型的智能面试刷题工具:上传简历、选择职位描述(JD),AI 自动生成个性化面试问答(基础知识、专业技能、项目经验、团队精神),支持流式生成、追问、背题练习与评分。内置 JD 模板库按 行业大类 → 职能方向 → 岗位名称 三层组织,管理员可增删改并调用大模型生成 JD 正文。
首页
AI 出题
面试详情
背题练习
后端 :Python 3.9+ / FastAPI / SQLAlchemy 2(Async)/ PostgreSQL / Alembic
AI :OpenAI 兼容接口(通义千问等),默认走 DashScope + qwen-plus
前端 :React 19 / TypeScript / Vite 5 / Tailwind CSS 4 / React Router 6
页面
路径
说明
AI 出题
/user/generate
上传简历(PDF/docx)、选择 JD 模板,AI 流式生成 12 题(4 类别×3 难度),支持继续生成与补充提示
公共题库
/user/public-pool
浏览内置职位及其公开面试题,无需登录
我的题库
/user/history
查看历次面试会话,进入会话详情与题目详情
今日练习
/user/recite
从指定题库抽题背诵,AI 评分(0-100)+ 熟练度(1-5 星),记录练习历史
我的简历
/user/resumes
管理已上传的简历文件(预览/删除)
题目详情
/user/session/:id/qa/:id
查看问答、追问、划选段落 AI 解释、按意见优化答案
页面
路径
说明
JD 模板管理
/admin/jd
按三层分类增删改查岗位模板,预览生成 JD、一键重新生成 JD 正文
默认连接串(仅限本地开发,勿用于生产):postgresql+asyncpg://postgres:password@localhost:5432/ai_interview
cd backend
python3 -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install -r requirements.txt
cp .env.example .env
# 编辑 .env:必须填写 DATABASE_URL、ADMIN_PASSWORD、JWT_SECRET_KEY
# 以及 QWEN_API_KEY 等 LLM 配置
alembic upgrade head
python seed_jd_templates.py
# 可选:导入约 100+ 条内置职位(需配置 QWEN_API_KEY)
python seed_builtin_jds.py
uvicorn app.main:app --reload --host 0.0.0.0 --port 8000
cd frontend
cp .env.example .env.local
npm install
npm run dev
访问 http://localhost:5173(Vite 默认端口)。
变量
说明
必填
DATABASE_URL
PostgreSQL 异步连接串
是
QWEN_API_KEY
阿里云 DashScope API Key
否*
QWEN_MODEL
模型名,默认 qwen-plus
否
QWEN_OCR_MODEL
多模态 OCR 模型,默认 qwen-vl-ocr-latest
否
LLM_BASE_URL
任意 OpenAI 兼容服务的 base URL(以 /v1 结尾)
否
LLM_API_KEY
LLM 服务 API Key(优先级高于 QWEN_API_KEY)
否
LLM_MODEL
LLM 模型 ID(优先级高于 QWEN_MODEL)
否
ADMIN_USERNAME
管理员用户名,默认 admin
否
ADMIN_PASSWORD
管理员密码(无默认值,必须配置 )
是
JWT_SECRET_KEY
JWT 签名密钥(未配置时每次启动随机生成,重启后 Token 失效)
推荐
JWT_ACCESS_TOKEN_EXPIRE_HOURS
Token 有效期(小时),默认 24
否
CORS_ORIGINS
允许的前端源,逗号分隔
否
OSS_ENDPOINT
阿里云 OSS Endpoint(不填则简历上传不可用)
否
OSS_BUCKET
OSS Bucket 名称
否
OSS_ACCESS_KEY_ID
OSS AccessKey ID
否
OSS_ACCESS_KEY_SECRET
OSS AccessKey Secret
否
OSS_PUBLIC_BASE_URL
OSS 公开访问域名前缀(可选)
否
* 未配置时 LLM 接口返回演示用占位内容,便于 UI 联调。
变量
说明
必填
VITE_API_BASE
后端根 URL,留空则走 Vite 代理
否
ai_interview/
├── backend/ # FastAPI 应用
│ ├── app/
│ │ ├── routers/ # API 路由(auth_user / interviews / jd_templates / public_pool / admin)
│ │ ├── services/ # 业务逻辑(AI 对话 / OSS 存储 / 简历解析 / 抽题)
│ │ ├── utils/ # 工具函数(密码 / 熟练度)
│ │ ├── models.py # SQLAlchemy 数据模型
│ │ ├── schemas.py # Pydantic 请求/响应模型
│ │ ├── config.py # 配置管理(从 .env 读取)
│ │ └── main.py # 应用入口
│ ├── alembic/ # 数据库迁移
│ └── scripts/ # 种子脚本(内置 JD / 公共题库)
├── frontend/ # React SPA
│ └── src/
│ ├── pages/user/ # 用户端页面
│ ├── pages/admin/ # 管理端页面
│ ├── components/ # 公共组件
│ ├── api/client.ts # API 调用(axios)
│ └── lib/ # 工具函数(Token / 认证 / NDJSON 解析)
├── docker-compose.yml # PostgreSQL 容器
├── LICENSE # MIT 开源协议
└── README.md
方法
路径
说明
POST
/register
用户名 + 密码注册
POST
/login
密码登录,返回 JWT
GET
/me
当前用户信息
方法
路径
说明
POST
/create
创建会话(上传简历 + JD)
POST
/{id}/generate
生成问答(非流式)
POST
/{id}/generate-stream
流式生成问答(NDJSON)
GET
/{id}
会话详情(含全部 QA)
GET
/history
历史会话列表
PATCH
/{id}
修改会话标题
DELETE
/{id}
删除会话
PATCH
/qa/{id}/favorite
收藏/取消收藏
POST
/qa/{id}/followup
生成追问
GET
/qa/{id}/followup-suggestions
推荐追问列表
POST
/qa/{id}/explain-stream
划选段落流式解释
POST
/qa/{id}/refine-answer
按意见优化答案
方法
路径
说明
POST
/upload-resume
上传简历文件(PDF/docx)
GET
/stored-resumes
已上传简历列表
GET
/stored-resumes/{id}/file
下载简历原件
DELETE
/stored-resumes/{id}
删除简历
POST
/recommend-positions
简历 → 职位推荐
POST
/parse-jd
智能解析 JD(文本/URL/截图)
背题练习 /api/interviews/recite
方法
路径
说明
POST
/daily
今日抽题(按类别/难度/熟练度筛选)
PUT
/mastery/{qa_id}
手动设定熟练度星数
POST
/grade
提交答案并 AI 评分
POST
/practice-runs
开始练习
PUT
/practice-runs/{id}/finish
结束练习
GET
/practice-runs
练习记录列表
GET
/practice-runs/{id}
练习详情
GET
/practice-runs/{id}/submissions
单次练习的提交记录
DELETE
/practice-runs/{id}/submissions
清空提交(重新答题前)
方法
路径
说明
GET
/
按行业/职能筛选岗位模板
GET
/meta
行业与职能方向元数据
方法
路径
说明
GET
/builtin-jobs
内置职位列表(含公开题数)
GET
/templates/{id}
职位信息 + 公开面试题
方法
路径
说明
POST
/login
管理员登录
GET
/jd-templates
全部 JD 模板
POST
/jd-templates/preview-generate
预览生成 JD
POST
/jd-templates
新增岗位模板
PUT
/jd-templates/{id}
修改模板
POST
/jd-templates/{id}/regenerate-jd
重新生成 JD 正文
DELETE
/jd-templates/{id}
删除模板
本项目基于 MIT License 开源。