# 集团招聘网站设计文档

**日期：** 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：求职者投递
1. 求职者浏览职位详情，点击"投递"
2. 检查是否已登录，未登录跳转注册/登录页
3. 检查简历是否填写完整，未完善提示引导至简历页
4. 弹出投递确认框，确认后创建 Application 记录（status: pending）
5. 投递成功提示，可在"我的投递"查看进度

### 流程 2：HR 处理投递（状态流转）
```
待查看(pending) → 已查看(viewed) → 面试中(interviewing) → 已录用(hired)
                                                          → 已拒绝(rejected)
```
- 每次状态变更通过 Django 内置邮件后端（SMTP）同步发送通知邮件给求职者
- 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
```
