一、功能概述
项目背景
平台现有"内容分享"功能覆盖知识库、数据库、Agent Nova 任务三大模块。用户可通过邮箱前缀或用户名模糊匹配(多选)以及粘贴多个完整邮箱实现批量分享。该功能自上线以来已成为团队协作的核心入口。
适用范围
本次升级覆盖全平台所有可分享资源类型,包括原有三大模块及新增的 Marketplace 模块(智能体 Agents、提示词模板 Prompt Templates、工具 Tools)。
核心痛点
人数限制瓶颈
单次分享上限 20 人,无法满足大规模协作场景(如全部门同步、跨团队项目),用户被迫重复操作。
缺少群组机制
不支持群组分享,用户需反复输入相同成员列表,效率低下且易遗漏。
Marketplace 未覆盖
Marketplace 模块(Agents、Prompt Templates、Tools)尚未接入分享功能,形成功能断裂。
二、核心需求目标
目标一:取消人数限制
移除 20 人上限,支持无限人数分享。针对大批量场景(>1000 人)引入异步队列处理机制,确保系统稳定性与用户体验。
目标二:引入群组分享
支持创建命名群组、从已有群组列表选择分享、群组成员与权限管理(增删改 + Owner/Admin/Member 三级角色)。
目标三:全域统一 (Marketplace)
将完整分享逻辑扩展至 Marketplace 模块(Agents、Prompt Templates、Tools),确保所有入口 UI 交互、数据状态流转完全一致,组件级复用。
三、详细功能描述
3.1 创建群组流程
3.2 选择群组分享流程
3.3 分享状态流转
待处理
分享中
全部成功
部分失败
全部失败
SUCCESS 处理
全部接收方均已成功获取权限。弹窗展示成功反馈并自动关闭(3s)。
PARTIAL_FAILURE 处理
展示失败用户列表及原因(如邮箱无效、权限不足)。提供「重试失败项」按钮,仅对失败项重新执行。
FAILED 处理
展示错误原因(如网络异常、服务端错误)。提供「全部重试」按钮。连续失败 3 次后建议用户联系管理员。
3.4 异步处理逻辑(>1000 人场景)
触发条件
当单次分享的总接收人数(用户 + 群组成员去重后)超过 1000 人时,系统自动切换为异步处理模式。
处理流程
- 前端提交分享请求,后端返回
async_task_id,响应时间 <3s。 - 后端将任务推入消息队列(如 RabbitMQ / Kafka),按批次处理(每批 200 人)。
- 前端展示「任务已提交」状态卡片,包含进度条(通过 WebSocket / SSE 实时更新)。
- 任务完成后推送通知(站内信 + 可选邮件通知),展示最终状态报告。
前端状态展示
重试策略
失败项自动重试最多 3 次(指数退避:2s → 4s → 8s),仍失败则标记为 FAILED 并记录原因。用户可在任务报告中手动触发对失败项的二次重试。
四、数据字段定义
4.1 群组表 share_groups
| 字段名 | 类型 | 必填 | 默认值 | 描述 |
|---|---|---|---|---|
id | BIGINT | 必填 | 自增 | 群组唯一标识,主键 |
group_name | VARCHAR(100) | 必填 | — | 群组名称,同一用户下唯一 |
creator_id | BIGINT | 必填 | — | 创建者用户 ID,外键关联 users 表 |
member_count | INT | 必填 | 0 | 当前成员数量(冗余计数,异步更新) |
description | VARCHAR(500) | 可选 | NULL | 群组描述信息 |
created_at | TIMESTAMP | 必填 | NOW() | 创建时间 |
updated_at | TIMESTAMP | 必填 | NOW() | 最后更新时间 |
is_active | BOOLEAN | 必填 | TRUE | 软删除标记 |
索引: UNIQUE(creator_id, group_name), INDEX(creator_id, is_active)
4.3 权限表 share_permissions
| 字段名 | 类型 | 必填 | 默认值 | 描述 |
|---|---|---|---|---|
id | BIGINT | 必填 | 自增 | 权限记录唯一标识 |
share_record_id | BIGINT | 必填 | — | 关联的分享记录 ID |
user_id | BIGINT | 必填 | — | 被授权用户 ID(群组分享时展开为个体记录) |
permission_level | ENUM | 必填 | view | view | edit | admin |
granted_by | BIGINT | 必填 | — | 授权人用户 ID |
granted_at | TIMESTAMP | 必填 | NOW() | 授权时间 |
revoked_at | TIMESTAMP | 可选 | NULL | 撤销时间,NULL 表示当前有效 |
is_active | BOOLEAN | 必填 | TRUE | 权限是否生效 |
索引: UNIQUE(share_record_id, user_id), INDEX(user_id, is_active), INDEX(permission_level)
4.4 群组成员表 group_members
| 字段名 | 类型 | 必填 | 默认值 | 描述 |
|---|---|---|---|---|
id | BIGINT | 必填 | 自增 | 记录唯一标识 |
group_id | BIGINT | 必填 | — | 关联群组 ID |
user_id | BIGINT | 必填 | — | 成员用户 ID |
role | ENUM | 必填 | member | 角色:owner(创建者,唯一)| admin | member |
added_by | BIGINT | 必填 | — | 添加此成员的操作者 ID |
added_at | TIMESTAMP | 必填 | NOW() | 加入时间 |
is_active | BOOLEAN | 必填 | 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.2 新建/管理群组弹窗
交互细节
群组名称校验
实时校验:2-50 字符,不允许特殊字符。失焦时异步校验是否重名,重名则 inline 提示并建议替代名称。
成员角色管理
创建者自动成为 Owner(不可变更、不可移除)。新成员默认角色为 Member。Owner 和 Admin 可修改其他成员角色。Member 只能查看群组信息。
角色权限矩阵
| 操作 | Owner | Admin | Member |
|---|---|---|---|
| 删除群组 | ✅ | — | — |
| 修改群组信息 | ✅ | ✅ | — |
| 添加/移除成员 | ✅ | ✅ | — |
| 修改成员角色 | ✅ | ✅* | — |
| 使用群组分享 | ✅ | ✅ | ✅ |
| 退出群组 | — | ✅ | ✅ |
* Admin 不可修改 Owner 或其他 Admin 的角色
7.3 分享状态反馈
成功状态
部分失败状态
失败状态
八、用户操作流程 (User Flow)
以下为从「点击分享」到「完成分享」的完整用户路径,重点标注群组分享的新增环节。
触发分享入口
用户在任意资源页面(知识库、数据库、Agent Nova 任务、Marketplace 的 Agent / Prompt Template / Tool 详情页或卡片)点击「分享」按钮。
触发组件: <ShareButton resourceType={type} resourceId={id} />
分享弹窗弹出
系统弹出统一的 ShareModal 组件。异步加载当前用户的群组列表和最近分享记录。焦点自动聚焦在搜索框。
选择分享目标(用户 / 群组)
路径 A — 搜索用户:在搜索框输入邮箱或用户名 → 下拉列表展示匹配结果 → 勾选用户 → 加入已选列表。支持粘贴多个邮箱(逗号/换行分隔)批量添加。
路径 B — 选择已有群组:在群组区域浏览或搜索群组 → 可点击 [展开] 预览成员 → 勾选群组 → 群组整体加入已选列表(显示成员数)。
路径 C — 新建群组:点击「+ 新建群组」→ 弹出二级模态框 → 输入名称、描述 → 搜索并添加成员 → 设置角色 → 创建成功 → 自动返回分享弹窗并选中新群组。
设置权限与有效期
从下拉选择器中选择权限级别(可查看 / 可编辑 / 管理员)和有效期(7天 / 30天 / 90天 / 永久)。权限统一应用于本次全部分享对象。
确认与执行
用户确认已选列表后点击「确认分享」。系统根据总人数自动选择同步/异步模式:
- ≤1000 人:同步执行,按钮变为 Loading 状态,完成后直接展示结果。
- >1000 人:系统弹出确认框「本次分享涉及 {n} 人,将以后台任务方式处理」→ 确认后创建异步任务。
结果反馈
根据执行结果展示对应状态(成功 / 部分失败 / 失败),参见 7.3 节的状态反馈原型。成功状态 3 秒后自动关闭弹窗,失败状态保持展示直到用户手动操作。异步任务通过通知中心推送最终结果。
九、一致性说明(Marketplace 复用方案)
9.1 组件复用架构
全平台所有分享入口共用同一套组件库,确保 UI 交互与数据状态完全一致:
9.2 各模块入口映射
| 模块 | 资源类型 (resourceType) | 入口位置 | 复用组件 |
|---|---|---|---|
| 知识库 | knowledge | 知识库详情页右上角「分享」按钮 | ShareButton + ShareModal |
| 数据库 | database | 数据库详情页右上角「分享」按钮 | ShareButton + ShareModal |
| Agent Nova | task | 任务详情页操作栏「分享」按钮 | ShareButton + ShareModal |
| Marketplace — Agents | agent | Agent 卡片右上角菜单「分享」/ 详情页「分享」按钮 | ShareButton + ShareModal |
| Marketplace — Prompts | prompt_template | 模板卡片右上角菜单「分享」/ 详情页「分享」按钮 | ShareButton + ShareModal |
| Marketplace — Tools | tool | 工具卡片右上角菜单「分享」/ 详情页「分享」按钮 | ShareButton + ShareModal |
9.3 状态机定义
所有模块共用同一有限状态机(FSM),确保状态流转行为一致:
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
- 数据库迁移脚本统一管理,确保表结构在所有环境一致