Files
geo/docs/superpowers/specs/2026-04-16-kol-feature-design.md
T
root 33f1121633 docs: add KOL feature design spec
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-16 22:08:50 +08:00

486 lines
16 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.
# KOL 功能设计文档
## 概述
为 GEO 工具平台新增 KOLKey Opinion Leader)功能模块。KOL 是平台中的超级用户角色——拥有普通用户的全部功能,同时可以创建、管理精调 prompt 订阅包,供其他用户付费订阅使用。平台记录订阅和使用数据,后续用于给 KOL 结算。
### 核心概念
- **KOL 用户**:拥有 `platform_role = "kol"` 的用户,具备普通用户全部权限 + 提示词管理 + 数据看板
- **订阅包(Package**KOL 发布的一组精调 prompt 的集合,面向某个行业/场景(如"家具行业精调包")
- **Prompt**:包内的具体提示词,适配不同平台或版本(如"豆包版友好"、"DeepSeek版"、"精调2025.4.16版"
- **动态表单**:每个 prompt 由 KOL 定义用户需要填写的变量(公司名、竞品等),prompt 内容对用户不可见
- **订阅**:用户通过申请订阅获取 KOL 包的使用权,管理员审批或手动绑定开通,第一版不做支付
### 实现策略
采用**渐进式集成**方案:KOL 作为现有系统的扩展层,复用已有的 article、generation_tasks 基础设施,新增 KOL 相关数据表和页面。改动最小,风险最低。
---
## 1. 数据模型
### 1.1 新增表
#### kol_packages — 订阅包
```sql
CREATE TABLE kol_packages (
id BIGSERIAL PRIMARY KEY,
kol_user_id BIGINT NOT NULL REFERENCES users(id),
name VARCHAR(200) NOT NULL,
description TEXT,
cover_url TEXT,
industry VARCHAR(100),
tags JSONB NOT NULL DEFAULT '[]',
price_note VARCHAR(200),
status VARCHAR(20) NOT NULL DEFAULT 'draft', -- draft / published / archived
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
deleted_at TIMESTAMPTZ
);
CREATE INDEX idx_kol_packages_kol_user ON kol_packages(kol_user_id) WHERE deleted_at IS NULL;
CREATE INDEX idx_kol_packages_status ON kol_packages(status) WHERE deleted_at IS NULL;
```
#### kol_prompts — KOL 提示词
```sql
CREATE TABLE kol_prompts (
id BIGSERIAL PRIMARY KEY,
package_id BIGINT NOT NULL REFERENCES kol_packages(id),
name VARCHAR(200) NOT NULL,
platform_hint VARCHAR(100), -- doubao / deepseek / chatgpt / 通用 等
prompt_content TEXT NOT NULL, -- prompt 模板内容,含 {{变量}} 占位符,用户不可见
variables_schema JSONB NOT NULL DEFAULT '[]', -- 动态表单定义
sort_order INT NOT NULL DEFAULT 0,
status VARCHAR(20) NOT NULL DEFAULT 'draft', -- draft / active / archived
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE INDEX idx_kol_prompts_package ON kol_prompts(package_id);
```
**variables_schema 格式**(变量 key 默认中文,也支持英文):
```json
[
{
"key": "公司名称",
"label": "公司名称",
"type": "input",
"required": true,
"placeholder": "请输入您的公司名"
},
{
"key": "行业",
"label": "行业",
"type": "select",
"options": ["家具", "建材", "家电"],
"required": true
},
{
"key": "主要竞品",
"label": "主要竞品",
"type": "textarea",
"required": false
},
{
"key": "月预算",
"label": "月预算(万)",
"type": "number",
"required": false
}
]
```
支持的 type 值:`input`(单行文本)、`textarea`(多行文本)、`select`(下拉选择)、`number`(数字)、`checkbox`(多选标签)。
#### kol_subscriptions — 订阅关系
```sql
CREATE TABLE kol_subscriptions (
id BIGSERIAL PRIMARY KEY,
tenant_id BIGINT NOT NULL REFERENCES tenants(id),
package_id BIGINT NOT NULL REFERENCES kol_packages(id),
status VARCHAR(20) NOT NULL DEFAULT 'pending', -- pending / active / expired / revoked
approved_by BIGINT REFERENCES users(id),
start_at TIMESTAMPTZ,
end_at TIMESTAMPTZ,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE UNIQUE INDEX uk_kol_subscription_active ON kol_subscriptions(tenant_id, package_id) WHERE status IN ('pending', 'active');
```
#### kol_usage_logs — 使用记录
```sql
CREATE TABLE kol_usage_logs (
id BIGSERIAL PRIMARY KEY,
package_id BIGINT NOT NULL REFERENCES kol_packages(id),
prompt_id BIGINT NOT NULL REFERENCES kol_prompts(id),
tenant_id BIGINT NOT NULL REFERENCES tenants(id),
article_id BIGINT REFERENCES articles(id),
variables_snapshot JSONB,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE INDEX idx_kol_usage_package ON kol_usage_logs(package_id, created_at DESC);
CREATE INDEX idx_kol_usage_tenant ON kol_usage_logs(tenant_id, created_at DESC);
```
### 1.2 现有表变更
#### articles 表
新增字段:
- `kol_prompt_id BIGINT REFERENCES kol_prompts(id)` — 关联使用的 KOL prompt
新增 `source_type` 值:`"kol"`
#### generation_tasks 表
新增 `task_type` 值:`"kol"`
`input_params_json` 存储用户填入的变量值:
```json
{
"kol_prompt_id": 42,
"variables": {
"公司名称": "宜家家居",
"行业": "家具",
"主要竞品": "全友、顾家",
"月预算": 50
}
}
```
#### platform_user_roles 表
新增 `platform_role` 值:`"kol"`
---
## 2. 页面结构与路由
### 2.1 侧边栏导航变更
在现有 `navSections`AppShell.vue)中新增两个分组:
```
现有导航:
Workspace
文章创作: 模版生成 | 自定义生成 | 自由创作 | 发布管理
品牌管理: 品牌库
品牌追踪: 追踪详情
内容管理: 知识库 | 图片库
新增:
KOL 市场: 模版市场 ← 所有用户可见
KOL 工作台: 提示词管理 | 数据看板 ← 仅 KOL 角色可见
```
"KOL 工作台" 分组根据用户 permissions 或 platform_role 动态显示/隐藏。
### 2.2 新增路由
| 路由 | 组件 | 角色 | 说明 |
|------|------|------|------|
| `/kol/marketplace` | KolMarketplaceView | 所有用户 | 浏览/筛选/订阅 KOL 包 |
| `/kol/packages/:id` | KolPackageDetailView | 所有用户 | 包详情 → prompt 列表 → 选择 prompt |
| `/kol/generate/:promptId` | KolGenerateView | 已订阅用户 | 动态表单(填变量)→ 提交生成 |
| `/kol/manage` | KolManageView | 仅 KOL | 管理订阅包 + AI 辅助编写 prompt |
| `/kol/dashboard` | KolDashboardView | 仅 KOL | 订阅数据统计看板 |
### 2.3 用户入口(3个)
1. **侧边栏「模版市场」**→ 浏览/筛选 → 订阅 → 选 prompt → 表单 → 生成
2. **Workspace 卡片区**:已订阅的包显示为卡片 → 点击 → 选 prompt → 表单 → 生成
3. **模版生成页面**:已订阅的 KOL 包也出现在模版选择器 modal 中
---
## 3. 普通用户流程
### 3.1 模版市场(KolMarketplaceView
- 卡片网格展示所有已发布的 KOL 订阅包
- 筛选:按行业、标签、KOL 名称
- 每张卡片展示:封面、包名、KOL 名称、行业标签、prompt 数量、订阅人数
- 卡片操作:点击进入包详情
### 3.2 包详情(KolPackageDetailView
- 头部:包名、描述、KOL 信息、行业标签
- 订阅状态区:
- 未订阅 → 显示「申请订阅」按钮(状态变为 pending)
- 待审批 → 显示「审核中」状态
- 已订阅 → 显示有效期
- Prompt 列表:展示包内所有 active prompt,每个显示名称 + 平台标识
- 点击某个 prompt → 跳转到生成页面(需已订阅)
### 3.3 动态表单生成(KolGenerateView
- 根据 `kol_prompts.variables_schema` 动态渲染表单
- 支持的字段类型:input、textarea、select、number、checkbox
- 用户填写变量 → 点击「生成文章」
- 后端:变量值替换 prompt 模板中的 `{{key}}` → 调用 LLM → 生成文章
- 生成的文章 `source_type = "kol"``kol_prompt_id` 关联对应 prompt
- 同时写入 `kol_usage_logs` 记录
---
## 4. KOL 提示词编辑器(KolManageView
### 4.1 包管理
- 列表展示 KOL 自己创建的所有订阅包
- 创建/编辑包:名称、描述、封面、行业、标签、定价说明
- 包状态管理:草稿 → 发布 → 下架
### 4.2 Prompt 编辑器(核心组件)
**三栏布局:**
- **左栏 — 变量组件面板(200px)**:
- 5 种可拖拽组件:输入框、多行文本、选择框、数字框、多选框
- 拖入编辑区光标位置触发配置
- **中栏 — Prompt 编辑区**
- 顶部 AI 辅助栏:
- AI 生成:KOL 描述需求 → AI 生成完整 prompt 模板(含变量)
- AI 优化:选中现有 prompt → AI 优化措辞/结构
- 复用现有 `template_assist_tasks` 异步任务机制
- 编辑区:支持富文本编辑,变量以彩色标签形式内联展示(如 `{{公司名称}}`
- 操作栏:预览表单、保存草稿、发布
- **右栏 — 变量配置面板(260px)**:
- 展示所有已添加的变量卡片
- 点击可编辑:key、显示名(label)、类型、是否必填、提示语、选项列表
- 变量 key 默认 = 显示名(中文),也支持手动改为英文
### 4.3 拖拽交互流程
1. KOL 从左侧面板拖一个组件到编辑区光标位置
2. 弹出配置弹窗:填写变量 key(默认中文)、显示名、必填、提示语/选项
3. 确认后:编辑区插入 `{{key}}` 占位符标签 + 右侧面板出现配置卡片
4. 后续可在右侧面板修改配置,编辑区标签同步更新
### 4.4 Prompt 内容保护
- `prompt_content` 只存储在服务端
- 面向普通用户的 API 永远不返回 prompt 原文
- 用户端只获取 `variables_schema`(表单定义)用于渲染表单
---
## 5. KOL 数据看板(KolDashboardView
### 5.1 数据指标
- **总订阅数**:所有包的 active 订阅总数
- **本月新增订阅**:当月新增 active 订阅
- **总使用次数**:所有 prompt 被使用生成文章的总次数
- **本月使用次数**:当月使用次数
### 5.2 按包维度
- 每个包的订阅用户数、使用次数
- 包内各 prompt 的使用次数排行
### 5.3 趋势图
- 订阅数随时间变化趋势
- 使用次数随时间变化趋势
### 5.4 数据来源
- 订阅数据:查询 `kol_subscriptions`
- 使用数据:查询 `kol_usage_logs`
- 后续扩展:收益计算、结算报表
---
## 6. 订阅管理
### 6.1 用户申请订阅
- 用户在包详情页点击「申请订阅」
- 创建 `kol_subscriptions` 记录,`status = 'pending'`
- 后续管理员审批
### 6.2 管理员操作
第一版通过现有平台管理机制处理:
- 审批待处理的订阅申请(pending → active
- 手动绑定开通:管理员直接创建 `status = 'active'` 的订阅记录
- 撤销订阅(active → revoked
### 6.3 订阅鉴权
- 用户访问 `/kol/generate/:promptId` 时,后端检查:
1. prompt 所属 package 是否存在
2. 用户 tenant 是否有该 package 的 active 订阅
3. 订阅是否在有效期内
- 不满足则返回 403
---
## 7. API 设计
### 7.1 KOL 市场(所有用户)
```
GET /api/tenant/kol/packages -- 市场列表(筛选:industry, tags, keyword
GET /api/tenant/kol/packages/:id -- 包详情(含 prompt 列表,不含 prompt_content
POST /api/tenant/kol/packages/:id/subscribe -- 申请订阅
GET /api/tenant/kol/subscriptions -- 我的订阅列表
```
### 7.2 KOL 生成(已订阅用户)
```
GET /api/tenant/kol/prompts/:id/schema -- 获取 prompt 的 variables_schema(不含 prompt_content
POST /api/tenant/kol/prompts/:id/generate -- 提交生成(body: variables 对象)
```
### 7.3 KOL 管理(仅 KOL 角色)
```
GET /api/tenant/kol/manage/packages -- 我的包列表
POST /api/tenant/kol/manage/packages -- 创建包
PUT /api/tenant/kol/manage/packages/:id -- 更新包
DELETE /api/tenant/kol/manage/packages/:id -- 删除包(软删除)
GET /api/tenant/kol/manage/packages/:id/prompts -- 包内 prompt 列表(含 prompt_content
POST /api/tenant/kol/manage/packages/:id/prompts -- 创建 prompt
PUT /api/tenant/kol/manage/prompts/:id -- 更新 prompt
DELETE /api/tenant/kol/manage/prompts/:id -- 删除 prompt
POST /api/tenant/kol/manage/prompts/ai-generate -- AI 辅助生成 prompt
POST /api/tenant/kol/manage/prompts/ai-optimize -- AI 辅助优化 prompt
```
### 7.4 KOL 看板(仅 KOL 角色)
```
GET /api/tenant/kol/dashboard/overview -- 总体指标
GET /api/tenant/kol/dashboard/packages -- 按包维度统计
GET /api/tenant/kol/dashboard/trend -- 趋势数据(query: period=7d/30d/90d
```
### 7.5 Workspace 集成
```
GET /api/tenant/workspace/template-cards -- 现有接口,扩展返回已订阅的 KOL 包卡片
```
---
## 8. 前端关键组件
| 组件 | 说明 |
|------|------|
| `KolMarketplaceView.vue` | 模版市场页面,卡片网格 + 筛选 |
| `KolPackageDetailView.vue` | 包详情,prompt 列表 + 订阅操作 |
| `KolGenerateView.vue` | 动态表单生成页面 |
| `KolManageView.vue` | KOL 包和 prompt 管理 |
| `KolPromptEditor.vue` | 核心组件:三栏 prompt 编辑器 |
| `KolVariablePanel.vue` | 左侧变量组件拖拽面板 |
| `KolVariableConfig.vue` | 右侧变量配置面板 |
| `KolDynamicForm.vue` | 根据 variables_schema 渲染动态表单(用户端 + 预览) |
| `KolDashboardView.vue` | KOL 数据看板 |
| `KolPackageCard.vue` | 市场/Workspace 中的订阅包卡片组件 |
---
## 9. 权限与角色
### 9.1 角色判断
- `platform_user_roles` 表中 `platform_role = 'kol'` 标识 KOL 用户
- 前端通过 `userInfo.permissions` 或单独 API 判断当前用户是否为 KOL
- KOL 工作台导航分组根据角色动态显示/隐藏
### 9.2 路由守卫
- `/kol/manage``/kol/dashboard`:前端路由守卫 + 后端 API 鉴权,仅 KOL 可访问
- `/kol/generate/:promptId`:后端校验订阅状态
### 9.3 API 鉴权
- `/api/tenant/kol/manage/*`:中间件校验 KOL 角色
- `/api/tenant/kol/prompts/:id/generate`:校验订阅有效性
- `/api/tenant/kol/dashboard/*`:校验 KOL 角色
---
## 10. i18n
`zh-CN.ts``en-US.ts` 中新增 `kol` 命名空间:
```
kol.marketplace.title -- 模版市场 / KOL Marketplace
kol.marketplace.filter.* -- 筛选相关
kol.package.subscribe -- 申请订阅
kol.package.subscribed -- 已订阅
kol.package.pending -- 审核中
kol.generate.title -- 生成文章
kol.generate.submit -- 提交生成
kol.manage.title -- 提示词管理
kol.manage.createPackage -- 创建订阅包
kol.manage.editor.* -- 编辑器相关
kol.dashboard.title -- 数据看板
kol.dashboard.totalSubs -- 总订阅数
kol.dashboard.monthSubs -- 本月新增
kol.dashboard.totalUsage -- 总使用次数
kol.dashboard.monthUsage -- 本月使用
nav.kolMarketplace -- 模版市场
nav.kolManage -- 提示词管理
nav.kolDashboard -- 数据看板
status.sourceType.kol -- KOL 生成
```
---
## 11. 与现有系统的集成点
| 现有模块 | 集成方式 |
|---------|---------|
| articles 表 | 新增 `source_type = "kol"` + `kol_prompt_id` 字段 |
| generation_tasks 表 | 新增 `task_type = "kol"` |
| 文章生成管道 | 复用 generation_tasks → worker → article_versions 流程 |
| platform_user_roles | 新增 `platform_role = "kol"` |
| template_assist_tasks | AI 辅助编写 prompt 复用此异步任务机制 |
| AppShell.vue navSections | 新增 2 个导航分组 |
| WorkspaceView.vue | 卡片区扩展显示已订阅 KOL 包 |
| TemplatesView.vue picker | 模版选择器 modal 中可展示已订阅 KOL 包 |
| display.ts getSourceTypeLabel | 新增 `"kol"` 分支 |
| shared-types | 新增 KOL 相关 TypeScript 接口 |
---
## 12. 第一版范围与不做的事
### 第一版做
- KOL 角色标识
- 订阅包 CRUD + 发布/下架
- Prompt 编辑器(变量拖拽 + AI 辅助)
- 模版市场浏览/筛选
- 申请订阅 + 管理员手动绑定开通
- 动态表单 → 文章生成
- KOL 数据看板(基础指标 + 趋势)
- Workspace 和模版选择器集成
- i18n 中英文支持
### 第一版不做
- 在线支付(用申请 + 管理员审批代替)
- 收益计算和提现
- Prompt 版本历史管理
- KOL 申请入驻流程(由管理员手动分配角色)
- 订阅包评价/评分系统
- Prompt A/B 测试