Files
mnote/wolaiplan.md
T
2025-11-23 10:55:04 +08:00

156 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.
# 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 天内可恢复。