# 04 知识库与知识点管理 — 跨项目完整能力分析 > 项目角色分类:主链路参与者(iOS、主 API、数据库、COS——知识库 CRUD 必须经过这些项目)、上游支撑(Python RAG Worker——异步处理导入资料,不阻塞知识库管理操作)、运维可观测(Admin)。 > Rust Document Runtime 不参与知识库管理链路。Heavy Runtime 不参与此链路。 > 注意:Python RAG Worker 在本能力中是上游支撑(知识库 CRUD 不依赖它);在"资料上传与处理"能力中是主链路参与者。 --- ## 1. 能力目标 用户可以创建、组织、维护个人知识库,管理其中的知识点和来源资料,通过文件夹分类、排序、搜索、公开发现和订阅来高效组织和获取学习内容。 --- ## 2. C 端入口 | 入口页面 | 触发方式 | 功能 | |---------|---------|------| | 知识库首页 | Tab "知识库" 默认 | 查看知识库列表、筛选、搜索入口、创建入口 | | 知识库搜索页 | 搜索图标 | 搜索知识库和知识点 | | 创建知识库页 | + 按钮 / 我的页学习资产 | 创建新知识库(封面、名称、描述) | | 知识库详情页 | 点击知识库卡片 | 查看知识点列表/来源文件列表、管理操作 | | 添加知识点页 | 操作菜单"添加" | 手动/文件模式添加知识点 | | 知识点详情页 | 点击知识点条目 | 查看/收藏/笔记/原文 | | 编辑知识点页 | 工具栏菜单 | 编辑标题和内容 | | 文件夹管理 Sheet | 操作菜单"文件夹管理" | 创建/重命名/删除文件夹 | | 导入资料页 | 操作菜单"上传" | 文件/相册/链接导入 | | 导入候选审核页 | 导入完成后 | 审核 AI 提取的知识点候选 | | 发现公开库页 | "我的"页"发现公开库" | 浏览/订阅公开知识库 | --- ## 3. 业务对象关系 ``` 知识库(KnowledgeBase) ├── 来源资料(KnowledgeSource)── 原始上传文件,含解析/索引/学习状态 ├── 知识点(KnowledgeItem)── 知识库的基本内容单元 │ ├── 类型:章节(chapter)、课程(lesson)、概念(concept)、笔记(note)、导入文档(imported_doc)、AI生成(ai_generated) │ ├── 层级:通过 parentId 形成树状结构 │ └── 关联:通过 sourceId 关联到来源资料 ├── 文件夹(KnowledgeFolder)── 用于组织知识点 │ └── 同步创建 folder 类型的 KnowledgeItem(保证 iOS 兼容) ├── 知识分块(KnowledgeChunk)── 来源资料的语义分块,含向量嵌入 ├── 导入候选(ImportCandidate)── AI 提取的知识点候选,等待审核 ├── 测验(Quiz)── 基于知识库内容生成的测验 ├── 订阅关系(KnowledgeBaseSubscription)── 用户对公开知识库的订阅 └── AI 会话范围(ChatScope)── AI 对话可限定在知识库范围 ``` --- ## 4. 用户主流程 ### 4.1 创建知识库 用户点击创建按钮 → 输入名称(必填)和描述(必填)→ 可选上传封面图(从相册选择,自动裁剪为 512×512)→ 点击创建 → API 创建知识库记录(默认 private)→ 用户可在列表中看到新知识库。每个用户最多创建 20 个知识库。 ### 4.2 浏览与筛选 用户进入知识库首页 → 查看知识库卡片列表(封面、名称、描述、日期、置顶标记、公开标记)→ 可通过分类筛选(全部/我的/已订阅/官方)切换视图 → 滚动到底部自动加载更多(分页 20 条/页)→ 下拉刷新。 ### 4.3 添加资料 用户进入知识库详情页 → 点击操作菜单"上传" → 选择文件/相册/链接导入 → 文件上传至 COS → API 创建 KnowledgeSource → 自动创建 DocumentImport 任务 → Python RAG Worker 异步处理 → 用户可查看 AI 处理状态 → 审核 AI 提取的候选知识点。 ### 4.4 手动添加知识点 用户进入添加知识点页 → 选择"手动"模式 → 输入标题和内容文字 → 保存 → API 创建 KnowledgeItem。 ### 4.5 编辑与删除知识点 用户在知识库详情页点击知识点 → 进入知识点详情页查看内容 → 工具栏菜单选择编辑 → 修改标题/内容 → 保存。滑动或长按可删除知识点(单个或批量)。 ### 4.6 批量操作 用户进入批量选择模式 → 逐选或全选知识点 → 点击批量删除 → 确认弹窗 → API 批量软删除。 ### 4.7 文件夹管理 用户打开文件夹管理 Sheet → 查看已有文件夹列表 → 新建(输入名称)→ 重命名(滑动操作)→ 删除(滑动操作)。创建文件夹时同步创建 folder 类型的 KnowledgeItem。注意:重命名文件夹时仅更新 KnowledgeFolder 记录的 name 字段,不会同步更新对应 KnowledgeItem 的 title 字段。当前无文件夹数量上限。 ### 4.8 排序 用户在知识库详情页点击排序菜单 → 选择排序方式(默认/文件大小/创建时间/更新时间)→ 知识点列表按所选方式重新排列。 ### 4.9 搜索 用户点击搜索图标 → 进入搜索页 → 输入关键词。当前搜索逻辑未实现——搜索页仅展示空状态,输入关键词不触发 API 调用。 ### 4.10 公开库发现与订阅 用户进入发现公开库页 → 查看所有公开知识库列表(含标题、描述、条目数)→ 点击订阅按钮 → API 创建订阅记录。用户可在知识库首页"已订阅"筛选中查看已订阅的知识库。用户不可订阅自己的知识库。取消订阅可随时操作。 ### 4.11 删除知识库 用户在知识库详情页操作菜单点击"删除知识库"→ 确认弹窗 → API 软删除知识库(设置 deletedAt)。删除后知识点和来源资料仍保留在数据库中(软删除),但不再对用户可见。 --- ## 5. 项目职责 ### iOS — 主链路参与者 - 知识库列表展示(卡片、筛选、分页、下拉刷新) - 创建知识库(封面选择与裁剪、名称/描述输入) - 知识库详情(双 Tab:知识点 + 来源文件,排序,批量操作) - 知识点详情(多格式渲染、收藏、笔记、原文) - 添加/编辑知识点 - 文件夹管理 Sheet - 搜索页(界面已搭建,逻辑未实现) - 公开库发现与订阅 - 导入与候选审核 ### 主 API — 主链路参与者 - 知识库 CRUD(创建/列表/详情/更新/软删除) - 知识库所有权校验(私有 KB 对非所有者返回 404) - 置顶切换 - 知识点 CRUD(创建/列表/详情/更新/单个删除/批量删除) - 知识点排序 - 公开库发现(GET /knowledge-bases/discover,含搜索参数) - 订阅管理(订阅/取消订阅/查看已订阅) - 文件夹 CRUD(创建/列表/更新/删除) - 知识库数量限制(每用户最多 20 个) - 内容安全检查(KB 标题、标签) ### 数据库 — 主链路参与者 - 存储知识库、知识点、来源资料、文件夹、订阅、导入任务等核心业务数据 - 软删除支持(deletedAt 字段) - 唯一约束(userId + knowledgeBaseId 订阅防重、userId + parentId + name 文件夹防重) ### COS — 主链路参与者 - 存储知识库封面图 - 存储知识点关联文件的内容(通过 COS URL 引用) ### Python RAG Worker — 上游支撑 - 不直接参与知识库 CRUD - 异步处理导入资料,生成 KnowledgeChunk、ImportCandidate - 用户在 RAG Worker 完成处理前即可查看和管理知识库及知识点 ### Admin — 运维与可观测 - 知识库列表查看(全部 KB,含所属用户、条目数) - 知识库详情抽屉(元数据 + 嵌套来源文件列表) - 来源文件查看(全部来源,按 KB 和解析状态筛选) - 来源文件引用追踪(查看哪些 AI 产物引用了该来源) - 知识库删除 - 用户管理(查看/状态管理) - 会员与配额管理 --- ## 6. 权限与可见性 ### 6.1 私有知识库 - **可见性:** 仅所有者可查看和操作。非所有者请求返回 404(隐藏存在性)。 - **所有者操作:** 全部 CRUD + 置顶 + 可见性切换 + 删除。 - **非所有者操作:** 无任何操作权限。 ### 6.2 公开知识库 - **可见性:** 任何人可通过发现页查看和搜索。所有者仍可正常管理。 - **所有者操作:** 同私有知识库。 - **非所有者操作:** 可查看详情、订阅。不可编辑或删除。 - **订阅:** 用户可订阅公开知识库。不可订阅自己的知识库。 ### 6.3 官方知识库 - **当前状态:** API 和数据库模型支持 ownerType 字段,但 iOS 端"官方"筛选返回空数组(TODO 注释:等后端支持)。 - **计划行为:** 由平台创建和维护的精选知识库,所有用户可查看和订阅。 ### 6.4 删除权限 - **知识库删除:** 仅所有者可删除(软删除)。 - **知识点删除:** 所有者可单个或批量删除。 - **来源资料删除:** 服务层无所有权检查(代码缺陷),任何认证用户可通过 ID 删除任意来源。 - **文件夹删除:** 服务层无显式所有权检查(代码缺陷),但通过 KB 所有权间接保护。 ### 6.5 资料访问权限 - **所有者:** 完整读写权限。可阅读原文件、使用 AI 对话(知识库范围)。 - **订阅者:** 可查看知识库内容。原文件阅读权限待确认(取决于 COS 文件访问控制)。 - **非所有者非订阅者:** 对私有 KB 无任何访问权限。对公开 KB 可查看详情和订阅。 --- ## 7. 查询入口 ### 用户查询 - **知识库列表:** iOS 知识库首页(卡片 + 筛选 + 分页)。 - **知识库详情:** iOS 知识库详情页(双 Tab + 排序)。 - **知识点详情:** iOS 知识点详情页(多格式渲染)。 - **搜索:** iOS 知识库搜索页(界面已搭建,逻辑未实现)。 - **公开库:** iOS 发现公开库页。 - **已订阅:** iOS 知识库首页"已订阅"筛选。 ### Admin 查询 - **知识库列表:** Admin 知识库页(全部 KB,含所属用户、条目数)。 - **知识库详情抽屉:** 元数据 + 嵌套来源文件列表 + 引用追踪。 - **来源文件列表:** Admin 来源文件页(按 KB 和解析状态筛选)。 - **引用追踪:** 查看特定来源被哪些 AI 产物(测验、摘要等)引用。 ### 系统内部查询 - **RAG 对话上下文:** API 从 KnowledgeItem 表按知识库 ID 查询最多 30 条,构建对话上下文。 - **导入任务关联:** API 创建 KnowledgeSource 时自动关联 DocumentImport。 - **订阅关系:** API 在订阅和已订阅列表查询时使用。 --- ## 8. 修改入口 ### 用户修改 - **创建知识库:** iOS 创建知识库页 → POST /knowledge-bases。 - **更新知识库:** iOS 知识库设置 → PATCH /knowledge-bases/:id。 - **置顶/取消置顶:** iOS 知识库卡片操作 → POST /knowledge-bases/:id/pin。 - **创建知识点:** iOS 添加知识点页 → POST /knowledge-items。 - **编辑知识点:** iOS 编辑知识点页 → PATCH /knowledge-items/:id。 - **删除知识点:** iOS 知识库详情页(单个/批量) → DELETE /knowledge-items/:id 或 POST /knowledge-items/batch-delete。 - **文件夹操作:** iOS 文件夹管理 Sheet → POST/PATCH/DELETE /knowledge-bases/:id/folders。 - **订阅/取消订阅:** iOS 发现公开库页 → POST/DELETE /knowledge-bases/:id/subscribe。 - **删除知识库:** iOS 知识库详情页 → DELETE /knowledge-bases/:id。 ### Admin 修改 - **删除知识库:** Admin 知识库页删除按钮(危险确认弹窗)。 - **删除文件:** Admin 文件管理页。 - **重试导入:** Admin 导入监控页。 ### 系统自动修改 - **itemCount 维护:** 创建/删除知识点时自动更新知识库的 itemCount。 - **软删除传播:** 删除文件夹时自动软删除子文件夹和对应的 KnowledgeItem。 - **内容安全检查:** KB 标题和标签自动进行敏感词匹配。 --- ## 9. 删除影响 ### 9.1 删除知识库 - **影响范围:** 知识库本身被软删除(设置 deletedAt)。 - **知识点:** 保留在数据库中(不被级联删除),但用户不可见。 - **来源资料:** 保留但关联的 KB 不可访问。 - **订阅:** 保留但已删除 KB 不出现在已订阅列表中。 - **测验:** 保留但关联的 KB 不可访问。 - **AI 会话:** 保留但知识库范围对话可能无法加载上下文。 ### 9.2 删除来源资料 - **影响范围:** 来源资料被软删除。 - **关联知识点:** 保留(sourceId 变为悬空引用)。 - **关联分块:** KnowledgeChunk 保留,Qdrant 向量需手动或通过软删除标记清理。 - **关联候选:** ImportCandidate 保留但关联的 sourceId 不可访问。 ### 9.3 删除知识点 - **影响范围:** 知识点被软删除,itemCount 递减。 - **子知识点:** 保留在数据库中(parentId 变为悬空引用)。 - **关联笔记:** 知识点详情页的笔记入口不可用。 - **AI 对话上下文:** 已删除知识点不再出现在上下文加载结果中。 ### 9.4 删除文件夹 - **影响范围:** 文件夹被软删除,对应的 folder 类型 KnowledgeItem 也被软删除。 - **子文件夹:** 级联软删除。 - **文件夹内知识点:** 保留在数据库中(parentId 引用可能变为悬空)。 ### 9.5 取消订阅 - **影响范围:** 订阅记录被删除。 - **已订阅列表:** 知识库从用户的已订阅筛选中消失。 - **其他数据:** 无影响。用户之前查看的知识库内容仍可查看(只要知识库保持公开)。 --- ## 10. 当前完成状态 | 组件 | 状态 | 说明 | |------|------|------| | iOS 创建知识库 | 已完成 | 封面、名称、描述,API 创建 | | iOS 知识库列表与筛选 | 部分完成 | 全部/我的/已订阅可用;"官方"筛选返回空 | | iOS 知识库详情(双 Tab) | 已完成 | 知识点列表 + 来源文件列表 | | iOS 手动添加知识点 | 已完成 | 标题 + 内容编辑 | | iOS 文件模式添加知识点 | 已完成 | COS 上传 + 创建知识点 | | iOS 知识点详情(多格式渲染) | 已完成 | 文本/Markdown/文件 | | iOS 编辑知识点 | 已完成 | 标题 + 内容修改 | | iOS 删除知识点(单个+批量) | 已完成 | 单个软删除 + 批量选择删除 | | iOS 文件夹管理 | 已完成 | 创建/重命名/删除 | | iOS 排序 | 已完成 | 4 种排序方式 | | iOS 搜索 | 未完成 | 搜索页界面已搭建,搜索逻辑未实现 | | iOS 公开库发现与订阅 | 已完成 | 查看/订阅/取消订阅 | | iOS 删除知识库 | 已完成 | 确认弹窗 + API 软删除 | | iOS 收藏知识点 | 部分完成 | UI 切换存在,后端 API 未支持(TODO) | | iOS 重命名知识点 | 未完成 | 菜单项存在但 action 为空(TODO) | | iOS 移动到文件夹 | 未完成 | 菜单项存在但 action 为空(TODO) | | iOS 知识库管理页 | 未完成 | 操作菜单"知识库管理"按钮 action 为空(TODO) | | API 知识库 CRUD | 已完成 | 创建/列表/详情/更新/软删除 | | API 知识库所有权校验 | 已完成 | 私有 KB 对非所有者返回 404 | | API 知识库数量限制 | 已完成 | 每用户最多 20 个 | | API 置顶切换 | 已完成 | | | API 公开库发现与搜索 | 已完成 | 支持标题+描述搜索 | | API 订阅管理 | 已完成 | 订阅/取消订阅/已订阅列表 | | API 知识点 CRUD | 已完成 | 创建/列表/详情/更新/单个删除/批量删除 | | API 知识点排序 | 已完成 | createdAt/updatedAt/fileSize/orderIndex | | API 文件夹 CRUD | 已完成 | 含 folder 类型 KnowledgeItem 同步;当前无文件夹数量限制 | | API 内容安全检查 | 已完成 | KB 标题 + 标签 + 候选内容 | | Admin 知识库查看 | 已完成 | 列表 + 详情抽屉 | | Admin 来源文件查看 | 已完成 | 按 KB 和解析状态筛选 | | Admin 来源文件引用追踪 | 已完成 | 查看 AI 产物引用了哪些来源 | | Admin 知识库删除 | 已完成 | | | 官方知识库 | 未完成 | API 模型支持但后端筛选未实现 | | API 来源资料删除权限校验 | 暂未确认 | 代码中无所有权检查(疑似缺陷) | | API 文件夹更新/删除权限校验 | 暂未确认 | 代码中无显式所有权检查 |