# 联系记录接口文档
## 1. 查询联系记录列表
### 接口信息
- **URL**: `/api/contacts`
- **方法**: `GET`
- **认证**: 需要登录(Header 携带 Authorization)
### 请求参数
| 参数名 | 类型 | 必填 | 说明 | 示例 |
|--------|------|------|------|------|
| page | integer | 否 | 页码,默认 1 | 1 |
| page_size | integer | 否 | 每页数量,默认 10 | 20 |
| search | string | 否 | 搜索关键词(姓名/岗位/联系方式) | 张三 |
| reply_status | string | 否 | 回复状态筛选 | 已回复 |
| wechat_exchanged | boolean | 否 | 是否交换微信 | true |
| start_date | string | 否 | 开始日期(YYYY-MM-DD) | 2024-01-01 |
| end_date | string | 否 | 结束日期(YYYY-MM-DD) | 2024-12-31 |
### 请求示例
```bash
# 基础查询
GET /api/contacts?page=1&page_size=20
# 关键词搜索
GET /api/contacts?search=张三
# 按回复状态筛选
GET /api/contacts?reply_status=已回复
# 按时间范围筛选
GET /api/contacts?start_date=2024-01-01&end_date=2024-12-31
# 组合筛选
GET /api/contacts?search=产品经理&reply_status=已回复&wechat_exchanged=true&start_date=2024-01-01&end_date=2024-12-31
```
### 响应示例
```json
{
"code": 200,
"msg": "success",
"data": {
"total": 150,
"page": 1,
"page_size": 20,
"results": [
{
"id": 1,
"name": "张三",
"position": "产品经理",
"contact": "13800138000",
"reply_status": "已回复",
"wechat_exchanged": true,
"account_id": 1,
"worker_id": "worker-001",
"notes": "沟通顺畅,有意向",
"contacted_at": "2024-03-01T10:30:00",
"created_at": "2024-03-01T10:00:00"
},
{
"id": 2,
"name": "李四",
"position": "前端工程师",
"contact": "wechat:lisi123",
"reply_status": "未回复",
"wechat_exchanged": false,
"account_id": 2,
"worker_id": "worker-002",
"notes": "",
"contacted_at": "2024-03-02T14:20:00",
"created_at": "2024-03-02T14:00:00"
}
]
}
}
```
---
## 2. 导出联系记录为 Excel
### 接口信息
- **URL**: `/api/contacts/export`
- **方法**: `GET`
- **认证**: 需要登录(Header 携带 Authorization)
- **响应类型**: `application/json`(返回下载链接)
### 请求参数
| 参数名 | 类型 | 必填 | 说明 | 示例 |
|--------|------|------|------|------|
| search | string | 否 | 搜索关键词(姓名/岗位/联系方式) | 张三 |
| reply_status | string | 否 | 回复状态筛选 | 已回复 |
| wechat_exchanged | boolean | 否 | 是否交换微信 | true |
| start_date | string | 否 | 开始日期(YYYY-MM-DD) | 2024-01-01 |
| end_date | string | 否 | 结束日期(YYYY-MM-DD) | 2024-12-31 |
### 请求示例
```bash
# 导出所有联系记录
GET /api/contacts/export
# 导出指定时间段的记录
GET /api/contacts/export?start_date=2024-01-01&end_date=2024-12-31
# 导出已回复且交换微信的记录
GET /api/contacts/export?reply_status=已回复&wechat_exchanged=true
# 导出组合筛选结果
GET /api/contacts/export?search=产品经理&start_date=2024-01-01&end_date=2024-03-31&reply_status=已回复
```
### 响应示例
```json
{
"code": 200,
"msg": "success",
"data": {
"download_url": "http://127.0.0.1:8000/media/exports/contacts_export_20240304_153045_a1b2c3d4.xlsx",
"filename": "contacts_export_20240304_153045_a1b2c3d4.xlsx",
"total_records": 150,
"generated_at": "2024-03-04 15:30:45"
}
}
```
### 响应字段说明
| 字段名 | 类型 | 说明 |
|--------|------|------|
| download_url | string | 文件下载链接(完整 URL) |
| filename | string | 生成的文件名 |
| total_records | integer | 导出的记录总数 |
| generated_at | string | 文件生成时间 |
### Excel 文件格式
**表头**(蓝色背景,白色粗体文字):
| 列名 | 说明 | 示例 |
|------|------|------|
| ID | 记录 ID | 1 |
| 姓名 | 联系人姓名 | 张三 |
| 岗位 | 应聘岗位 | 产品经理 |
| 联系方式 | 电话或微信 | 13800138000 |
| 回复状态 | 回复状态 | 已回复 |
| 是否交换微信 | 是/否 | 是 |
| Worker ID | Worker 标识 | worker-001 |
| 备注 | 备注信息 | 沟通顺畅,有意向 |
| 联系时间 | 联系时间 | 2024-03-01 10:30:00 |
| 创建时间 | 创建时间 | 2024-03-01 10:00:00 |
### 前端调用示例
```javascript
// 使用 axios
const exportContacts = async (params) => {
try {
const response = await axios.get('/api/contacts/export', {
params: params,
headers: {
'Authorization': `Bearer ${token}`
}
});
if (response.data.code === 200) {
const { download_url, filename, total_records } = response.data.data;
// 方式1:直接打开下载链接
window.open(download_url, '_blank');
// 方式2:使用 a 标签下载
const link = document.createElement('a');
link.href = download_url;
link.download = filename;
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
// 提示用户
console.log(`成功导出 ${total_records} 条记录`);
}
} catch (error) {
console.error('导出失败:', error);
}
};
// 调用示例
exportContacts({
start_date: '2024-01-01',
end_date: '2024-12-31',
reply_status: '已回复'
});
```
```javascript
// 使用 fetch
const exportContacts = async (params) => {
const queryString = new URLSearchParams(params).toString();
try {
const response = await fetch(`/api/contacts/export?${queryString}`, {
headers: {
'Authorization': `Bearer ${token}`
}
});
const result = await response.json();
if (result.code === 200) {
const { download_url, filename, total_records } = result.data;
// 直接下载文件
const link = document.createElement('a');
link.href = download_url;
link.download = filename;
link.click();
alert(`成功导出 ${total_records} 条记录`);
}
} catch (error) {
console.error('导出失败:', error);
}
};
```
```vue
```
---
## 错误码说明
| 错误码 | 说明 |
|--------|------|
| 200 | 成功 |
| 400 | 请求参数错误 |
| 401 | 未登录或 token 无效 |
| 500 | 服务器内部错误 |
## 注意事项
1. **时间筛选**:
- `start_date` 从当天 00:00:00 开始
- `end_date` 到当天 23:59:59 结束
- 时间筛选基于 `created_at` 字段(创建时间)
2. **搜索功能**:
- `search` 参数支持模糊匹配
- 同时搜索姓名、岗位、联系方式三个字段
3. **导出机制**:
- 导出接口返回下载链接,不直接返回文件流
- 文件保存在服务器 `media/exports/` 目录
- 文件名格式:`contacts_export_{时间戳}_{随机ID}.xlsx`
- 导出接口不分页,会导出所有符合条件的记录
- 建议在导出大量数据时添加时间范围限制
4. **文件管理**:
- 导出的文件会保存在服务器上
- 建议定期清理过期的导出文件
- 可以通过定时任务删除超过一定时间的文件
5. **认证要求**:
- 所有接口都需要在 Header 中携带 `Authorization` token
- token 格式:`Bearer `
6. **下载链接**:
- 返回的 `download_url` 是可直接访问的完整下载 URL
- 前端可直接 `window.open(download_url)` 或 `a.href = download_url` 下载