集团招聘网站设计文档
日期: 2026-03-24
状态: 已确认
1. 项目概述
为中型集团(5-20 家子公司)构建一个内部招聘网站,类似智联招聘但更简洁。支持多公司多角色管理,求职者可注册登录、搜索职位、在线填写或上传简历进行投递。
2. 技术栈
| 层级 |
技术选型 |
| 前端 |
Vue 3 + Vue Router + Pinia + Element Plus |
| 后端 |
Django 4.2 + Django REST Framework |
| 认证 |
djangorestframework-simplejwt(JWT) |
| 数据库 |
PostgreSQL |
| 缓存 |
Redis |
| 文件存储 |
本地存储(初期),后期可切换至对象存储(OSS) |
| 部署 |
Nginx + Gunicorn |
3. 架构方案
方案:Django 后端 + 单个 Vue3 SPA(前后端分离)
前端单页应用通过 Vue Router 划分三个区域,使用路由守卫控制访问权限。后端提供 RESTful API,Nginx 反向代理静态资源和 API 请求。
用户浏览器
│
▼
Nginx
├── / → Vue3 静态文件
└── /api/ → Django (Gunicorn)
├── 认证模块
├── 职位模块
├── 投递模块
└── 组织架构模块
│
PostgreSQL + Redis
4. 用户角色
| 角色 |
标识 |
权限说明 |
| 超级管理员 |
superadmin |
管理组织架构、所有用户、查看全局职位 |
| 公司管理员 |
admin |
管理本公司职位、处理本公司投递记录 |
| 求职者 |
seeker |
注册登录、搜索职位、管理简历、投递职位 |
5. 数据模型
Organization 组织架构
| 字段 |
类型 |
说明 |
| id |
PK |
主键 |
| name |
CharField |
公司名称 |
| parent |
FK(self, null) |
父级公司(集团为 null) |
| logo |
ImageField |
公司 Logo |
| description |
TextField |
公司简介 |
| email |
EmailField |
公司联系邮箱 |
| is_active |
BooleanField |
是否启用 |
User 用户
| 字段 |
类型 |
说明 |
| id |
PK |
主键 |
| username |
CharField |
登录账号 |
| email |
EmailField |
用户邮箱 |
| phone |
CharField |
手机号 |
| role |
CharField |
superadmin / admin / seeker |
| organization |
FK(Organization, null) |
所属公司(admin 角色使用) |
| is_active |
BooleanField |
账号状态 |
Job 职位
| 字段 |
类型 |
说明 |
| id |
PK |
主键 |
| organization |
FK(Organization) |
所属公司 |
| title |
CharField |
职位名称 |
| category |
CharField |
职位类别 |
| location |
CharField |
工作地点 |
| salary |
CharField |
薪资范围 |
| description |
TextField |
职位描述(富文本) |
| status |
CharField |
draft / published / closed |
| created_at |
DateTimeField |
创建时间 |
Resume 简历
| 字段 |
类型 |
说明 |
| id |
PK |
主键 |
| user |
FK(User) |
所属求职者 |
| name |
CharField |
姓名 |
| gender |
CharField |
性别 |
| birthday |
DateField |
出生日期 |
| education |
JSONField |
教育经历列表(PostgreSQL JSONB) |
| experience |
JSONField |
工作经历列表(PostgreSQL JSONB) |
| attachment |
FileField |
简历附件(PDF/Word) |
Application 投递记录
| 字段 |
类型 |
说明 |
| id |
PK |
主键 |
| job |
FK(Job) |
投递的职位 |
| applicant |
FK(User) |
求职者 |
| resume_snapshot |
JSONField |
投递时将简历内容序列化复制存储,与 Resume 主表解耦 |
| status |
CharField |
pending / viewed / interviewing / hired / rejected |
| note |
TextField |
HR 备注 |
| applied_at |
DateTimeField |
投递时间 |
6. 页面结构与路由
公开门户(无需登录)
| 路由 |
页面 |
说明 |
/ |
首页 |
职位推荐、公司展示、搜索入口 |
/jobs |
职位列表 |
搜索+筛选(公司/地点/薪资/类别) |
/jobs/:id |
职位详情 |
职位描述、要求、投递按钮 |
/companies |
公司列表 |
所有子公司展示 |
/companies/:id |
公司详情 |
公司介绍 + 在招职位 |
/login |
求职者登录 |
管理员也使用此页面登录,通过 role 跳转不同后台 |
/register |
求职者注册 |
- |
求职者中心(seeker 登录后可访问)
| 路由 |
页面 |
说明 |
/seeker/resume |
我的简历 |
填写/编辑在线简历 + 上传附件 |
/seeker/applications |
我的投递 |
投递记录列表 + 状态追踪 |
/seeker/profile |
账号设置 |
修改密码/邮箱/手机号 |
管理后台(admin/superadmin 登录后可访问)
| 路由 |
页面 |
权限 |
/admin/jobs |
职位管理 |
admin(本公司)/ superadmin(全局只读) |
/admin/applications |
投递管理 |
admin(本公司) |
/admin/organizations |
组织架构管理 |
superadmin 专属 |
/admin/users |
用户管理 |
superadmin 专属 |
路由守卫规则
- 未登录访问
/seeker/* → 跳转 /login,登录后返回原页
- 未登录访问
/admin/* → 跳转管理员登录页
- admin 角色访问 superadmin 专属页 → 403
- seeker 角色访问
/admin/* → 403
7. 关键业务流程
流程 1:求职者投递
- 求职者浏览职位详情,点击"投递"
- 检查是否已登录,未登录跳转注册/登录页
- 检查简历是否填写完整,未完善提示引导至简历页
- 弹出投递确认框,确认后创建 Application 记录(status: pending)
- 投递成功提示,可在"我的投递"查看进度
流程 2:HR 处理投递(状态流转)
待查看(pending) → 已查看(viewed) → 面试中(interviewing) → 已录用(hired)
→ 已拒绝(rejected)
- 每次状态变更通过 Django 内置邮件后端(SMTP)同步发送通知邮件给求职者
- HR 可在任意阶段填写备注
流程 3:公司管理员发布职位
- 填写职位信息(标题、描述、薪资、地点、类别)
- 保存草稿(status: draft)或直接发布(status: published)
- 需要停止招聘时手动关闭(status: closed)
- 权限隔离:管理员只能操作本公司职位
8. Django App 划分
offer_backend/
├── apps/
│ ├── accounts/ # 用户认证、角色管理
│ ├── organizations/ # 组织架构(集团/子公司)
│ ├── jobs/ # 职位管理
│ ├── resumes/ # 简历管理
│ └── applications/ # 投递记录
9. 项目目录结构
offer/
├── offer_backend/ # Django 后端
│ ├── apps/
│ ├── config/ # 设置、URL、wsgi
│ ├── manage.py
│ └── requirements.txt
└── offer_frontend/ # Vue3 前端
├── src/
│ ├── views/
│ │ ├── portal/ # 公开门户页面
│ │ ├── seeker/ # 求职者中心页面
│ │ └── admin/ # 管理后台页面
│ ├── stores/ # Pinia 状态管理
│ ├── router/ # Vue Router
│ └── api/ # API 请求封装
└── package.json