PRD v2.0 · 2026-04-27

内容分享功能
升级方案

产品需求文档 & 交互设计方案
覆盖知识库 · 数据库 · Agent Nova · Marketplace 全域统一

取消人数限制 群组分享机制 Marketplace 扩展 组件级复用

一、功能概述

项目背景

平台现有"内容分享"功能覆盖知识库、数据库、Agent Nova 任务三大模块。用户可通过邮箱前缀或用户名模糊匹配(多选)以及粘贴多个完整邮箱实现批量分享。该功能自上线以来已成为团队协作的核心入口。

适用范围

本次升级覆盖全平台所有可分享资源类型,包括原有三大模块及新增的 Marketplace 模块(智能体 Agents、提示词模板 Prompt Templates、工具 Tools)。

核心痛点

人数限制瓶颈

单次分享上限 20 人,无法满足大规模协作场景(如全部门同步、跨团队项目),用户被迫重复操作。

缺少群组机制

不支持群组分享,用户需反复输入相同成员列表,效率低下且易遗漏。

Marketplace 未覆盖

Marketplace 模块(Agents、Prompt Templates、Tools)尚未接入分享功能,形成功能断裂。

二、核心需求目标

目标一:取消人数限制

移除 20 人上限,支持无限人数分享。针对大批量场景(>1000 人)引入异步队列处理机制,确保系统稳定性与用户体验。

优先级: P0 · 预估影响面: 全量用户

目标二:引入群组分享

支持创建命名群组、从已有群组列表选择分享、群组成员与权限管理(增删改 + Owner/Admin/Member 三级角色)。

优先级: P0 · 预估影响面: 高频协作用户

目标三:全域统一 (Marketplace)

将完整分享逻辑扩展至 Marketplace 模块(Agents、Prompt Templates、Tools),确保所有入口 UI 交互、数据状态流转完全一致,组件级复用。

优先级: P1 · 预估影响面: Marketplace 用户

三、详细功能描述

3.1 创建群组流程

用户点击「+ 新建群组」
输入群组名称
名称是否重复?
提示「名称已存在」
返回修改
搜索并添加成员
为每位成员设置角色
(Owner / Admin / Member)
至少 1 名成员?
提示「请添加成员」
点击「创建群组」
群组创建成功
返回分享弹窗,自动选中新群组

3.2 选择群组分享流程

用户点击「分享」按钮
弹出分享弹窗
搜索框输入关键字
(同时匹配用户 + 群组)
选择用户 or 群组?
选择用户
添加至已选列表
选择群组
可展开查看成员
确认并添加群组至已选
统一设置权限级别
(可查看 / 可编辑 / 管理员)
总人数 > 1000?
≤1000
同步执行分享
>1000
异步任务队列处理
分享完成 / 任务已提交

3.3 分享状态流转

PENDING
待处理
PROCESSING
分享中
SUCCESS
全部成功
PARTIAL_FAILURE
部分失败
FAILED
全部失败

SUCCESS 处理

全部接收方均已成功获取权限。弹窗展示成功反馈并自动关闭(3s)。

PARTIAL_FAILURE 处理

展示失败用户列表及原因(如邮箱无效、权限不足)。提供「重试失败项」按钮,仅对失败项重新执行。

FAILED 处理

展示错误原因(如网络异常、服务端错误)。提供「全部重试」按钮。连续失败 3 次后建议用户联系管理员。

3.4 异步处理逻辑(>1000 人场景)

触发条件

当单次分享的总接收人数(用户 + 群组成员去重后)超过 1000 人时,系统自动切换为异步处理模式。

处理流程

  1. 前端提交分享请求,后端返回 async_task_id,响应时间 <3s。
  2. 后端将任务推入消息队列(如 RabbitMQ / Kafka),按批次处理(每批 200 人)。
  3. 前端展示「任务已提交」状态卡片,包含进度条(通过 WebSocket / SSE 实时更新)。
  4. 任务完成后推送通知(站内信 + 可选邮件通知),展示最终状态报告。

前端状态展示

┌────────────────────────────────────┐ │ 分享任务进行中 │ │ ━━━━━━━━━━━━━━━━━━━░░░░ 78% │ │ │ │ 总计: 2,350 人 │ │ 已完成: 1,833 人 │ │ 失败: 12 人 │ │ 剩余: 505 人 │ │ │ │ 预计剩余时间: ~45 秒 │ │ │ │ [后台运行] [取消任务] │ └────────────────────────────────────┘

重试策略

失败项自动重试最多 3 次(指数退避:2s → 4s → 8s),仍失败则标记为 FAILED 并记录原因。用户可在任务报告中手动触发对失败项的二次重试。

四、数据字段定义

4.1 群组表 share_groups

字段名类型必填默认值描述
idBIGINT必填自增群组唯一标识,主键
group_nameVARCHAR(100)必填群组名称,同一用户下唯一
creator_idBIGINT必填创建者用户 ID,外键关联 users 表
member_countINT必填0当前成员数量(冗余计数,异步更新)
descriptionVARCHAR(500)可选NULL群组描述信息
created_atTIMESTAMP必填NOW()创建时间
updated_atTIMESTAMP必填NOW()最后更新时间
is_activeBOOLEAN必填TRUE软删除标记

索引: UNIQUE(creator_id, group_name), INDEX(creator_id, is_active)

4.2 分享记录表 share_records

字段名类型必填默认值描述
idBIGINT必填自增分享记录唯一标识
resource_typeENUM必填资源类型:knowledge | database | task | agent | prompt_template | tool
resource_idBIGINT必填被分享资源的 ID
sharer_idBIGINT必填执行分享操作的用户 ID
target_typeENUM必填分享目标类型:user | group
target_idBIGINT必填目标用户 ID 或群组 ID
permission_levelENUM必填view权限级别:view | edit | admin
statusENUM必填pending状态:pending | processing | success | partial_failure | failed
async_task_idVARCHAR(64)可选NULL异步任务 ID(仅 >1000 人时生成)
created_atTIMESTAMP必填NOW()分享发起时间
expires_atTIMESTAMP可选NOW()+30d分享过期时间,NULL 表示永不过期

索引: INDEX(resource_type, resource_id), INDEX(sharer_id), INDEX(target_type, target_id), INDEX(status)

4.3 权限表 share_permissions

字段名类型必填默认值描述
idBIGINT必填自增权限记录唯一标识
share_record_idBIGINT必填关联的分享记录 ID
user_idBIGINT必填被授权用户 ID(群组分享时展开为个体记录)
permission_levelENUM必填viewview | edit | admin
granted_byBIGINT必填授权人用户 ID
granted_atTIMESTAMP必填NOW()授权时间
revoked_atTIMESTAMP可选NULL撤销时间,NULL 表示当前有效
is_activeBOOLEAN必填TRUE权限是否生效

索引: UNIQUE(share_record_id, user_id), INDEX(user_id, is_active), INDEX(permission_level)

4.4 群组成员表 group_members

字段名类型必填默认值描述
idBIGINT必填自增记录唯一标识
group_idBIGINT必填关联群组 ID
user_idBIGINT必填成员用户 ID
roleENUM必填member角色:owner(创建者,唯一)| admin | member
added_byBIGINT必填添加此成员的操作者 ID
added_atTIMESTAMP必填NOW()加入时间
is_activeBOOLEAN必填TRUE成员是否有效(软删除)

索引: UNIQUE(group_id, user_id), INDEX(user_id, is_active)

五、异常处理逻辑

异常场景错误码用户提示文案系统行为触发位置
邮箱格式错误 INVALID_EMAIL 「邮箱格式不正确,请检查后重试」 前端实时校验,阻止提交。输入框标红并显示 inline error。 分享弹窗 / 群组添加成员
用户不存在 USER_NOT_FOUND 「未找到该用户,请确认邮箱或用户名」 搜索结果返回空列表,输入框下方展示灰色提示。支持继续输入完整邮箱邀请(如开启邀请功能)。 分享弹窗 / 群组添加成员
重复分享 DUPLICATE_SHARE 「该资源已分享给此用户/群组」 后端校验去重,前端 Toast 提示(Warning 级别)。自动跳过已分享对象,继续处理其余。 确认分享时
权限不足 PERMISSION_DENIED 「您没有权限执行此操作」 阻止操作执行,弹窗展示权限不足提示。引导用户联系资源所有者。 分享 / 群组管理
资源已删除 RESOURCE_DELETED 「分享的资源已被删除或不可用」 关闭分享弹窗,页面刷新资源列表。 确认分享时
群组名称重复 GROUP_NAME_EXISTS 「群组名称已存在,请使用其他名称」 输入框下方 inline error,阻止创建。支持追加后缀建议(如"产品团队 (2)")。 新建群组弹窗
成员已在群组中 MEMBER_EXISTS 「该用户已是群组成员」 前端实时校验,搜索结果中已有成员置灰并标注"已添加"。 群组添加成员
网络超时 NETWORK_TIMEOUT 「网络连接超时,请稍后重试」 自动重试 2 次(间隔 1s、3s),仍失败则展示 Toast 错误 + 手动重试按钮。 所有网络请求
异步任务部分失败 ASYNC_PARTIAL_FAIL 「分享已完成,但 {n} 位用户分享失败」 任务报告中展示失败用户列表及原因。提供「重试失败项」按钮,仅重新处理失败记录。 异步任务完成通知
频率限制 RATE_LIMITED 「操作过于频繁,请 {n} 秒后重试」 返回 HTTP 429,前端倒计时展示,禁用按钮直到冷却结束。 所有分享操作
服务端异常 INTERNAL_ERROR 「系统繁忙,请稍后重试。如持续出现请联系管理员」 记录错误日志 + 告警。前端展示通用错误 Toast,提供反馈入口。 所有接口

六、非功能性需求

6.1 性能要求

场景处理模式响应时间要求技术策略
≤100 人分享 同步 接口响应 < 2 秒 单次数据库批量写入,事务保证原子性。
100–1000 人分享 同步 + 进度 接口响应 < 5 秒(含进度反馈) 分批写入(每批 200),前端展示进度条。使用数据库批量 INSERT + 连接池优化。
>1000 人分享 异步队列 初始化响应 < 3 秒,后台处理 消息队列(Kafka/RabbitMQ)+ Worker 集群。每批 200 人,Worker 数可水平扩展。WebSocket/SSE 推送进度。
群组列表加载 同步 响应 < 500ms Redis 缓存用户群组列表(TTL 5min),分页加载(每页 20 条),模糊搜索走 Elasticsearch。
搜索用户/群组 同步 响应 < 300ms Elasticsearch 前缀匹配 + 用户输入 debounce 300ms。结果按相关度排序,最多返回 50 条。

并发处理策略

  • 分享请求通过分布式锁(Redis SETNX)防止同一资源对同一目标的重复分享。
  • 异步 Worker 支持水平扩展,默认 4 实例,峰值可扩至 16 实例。
  • 数据库写入使用 Batch Insert + 乐观锁,减少锁竞争。
  • 前端按钮提交后立即禁用,防止重复点击(debounce + 请求去重)。

6.2 安全性

分享有效期

  • 默认有效期 30 天,可由分享者自定义(7天/30天/90天/永久)。
  • 过期后权限自动撤销,定时任务每小时扫描清理。
  • 资源所有者可随时手动撤销任意分享。

权限校验机制

  • 每次资源访问均校验权限(服务端中间件拦截),不依赖前端判断。
  • 权限变更实时生效,缓存同步延迟 <1s。
  • 支持权限降级(admin → edit → view),不可越级提升。

频率限制

  • 单用户每分钟最多 10 次分享操作(滑动窗口算法)。
  • 单用户每小时最多创建 20 个群组。
  • 超限返回 HTTP 429,附带 Retry-After 头。

审计与加密

  • 所有分享、权限变更、群组操作均记录审计日志(操作者、时间、IP、行为详情)。
  • 审计日志保留 180 天,不可篡改。
  • 传输层加密 TLS 1.3,敏感字段(邮箱)存储时 AES-256 加密。

七、关键界面原型

7.1 改版后的分享弹窗

┌───────────────────────────────────────────────┐ │ 分享 "2026 Q2 产品路线图" [✕] │ ├───────────────────────────────────────────────┤ │ │ │ ┌───────────────────────────────────────┐ │ │ │ 🔍 搜索用户邮箱、用户名或群组... │ │ │ └───────────────────────────────────────┘ │ │ │ │ ┌─ 群组 ────────────────────────────────┐ │ │ │ │ │ │ │ ☐ 📁 产品团队 12 人 [展开▾] │ │ │ │ ☐ 📁 技术部门 28 人 [展开▾] │ │ │ │ ☐ 📁 设计中心 8 人 [展开▾] │ │ │ │ │ │ │ │ + 新建群组... │ │ │ └────────────────────────────────────────┘ │ │ │ │ ┌─ 最近分享 ────────────────────────────┐ │ │ │ ☐ 👤 [email protected] │ │ │ │ ☐ 👤 [email protected] │ │ │ │ ☐ 👤 [email protected] │ │ │ └────────────────────────────────────────┘ │ │ │ │ ┌─ 已选择 (14人) ───────────────────────┐ │ │ │ 📁 产品团队(12) [✕] │ │ │ │ 👤 zhang.wei [✕] │ │ │ │ 👤 li.ming [✕] │ │ │ └────────────────────────────────────────┘ │ │ │ │ 权限: [ 可查看 ▾ ] │ │ 有效期: [ 30 天 ▾ ] │ │ │ │ ┌─────────┐ ┌──────────────┐ │ │ │ 取 消 │ │ 确认分享 ➜ │ │ │ └─────────┘ └──────────────┘ │ └───────────────────────────────────────────────┘

关键交互说明

A. 统一搜索框

支持同时搜索用户(邮箱/用户名)和群组(群组名称),搜索结果分两栏展示。输入 debounce 300ms,最少 2 字符触发搜索。

B. 群组区域

展示当前用户可访问的群组列表(Owner / Admin / Member),按最近使用排序。点击 [展开] 可预览群组成员列表。勾选即添加至已选列表。

C. 已选区域

实时展示已选用户和群组,Chip 形式排列。群组 Chip 显示成员数量。点击 [✕] 移除。总人数去重计算后展示。

D. 权限与有效期

全局权限选择器:可查看 / 可编辑 / 管理员。有效期选择器:7天 / 30天 / 90天 / 永久。统一应用于本次分享的所有对象。

7.2 新建/管理群组弹窗

┌───────────────────────────────────────────────┐ │ 新建群组 [✕] │ ├───────────────────────────────────────────────┤ │ │ │ 群组名称 * │ │ ┌───────────────────────────────────────┐ │ │ │ 产品设计评审组 │ │ │ └───────────────────────────────────────┘ │ │ │ │ 群组描述(可选) │ │ ┌───────────────────────────────────────┐ │ │ │ 用于产品设计方案的评审与讨论 │ │ │ └───────────────────────────────────────┘ │ │ │ │ 添加成员 │ │ ┌───────────────────────────────────────┐ │ │ │ 🔍 搜索邮箱或用户名... │ │ │ └───────────────────────────────────────┘ │ │ │ │ 已添加成员 (4人) │ │ ┌────────────────────────────────────────┐ │ │ │ 🟢 我 (Owner) 所有者 固定 │ │ │ │ 👤 [email protected] [ 管理员 ▾] [✕] │ │ │ │ 👤 [email protected] [ 成员 ▾] [✕] │ │ │ │ 👤 [email protected] [ 成员 ▾] [✕] │ │ │ └────────────────────────────────────────┘ │ │ │ │ ┌─────────┐ ┌──────────────┐ │ │ │ 取 消 │ │ 创建群组 ➜ │ │ │ └─────────┘ └──────────────┘ │ └───────────────────────────────────────────────┘

交互细节

群组名称校验

实时校验:2-50 字符,不允许特殊字符。失焦时异步校验是否重名,重名则 inline 提示并建议替代名称。

成员角色管理

创建者自动成为 Owner(不可变更、不可移除)。新成员默认角色为 Member。Owner 和 Admin 可修改其他成员角色。Member 只能查看群组信息。

角色权限矩阵

操作OwnerAdminMember
删除群组
修改群组信息
添加/移除成员
修改成员角色✅*
使用群组分享
退出群组

* Admin 不可修改 Owner 或其他 Admin 的角色

7.3 分享状态反馈

成功状态

┌──────────────────────────┐ │ │ │ ✅ 分享成功! │ │ │ │ 已分享给 14 位用户 │ │ (含群组「产品团队」) │ │ │ │ 权限: 可查看 │ │ 有效期: 30 天 │ │ │ │ [ 完成 ] │ │ │ │ 3 秒后自动关闭... │ └──────────────────────────┘

部分失败状态

┌──────────────────────────┐ │ │ │ ⚠️ 分享部分完成 │ │ │ │ 成功: 12 人 │ │ 失败: 2 人 │ │ │ │ 失败详情: │ │ ├ [email protected] → 用户不存在│ │ └ [email protected] → 权限不足 │ │ │ │ [重试失败项] [完成] │ └──────────────────────────┘

失败状态

┌──────────────────────────┐ │ │ │ ❌ 分享失败 │ │ │ │ 原因: 网络连接超时 │ │ │ │ 已自动重试 3 次 │ │ 仍然无法完成操作 │ │ │ │ [全部重试] │ │ [联系管理员] │ │ │ └──────────────────────────┘

八、用户操作流程 (User Flow)

以下为从「点击分享」到「完成分享」的完整用户路径,重点标注群组分享的新增环节。

1

触发分享入口

用户在任意资源页面(知识库、数据库、Agent Nova 任务、Marketplace 的 Agent / Prompt Template / Tool 详情页或卡片)点击「分享」按钮。

触发组件: <ShareButton resourceType={type} resourceId={id} />

2

分享弹窗弹出

系统弹出统一的 ShareModal 组件。异步加载当前用户的群组列表和最近分享记录。焦点自动聚焦在搜索框。

3
新增环节

选择分享目标(用户 / 群组)

路径 A — 搜索用户:在搜索框输入邮箱或用户名 → 下拉列表展示匹配结果 → 勾选用户 → 加入已选列表。支持粘贴多个邮箱(逗号/换行分隔)批量添加。

路径 B — 选择已有群组:在群组区域浏览或搜索群组 → 可点击 [展开] 预览成员 → 勾选群组 → 群组整体加入已选列表(显示成员数)。

路径 C — 新建群组:点击「+ 新建群组」→ 弹出二级模态框 → 输入名称、描述 → 搜索并添加成员 → 设置角色 → 创建成功 → 自动返回分享弹窗并选中新群组。

4

设置权限与有效期

从下拉选择器中选择权限级别(可查看 / 可编辑 / 管理员)和有效期(7天 / 30天 / 90天 / 永久)。权限统一应用于本次全部分享对象。

5

确认与执行

用户确认已选列表后点击「确认分享」。系统根据总人数自动选择同步/异步模式:

  • ≤1000 人:同步执行,按钮变为 Loading 状态,完成后直接展示结果。
  • >1000 人:系统弹出确认框「本次分享涉及 {n} 人,将以后台任务方式处理」→ 确认后创建异步任务。
6

结果反馈

根据执行结果展示对应状态(成功 / 部分失败 / 失败),参见 7.3 节的状态反馈原型。成功状态 3 秒后自动关闭弹窗,失败状态保持展示直到用户手动操作。异步任务通过通知中心推送最终结果。

九、一致性说明(Marketplace 复用方案)

9.1 组件复用架构

全平台所有分享入口共用同一套组件库,确保 UI 交互与数据状态完全一致:

┌─────────────────────────────────────────────────────────────────────┐ │ 共享组件层 (Shared Components) │ │ │ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │ │ ShareButton │ │ ShareModal │ │ GroupManager │ │ │ │ │ │ │ │ │ │ │ │ 分享入口按钮 │ │ 分享弹窗主体 │ │ 群组管理面板 │ │ │ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ │ │ │ │ │ │ │ ┌──────┴─────────────────┴─────────────────┴──────────────┐ │ │ │ 统一状态管理 (Share State Machine) │ │ │ │ IDLE → SELECTING → CONFIRMING → PROCESSING → RESULT │ │ │ └──────────────────────────┬──────────────────────────────┘ │ │ │ │ │ ┌──────────────────────────┴──────────────────────────────┐ │ │ │ 统一 API 层 (Share API Service) │ │ │ │ POST /api/v2/share GET /api/v2/share/status/:id │ │ │ │ POST /api/v2/groups PUT /api/v2/groups/:id │ │ │ └─────────────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────────────┘ 调用方式(所有模块统一): ────────────────────────────────────────────── <ShareModal resourceType="knowledge | database | task | agent | prompt_template | tool" resourceId={resourceId} resourceName={resourceName} onSuccess={handleSuccess} onClose={handleClose} />

9.2 各模块入口映射

模块资源类型 (resourceType)入口位置复用组件
知识库knowledge知识库详情页右上角「分享」按钮ShareButton + ShareModal
数据库database数据库详情页右上角「分享」按钮ShareButton + ShareModal
Agent Novatask任务详情页操作栏「分享」按钮ShareButton + ShareModal
Marketplace — AgentsagentAgent 卡片右上角菜单「分享」/ 详情页「分享」按钮ShareButton + ShareModal
Marketplace — Promptsprompt_template模板卡片右上角菜单「分享」/ 详情页「分享」按钮ShareButton + ShareModal
Marketplace — Toolstool工具卡片右上角菜单「分享」/ 详情页「分享」按钮ShareButton + ShareModal

9.3 状态机定义

所有模块共用同一有限状态机(FSM),确保状态流转行为一致:

IDLE SELECTING CONFIRMING PROCESSING SUCCESS / PARTIAL_FAIL / FAILED

IDLE:弹窗关闭,无活跃分享操作。

SELECTING:弹窗打开,用户正在选择分享目标。可搜索、选择群组、新建群组。

CONFIRMING:用户已选择目标,正在设置权限和有效期,准备提交。

PROCESSING:请求已提交,等待服务端处理。同步场景展示 Loading,异步场景展示进度条。

SUCCESS / PARTIAL_FAIL / FAILED:终态,展示对应的结果反馈界面。

9.4 开发实施要求

前端

  • ShareModal、GroupManager 等组件提取至 @shared/components/share/ 目录
  • 使用 Context / Store 管理分享状态机,各模块通过 Props 注入 resourceType 和 resourceId
  • API 调用层统一封装在 @shared/api/share.ts
  • 组件支持主题适配,确保在不同模块的 UI 主题下视觉一致

后端

  • API 路由统一前缀 /api/v2/share,通过 resource_type 参数区分资源类型
  • 权限校验中间件统一处理,根据 resource_type 路由至对应的权限校验器
  • 异步任务处理器抽象为通用 ShareWorker,各资源类型注册自定义的 pre/post hook
  • 数据库迁移脚本统一管理,确保表结构在所有环境一致