0.5 缩减重构
This commit is contained in:
@@ -0,0 +1,155 @@
|
||||
# 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、Supabase(Auth + Postgres + Storage)、BlockNote + Tiptap 扩展、Tailwind CSS v4、`lucide-react`/`react-icons`。
|
||||
- **状态管理**:`zustand` 统一管理全局 UI(Sidebar/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:命令过滤(拼音/英文)、命令执行回调。
|
||||
- E2E(Playwright):
|
||||
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 天内可恢复。
|
||||
Reference in New Issue
Block a user