# Plan: 用 Tiptap 替换 wangEditor
## 目标
将项目中所有 wangEditor 编辑器替换为 Tiptap,保留全部现有功能(文字格式、标题、列表、表格、图片上传、视频、链接、代码/引用、颜色、撤销重做等),保持 v-model 接口不变。
## 需要修改的文件清单
### 新建文件
| 文件 | 说明 |
|------|------|
| `platform/src/views/components/TiptapEditor.vue` | Tiptap 编辑器组件(替代 WangEditor) |
### 修改文件
| 文件 | 改动 |
|------|------|
| `platform/package.json` | 移除 `@wangeditor/editor`,添加 Tiptap 依赖 |
| `backend/package.json` | 同上 |
| `platform/src/main.js` | 替换 WangEditor 全局注册为 TiptapEditor |
| `backend/src/main.js` | 同上 |
| `platform/src/views/tools/notebook/components/edit.vue` | 改用 TiptapEditor |
| `platform/src/views/tools/notebook/components/WangEditor.vue` | 删除此文件 |
| `backend/src/views/apps/cms/articles/components/edit.vue` | 改用 TiptapEditor |
| `backend/src/views/apps/cms/products/components/edit.vue` | 改用 TiptapEditor,更新 import (line 98) |
| `backend/src/views/apps/cms/articles/components/edit.vue` | 改用 TiptapEditor,更新 import (line 174),更新 w-e-* 样式 (line 538-539) |
| `backend/src/views/components/WangEditor.vue` | 替换为 TiptapEditor(或删除后改名) |
| `platform/src/views/Main.vue` | 更新 w-e-* 选择器为新的编辑器选择器 |
| `backend/src/views/Main.vue` | 同上 |
| `platform/src/assets/less/style.less` | 更新 .w-e-* 样式为新编辑器样式 |
| `backend/src/assets/less/style.less` | 同上 |
### 可删除文件
| 文件 | 说明 |
|------|------|
| `platform/src/views/components/WangEditor.vue` | 被 TiptapEditor 替代 |
| `platform/src/views/tools/notebook/components/WangEditor.vue` | 被 TiptapEditor 替代 |
| `backend/src/views/components/WangEditor.vue` | 被 TiptapEditor 替代 |
---
## Step 1: 安装 Tiptap 依赖,移除 wangEditor
两个项目(platform、backend)都需要执行:
```bash
# 移除 wangEditor
npm uninstall @wangeditor/editor
# 安装 Tiptap 核心
npm install @tiptap/vue-3 @tiptap/pm @tiptap/starter-kit
# 安装扩展
npm install @tiptap/extension-underline
npm install @tiptap/extension-text-style
npm install @tiptap/extension-color
npm install @tiptap/extension-highlight
npm install @tiptap/extension-placeholder
npm install @tiptap/extension-link
npm install @tiptap/extension-image
npm install @tiptap/extension-table @tiptap/extension-table-row @tiptap/extension-table-cell @tiptap/extension-table-header
npm install @tiptap/extension-text-align
```
---
## Step 2: 创建 TiptapEditor.vue 组件
路径:`platform/src/views/components/TiptapEditor.vue`
### 组件接口(保持与 WangEditor 一致)
- **Props**: `modelValue: string` (HTML)
- **Emits**: `update:modelValue`
- **Expose**: `clear()`, `getContent()`, `setContent(content)`
### 功能模块
#### 编辑器核心
- 使用 `useEditor` + `EditorContent` from `@tiptap/vue-3`
- Extensions 列表:
- `StarterKit` (bold, italic, strike, headings H1-H6, orderedList, bulletList, code, codeBlock, blockquote, horizontalRule, history/undo/redo)
- `Underline`
- `TextStyle` + `Color` + `Highlight` (文字颜色/背景色)
- `Placeholder` ("请输入内容...")
- `Link` (超链接)
- `Image` (图片)
- `Table` + `TableRow` + `TableCell` + `TableHeader` (表格,支持 resizable)
- `TextAlign` (left/center/right/justify)
#### 工具栏
分组按钮布局,从左到右:
1. **文字格式**: 加粗(B)、斜体(I)、下划线(U)、删除线(S)
2. **标题**: H1-H4 下拉或按钮组
3. **列表**: 有序、无序
4. **引用/代码**: 引用块、代码块
5. **链接**: 插入/编辑链接
6. **图片**: 上传图片按钮
7. **视频**: 插入视频(URL 方式)
8. **表格**: 插入表格、删除行/列、合并单元格
9. **颜色**: 文字颜色、背景色
10. **对齐**: 左/中/右/两端
11. **其他**: 撤销、重做
#### 图片上传
- 复用现有 `uploadFile` API(`@/api/file`)
- 上传到 `/api/files`,带 Bearer token
- 与现有 WangEditor 上传逻辑一致
#### HTML 双向同步
- `editor.on('update')` → `emit('update:modelValue', editor.getHTML())`
- `watch(modelValue)` → `editor.commands.setContent(newVal)` (避免循环触发)
#### 样式
- 保持现有 `.wang-editor-wrapper` 的视觉风格
- 新编辑器使用 `.tiptap-editor-wrapper` 类名
- 编辑区域使用 Tiptap 默认的 `.tiptap` 类名
- 支持 dark mode(`html.dark` 选择器)
---
## Step 3: 替换全局注册
### platform/src/main.js
```js
// 移除: import WangEditor from '@/views/components/WangEditor.vue';
// 添加: import TiptapEditor from '@/views/components/TiptapEditor.vue';
// 移除: app.component('WangEditor', WangEditor);
// 添加: app.component('TiptapEditor', TiptapEditor);
```
### backend/src/main.js
同上。
---
## Step 4: 更新消费者页面
3 个消费者页面需要将 `` 改为 ``:
1. `platform/src/views/tools/notebook/components/edit.vue` (line 19)
- 改 `` → ``
- 移除 `import WangEditor from './WangEditor.vue'`
2. `backend/src/views/apps/cms/articles/components/edit.vue`
- 改 `` → ``
- 移除或更新 import
3. `backend/src/views/apps/cms/products/components/edit.vue` (line 28)
- 改 `` → ``
- 保留 `style="height: 450px;"`
---
## Step 5: 更新 Main.vue 事件处理
两个 Main.vue 中的右键菜单拦截逻辑需要更新选择器:
```
旧: '.wang-editor-wrapper', '.w-e-toolbar', '.w-e-drop-panel', '.w-e-modal', '.w-e-toolbar-menu', '[class*="w-e-"]'
新: '.tiptap-editor-wrapper', '.tiptap-toolbar', '[class*="tiptap-"]'
```
---
## Step 6: 更新全局样式
两个 `style.less` 中将 `.wang-editor-wrapper` / `.w-e-*` 选择器替换为新的 Tiptap 编辑器选择器。
---
## Step 7: 删除旧文件
- 删除 `platform/src/views/components/WangEditor.vue`
- 删除 `platform/src/views/tools/notebook/components/WangEditor.vue`
- 删除 `backend/src/views/components/WangEditor.vue`
---
## Step 8: 更新文档
- `platform/src/views/tools/notebook/README.md` - 更新技术栈描述
- `docs/NOTEBOOK_DEPLOYMENT_CHECKLIST.md` - 更新依赖安装命令
---
## 验证方式
1. `cd platform && npm install` - 确认依赖安装无报错
2. `cd backend && npm install` - 同上
3. 启动 platform 开发服务器,测试:
- 笔记本编辑器:输入文字、格式化、插入表格、上传图片
- 工具栏所有按钮可用
- v-model 双向绑定正常
4. 启动 backend 开发服务器,测试:
- CMS 文章编辑器:所有功能正常
- CMS 产品编辑器:所有功能正常
5. 测试 dark mode 切换下编辑器样式
6. 测试表格内 Backspace/Delete 正常工作