From 06878975b7fa222b6d7c793a0e541adb4c1d45cf Mon Sep 17 00:00:00 2001 From: TianyangZhang Date: Tue, 24 Mar 2026 16:32:40 +0800 Subject: [PATCH] docs: add recruitment website design spec --- .../2026-03-24-recruitment-website-design.md | 217 ++++++++++++++++++ 1 file changed, 217 insertions(+) create mode 100644 docs/superpowers/specs/2026-03-24-recruitment-website-design.md diff --git a/docs/superpowers/specs/2026-03-24-recruitment-website-design.md b/docs/superpowers/specs/2026-03-24-recruitment-website-design.md new file mode 100644 index 0000000..b55b980 --- /dev/null +++ b/docs/superpowers/specs/2026-03-24-recruitment-website-design.md @@ -0,0 +1,217 @@ +# 集团招聘网站设计文档 + +**日期:** 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 | FK(Resume) | 投递时关联的简历(快照) | +| status | CharField | pending / viewed / interviewing / hired / rejected | +| note | TextField | HR 备注 | +| applied_at | DateTimeField | 投递时间 | + +--- + +## 6. 页面结构与路由 + +### 公开门户(无需登录) +| 路由 | 页面 | 说明 | +|------|------|------| +| `/` | 首页 | 职位推荐、公司展示、搜索入口 | +| `/jobs` | 职位列表 | 搜索+筛选(公司/地点/薪资/类别) | +| `/jobs/:id` | 职位详情 | 职位描述、要求、投递按钮 | +| `/companies` | 公司列表 | 所有子公司展示 | +| `/companies/:id` | 公司详情 | 公司介绍 + 在招职位 | +| `/login` | 求职者登录 | - | +| `/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:求职者投递 +1. 求职者浏览职位详情,点击"投递" +2. 检查是否已登录,未登录跳转注册/登录页 +3. 检查简历是否填写完整,未完善提示引导至简历页 +4. 弹出投递确认框,确认后创建 Application 记录(status: pending) +5. 投递成功提示,可在"我的投递"查看进度 + +### 流程 2:HR 处理投递(状态流转) +``` +待查看(pending) → 已查看(viewed) → 面试中(interviewing) → 已录用(hired) + → 已拒绝(rejected) +``` +- 每次状态变更自动发送邮件通知求职者 +- HR 可在任意阶段填写备注 + +### 流程 3:公司管理员发布职位 +1. 填写职位信息(标题、描述、薪资、地点、类别) +2. 保存草稿(status: draft)或直接发布(status: published) +3. 需要停止招聘时手动关闭(status: closed) +4. 权限隔离:管理员只能操作本公司职位 + +--- + +## 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 +```