diff --git a/docs/superpowers/plans/2026-04-18-article-edit-markdown-implementation-plan.md b/docs/superpowers/plans/2026-04-18-article-edit-markdown-implementation-plan.md new file mode 100644 index 0000000..a47bbd7 --- /dev/null +++ b/docs/superpowers/plans/2026-04-18-article-edit-markdown-implementation-plan.md @@ -0,0 +1,447 @@ +# 文章编辑页 Markdown 分屏与上传 Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** 按 `docs/superpowers/specs/2026-04-18-article-edit-markdown-design.md` 实现写作优先布局、可折叠「文章设置」、`md-editor-v3` 分屏编辑/预览、图片批量上传插入 Markdown,并将上传单文件上限调至 10MB。 + +**Architecture:** 新增封装组件在 `ClientOnly` 内挂载 `MdEditor`(`preview=true` 默认分屏,用户可拖中间分隔条调比例);`onUploadImg` 内用 `FormData` 多 `file` 字段调用现有 `/api/file/upload`,成功后将 `url` 数组交给编辑器回调;编辑/新建两页共用该组件;元数据区用 `UCollapsible` 包在 `UCard` 内;上传限制仅在 Nitro 路由中改 `multer` 配置。 + +**Tech Stack:** Nuxt 4.4、`@nuxt/ui` 4.6、Vue 3.5、`md-editor-v3` **6.4.2**(计划中锁定;安装以 `package.json` 为准)、Bun、`$fetch` 封装 `request` + `unwrapApiBody`、`useToast`。 + +**Spec:** `docs/superpowers/specs/2026-04-18-article-edit-markdown-design.md` + +**测试说明:** 本期以 spec 第 8 节 **手动验收** 为主;仓库暂无 HTTP 上传集成测试,计划中不虚构「先写失败测试」步骤。 + +--- + +## 文件结构(将创建 / 修改) + +| 路径 | 职责 | +|------|------| +| `package.json` / `bun.lock` | 依赖 `md-editor-v3@6.4.2` | +| `nuxt.config.ts` | 若 `bun run dev` / `build` 报 md-editor 预构建错误,增加 `vite.optimizeDeps.include`(见 Task 1 可选步) | +| `server/api/file/upload.post.ts` | `limits.fileSize` → 10MB | +| `app/components/PostBodyMarkdownEditor.vue` | `MdEditor` + `v-model` + `onUploadImg` + Toast 错误 | +| `app/pages/me/posts/[id].vue` | 布局 C:顶栏、`UCard`、`UCollapsible`、正文组件、表单与保存/删除 | +| `app/pages/me/posts/new.vue` | 与编辑页一致的布局与正文组件 | + +--- + +### Task 1: 依赖与构建兜底 + +**Files:** + +- Modify: `package.json` +- Modify: `bun.lock`(由 bun 自动生成) + +- [ ] **Step 1: 安装 md-editor-v3** + +Run: + +```bash +cd /home/dash/projects/person-panel && bun add md-editor-v3@6.4.2 +``` + +Expected: `package.json` 的 `dependencies` 含 `"md-editor-v3": "6.4.2"`(或兼容的 6.4.x 解析版本)。 + +- [ ] **Step 2: 校验开发构建** + +Run: + +```bash +cd /home/dash/projects/person-panel && bun run dev +``` + +Expected: Nuxt 启动无报错;在浏览器打开任意页确认无白屏。 + +若控制台出现与 `md-editor-v3` / `codemirror` 相关的 **optimizeDeps / 预构建** 错误,再执行 **Step 3**;否则跳过 Step 3。 + +- [ ] **Step 3(可选): Vite 预构建包含** + +Modify `nuxt.config.ts`,在 `defineNuxtConfig({ ... })` 内与 `nitro` 同级增加: + +```typescript + vite: { + optimizeDeps: { + include: ['md-editor-v3'], + }, + }, +``` + +保存后重新 `bun run dev`,Expected: 错误消失。 + +- [ ] **Step 4: Commit** + +```bash +cd /home/dash/projects/person-panel && git add package.json bun.lock nuxt.config.ts && git commit -m "chore(deps): add md-editor-v3 for post markdown editor" +``` + +(若未改 `nuxt.config.ts`,从 `git add` 中省略该文件。) + +--- + +### Task 2: 上传体积 10MB + +**Files:** + +- Modify: `server/api/file/upload.post.ts`(`limits` 段) + +- [ ] **Step 1: 修改 fileSize 上限** + +将 `fileSize: 5 * 1024 * 1024` 替换为: + +```typescript + fileSize: 10 * 1024 * 1024, // 10MB +``` + +`fileFilter` 与 `upload.array('file', 10)` **保持不变**。 + +- [ ] **Step 2: Commit** + +```bash +cd /home/dash/projects/person-panel && git add server/api/file/upload.post.ts && git commit -m "feat(upload): raise image upload limit to 10MB" +``` + +--- + +### Task 3: 正文编辑器封装组件 + +**Files:** + +- Create: `app/components/PostBodyMarkdownEditor.vue` + +- [ ] **Step 1: 新增组件文件** + +创建 `app/components/PostBodyMarkdownEditor.vue`,完整内容: + +```vue + + + +``` + +说明:`preview` 默认为 `true`(见 `md-editor-v3` 类型定义),即左侧编辑、右侧预览;库内分隔条可拖调宽度。`onUploadImg` 签名:`(files: File[], callback: (urls: string[]) => void)`,多文件一次请求与 `multer.array('file', 10)` 对齐。 + +- [ ] **Step 2: Commit** + +```bash +cd /home/dash/projects/person-panel && git add app/components/PostBodyMarkdownEditor.vue && git commit -m "feat(editor): add PostBodyMarkdownEditor with md-editor-v3 and upload" +``` + +--- + +### Task 4: 编辑页 `[id].vue` 布局与接入 + +**Files:** + +- Modify: `app/pages/me/posts/[id].vue` + +- [ ] **Step 1: 替换模板与容器** + +将 `