Recruitment_site/docs/superpowers/specs/2026-03-25-company-jobs-thr...

99 lines
3.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 公司列表三栏布局设计文档
**日期:** 2026-03-25
**状态:** 已批准
**影响页面:** `/companies``CompanyListView.vue`
---
## 目标
将现有 `/companies` 页面从网格卡片布局改造为三栏联动布局,用户可在同一页面浏览公司、查看岗位列表、阅读岗位详情,无需跳转。
---
## 布局结构
```
┌─────────────────────────────────────────────────────┐
│ 左栏 220px │ 中栏 260px │ 右栏 flex:1 │
│ 公司列表 │ 岗位列表 │ 岗位详情 │
└─────────────────────────────────────────────────────┘
```
整体高度撑满视口(`height: calc(100vh - navbar高度)`),各栏独立滚动。
---
## 各栏设计
### 左栏 — 公司列表
- 顶部标题「全部企业」+ 公司总数 badge
- 每个公司卡片包含:
- 首字 Logo无图片时用公司名首字 + 蓝色背景)
- 公司名称、行业、城市
- 在招岗位数
- 选中状态:左边框 `3px solid #409EFF`,背景白色
- 未选中:左边框透明,背景 `#f5f7fa`
- 数据来源:`getOrganizations()` API
### 中栏 — 岗位列表
- 标题显示「{公司名} · 职位列表」
- 每条岗位显示:岗位名称 + 城市/薪资/类别标签
- 选中状态:左边框 `3px solid #409EFF`,背景 `#ecf5ff`
- 数据来源:`getJobs({ organization: org.id })` API已有 organization 过滤器)
- 加载中显示 skeleton
### 右栏 — 岗位详情
- 顶部:公司 Logo + 岗位名称 + 城市副标题 + 「立即申请」按钮
- 标签行:城市、薪资、类别、经验要求
- 正文:职位描述、任职要求(`job.description` 字段)
- 未选中岗位时显示空状态提示
- 数据来源:`getJob(job.id)` API
---
## 状态管理
组件内使用三个 ref
| 变量 | 类型 | 说明 |
|------|------|------|
| `orgs` | `Ref<Organization[]>` | 所有公司列表 |
| `selectedOrg` | `Ref<Organization \| null>` | 当前选中公司 |
| `jobs` | `Ref<Job[]>` | 当前公司的岗位列表 |
| `selectedJob` | `Ref<JobDetail \| null>` | 当前选中岗位详情 |
| `jobsLoading` | `Ref<boolean>` | 中栏加载状态 |
| `detailLoading` | `Ref<boolean>` | 右栏加载状态 |
---
## 交互流程
1. `onMounted` → 调用 `getOrganizations()`,加载公司列表,自动选中第一个
2. 自动选中第一个公司 → 触发 `selectOrg(org)` → 调用 `getJobs({ organization: org.id })`
3. 点击公司 → `selectOrg(org)` → 更新岗位列表,清空 `selectedJob`
4. 点击岗位 → `selectJob(job)` → 调用 `getJob(job.id)` → 更新右栏详情
5. 点击「立即申请」→ 跳转到 `/jobs/:id`(保留现有申请流程)
---
## 文件变更范围
| 文件 | 变更类型 |
|------|---------|
| `offer_frontend/src/views/portal/CompanyListView.vue` | 完全重写 |
无需改动后端organization 过滤已支持)、无需新增路由、无需新增组件。
---
## 不在范围内
- 搜索/筛选公司
- 分页(公司数量有限,一次性加载)
- CompanyDetailView`/companies/:id`)不变