From bca9490fbac6181f59962923c2cd580c29c98748 Mon Sep 17 00:00:00 2001 From: jlj <3042504846@qq.com> Date: Fri, 23 May 2025 20:35:52 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8D=95=E4=B8=AA=E5=8D=95?= =?UTF-8?q?=E4=BA=BA=E7=AE=80=E6=98=93=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/chat/chat.md | 50 +++ apps/chat/views.py | 55 +++ brands.md | 719 ++++++++++++++++++++++++++++++ daren_detail.md | 1056 ++++++++++++++++++++++++++++++++++++++++++++ discovery.md | 371 ++++++++++++++++ template.md | 708 +++++++++++++++++++++++++++++ 6 files changed, 2959 insertions(+) create mode 100644 brands.md create mode 100644 daren_detail.md create mode 100644 discovery.md create mode 100644 template.md diff --git a/apps/chat/chat.md b/apps/chat/chat.md index a6323a3..fb9e516 100644 --- a/apps/chat/chat.md +++ b/apps/chat/chat.md @@ -310,6 +310,56 @@ data: {"code": 200, "message": "完成", "data": {"id": "记录ID", "conversatio } ``` +### 11. 根据ID获取达人信息 + +根据达人ID获取单个达人的详细信息。 + +- **URL**: `/api/chat-history/get_creator_by_id/` +- **方法**: `GET` +- **参数**: + +| 参数名 | 类型 | 必填 | 描述 | +|-------|------|------|------| +| id | integer | 是 | 达人ID | + +- **响应**: + +```json +{ + "code": 200, + "message": "获取成功", + "data": { + "id": 1, + "name": "Michelle", + "avatar_url": "http://example.com/avatar.jpg", + "category": "Clothing & Accessories", + "mcn": "--", + "pricing": "$100/video", + "collab": ["SUNLINK", "ARZOPA"] + } +} +``` + +- **错误响应**: + +缺少参数时: +```json +{ + "code": 400, + "message": "缺少必要参数: id", + "data": null +} +``` + +达人不存在时: +```json +{ + "code": 404, + "message": "未找到该达人信息", + "data": null +} +``` + ## WebSocket API 除了REST API之外,Chat模块还提供了WebSocket接口,用于实时流式获取对话回答。 diff --git a/apps/chat/views.py b/apps/chat/views.py index af9477c..3d19297 100644 --- a/apps/chat/views.py +++ b/apps/chat/views.py @@ -18,6 +18,8 @@ from apps.chat.services.chat_api import ( ExternalAPIError, stream_chat_answer, get_chat_answer, generate_conversation_title_from_deepseek ) +from apps.daren_detail.models import CreatorProfile +from apps.daren_detail.serializers import CreatorProfileSerializer, CreatorProfileListSerializer logger = logging.getLogger(__name__) @@ -601,3 +603,56 @@ class ChatHistoryViewSet(viewsets.ModelViewSet): 'message': f"更新会话标题失败: {str(e)}", 'data': None }, status=status.HTTP_500_INTERNAL_SERVER_ERROR) + + @action(detail=False, methods=['get']) + def get_creator_by_id(self, request): + """根据ID获取单个达人信息""" + try: + creator_id = request.query_params.get('id') + if not creator_id: + return Response({ + 'code': 400, + 'message': '缺少必要参数: id', + 'data': None + }, status=status.HTTP_400_BAD_REQUEST) + + try: + creator = CreatorProfile.objects.get(id=creator_id) + except CreatorProfile.DoesNotExist: + return Response({ + 'code': 404, + 'message': '未找到该达人信息', + 'data': None + }, status=status.HTTP_404_NOT_FOUND) + + # 处理头像URL + avatar_url = creator.get_avatar_url() + if avatar_url and request: + if creator.avatar: + avatar_url = request.build_absolute_uri(avatar_url) + + # 组装返回数据 + result = { + 'id': creator.id, + 'name': creator.name, + 'avatar_url': avatar_url, + 'category': creator.category, + 'mcn': creator.mcn if creator.mcn else '--', + 'pricing': f"${creator.pricing}/video" if creator.pricing else '--', + 'collab': creator.e_commerce_platforms if creator.e_commerce_platforms else [] + } + + return Response({ + 'code': 200, + 'message': '获取成功', + 'data': result + }) + + except Exception as e: + logger.error(f"获取达人信息失败: {str(e)}") + logger.error(traceback.format_exc()) + return Response({ + 'code': 500, + 'message': f'获取达人信息失败: {str(e)}', + 'data': None + }, status=status.HTTP_500_INTERNAL_SERVER_ERROR) diff --git a/brands.md b/brands.md new file mode 100644 index 0000000..f76daa0 --- /dev/null +++ b/brands.md @@ -0,0 +1,719 @@ +# Brands 模块 API 文档 + +本文档详细说明了 Brands 模块的 API 接口,包括请求方法、URL、参数说明和响应格式。 + +## 目录 + +1. [通用说明](#通用说明) +2. [品牌相关接口](#品牌相关接口) +3. [产品相关接口](#产品相关接口) +4. [活动相关接口](#活动相关接口) +5. [WebSocket 接口](#websocket-接口) +6. [状态轮询管理](#状态轮询管理) + +## 通用说明 + +### 基础URL + +所有 API 的基础 URL 为:`http://127.0.0.1:8000/api/` + +### 认证方式 + +除特殊说明外,所有 API 都需要 Token 认证。请在请求头中添加: + +``` +Authorization: Token +``` + +### 响应格式 + +所有 API 返回的数据格式统一为: + +```json +{ + "code": 200, // 状态码,200表示成功,其他表示错误 + "message": "成功", // 状态描述 + "data": {} // 返回的数据,可能是对象、数组或null +} +``` + +## 品牌相关接口 + +### 获取品牌列表 + +- **URL**: `/brands/` +- **方法**: GET +- **描述**: 获取所有品牌的列表 +- **参数**: 无 +- **响应示例**: + ```json + { + "code": 200, + "message": "成功", + "data": [ + { + "id": "uuid-string", + "name": "品牌名称", + "description": "品牌描述", + "logo_url": "品牌Logo链接", + "category": "品牌分类", + "source": "来源", + "collab_count": 10, + "creators_count": 20, + "campaign_id": "活动ID", + "total_gmv_achieved": "1000.00", + "total_views_achieved": "5000.00", + "shop_overall_rating": "4.5", + "dataset_id_list": ["id1", "id2"], + "created_at": "2023-01-01T00:00:00Z", + "updated_at": "2023-01-01T00:00:00Z", + "is_active": true + } + ] + } + ``` + +### 获取单个品牌详情 + +- **URL**: `/brands/{brand_id}/` +- **方法**: GET +- **描述**: 获取指定ID的品牌详细信息 +- **参数**: + - `brand_id`: 品牌ID (路径参数) +- **响应示例**: + ```json + { + "code": 200, + "message": "成功", + "data": { + "id": "uuid-string", + "name": "品牌名称", + "description": "品牌描述", + "logo_url": "品牌Logo链接", + "category": "品牌分类", + "source": "来源", + "collab_count": 10, + "creators_count": 20, + "campaign_id": "活动ID", + "total_gmv_achieved": "1000.00", + "total_views_achieved": "5000.00", + "shop_overall_rating": "4.5", + "dataset_id_list": ["id1", "id2"], + "created_at": "2023-01-01T00:00:00Z", + "updated_at": "2023-01-01T00:00:00Z", + "is_active": true, + "products": [...], // 品牌关联的产品列表 + "campaigns": [...] // 品牌关联的活动列表 + } + } + ``` + +### 创建品牌 + +- **URL**: `/brands/` +- **方法**: POST +- **描述**: 创建新的品牌 +- **请求参数**: + ```json + { + "name": "品牌名称", // 必填 + "description": "品牌描述", + "logo_url": "品牌Logo链接", + "category": "品牌分类", + "source": "来源" + } + ``` +- **响应示例**: + ```json + { + "code": 200, + "message": "成功", + "data": { + "id": "uuid-string", + "name": "品牌名称", + "description": "品牌描述", + // ... 其他字段 + } + } + ``` + +### 更新品牌 + +- **URL**: `/brands/{brand_id}/` +- **方法**: PUT/PATCH +- **描述**: 更新品牌信息 +- **参数**: + - `brand_id`: 品牌ID (路径参数) + - 请求体包含要更新的字段 +- **响应示例**: + ```json + { + "code": 200, + "message": "成功", + "data": { + // 更新后的品牌信息 + } + } + ``` + +### 删除品牌 + +- **URL**: `/brands/{brand_id}/` +- **方法**: DELETE +- **描述**: 删除品牌(软删除) +- **参数**: + - `brand_id`: 品牌ID (路径参数) +- **响应示例**: + ```json + { + "code": 200, + "message": "删除成功", + "data": null + } + ``` + +### 获取品牌产品列表 + +- **URL**: `/brands/{brand_id}/products/` +- **方法**: GET +- **描述**: 获取指定品牌下的所有产品 +- **参数**: + - `brand_id`: 品牌ID (路径参数) +- **响应示例**: + ```json + { + "code": 200, + "message": "成功", + "data": [ + // 产品列表 + ] + } + ``` + +### 获取品牌活动列表 + +- **URL**: `/brands/{brand_id}/campaigns/` +- **方法**: GET +- **描述**: 获取指定品牌下的所有活动 +- **参数**: + - `brand_id`: 品牌ID (路径参数) +- **响应示例**: + ```json + { + "code": 200, + "message": "成功", + "data": [ + // 活动列表 + ] + } + ``` + +### 获取品牌知识库ID列表 + +- **URL**: `/brands/{brand_id}/dataset_ids/` +- **方法**: GET +- **描述**: 获取指定品牌的所有知识库ID +- **参数**: + - `brand_id`: 品牌ID (路径参数) +- **响应示例**: + ```json + { + "code": 200, + "message": "成功", + "data": { + "dataset_id_list": ["id1", "id2", "id3"] + } + } + ``` + +## 产品相关接口 + +### 获取产品列表 + +- **URL**: `/products/` +- **方法**: GET +- **描述**: 获取所有产品列表 +- **参数**: 无 +- **响应示例**: + ```json + { + "code": 200, + "message": "成功", + "data": [ + { + "id": "uuid-string", + "brand": "品牌ID", + "name": "产品名称", + "description": "产品描述", + "image_url": "产品图片", + "pid": "产品ID", + "commission_rate": "10.00", + "open_collab": "5.00", + "available_samples": 10, + "sales_price_min": "50.00", + "sales_price_max": "100.00", + "stock": 100, + "items_sold": 50, + "product_rating": "4.5", + "reviews_count": 20, + "collab_creators": 5, + "tiktok_shop": false, + "dataset_id": "知识库ID", + "external_id": "外部ID", + "created_at": "2023-01-01T00:00:00Z", + "updated_at": "2023-01-01T00:00:00Z", + "is_active": true + } + ] + } + ``` + +### 获取单个产品详情 + +- **URL**: `/products/{product_id}/` +- **方法**: GET +- **描述**: 获取指定ID的产品详情 +- **参数**: + - `product_id`: 产品ID (路径参数) +- **响应示例**: + ```json + { + "code": 200, + "message": "成功", + "data": { + // 产品详情 + } + } + ``` + +### 创建产品 + +- **URL**: `/products/` +- **方法**: POST +- **描述**: 创建新的产品 +- **请求参数**: + ```json + { + "brand": "品牌ID", // 必填 + "name": "产品名称", // 必填 + "description": "产品描述", + "image_url": "产品图片", + "pid": "产品ID", + "commission_rate": 10.00, + "dataset_id": "知识库ID" // 必填 + // ... 其他字段 + } + ``` +- **响应示例**: + ```json + { + "code": 200, + "message": "成功", + "data": { + // 创建的产品信息 + } + } + ``` + +### 更新产品 + +- **URL**: `/products/{product_id}/` +- **方法**: PUT/PATCH +- **描述**: 更新产品信息 +- **参数**: + - `product_id`: 产品ID (路径参数) + - 请求体包含要更新的字段 +- **响应示例**: + ```json + { + "code": 200, + "message": "成功", + "data": { + // 更新后的产品信息 + } + } + ``` + +### 删除产品 + +- **URL**: `/products/{product_id}/` +- **方法**: DELETE +- **描述**: 删除产品(软删除) +- **参数**: + - `product_id`: 产品ID (路径参数) +- **响应示例**: + ```json + { + "code": 200, + "message": "删除成功", + "data": null + } + ``` + +## 活动相关接口 + +### 获取活动列表 + +- **URL**: `/campaigns/` +- **方法**: GET +- **描述**: 获取所有活动列表 +- **参数**: 无 +- **响应示例**: + ```json + { + "code": 200, + "message": "成功", + "data": [ + { + "id": "活动ID", + "brand": "品牌ID", + "name": "活动名称", + "description": "活动描述", + "image_url": "活动图片", + "service": "服务类型", + "creator_type": "创作者类型", + "creator_level": "创作者等级", + "creator_category": "创作者分类", + "creators_count": 10, + "gmv": "GMV范围", + "followers": "粉丝数范围", + "views": "浏览量范围", + "budget": "预算范围", + "link_product": ["产品ID1", "产品ID2"], + "start_date": "2023-01-01T00:00:00Z", + "end_date": "2023-02-01T00:00:00Z", + "dataset_id": "知识库ID", + "external_id": "外部ID", + "status": "待处理", // pending, accepted, rejected, completed, in_progress + "gmv_achieved": "实现GMV", + "views_achieved": "实现观看量", + "video_link": "视频链接", + "created_at": "2023-01-01T00:00:00Z", + "updated_at": "2023-01-01T00:00:00Z", + "is_active": true + } + ] + } + ``` + +### 获取单个活动详情 + +- **URL**: `/campaigns/{campaign_id}/` +- **方法**: GET +- **描述**: 获取指定ID的活动详情 +- **参数**: + - `campaign_id`: 活动ID (路径参数) +- **响应示例**: + ```json + { + "code": 200, + "message": "成功", + "data": { + // 活动详情 + } + } + ``` + +### 创建活动 + +- **URL**: `/campaigns/` +- **方法**: POST +- **描述**: 创建新的活动 +- **请求参数**: + ```json + { + "brand": "品牌ID", // 必填 + "name": "活动名称", // 必填 + "description": "活动描述", + "image_url": "活动图片", + "service": "服务类型", + "creator_type": "创作者类型", + "dataset_id": "知识库ID", // 必填 + // ... 其他字段 + } + ``` +- **响应示例**: + ```json + { + "code": 200, + "message": "成功", + "data": { + // 创建的活动信息 + } + } + ``` + +### 更新活动 + +- **URL**: `/campaigns/{campaign_id}/` +- **方法**: PUT/PATCH +- **描述**: 更新活动信息 +- **参数**: + - `campaign_id`: 活动ID (路径参数) + - 请求体包含要更新的字段 +- **响应示例**: + ```json + { + "code": 200, + "message": "成功", + "data": { + // 更新后的活动信息 + } + } + ``` + +### 删除活动 + +- **URL**: `/campaigns/{campaign_id}/` +- **方法**: DELETE +- **描述**: 删除活动(软删除) +- **参数**: + - `campaign_id`: 活动ID (路径参数) +- **响应示例**: + ```json + { + "code": 200, + "message": "删除成功", + "data": null + } + ``` + +### 向活动添加产品 + +- **URL**: `/campaigns/{campaign_id}/add_product/` +- **方法**: POST +- **描述**: 将产品添加到活动中 +- **参数**: + - `campaign_id`: 活动ID (路径参数) + - 请求体: + ```json + { + "product_id": "产品ID" + } + ``` +- **响应示例**: + ```json + { + "code": 200, + "message": "产品添加成功", + "data": null + } + ``` + +### 从活动移除产品 + +- **URL**: `/campaigns/{campaign_id}/remove_product/` +- **方法**: POST +- **描述**: 从活动中移除产品 +- **参数**: + - `campaign_id`: 活动ID (路径参数) + - 请求体: + ```json + { + "product_id": "产品ID" + } + ``` +- **响应示例**: + ```json + { + "code": 200, + "message": "产品移除成功", + "data": null + } + ``` + +### 获取活动创作者列表 + +- **URL**: `/campaigns/{campaign_id}/creator_list/` +- **方法**: GET +- **描述**: 获取指定活动的创作者列表 +- **参数**: + - `campaign_id`: 活动ID (路径参数) +- **响应示例**: + ```json + { + "code": 200, + "message": "成功", + "data": { + "campaign": { + "id": "活动ID", + "name": "活动名称", + "description": "活动描述", + "image_url": "活动图片", + "service": "服务类型", + "creator_type": "创作者类型", + "creator_level": "创作者等级", + "creator_category": "创作者分类", + "creators_count": 10, + "gmv": "GMV范围", + "followers": "粉丝数范围", + "views": "浏览量范围", + "budget": "预算范围", + "start_date": "2023-01-01T00:00:00Z", + "end_date": "2023-02-01T00:00:00Z", + "status": "状态" + }, + "creators": [ + { + "id": "创作者ID", + "name": "创作者名称", + "category": "创作者分类", + "followers": 5000, + "gmv_generated": "1000.00", + "views_generated": "5000", + "pricing": "100.00", + "status": "状态" + } + ] + } + } + ``` + +### 获取WebSocket连接URL + +- **URL**: `/campaigns/{campaign_id}/websocket_url/` +- **方法**: GET +- **描述**: 获取带有认证Token的WebSocket连接URL +- **参数**: + - `campaign_id`: 活动ID (路径参数) + - 查询参数: + - `product_id`: 可选,用于获取特定产品的WebSocket连接 +- **响应示例**: + ```json + { + "code": 200, + "message": "成功", + "data": { + "websocket_url": "ws://127.0.0.1:8000/ws/campaigns/12345/status/?token=abc123" + } + } + ``` + +### 获取当前Token信息 + +- **URL**: `/campaigns/token_info/` +- **方法**: GET +- **描述**: 获取当前用户的认证Token信息和WebSocket连接示例 +- **参数**: 无 +- **响应示例**: + ```json + { + "code": 200, + "message": "成功", + "data": { + "user_id": "用户ID", + "email": "用户邮箱", + "token": "认证Token", + "expires_at": "过期时间", + "websocket_example": { + "campaign": "ws://127.0.0.1:8000/ws/campaigns/campaign_id/status/?token=abc123", + "product": "ws://127.0.0.1:8000/ws/campaigns/campaign_id/status/?product_id=product_id&token=abc123" + } + } + } + ``` + +## WebSocket 接口 + +### 建立活动状态WebSocket连接 + +- **URL**: `ws://127.0.0.1:8000/ws/campaigns/{campaign_id}/status/?token={token}` +- **描述**: 建立WebSocket连接,获取活动状态的实时更新 +- **参数**: + - `campaign_id`: 活动ID (路径参数) + - 查询参数: + - `token`: 用户认证Token (必填) + - `product_id`: 可选,用于获取特定产品的状态 +- **连接成功后接收的数据格式**: + ```json + { + "campaign": { + // 活动信息 + }, + "creators": [ + // 创作者列表 + ] + } + ``` + +### WebSocket连接JavaScript示例 + +```javascript +// 获取WebSocket URL +const response = await fetch(`http://127.0.0.1:8000/api/campaigns/${campaignId}/websocket_url/`); +const data = await response.json(); +const wsUrl = data.data.websocket_url; + +// 建立WebSocket连接 +const socket = new WebSocket(wsUrl); + +// 连接打开事件 +socket.onopen = function(e) { + console.log("WebSocket连接已建立"); +}; + +// 接收消息事件 +socket.onmessage = function(event) { + const data = JSON.parse(event.data); + console.log("接收到的数据:", data); + // 处理接收到的数据 +}; + +// 错误事件 +socket.onerror = function(error) { + console.error("WebSocket错误:", error); +}; + +// 连接关闭事件 +socket.onclose = function(event) { + console.log("WebSocket连接已关闭"); +}; +``` + +## 状态轮询管理 + +### 停止轮询 + +- **URL**: `/campaigns/{campaign_id}/stop_polling/` +- **方法**: POST +- **描述**: 停止指定活动的状态轮询 +- **参数**: + - `campaign_id`: 活动ID (路径参数) + - 请求体: + ```json + { + "product_id": "产品ID" // 可选,不提供则停止整个活动的轮询 + } + ``` +- **响应示例**: + ```json + { + "code": 200, + "message": "轮询已停止", + "data": null + } + ``` + +### 获取活跃轮询任务 + +- **URL**: `/campaigns/active_polling_tasks/` +- **方法**: GET +- **描述**: 获取当前系统中所有活跃的轮询任务 +- **参数**: 无 +- **响应示例**: + ```json + { + "code": 200, + "message": "成功", + "data": { + "active_tasks": [ + { + "campaign_id": "活动ID", + "product_id": "产品ID", // 如果存在 + "interval": 30, // 轮询间隔,单位为秒 + "last_poll": "2023-01-01T00:00:00Z" + } + ] + } + } + ``` diff --git a/daren_detail.md b/daren_detail.md new file mode 100644 index 0000000..0e58860 --- /dev/null +++ b/daren_detail.md @@ -0,0 +1,1056 @@ +# 达人详情模块 (daren_detail) API 接口文档 + +## 模块简介 + +`daren_detail` 模块是达人管理系统的核心模块,提供了完整的达人信息管理功能,包括: +- 达人筛选、详情查看、信息更新 +- 营销活动管理和达人合作详情 +- 多维度指标数据管理(协作指标、视频指标、直播指标、粉丝统计、趋势分析) +- 视频内容管理 +- 公有达人库和私有达人库管理 + +## 认证方式 + +所有接口都需要使用 `CustomTokenAuthentication` 进行身份验证,请在请求头中包含: +```http +Authorization: Token +``` + +## 1. 达人管理相关接口 + +### 1.1 添加/更新达人 +- **接口路径**: `POST /creators/add/` +- **功能**: 添加新达人或更新现有达人信息 +- **请求方法**: POST + +**请求体参数**: +```json +{ + "name": "达人姓名", // 必填 + "avatar_url": "头像URL", + "category": "Beauty & Personal Care", + "e_commerce_level": "L3", // 或数字3 + "exposure_level": "KOL-1", + "followers": 125000, + "gmv": "$534.1k", // 或数字534.1 + "items_sold": "2.5k", // 或数字2.5 + "avg_video_views": "85k", // 或数字85000 + "pricing": { + "individual": 200, // 或直接传数字 + "package": "套餐描述" + }, + "collab_count": 15, + "latest_collab": "2024-03-15", + "e_commerce_platforms": ["TikTok Shop", "Instagram Shop"], + "mcn": "MCN机构名称" +} +``` + +**响应格式**: +```json +{ + "code": 200, + "message": "达人信息已添加/更新", + "data": { + "created": true, // true为新建,false为更新 + "creator_id": 123 + } +} +``` + +### 1.2 获取达人详情 +- **接口路径**: `GET /creators/{creator_id}/` +- **功能**: 获取指定达人的详细信息 +- **请求方法**: GET + +**URL参数**: +- `creator_id`: 达人ID(必填) + +**响应格式**: +```json +{ + "code": 200, + "message": "获取成功", + "data": { + "creator": { + "id": 123, + "name": "达人姓名", + "avatar": "头像URL", + "email": "邮箱", + "social_accounts": { + "instagram": "@username", + "tiktok": "tiktok链接" + }, + "location": "地理位置", + "live_schedule": "直播时间安排" + }, + "metrics": { + "e_commerce_level": "L3", + "exposure_level": "KOL-1", + "followers": "125k", + "actual_followers": 125000, + "gmv": "$534k", + "actual_gmv": 534.1, + "items_sold": "2500", + "avg_video_views": "85k", + "actual_views": 85000, + "gpm": "$2.35", // 每千次观看收入 + "gmv_per_customer": "$213.64" // 每位客户GMV + }, + "business": { + "category": "Beauty & Personal Care", + "categories": ["Beauty & Personal Care"], + "mcn": "MCN机构", + "pricing": { + "price": "$200", + "package": "套餐描述" + }, + "collab_count": 15, + "latest_collab": "2024-03-15", + "e_commerce_platforms": ["TikTok Shop"] + }, + "analytics": { + "gmv_by_channel": {...}, // 按渠道分析 + "gmv_by_category": {...} // 按类别分析 + } + } +} +``` + +### 1.3 更新达人详细信息 +- **接口路径**: `POST /creators/update_detail/` +- **功能**: 更新达人的详细信息(联系方式、社交账号等) +- **请求方法**: POST + +**请求体参数**: +```json +{ + "creator_id": 123, // 必填 + "email": "新邮箱", + "instagram": "@new_username", + "tiktok_link": "新TikTok链接", + "location": "新地理位置", + "live_schedule": "新直播时间安排", + "mcn": "新MCN机构", + "gmv_by_channel": {...}, // 按渠道GMV分析数据 + "gmv_by_category": {...} // 按类别GMV分析数据 +} +``` + +**响应格式**: +```json +{ + "code": 200, + "message": "达人详细信息已更新", + "data": { + "creator_id": 123, + "name": "达人姓名" + } +} +``` + +### 1.4 获取达人品牌合作详情 +- **接口路径**: `GET /creators/{creator_id}/campaigns/` +- **功能**: 获取指定达人与各品牌的合作活动详情,支持分页 +- **请求方法**: GET + +**URL参数**: +- `creator_id`: 达人ID(必填) +- `page`: 页码,默认为1 +- `page_size`: 每页数量,默认为10 + +**响应格式**: +```json +{ + "code": 200, + "message": "获取成功", + "data": [ + { + "brand": { + "id": "U", + "name": "品牌名称", + "color": "#E74694" + }, + "pricing_detail": "$80", + "start_date": "05/31/2024", + "end_date": "05/29/2024", + "status": "completed", // pending, in_progress, completed, cancelled + "gmv_achieved": "$120", + "views_achieved": "650", + "video_link": "视频链接", + "campaign_id": 456, + "campaign_name": "活动名称" + } + ], + "pagination": { + "current_page": 1, + "total_pages": 5, + "total_count": 45, + "has_next": true, + "has_prev": false + }, + "creator": { + "id": 123, + "name": "达人姓名", + "avatar": "头像URL", + "category": "Beauty & Personal Care", + "exposure_level": "KOL-1" + } +} +``` + +## 2. 营销活动相关接口 + +### 2.1 获取营销活动列表 +- **接口路径**: `GET /campaigns/` +- **功能**: 获取所有活跃的营销活动列表 +- **请求方法**: GET + +**响应格式**: +```json +{ + "code": 200, + "message": "获取成功", + "data": [ + { + "id": 456, + "name": "品牌名 产品名", + "brand": "品牌名", + "product": "产品名" + } + ] +} +``` + +### 2.2 添加达人到营销活动 +- **接口路径**: `POST /campaigns/add/` +- **功能**: 将达人添加到指定营销活动中 +- **请求方法**: POST + +**请求体参数**: +```json +{ + "campaign_id": 456, // 必填 + "creator_ids": [123, 124, 125] // 达人ID列表,必填 +} +``` + +**响应格式**: +```json +{ + "code": 200, + "message": "成功添加达人到活动", + "data": { + "campaign": { + "id": "456", + "name": "活动名称" + }, + "added_creators": [ + { + "id": 123, + "name": "达人姓名" + } + ], + "stats": { + "added": 1, // 成功添加数量 + "skipped": 0, // 跳过数量(达人不存在) + "already_exists": 2 // 已存在数量 + } + } +} +``` + +## 3. 指标数据相关接口 + +### 3.1 获取创作者指标数据 +- **接口路径**: `GET /creators/{creator_id}/metrics/` +- **功能**: 获取创作者的协作指标、视频和直播指标数据 +- **请求方法**: GET + +**URL参数**: +- `creator_id`: 创作者ID(必填) +- `start_date`: 开始日期,格式:YYYY-MM-DD(可选) +- `end_date`: 结束日期,格式:YYYY-MM-DD(可选) + +**响应格式**: +```json +{ + "code": 200, + "message": "获取成功", + "data": { + "collaboration_metrics": { + "avg_commission_rate": "15.5%", + "products_count": 25, + "brand_collaborations": 8, + "product_price": "$50 - $200", + "date_range": "Mar 01, 2024 - Mar 31, 2024" + }, + "video": { + "gpm": "$2.35", + "videos_count": 12, + "avg_views": "85k", + "avg_engagement": "3.2%", + "avg_likes": 2500, + "date_range": "Mar 01, 2024 - Mar 31, 2024" + }, + "shoppable_video": { + "gpm": "$3.15", + "videos_count": 8, + "avg_views": "92k", + "avg_engagement": "4.1%", + "avg_likes": 3200, + "date_range": "Mar 01, 2024 - Mar 31, 2024" + }, + "live": { + "gpm": "$4.50", + "lives_count": 5, + "avg_views": "150k", + "avg_engagement": "5.8%", + "avg_likes": 8500, + "date_range": "Mar 01, 2024 - Mar 31, 2024" + }, + "shoppable_live": { + "gpm": "$6.20", + "lives_count": 3, + "avg_views": "180k", + "avg_engagement": "7.2%", + "avg_likes": 12000, + "date_range": "Mar 01, 2024 - Mar 31, 2024" + } + } +} +``` + +### 3.2 更新创作者指标数据 +- **接口路径**: `POST /creators/metrics/update/` +- **功能**: 更新创作者的指标数据 +- **请求方法**: POST + +**请求体参数**: +```json +{ + "creator_id": 123, // 必填 + "metrics_type": "collaboration", // 必填:collaboration, video, shoppable_video, live, shoppable_live + "metrics_data": { + "start_date": "2024-03-01", // 必填,格式:YYYY-MM-DD + "end_date": "2024-03-31", // 必填,格式:YYYY-MM-DD + // 根据metrics_type不同,以下参数有所不同: + + // 当metrics_type为"collaboration"时: + "avg_commission_rate": "15.5%", // 或数字15.5 + "products_count": 25, + "brand_collaborations": 8, + "product_price": "$50 - $200", // 格式:$最小值 - $最大值 + + // 当metrics_type为"video"或"shoppable_video"时: + "gpm": "$2.35", // 或数字2.35 + "videos_count": 12, + "avg_views": "85k", // 或数字85000 + "avg_engagement": "3.2%", // 或数字3.2 + "avg_likes": 2500, + + // 当metrics_type为"live"或"shoppable_live"时: + "gpm": "$4.50", + "lives_count": 5, + "avg_views": "150k", + "avg_engagement": "5.8%", + "avg_likes": 8500 + } +} +``` + +**响应格式**: +```json +{ + "code": 200, + "message": "协作指标数据已更新", // 根据metrics_type变化 + "data": { + "created": true, // true为新建,false为更新 + "metrics_id": 789 + } +} +``` + +### 3.3 获取创作者粉丝统计数据 +- **接口路径**: `GET /creator/{creator_id}/followers/` 或 `GET /creator/followers/?creator_id={creator_id}` +- **功能**: 获取创作者的粉丝性别、年龄、地域分布统计 +- **请求方法**: GET + +**URL参数**: +- `creator_id`: 创作者ID(必填) + +**响应格式**: +```json +{ + "code": 200, + "message": "获取成功", + "data": { + "gender": { + "female": 65.5, + "male": 34.5 + }, + "age": { + "18-24": 25.2, + "25-34": 35.8, + "35-44": 22.1, + "45-54": 12.3, + "55+": 4.6 + }, + "locations": { + "TX": 18.5, + "FL": 15.2, + "NY": 12.8, + "CA": 11.3, + "GE": 8.9 + }, + "date_range": { + "start_date": "2024-03-29", + "end_date": "2024-04-28" + } + } +} +``` + +### 3.4 更新创作者粉丝统计数据 +- **接口路径**: `POST /creator/followers/update/` +- **功能**: 更新创作者的粉丝统计数据 +- **请求方法**: POST + +**请求体参数**: +```json +{ + "creator_id": 123, // 必填 + "follower_data": { + "date_range": { + "start_date": "2024-03-29", // 必填 + "end_date": "2024-04-28" // 必填 + }, + "gender": { + "female": 65.5, + "male": 34.5 + }, + "age": { + "18-24": 25.2, + "25-34": 35.8, + "35-44": 22.1, + "45-54": 12.3, + "55+": 4.6 + }, + "locations": { + "TX": 18.5, + "FL": 15.2, + "NY": 12.8, + "CA": 11.3, + "GE": 8.9 + } + } +} +``` + +**响应格式**: +```json +{ + "code": 200, + "message": "粉丝统计数据已更新", + "data": { + "created": true, + "metrics_id": 890 + } +} +``` + +### 3.5 获取创作者趋势数据 +- **接口路径**: `GET /creator/{creator_id}/trends/` 或 `GET /creator/trends/?creator_id={creator_id}` +- **功能**: 获取创作者的GMV、销量、粉丝、观看量等趋势数据 +- **请求方法**: GET + +**URL参数**: +- `creator_id`: 创作者ID(必填) +- `start_date`: 开始日期,格式:YYYY-MM-DD(可选,默认最近30天) +- `end_date`: 结束日期,格式:YYYY-MM-DD(可选,默认今天) + +**响应格式**: +```json +{ + "code": 200, + "message": "获取成功", + "data": { + "gmv": [1250.5, 1380.2, 1156.8, ...], // 30天的GMV数据 + "items_sold": [850, 920, 780, ...], // 30天的销量数据 + "followers": [125000, 125150, 125300, ...], // 30天的粉丝数据 + "video_views": [85000, 92000, 78000, ...], // 30天的观看量数据 + "engagement_rate": [3.2, 3.5, 2.8, ...], // 30天的互动率数据 + "dates": ["2024-03-01", "2024-03-02", ...], // 对应的日期 + "date_range": { + "start_date": "2024-03-01", + "end_date": "2024-03-31" + } + } +} +``` + +### 3.6 更新创作者趋势数据 +- **接口路径**: `POST /creator/trend/update/` +- **功能**: 更新单日的创作者趋势数据 +- **请求方法**: POST + +**请求体参数**: +```json +{ + "creator_id": 123, // 必填 + "date": "2024-03-15", // 必填,格式:YYYY-MM-DD + "metrics": { + "gmv": 1250.5, + "items_sold": 850, + "followers": 125000, + "video_views": 85000, + "engagement_rate": 3.2 + } +} +``` + +**响应格式**: +```json +{ + "code": 200, + "message": "趋势数据已更新", + "data": { + "created": true, + "metrics_id": 901, + "date": "2024-03-15" + } +} +``` + +## 4. 视频管理相关接口 + +### 4.1 获取创作者视频列表 +- **接口路径**: `GET /creator/{creator_id}/videos/` 或 `GET /creator/videos/?creator_id={creator_id}` +- **功能**: 获取创作者的视频列表,分为普通视频和带产品视频 +- **请求方法**: GET + +**URL参数**: +- `creator_id`: 创作者ID(必填) +- `page`: 页码,默认为1 +- `page_size`: 每页数量,默认为6 + +**响应格式**: +```json +{ + "code": 200, + "message": "获取成功", + "data": { + "regular_videos": { + "videos": [ + { + "id": 1, + "title": "视频标题", + "thumbnail_url": "缩略图URL", + "badge": "red", // red, gold等 + "view_count": 2130, + "like_count": 20, + "release_date": "2025-03-31" + } + ], + "total": 15, + "page": 1, + "page_size": 6, + "total_pages": 3 + }, + "product_videos": { + "videos": [ + { + "id": 4, + "title": "带产品的视频标题", + "thumbnail_url": "缩略图URL", + "badge": "red", + "view_count": 2130, + "like_count": 20, + "release_date": "2025-03-31", + "has_product": true, + "product_name": "产品名称", + "product_url": "产品链接" + } + ], + "total": 8, + "page": 1, + "page_size": 6, + "total_pages": 2 + } + } +} +``` + +### 4.2 添加创作者视频 +- **接口路径**: `POST /creator/video/add/` +- **功能**: 为创作者添加新视频 +- **请求方法**: POST + +**请求体参数**: +```json +{ + "creator_id": 123, // 必填 + "title": "视频标题", // 必填 + "release_date": "2024-03-15", // 必填,格式:YYYY-MM-DD + "video_type": "regular", // 可选:regular, product,默认regular + "description": "视频描述", + "thumbnail_url": "缩略图URL", + "video_url": "视频URL", + "video_id": "vid_123456", // 可选,不提供会自动生成 + "badge": "red", // 可选:red, gold等,默认red + "view_count": 2130, + "like_count": 20, + "comment_count": 5, + "has_product": false, // 如果video_type为product,会自动设为true + "product_name": "产品名称", // 有产品时填写 + "product_url": "产品链接" // 有产品时填写 +} +``` + +**响应格式**: +```json +{ + "code": 200, + "message": "视频添加成功", + "data": { + "video_id": 456, + "created": true // true为新建,false为更新 + } +} +``` + +## 5. 公有达人库相关接口 + +### 5.1 获取公有达人库列表 +- **接口路径**: `GET /public/creators/` +- **功能**: 获取公有达人库中的达人列表 +- **请求方法**: GET + +**URL参数**: +- `page`: 页码,默认为1 +- `page_size`: 每页数量,默认为10 +- `category`: 分类过滤(可选) +- `keyword`: 关键词搜索(可选) + +**响应格式**: +```json +{ + "code": 200, + "message": "获取成功", + "data": [ + { + "public_id": 123, + "creator_id": 456, + "name": "达人姓名", + "avatar": "头像URL", + "category": "Beauty & Personal Care", + "e_commerce_level": "L3", + "exposure_level": "KOL-1", + "followers": "125k", + "gmv": "$534k", + "avg_video_views": "85k", + "pricing": "$200", + "pricing_package": "套餐描述", + "collab_count": 15, + "remark": "公有库备注", + "category_public": "公有库分类" + } + ], + "pagination": { + "current_page": 1, + "total_pages": 15, + "total_count": 150, + "has_next": true, + "has_prev": false + } +} +``` + +### 5.2 筛选公有达人库 +- **接口路径**: `POST /public/creators/filter/` +- **功能**: 根据过滤条件筛选公有达人库中的达人 +- **请求方法**: POST + +**URL参数**: +- `page`: 页码,默认为1 +- `page_size`: 每页数量,默认为10 + +**请求体参数**: +```json +{ + "filter": { + "category": ["Beauty & Personal Care"], // 多选 + "e_commerce_level": ["L1", "L2", "L3"], // 多选 + "exposure_level": ["KOL-1", "KOC-1"], // 多选 + "gmv_range": ["$0-$5k", "$5k-$25k"], // 多选 + "views_range": ["10k-100k"], // 单选 + "pricing": ["100-500"] // 单选 + } +} +``` + +**响应格式**: 同5.1 + +### 5.3 添加达人到公有库 +- **接口路径**: `POST /public/creators/add/` +- **功能**: 将达人添加到公有达人库 +- **请求方法**: POST + +**请求体参数**: +```json +{ + "creator_id": 456, // 必填 + "category": "分类", // 可选 + "remark": "备注信息" // 可选 +} +``` + +**响应格式**: +```json +{ + "code": 200, + "message": "成功添加达人到公有库", // 或"成功更新达人到公有库" + "data": { + "creator": { + "id": 456, + "name": "达人姓名" + }, + "public_pool": { + "id": 123, + "category": "分类", + "remark": "备注信息" + } + } +} +``` + +### 5.4 从公有库移除达人 +- **接口路径**: `POST /public/creators/remove/` +- **功能**: 从公有达人库中移除达人,同时更新私有库中相关记录的状态 +- **请求方法**: POST + +**请求体参数**: +```json +{ + "creator_id": 456, // 二选一 + "public_id": 123 // 二选一 +} +``` + +**响应格式**: +```json +{ + "code": 200, + "message": "成功从公有库移除达人", + "data": { + "creator": { + "id": 456, + "name": "达人姓名" + }, + "removed_from_public": true, + "updated_private_relations": 3, + "note": "已更新 3 个私有库中的相关记录状态" + } +} +``` + +## 6. 私有达人库相关接口 + +### 6.1 获取私有达人库列表 +- **接口路径**: `GET /private/pools/` +- **功能**: 获取当前用户的私有达人库列表 +- **请求方法**: GET + +**URL参数**: +- `user_id`: 用户ID(可选,只能查看自己的) + +**响应格式**: +```json +{ + "code": 200, + "message": "获取成功", + "data": [ + { + "id": 123, + "name": "我的收藏", + "description": "私有库描述", + "is_default": true, + "creator_count": 25, + "created_at": "2024-03-15" + } + ] +} +``` + +### 6.2 创建私有达人库 +- **接口路径**: `POST /private/pools/create/` +- **功能**: 创建新的私有达人库 +- **请求方法**: POST + +**请求体参数**: +```json +{ + "name": "私有库名称", // 必填 + "description": "私有库描述", // 可选 + "is_default": false // 可选,是否设为默认库 +} +``` + +**响应格式**: +```json +{ + "code": 200, + "message": "私有库创建成功", + "data": { + "id": 123, + "name": "私有库名称", + "is_default": false, + "creator_count": 0, + "created_at": "2024-03-15" + } +} +``` + +### 6.3 获取私有库中的达人 +- **接口路径**: `GET /private/pools/creators/{pool_id}/` 或 `GET /private/pools/creators/?pool_id={pool_id}` +- **功能**: 获取指定私有库中的达人列表 +- **请求方法**: GET + +**URL参数**: +- `pool_id`: 私有库ID(必填) +- `page`: 页码,默认为1 +- `page_size`: 每页数量,默认为10 +- `status`: 状态过滤,默认为active(可选:active, archived, public_removed) +- `keyword`: 关键词搜索(可选) + +**响应格式**: +```json +{ + "code": 200, + "message": "获取成功", + "data": [ + { + "relation_id": 789, + "creator_id": 456, + "name": "达人姓名", + "avatar": "头像URL", + "category": "Beauty & Personal Care", + "e_commerce_level": "L3", + "exposure_level": "KOL-1", + "followers": "125k", + "gmv": "$534k", + "avg_video_views": "85k", + "pricing": "$200", + "collab_count": 15, + "notes": "私有库备注", + "status": "active", // active, archived, public_removed + "added_from_public": true, + "added_at": "2024-03-15", + "is_public_removed": false, + "status_note": null + } + ], + "pagination": { + "current_page": 1, + "total_pages": 3, + "total_count": 25, + "has_next": true, + "has_prev": false + }, + "pool_info": { + "id": 123, + "name": "我的收藏", + "description": "私有库描述", + "is_default": true, + "user_id": 1, + "created_at": "2024-03-15" + } +} +``` + +### 6.4 添加达人到私有库 +- **接口路径**: `POST /private/pools/creators/add/` +- **功能**: 将达人添加到指定私有库 +- **请求方法**: POST + +**请求体参数**: +```json +{ + "pool_id": 123, // 必填 + "creator_id": 456, // 单个添加时使用 + "creator_ids": [456, 457, 458], // 批量添加时使用 + "notes": "备注信息" // 可选 +} +``` + +**响应格式**: +```json +{ + "code": 200, + "message": "操作成功", + "data": { + "added": [ + { + "id": 456, + "name": "达人姓名", + "action": "添加" + } + ], + "already_exists_count": 2, + "pool": { + "id": 123, + "name": "我的收藏" + } + } +} +``` + +### 6.5 更新私有库中的达人 +- **接口路径**: `POST /private/pools/creators/update/` +- **功能**: 更新私有库中达人的状态或备注 +- **请求方法**: POST + +**请求体参数**: +```json +{ + "relation_id": 789, // 必填 + "status": "archived", // 可选:active, archived + "notes": "新的备注信息" // 可选,传null可清空 +} +``` + +**响应格式**: +```json +{ + "code": 200, + "message": "更新成功", + "data": { + "relation_id": 789, + "creator_id": 456, + "pool_id": 123, + "status": "archived", + "notes": "新的备注信息" + } +} +``` + +### 6.6 从私有库移除达人 +- **接口路径**: `POST /private/pools/creators/remove/` +- **功能**: 从私有库中移除达人 +- **请求方法**: POST + +**请求体参数**: +```json +{ + // 方式1:通过关联ID删除 + "relation_id": 789, // 单个删除 + "relation_ids": [789, 790], // 批量删除 + + // 方式2:通过私有库ID和达人ID删除 + "pool_id": 123, + "creator_id": 456, // 单个删除 + "creator_ids": [456, 457] // 批量删除 +} +``` + +**响应格式**: +```json +{ + "code": 200, + "message": "移除成功", + "data": { + "deleted_count": 2, + "relation_ids": [789, 790], // 或creator_ids + "pool_id": 123 + } +} +``` + +### 6.7 筛选私有库中的达人 +- **接口路径**: `POST /private/pools/creators/filter/` +- **功能**: 根据过滤条件筛选私有库中的达人 +- **请求方法**: POST + +**URL参数**: +- `page`: 页码,默认为1 +- `page_size`: 每页数量,默认为10 + +**请求体参数**: +```json +{ + "pool_id": 123, // 必填 + "filter": { + "status": "active", // 可选:active, archived, public_removed + "category": ["Beauty & Personal Care"], // 多选 + "e_commerce_level": ["L1", "L2", "L3"], // 多选 + "exposure_level": ["KOL-1", "KOC-1"], // 多选 + "gmv_range": ["$0-$5k", "$5k-$25k"], // 多选 + "views_range": ["10k-100k"], // 单选 + "pricing": ["100-500"] // 单选 + } +} +``` + +**响应格式**: 同6.3 + +## 错误响应格式 + +所有接口在出错时都会返回统一的错误格式: + +```json +{ + "code": 400, // 错误状态码 + "message": "错误描述信息", + "data": null +} +``` + +**常见错误码**: +- `400`: 请求参数错误 +- `401`: 用户未认证 +- `403`: 权限不足 +- `404`: 资源不存在 +- `409`: 资源冲突(如重名) +- `500`: 服务器内部错误 + +## 使用示例 + +### 筛选达人示例 +```bash +curl -X POST "https://api.example.com/creators/filter/?page=1" \ + -H "Authorization: Token your_token_here" \ + -H "Content-Type: application/json" \ + -d '{ + "filter": { + "category": ["Beauty & Personal Care"], + "e_commerce_level": ["L2", "L3"], + "gmv_range": ["$5k-$25k", "$25k-$50k"] + } + }' +``` + +### 获取达人详情示例 +```bash +curl -X GET "https://api.example.com/creators/123/" \ + -H "Authorization: Token your_token_here" +``` + +### 更新指标数据示例 +```bash +curl -X POST "https://api.example.com/creators/metrics/update/" \ + -H "Authorization: Token your_token_here" \ + -H "Content-Type: application/json" \ + -d '{ + "creator_id": 123, + "metrics_type": "video", + "metrics_data": { + "start_date": "2024-03-01", + "end_date": "2024-03-31", + "gpm": 2.35, + "videos_count": 12, + "avg_views": 85000, + "avg_engagement": 3.2, + "avg_likes": 2500 + } + }' +``` diff --git a/discovery.md b/discovery.md new file mode 100644 index 0000000..3b5de9a --- /dev/null +++ b/discovery.md @@ -0,0 +1,371 @@ +# Discovery 模块 API 文档 + +本文档详细说明了 Discovery 模块的 API 接口,包括请求方法、URL、参数说明和响应格式。 + +## 目录 + +1. [通用说明](#通用说明) +2. [创作者搜索会话接口](#创作者搜索会话接口) +3. [创作者发现接口](#创作者发现接口) + +## 通用说明 + +### 基础URL + +所有 API 的基础 URL 为:`http://127.0.0.1:8000/api/discovery/` + +### 认证方式 + +所有 API 都需要 Token 认证。请在请求头中添加: + +``` +Authorization: Token +``` + +### 响应格式 + +所有 API 返回的数据格式统一为: + +```json +{ + "code": 200, // 状态码,200表示成功,其他表示错误 + "message": "成功", // 状态描述 + "data": {} // 返回的数据,可能是对象、数组或null +} +``` + +### 分页 + +列表接口支持分页,默认每页 20 条数据,最大每页 100 条。 + +分页参数: +- `page`: 页码,从1开始 +- `page_size`: 每页数量,默认20 + +分页响应格式: + +```json +{ + "code": 200, + "message": "获取数据成功", + "data": { + "count": 100, // 总记录数 + "next": "下一页URL", // 下一页链接,如果没有则为null + "previous": "上一页URL", // 上一页链接,如果没有则为null + "results": [] // 当前页数据 + } +} +``` + +## 创作者搜索会话接口 + +搜索会话是指用户进行的一次创作者搜索,包含搜索结果和相关统计信息。 + +### 获取搜索会话列表 + +- **URL**: `/sessions/` +- **方法**: GET +- **描述**: 获取所有搜索会话的列表 +- **参数**: + - 分页参数,参见[分页](#分页)部分 +- **响应示例**: + ```json + { + "code": 200, + "message": "获取搜索会话列表成功", + "data": [ + { + "id": 1, + "session_number": 123, + "creator_count": 100, + "shoppable_creators": 26, + "avg_followers": 162.2, + "avg_gmv": 534.1, + "avg_video_views": 1.9, + "date_created": "2023-01-01" + } + ] + } + ``` + +### 获取搜索会话详情 + +- **URL**: `/sessions/{session_id}/` +- **方法**: GET +- **描述**: 获取指定ID的搜索会话详细信息,包含搜索到的创作者列表 +- **参数**: + - `session_id`: 会话ID (路径参数) +- **响应示例**: + ```json + { + "code": 200, + "message": "获取搜索会话详情成功", + "data": { + "id": 1, + "session_number": 123, + "creator_count": 100, + "shoppable_creators": 26, + "avg_followers": 162.2, + "avg_gmv": 534.1, + "avg_video_views": 1.9, + "date_created": "2023-01-01", + "creators": [ + // 创作者列表,见创作者数据结构 + ] + } + } + ``` + +### 创建搜索会话 + +- **URL**: `/sessions/` +- **方法**: POST +- **描述**: 创建新的搜索会话 +- **请求参数**: + ```json + { + "session_number": 123, + "creator_count": 100, + "shoppable_creators": 26, + "avg_followers": 162.2, + "avg_gmv": 534.1, + "avg_video_views": 1.9, + "date_created": "2023-01-01" + } + ``` +- **响应示例**: + ```json + { + "code": 200, + "message": "创建搜索会话成功", + "data": { + "id": 1, + "session_number": 123, + "creator_count": 100, + "shoppable_creators": 26, + "avg_followers": 162.2, + "avg_gmv": 534.1, + "avg_video_views": 1.9, + "date_created": "2023-01-01" + } + } + ``` + +### 更新搜索会话 + +- **URL**: `/sessions/{session_id}/` +- **方法**: PUT/PATCH +- **描述**: 更新搜索会话信息 +- **参数**: + - `session_id`: 会话ID (路径参数) + - 请求体包含要更新的字段 +- **响应示例**: + ```json + { + "code": 200, + "message": "更新搜索会话成功", + "data": { + // 更新后的会话信息 + } + } + ``` + +### 删除搜索会话 + +- **URL**: `/sessions/{session_id}/` +- **方法**: DELETE +- **描述**: 删除搜索会话 +- **参数**: + - `session_id`: 会话ID (路径参数) +- **响应示例**: + ```json + { + "code": 200, + "message": "删除搜索会话成功", + "data": null + } + ``` + +### 获取会话创作者列表 + +- **URL**: `/sessions/{session_id}/results/` +- **方法**: GET +- **描述**: 获取指定会话的搜索结果(创作者列表) +- **参数**: + - `session_id`: 会话ID (路径参数) + - 分页参数,参见[分页](#分页)部分 +- **响应示例**: + ```json + { + "code": 200, + "message": "获取会话创作者列表成功", + "data": [ + // 创作者列表,见创作者数据结构 + ] + } + ``` + +## 创作者发现接口 + +### 获取创作者列表 + +- **URL**: `/creators/` +- **方法**: GET +- **描述**: 获取所有创作者的列表 +- **参数**: + - 分页参数,参见[分页](#分页)部分 +- **响应示例**: + ```json + { + "code": 200, + "message": "获取创作者列表成功", + "data": [ + { + "id": 1, + "name": "创作者名称", + "avatar": "头像URL", + "category": "Phones & Electronics", + "ecommerce_level": "L2", + "exposure_level": "KOC-1", + "followers": 162.2, + "gmv": 534.1, + "items_sold": 18.1, + "avg_video_views": 1.9, + "has_ecommerce": true, + "tiktok_url": "抖音链接", + "session": 1 + } + ] + } + ``` + +### 获取创作者详情 + +- **URL**: `/creators/{creator_id}/` +- **方法**: GET +- **描述**: 获取指定ID的创作者详细信息 +- **参数**: + - `creator_id`: 创作者ID (路径参数) +- **响应示例**: + ```json + { + "code": 200, + "message": "获取创作者详情成功", + "data": { + "id": 1, + "name": "创作者名称", + "avatar": "头像URL", + "category": "Phones & Electronics", + "ecommerce_level": "L2", + "exposure_level": "KOC-1", + "followers": 162.2, + "gmv": 534.1, + "items_sold": 18.1, + "avg_video_views": 1.9, + "has_ecommerce": true, + "tiktok_url": "抖音链接", + "session": 1 + } + } + ``` + +### 搜索创作者 + +- **URL**: `/creators/search/` +- **方法**: POST +- **描述**: 根据条件搜索创作者并创建新的搜索会话 +- **请求参数**: + ```json + { + "query": "搜索关键词", + "category": "Phones & Electronics", // 可选,见类别列表 + "ecommerce_level": "L2", // 可选,见电商等级列表 + "exposure_level": "KOC-1" // 可选,见曝光等级列表 + } + ``` +- **响应示例**: + ```json + { + "code": 200, + "message": "搜索创作者成功", + "data": { + "id": 1, + "session_number": 123, + "creator_count": 5, + "shoppable_creators": 3, + "avg_followers": 162.2, + "avg_gmv": 534.1, + "avg_video_views": 1.9, + "date_created": "2023-01-01", + "creators": [ + // 创作者列表,见创作者数据结构 + ] + } + } + ``` + +## 数据结构 + +### 创作者类别 + +- `Phones & Electronics`: 手机与电子产品 +- `Womenswear & Underwear`: 女装与内衣 +- `Sports & Outdoor`: 运动与户外 +- `Food & Beverage`: 食品与饮料 +- `Health`: 健康 +- `Kitchenware`: 厨具 +- `Furniture`: 家具 +- `Shoes`: 鞋类 +- `Home Supplies`: 家居用品 + +### 电商等级 + +- `L1`: Level 1 +- `L2`: Level 2 +- `L3`: Level 3 +- `L4`: Level 4 +- `L5`: Level 5 +- `New tag`: 新标签 + +### 曝光等级 + +- `KOC-1`: Key Opinion Consumer 1级 +- `KOC-2`: Key Opinion Consumer 2级 +- `KOL-2`: Key Opinion Leader 2级 +- `KOL-3`: Key Opinion Leader 3级 +- `New tag`: 新标签 + +### 创作者数据结构 + +```json +{ + "id": 1, + "name": "创作者名称", + "avatar": "头像URL", + "category": "Phones & Electronics", + "ecommerce_level": "L2", + "exposure_level": "KOC-1", + "followers": 162.2, // 单位:K (千) + "gmv": 534.1, // 单位:K (千) + "items_sold": 18.1, // 单位:K (千) + "avg_video_views": 1.9, // 单位:M (百万) + "has_ecommerce": true, // 是否有电商能力 + "tiktok_url": "抖音链接", + "session": 1 // 所属搜索会话ID +} +``` + +### 搜索会话数据结构 + +```json +{ + "id": 1, + "session_number": 123, // 会话编号 + "creator_count": 100, // 创作者数量 + "shoppable_creators": 26, // 可购物创作者数量 + "avg_followers": 162.2, // 平均粉丝数 (K) + "avg_gmv": 534.1, // 平均GMV (K) + "avg_video_views": 1.9, // 平均视频观看量 (M) + "date_created": "2023-01-01" // 创建日期 +} +``` diff --git a/template.md b/template.md new file mode 100644 index 0000000..2955ad2 --- /dev/null +++ b/template.md @@ -0,0 +1,708 @@ +# 模板模块 API 文档 + +## 简介 + +模板模块(template)提供了一系列API,用于管理和使用各种消息、内容模板,支持按分类、平台、任务类型等维度管理模板。所有接口均需要身份验证,使用CustomTokenAuthentication进行认证。 + +本文档详细说明了模板模块中所有接口的使用方法、请求参数和响应结果。 + +## 目录 + +- [模板管理](#模板管理) +- [模板分类管理](#模板分类管理) + +## 模板管理 + +模板模块使用REST风格的API,通过TemplateViewSet提供了以下功能: + +### 1. 获取模板列表 + +**接口说明**:获取所有模板的列表 + +**请求地址**:`GET /template/` + +**查询参数**: + +| 参数名 | 类型 | 必填 | 说明 | +|-------|------|-----|------| +| page | int | 否 | 分页页码,默认1 | +| page_size | int | 否 | 每页显示数量,默认10,最大100 | +| title | string | 否 | 按标题内容过滤(模糊匹配) | +| content | string | 否 | 按正文内容过滤(模糊匹配) | +| mission | string | 否 | 按任务类型过滤 | +| platform | string | 否 | 按平台过滤 | +| collaboration_type | string | 否 | 按合作模式过滤 | +| service | string | 否 | 按服务类型过滤 | +| category | int | 否 | 按分类ID过滤 | +| category_name | string | 否 | 按分类名称过滤(模糊匹配) | +| is_public | boolean | 否 | 按是否公开过滤 | +| created_after | datetime | 否 | 按创建日期过滤(早于指定日期) | +| created_before | datetime | 否 | 按创建日期过滤(晚于指定日期) | +| search | string | 否 | 搜索标题和内容 | +| ordering | string | 否 | 排序字段,例如:-created_at表示按创建时间降序排序 | + +**响应结果**: + +```json +{ + "code": 200, + "message": "获取模板列表成功", + "data": { + "count": 100, + "next": "http://example.com/template/?page=2", + "previous": null, + "results": [ + { + "id": 1, + "title": "模板标题", + "preview": "模板内容预览...", + "category_name": "分类名称", + "mission": "initial_contact", + "mission_display": "初步联系", + "platform": "tiktok", + "platform_display": "TikTok", + "service": "text", + "service_display": "文本", + "collaboration_type": "paid_promotion", + "collaboration_type_display": "付费推广", + "is_public": true, + "created_at": "2023-01-01T00:00:00Z", + "updated_at": "2023-01-01T00:00:00Z" + } + ], + "total_pages": 10, + "current_page": 1 + } +} +``` + +### 2. 获取模板详情 + +**接口说明**:获取单个模板的详细信息 + +**请求地址**:`GET /template/{id}/` + +**路径参数**: + +| 参数名 | 类型 | 必填 | 说明 | +|-------|------|-----|------| +| id | int | 是 | 模板ID | + +**响应结果**: + +```json +{ + "code": 200, + "message": "获取模板详情成功", + "data": { + "id": 1, + "title": "模板标题", + "content": "模板完整内容...", + "preview": "模板内容预览...", + "category": { + "id": 1, + "name": "分类名称", + "description": "分类描述", + "created_at": "2023-01-01T00:00:00Z", + "updated_at": "2023-01-01T00:00:00Z" + }, + "mission": "initial_contact", + "mission_display": "初步联系", + "platform": "tiktok", + "platform_display": "TikTok", + "service": "text", + "service_display": "文本", + "collaboration_type": "paid_promotion", + "collaboration_type_display": "付费推广", + "is_public": true, + "created_at": "2023-01-01T00:00:00Z", + "updated_at": "2023-01-01T00:00:00Z" + } +} +``` + +### 3. 创建模板 + +**接口说明**:创建新的模板 + +**请求地址**:`POST /template/` + +**请求参数**: + +```json +{ + "title": "模板标题", + "content": "模板完整内容...", + "category": 1, + "mission": "initial_contact", + "platform": "tiktok", + "service": "text", + "collaboration_type": "paid_promotion", + "is_public": true +} +``` + +**参数说明**: + +| 参数名 | 类型 | 必填 | 说明 | +|-------|------|-----|------| +| title | string | 是 | 模板标题 | +| content | string | 是 | 模板内容 | +| category | int | 是 | 分类ID | +| mission | string | 否 | 任务类型,默认"initial_contact",可选值: initial_contact(初步联系), follow_up(跟进), negotiation(谈判), closing(成交), other(其他) | +| platform | string | 否 | 平台,默认"tiktok",可选值: tiktok, instagram, youtube, facebook, twitter, other | +| service | string | 否 | 服务类型,默认"text",可选值: voice(声优-交谈), text(文本), video(视频), image(图片), other(其他) | +| collaboration_type | string | 否 | 合作模式,默认"paid_promotion",可选值: paid_promotion(付费推广), affiliate(联盟营销), sponsored_content(赞助内容), brand_ambassador(品牌大使), other(其他) | +| is_public | boolean | 否 | 是否公开,默认true | + +**响应结果**: + +```json +{ + "code": 201, + "message": "模板创建成功", + "data": { + "id": 1, + "title": "模板标题", + "content": "模板完整内容...", + "category": 1, + "mission": "initial_contact", + "platform": "tiktok", + "service": "text", + "collaboration_type": "paid_promotion", + "is_public": true + } +} +``` + +### 4. 更新模板 + +**接口说明**:更新已有的模板 + +**请求地址**:`PUT /template/{id}/` 或 `PATCH /template/{id}/` + +**路径参数**: + +| 参数名 | 类型 | 必填 | 说明 | +|-------|------|-----|------| +| id | int | 是 | 模板ID | + +**请求参数**: +- PUT请求需要提供完整的模板信息 +- PATCH请求可以只提供需要更新的字段 + +```json +{ + "title": "更新后的模板标题", + "content": "更新后的模板内容...", + "category": 2, + "mission": "follow_up", + "platform": "instagram", + "service": "voice", + "collaboration_type": "affiliate", + "is_public": false +} +``` + +**响应结果**: + +```json +{ + "code": 200, + "message": "模板更新成功", + "data": { + "id": 1, + "title": "更新后的模板标题", + "content": "更新后的模板内容...", + "category": 2, + "mission": "follow_up", + "platform": "instagram", + "service": "voice", + "collaboration_type": "affiliate", + "is_public": false + } +} +``` + +### 5. 删除模板 + +**接口说明**:删除指定的模板 + +**请求地址**:`DELETE /template/{id}/` + +**路径参数**: + +| 参数名 | 类型 | 必填 | 说明 | +|-------|------|-----|------| +| id | int | 是 | 模板ID | + +**响应结果**: + +```json +{ + "code": 200, + "message": "模板删除成功", + "data": null +} +``` + +### 6. 获取我的模板 + +**接口说明**:获取当前用户有权限查看的所有模板 + +**请求地址**:`GET /template/mine/` + +**查询参数**: + +| 参数名 | 类型 | 必填 | 说明 | +|-------|------|-----|------| +| page | int | 否 | 分页页码,默认1 | +| page_size | int | 否 | 每页显示数量,默认10,最大100 | + +**响应结果**: + +```json +{ + "code": 200, + "message": "获取模板成功", + "data": { + "count": 50, + "next": "http://example.com/template/mine/?page=2", + "previous": null, + "results": [ + { + "id": 1, + "title": "模板标题", + "preview": "模板内容预览...", + "category_name": "分类名称", + "mission": "initial_contact", + "mission_display": "初步联系", + "platform": "tiktok", + "platform_display": "TikTok", + "service": "text", + "service_display": "文本", + "collaboration_type": "paid_promotion", + "collaboration_type_display": "付费推广", + "is_public": true, + "created_at": "2023-01-01T00:00:00Z", + "updated_at": "2023-01-01T00:00:00Z" + } + ], + "total_pages": 5, + "current_page": 1 + } +} +``` + +### 7. 获取公开模板 + +**接口说明**:获取所有公开的模板 + +**请求地址**:`GET /template/public/` + +**查询参数**: + +| 参数名 | 类型 | 必填 | 说明 | +|-------|------|-----|------| +| page | int | 否 | 分页页码,默认1 | +| page_size | int | 否 | 每页显示数量,默认10,最大100 | + +**响应结果**: + +```json +{ + "code": 200, + "message": "获取公开模板成功", + "data": { + "count": 30, + "next": "http://example.com/template/public/?page=2", + "previous": null, + "results": [ + { + "id": 1, + "title": "模板标题", + "preview": "模板内容预览...", + "category_name": "分类名称", + "mission": "initial_contact", + "mission_display": "初步联系", + "platform": "tiktok", + "platform_display": "TikTok", + "service": "text", + "service_display": "文本", + "collaboration_type": "paid_promotion", + "collaboration_type_display": "付费推广", + "is_public": true, + "created_at": "2023-01-01T00:00:00Z", + "updated_at": "2023-01-01T00:00:00Z" + } + ], + "total_pages": 3, + "current_page": 1 + } +} +``` + +### 8. 按任务类型获取模板 + +**接口说明**:按任务类型筛选模板 + +**请求地址**:`GET /template/by_mission/` + +**查询参数**: + +| 参数名 | 类型 | 必填 | 说明 | +|-------|------|-----|------| +| mission | string | 是 | 任务类型,可选值: initial_contact(初步联系), follow_up(跟进), negotiation(谈判), closing(成交), other(其他) | +| page | int | 否 | 分页页码,默认1 | +| page_size | int | 否 | 每页显示数量,默认10,最大100 | + +**响应结果**: + +```json +{ + "code": 200, + "message": "按任务类型获取模板成功", + "data": { + "count": 20, + "next": "http://example.com/template/by_mission/?mission=initial_contact&page=2", + "previous": null, + "results": [ + { + "id": 1, + "title": "初步联系模板", + "preview": "模板内容预览...", + "category_name": "分类名称", + "mission": "initial_contact", + "mission_display": "初步联系", + "platform": "tiktok", + "platform_display": "TikTok", + "service": "text", + "service_display": "文本", + "collaboration_type": "paid_promotion", + "collaboration_type_display": "付费推广", + "is_public": true, + "created_at": "2023-01-01T00:00:00Z", + "updated_at": "2023-01-01T00:00:00Z" + } + ], + "total_pages": 2, + "current_page": 1 + } +} +``` + +### 9. 按平台获取模板 + +**接口说明**:按平台筛选模板 + +**请求地址**:`GET /template/by_platform/` + +**查询参数**: + +| 参数名 | 类型 | 必填 | 说明 | +|-------|------|-----|------| +| platform | string | 是 | 平台,可选值: tiktok, instagram, youtube, facebook, twitter, other | +| page | int | 否 | 分页页码,默认1 | +| page_size | int | 否 | 每页显示数量,默认10,最大100 | + +**响应结果**: + +```json +{ + "code": 200, + "message": "按平台获取模板成功", + "data": { + "count": 15, + "next": "http://example.com/template/by_platform/?platform=tiktok&page=2", + "previous": null, + "results": [ + { + "id": 1, + "title": "TikTok模板", + "preview": "模板内容预览...", + "category_name": "分类名称", + "mission": "initial_contact", + "mission_display": "初步联系", + "platform": "tiktok", + "platform_display": "TikTok", + "service": "text", + "service_display": "文本", + "collaboration_type": "paid_promotion", + "collaboration_type_display": "付费推广", + "is_public": true, + "created_at": "2023-01-01T00:00:00Z", + "updated_at": "2023-01-01T00:00:00Z" + } + ], + "total_pages": 2, + "current_page": 1 + } +} +``` + +### 10. 按合作方式获取模板 + +**接口说明**:按合作方式筛选模板 + +**请求地址**:`GET /template/by_collaboration/` + +**查询参数**: + +| 参数名 | 类型 | 必填 | 说明 | +|-------|------|-----|------| +| collaboration | string | 是 | 合作模式,可选值: paid_promotion(付费推广), affiliate(联盟营销), sponsored_content(赞助内容), brand_ambassador(品牌大使), other(其他) | +| page | int | 否 | 分页页码,默认1 | +| page_size | int | 否 | 每页显示数量,默认10,最大100 | + +**响应结果**: + +```json +{ + "code": 200, + "message": "按合作方式获取模板成功", + "data": { + "count": 25, + "next": "http://example.com/template/by_collaboration/?collaboration=paid_promotion&page=2", + "previous": null, + "results": [ + { + "id": 1, + "title": "付费推广模板", + "preview": "模板内容预览...", + "category_name": "分类名称", + "mission": "initial_contact", + "mission_display": "初步联系", + "platform": "tiktok", + "platform_display": "TikTok", + "service": "text", + "service_display": "文本", + "collaboration_type": "paid_promotion", + "collaboration_type_display": "付费推广", + "is_public": true, + "created_at": "2023-01-01T00:00:00Z", + "updated_at": "2023-01-01T00:00:00Z" + } + ], + "total_pages": 3, + "current_page": 1 + } +} +``` + +### 11. 按服务类型获取模板 + +**接口说明**:按服务类型筛选模板 + +**请求地址**:`GET /template/by_service/` + +**查询参数**: + +| 参数名 | 类型 | 必填 | 说明 | +|-------|------|-----|------| +| service | string | 是 | 服务类型,可选值: voice(声优-交谈), text(文本), video(视频), image(图片), other(其他) | +| page | int | 否 | 分页页码,默认1 | +| page_size | int | 否 | 每页显示数量,默认10,最大100 | + +**响应结果**: + +```json +{ + "code": 200, + "message": "按服务类型获取模板成功", + "data": { + "count": 18, + "next": "http://example.com/template/by_service/?service=text&page=2", + "previous": null, + "results": [ + { + "id": 1, + "title": "文本模板", + "preview": "模板内容预览...", + "category_name": "分类名称", + "mission": "initial_contact", + "mission_display": "初步联系", + "platform": "tiktok", + "platform_display": "TikTok", + "service": "text", + "service_display": "文本", + "collaboration_type": "paid_promotion", + "collaboration_type_display": "付费推广", + "is_public": true, + "created_at": "2023-01-01T00:00:00Z", + "updated_at": "2023-01-01T00:00:00Z" + } + ], + "total_pages": 2, + "current_page": 1 + } +} +``` + +## 模板分类管理 + +模板分类管理使用REST风格的API,通过TemplateCategoryViewSet提供了以下功能: + +### 1. 获取分类列表 + +**接口说明**:获取所有模板分类的列表 + +**请求地址**:`GET /template/categories/` + +**查询参数**: + +| 参数名 | 类型 | 必填 | 说明 | +|-------|------|-----|------| +| page | int | 否 | 分页页码,默认1 | +| page_size | int | 否 | 每页显示数量,默认10,最大100 | + +**响应结果**: + +```json +{ + "code": 200, + "message": "获取模板分类列表成功", + "data": { + "count": 8, + "next": null, + "previous": null, + "results": [ + { + "id": 1, + "name": "分类名称", + "description": "分类描述", + "created_at": "2023-01-01T00:00:00Z", + "updated_at": "2023-01-01T00:00:00Z" + } + ], + "total_pages": 1, + "current_page": 1 + } +} +``` + +### 2. 获取分类详情 + +**接口说明**:获取单个模板分类的详细信息 + +**请求地址**:`GET /template/categories/{id}/` + +**路径参数**: + +| 参数名 | 类型 | 必填 | 说明 | +|-------|------|-----|------| +| id | int | 是 | 分类ID | + +**响应结果**: + +```json +{ + "code": 200, + "message": "获取模板分类详情成功", + "data": { + "id": 1, + "name": "分类名称", + "description": "分类描述", + "created_at": "2023-01-01T00:00:00Z", + "updated_at": "2023-01-01T00:00:00Z" + } +} +``` + +### 3. 创建分类 + +**接口说明**:创建新的模板分类 + +**请求地址**:`POST /template/categories/` + +**请求参数**: + +```json +{ + "name": "新分类名称", + "description": "新分类描述" +} +``` + +**参数说明**: + +| 参数名 | 类型 | 必填 | 说明 | +|-------|------|-----|------| +| name | string | 是 | 分类名称 | +| description | string | 否 | 分类描述 | + +**响应结果**: + +```json +{ + "code": 201, + "message": "模板分类创建成功", + "data": { + "id": 2, + "name": "新分类名称", + "description": "新分类描述", + "created_at": "2023-01-02T00:00:00Z", + "updated_at": "2023-01-02T00:00:00Z" + } +} +``` + +### 4. 更新分类 + +**接口说明**:更新已有的模板分类 + +**请求地址**:`PUT /template/categories/{id}/` 或 `PATCH /template/categories/{id}/` + +**路径参数**: + +| 参数名 | 类型 | 必填 | 说明 | +|-------|------|-----|------| +| id | int | 是 | 分类ID | + +**请求参数**: +- PUT请求需要提供完整的分类信息 +- PATCH请求可以只提供需要更新的字段 + +```json +{ + "name": "更新后的分类名称", + "description": "更新后的分类描述" +} +``` + +**响应结果**: + +```json +{ + "code": 200, + "message": "模板分类更新成功", + "data": { + "id": 2, + "name": "更新后的分类名称", + "description": "更新后的分类描述", + "created_at": "2023-01-02T00:00:00Z", + "updated_at": "2023-01-03T00:00:00Z" + } +} +``` + +### 5. 删除分类 + +**接口说明**:删除指定的模板分类 + +**请求地址**:`DELETE /template/categories/{id}/` + +**路径参数**: + +| 参数名 | 类型 | 必填 | 说明 | +|-------|------|-----|------| +| id | int | 是 | 分类ID | + +**响应结果**: + +```json +{ + "code": 200, + "message": "模板分类删除成功", + "data": null +} +```