Files
mnote/wolaiplan.md
T

156 lines
16 KiB
Markdown
Raw Permalink Normal View History

2025-11-23 10:55:04 +08:00
# Wolai 深度复刻计划
**目标**:复刻 Wolai 在线文档的核心体验,首先补齐左侧树状侧边栏的交互稳定性,并在右侧 BlockNote 编辑器内实现官方文档列举的全部块能力、引用链路与媒体处理。
**基准**`design/ui_react.md``design/PHASE_1.5_TURN_TO_PAGE_EXACT_CLONE.md`,以及 `scraped_docs` 目录内的官方说明。
**范围**Next.js + Supabase + BlockNote 技术栈,聚焦 Web 前端与与 Supabase 表结构;暂不包含移动端或第三方 IM 集成。
## 0. 对标资料与能力映射
| 模块 | 对标文档 | 关键能力 | 当前差距 |
| --- | --- | --- | --- |
| 工作空间壳层/侧边栏 | `scraped_docs/功能概览.md``scraped_docs/页面定义.md``scraped_docs/垃圾桶.md` | 左侧树支持星标置顶/公共/共享/私有/模板/垃圾桶分区、宽度拖拽、工作空间切换、顶部功能按钮;垃圾桶需支持恢复/彻底删除及“操作确认” | 仅有简单树结构,缺分区、星标、垃圾桶操作、右键菜单及拖拽稳定性 |
| 页面配置 | `scraped_docs/页面选项.md` | 自适应宽度、小字体、标题目录、标题自动编号、编辑保护、导出/移动/嵌入/历史/统计、自定义页面默认布局 | 目前只有部分菜单;标题目录/编号、编辑保护、字数统计未实现 |
| 标题体系 | `scraped_docs/标题.md` | H1-H5、折叠标题、快捷键/Markdown/斜杠创建、标题目录关联、自动编号、居中、级别提示 | BlockNote 默认仅支持 H1-H3,无折叠、无自动编号、无快捷键转换 |
| 块编辑基础 | `scraped_docs/基本编辑.md` | 块是第一等公民:拖动、分栏、块结构显示、块转换、块级复制/粘贴/缩进、文本样式/颜色/链接/引用/显示块结构快捷键 | 现有 BlockNote 能力未进行 Wolai 样式与交互定制,缺块结构视图、块插入按钮等细节 |
| 斜杠菜单 | `scraped_docs/斜杠菜单.md` | `/` 唤起可搜索命令,覆盖基础块、进阶块、转换、行内元素、媒体、引用、快速功能、颜色/背景 | 仅有默认 BlockNote slash menu,命令内容/分组/拼音过滤未对齐 |
| 列表与待办 | `scraped_docs/数字列表.md``scraped_docs/todolist.md` | 多级编号格式可自定义、Markdown/快捷命令、缩进结构、进度条联动、高级待办四态及 Alt 切换取消 | 数字列表格式固定,缺高级待办、进度条联动逻辑 |
| 引用体系 | `scraped_docs/页面引用.md``scraped_docs/块引用.md` | [[/ # 快速引用、预引用、引用别名、行内/嵌入块引用、拖拽引用、反向链接、嵌入到...、快捷键 H/Q/Ctrl+Shift+R | 目前仅有基本页面链接,无预引用、别名、嵌入块引用、反向引用列表 |
| 搜索 | `scraped_docs/搜索选项.md` | `Ctrl/Cmd+P` 全局搜索、最近访问列表、仅标题/精确/时间范围过滤、当前页面范围过滤、图片 OCR 搜索、快捷键多窗口打开 | 只有简单页面检索,无过滤器、图片 OCR、快捷开窗 |
| 媒体/图片 | `scraped_docs/图片.md` | 上传/最近上传/链接/动态图标四入口、拖拽/粘贴、大小限制提示、对齐/边框/说明/说明居中/链接、全屏/查看原图/下载、裁剪/马赛克/绘制编辑、手动 OCR | 仅能上传图片,缺菜单操作、编辑器、OCR 入口、动态图标 |
## 1. 现状分析与问题定位
### 1.1 导航与工作空间壳层
- 树状结构拖拽存在抖动与状态不同步,缺少 Wolai 官方的分区/折叠/右键菜单/星标/垃圾桶功能。
- 顶部功能按钮(搜索、页面关系图、导入、成员等)未复刻,空间切换流程也不符合 `功能概览.md` 描述。
### 1.2 编辑器交互
- BlockNote 默认样式与 Wolai 蓝色系(#2563eb)相差较大,行距、列布局、块菜单体验不足。
- H5-H9、折叠标题、标题目录/编号、块转换、显示块结构等官方能力缺失。
- 待办、进度条、数字列表等块尚未实现 Wolai 规则,`转为页面` 功能仍未闭环。
### 1.3 引用、搜索与上下文
- 目前无 [[ 预引用、别名、嵌入引用等;页面引用未形成反向链接、也没有“嵌入到...”工作流。
- 全局搜索停留在基础 Title 匹配层面,缺时间范围过滤、图片 OCR 建索引、快捷键打开多窗。
### 1.4 媒体与垃圾桶
- 图片块只支持最小上传,暂无编辑、说明、链接、OCR 和动态图标;无法区分最近上传。
- 垃圾桶界面缺“操作确认”开关、搜索与恢复/彻底删除功能,风险不可控。
## 2. 分阶段路线图
### 阶段 A:侧边栏与空间壳层重构(T+3 天)
- [x] 新建 `SidebarTree` 数据层,按工作空间/公共/共享/私有/星标/模板分类读取 Supabase;对齐 `功能概览.md` 的折叠状态与宽度拖拽。
- [x] 引入 `@dnd-kit` 实现虚拟化拖拽,保证无限嵌套无抖动;补齐右键菜单(重命名/移动/删除/转为子页面)。
- [x] 实现顶部功能按钮占位与事件(搜索入口、页面关系图、导入、成员、消息箱、今日速记、手气不错、更多)。
- [x] 垃圾桶列表、恢复/彻底删除、操作确认、关键字搜索全部落地。
### 阶段 B:编辑器块体系与标题/列表(T+5 天)
- [x]`scraped_docs/基本编辑.md` 为准对 BlockNote 主题进行定制:块拖拽手柄、上下插入按钮、列布局、显示块结构。
- [x] 完成 H1-H5、折叠标题、标题居中/快捷键/自动编号、标题目录与右侧 TOC。
- [x] 实现数字列表格式层级选择、Markdown 快捷输入、进度条块与高级待办四态以及进度联动。
- [x] 补齐 `/` 命令面板、拼音过滤、命令分组、快速功能入口以及颜色/背景命令。
### 阶段 C:页面/块引用与搜索体系(T+4 天)
- [x] [[ / # 预引用流水线与引用面板基础版:BlockNote 双输入触发搜索面板,`useReferenceComposer` 负责调用 `/api/references/record`,并将行内/嵌入引用写入新建的 `page_refs` 表;底部提供 `PageBacklinksPanel` 读取 `list_backlinks` RPC 并展示反向引用列表。
- [x] 服务端:创建 `page_refs` 表 + 触发器/策略,提供 `record_page_ref``list_backlinks` RPC,并通过 API 路由对齐工作空间鉴权。
- [x] 前端:`SearchPalette` 引入 `useReferenceComposer`,自动写入引用并回填 blockId`DocumentContent` 新增反链面板。
- [x] 进阶:`PageHoverCard` 引用预览、拖拽引用卡片、`嵌入到...``复制块引用` 快捷入口与引用筛选折叠仍待实现。
- [x] 搜索弹窗(Ctrl/Cmd+P)与 OCR 过滤:复刻 Wolai 快捷搜索,支持最近访问缓存、仅标题 / 精确匹配 / 编辑时间 / 创建时间 / 当前页面范围 / 图片 OCR 多过滤器,并提供 Ctrl/Cmd+Enter 新开窗口、Alt+Enter 右侧打开。
- [x] 数据:落地 `user_recent_pages` 表 + `/api/search/recent``/api/search/documents` 同时返回最近访问并在前端展示。
- [x] UI:提供最近/全部 Tab、编辑/创建时间切换、自定义日期选择及 OCR 过滤提示。
- [x] 验证:补充 vitest 针对过滤组合(仅标题+时间范围)、快捷键映射(Ctrl/Cmd+Enter、Alt+Enter)以及 OCR 结果高亮。
- [x] 页面选项与统计:自适应宽度/小字体/标题目录/编辑保护/导出/历史/字数统计等全部可在右上角菜单内切换,并同步到 Supabase。
- Schema`pages` 表新增 `is_narrow_width`, `use_small_font`, `toc_mode`, `is_locked`, `stats_word_count`, `stats_todo` 字段;新增 `page_audit_logs` 记录导出/历史访问。
- 交互:`PageOptionsDrawer` 组件统一渲染切换项,部分操作(导出、历史)通过 Server Action 调用 Supabase Edge Function;字数/待办统计依赖块结构 diff 即时刷新并展示在面板底部。
- 安全:编辑保护开启后 BlockNote 进入只读状态,界面显示锁标识并要求拥有者解锁,所有写入请求需校验 `pages.is_locked`
### 阶段 D:媒体与增值体验(T+3 天)
- [x] 图片块:上传/最近上传/链接/动态图标四入口,尺寸限制校验,菜单中支持边框/说明/说明居中/超链接/全屏/查看原图/下载/替换/编辑/OCR。
- [x] 图片编辑器集成裁剪、矩形、马赛克、自由绘制;OCR 操作触发 Supabase Edge Function 建索引供搜索使用。
- [ ] 模板中心/帮助入口、空间功能按钮埋点、Good Night 模式跟随系统等 UI 细节收尾。
## 3. 关键模块实现要点
### 3.1 侧边栏与工作空间(来源:`功能概览.md`、`页面定义.md`、`垃圾桶.md`
- 列表以顶层页面为根,支持无限展开+懒加载;同级采用虚拟滚动避免渲染开销。
- 星标置顶、公共/共享/私有/模板中心入口需可切换并记忆折叠状态;垃圾桶内可按标题搜索并展示“操作确认”开关。
- 工作空间下拉展示所有空间,允许创建/加入并一键切换;顶部功能按钮根据空间类型(团队/个人)切换文案。
### 3.2 页面容器与选项(来源:`页面选项.md`)
- 页面右上角菜单包含:自适应宽度、小字体、标题目录/编号、编辑保护、撤回、删除、移动、嵌入、模板、复制链接(含标题)、行内/嵌入引用、导出、页面历史、字数统计、待办统计。
- 自定义页面弹窗可调整字体、布局、显示块引用数字、折叠反向引用、隐藏子页面、嵌入默认位置。
- 标题目录宽度需根据视口自适应,提供完整/精简/折叠菜单和 `Ctrl/Cmd+Shift+L` 快捷键。
### 3.3 标题系统(来源:`标题.md`)
- 支持 `/h1`-`/h5``+##` 折叠标题、`Ctrl/Cmd+Shift+1~4` 快捷键、`+` 转折叠,标题悬浮显示等级圆点。
- 自动编号校验层级并以红色问号提示错误;编号点击可切换样式或关闭。
- 标题可居中(块菜单/`C` 键),并与标题目录联动展示子页面。
### 3.4 块编辑与斜杠菜单(来源:`基本编辑.md`、`斜杠菜单.md`)
- 左侧 `::` 手柄支持拖动、上下/左右插入(+ 按钮、A/B 快捷键),`Esc` 选中块,`Ctrl/Cmd+A` 二段选择,`Tab/Shift+Tab` 缩进。
- 块结构视图通过 `Ctrl/Cmd+Shift+U` 开关灰色虚线框;块菜单含“转换为”并列出所有文本类块。
- 斜杠命令按官方分组(基础块/进阶块/转换/行内元素/媒体/引用/快速输入/分栏/快速功能/颜色/背景),支持拼音模糊与英文过滤;命令项需展示快捷键或描述。
### 3.5 列表与待办(来源:`数字列表.md`、`todolist.md`
- 数字列表默认三层(1/a/i)循环,并允许通过层级首项菜单切换样式;处理跨块断裂和图片缩进造成的编号断层。
- 待办列表支持 Markdown `[]`、高级待办 `()`、折叠变体 `+[]``+()`,进度条块读取同级待办完成度,高级待办 Alt/Opt 点击直接切换为取消。
- 待办完成度同步页面选项中的统计信息。
### 3.6 页面/块引用(来源:`页面引用.md`、`块引用.md`)
- 输入 `[[` / `#` / 文本样式 / `Ctrl/Cmd+Shift+R` 统一本地化搜索;若无命中提供“预引用”和“创建页面”。
- 行内/嵌入引用可通过 `复制块引用链接` (H/Q 快捷键) 或拖拽到右侧边栏创建;行内引用可设置别名并悬浮预览。
- 页面底部展示反向引用列表并支持折叠(配合页面选项中的折叠引用设置)。
### 3.7 搜索与工作流(来源:`搜索选项.md`)
- 搜索弹窗默认显示最近 20 个页面,可清空记录;输入时支持模糊匹配标题、分词匹配内容,英文/数字前缀匹配。
- 过滤器:仅匹配标题、精确匹配、编辑时间、创建时间、当前页面范围、图片 OCR;回车打开,`Ctrl/Cmd+Enter` 新窗口,`Alt/Opt+Enter` 右侧边栏。
- 选中文本 `Ctrl/Cmd+P` 直接填充搜索词。
### 3.8 媒体/图片(来源:`图片.md`)
- `/tp` 插入图片后提供上传/最近上传/链接/动态图标;支持多文件拖拽上传、粘贴图片/链接。
- 图片块菜单包含边框、默认大小、全屏、查看原图、下载、更换、说明、说明居中 (`C`)、添加链接。
- 图片编辑器提供裁剪/矩形/马赛克/自由绘制,OCR 操作会触发后台任务并有状态提示;说明区可输入文本并选择对齐方式。
- 动态图标能力需可选择日期/百分比/字符等变体。
### 3.9 垃圾桶与安全(来源:`垃圾桶.md`)
- 左侧底部固定“垃圾桶”入口,支持搜索、恢复、彻底删除;提供“操作确认”开关及 180 天恢复提示。
- 恢复页面默认回到“我的页面”,彻底删除需在 Supabase 端调用软删除 / 标记以便后台恢复。
## 4. 技术规范
- **技术栈**Next.js 15 App Router、React 18.3、SupabaseAuth + Postgres + Storage)、BlockNote + Tiptap 扩展、Tailwind CSS v4、`lucide-react`/`react-icons`
- **状态管理**`zustand` 统一管理全局 UISidebar/Dialogs/Theme),`@tanstack/react-query` 管理数据 fetching 与缓存;搜索/引用使用 React Server Actions + Supabase RPC 提升性能。
- **拖拽与虚拟化**`@dnd-kit/core` + `@dnd-kit/sortable`,虚拟树使用 `@tanstack/react-virtual`,结合稳定 ID 解决嵌套节点闪动。
- **样式要求**:全局遵循 Wolai 配色与排版,标题、待办、列表等组件以 CSS 变量驱动,支持 Good Night 模式与系统跟随。
- **编码规范**:所有字符串/文件 UTF-8、中文注释;公共逻辑拆入 `services/``src/lib/`,组件使用 `src/components/wolai/*` 组织。
- **Supabase 表设计**
- `pages`(层级/排序/图标/题头图/保护状态);
- `blocks`(类型/属性 JSON/父子顺序/引用 ID);
- `media_assets`(文件/最近上传/动态图标配置/OCR 文本);
- `page_refs`(引用关系、别名、行内/嵌入标记)。
## 5. 验证计划
### 自动化测试
- `supabase/functions`:添加单元测试验证 OCR 索引写入、垃圾桶恢复逻辑。
- 前端 `vitest`
- Sidebar 拖拽排序、星标过滤、垃圾桶操作确认。
- Block schema:标题转换/折叠、待办进度联动、转为页面数据写入。
- Slash menu:命令过滤(拼音/英文)、命令执行回调。
- E2EPlaywright):
1. 新建页面 -> 输入 `/h5` -> 自动编号 -> 打开标题目录。
2. 创建高级待办 + 进度条 -> Alt 点击取消 -> 进度更新。
3. 复制块引用 -> 粘贴为嵌入 -> 搜索引用的别名。
4. 上传图片 -> 编辑 -> 启动 OCR -> 通过搜索定位。
### 手动验证清单
- 侧边栏:三层嵌套创建/拖拽/移动到垃圾桶/恢复;星标页面固定在顶部。
- 编辑器:`转为页面` 保留嵌套内容;折叠标题展开/折叠一致;显示块结构/Good Night 切换。
- Slash menu`/tp``/dblb``/zhwlb``/grsz` 等命令可被拼音缩写过滤。
- 搜索:键入中文模糊、英文前缀、仅标题、编辑时间过滤;`Ctrl+Enter` 新窗口、`Alt+Enter` 右侧打开。
- 引用:`[[` 预引用 -> 创建新页面 -> 切换别名 -> 页面底部显示反向引用;`嵌入到...` 将块嵌入其他页面。
- 图片:上传 + 最近上传选择 + 链接插入 + 动态图标,OCR 后在搜索中出现高亮摘要。
- 垃圾桶:打开操作确认、恢复/彻底删除操作均符合提示。
## 6. 下一步行动
1. 输出 Sidebar 数据结构与拖拽方案设计稿,确定 Supabase 表/索引需求。
2. 基于 `scraped_docs/基本编辑.md` 构建 BlockNote 自定义 schema(标题/待办/进度条/转页面),并封装 `/` 命令扩展。
3. 设计全局搜索 & OCR 索引流程(图片上传 -> Edge Function OCR -> Supabase `media_assets` 更新 -> 搜索服务),并评估性能预算。
4. 规划垃圾桶与页面历史数据清理脚本,确保 180 天内可恢复。