笔记图片块:端上只能纯文本,图文混排的 image 块显示成「[图片]」 #23

Closed
opened 2026-10-28 12:52:45 +00:00 by laoyang · 1 comment
Owner

现象

笔记端上只支持纯文本:FbNoteSheet 头部注释写明「端上只支持纯文本(服务端 body → 一个 text 块);网页那边可以图文混排(note_blocks 有 image 块),端上先不做」。已有笔记里的图片块在端上显示成「[图片]」,编辑保存还会把图片块弄丢风险。

现状与依据

  • 服务端已支持:Note::BLOCK_KINDS = ['text', 'image'],note_blocks 表按块存(text/image),imageKey() / blocks() 已能下发 image 块内容。
  • 端上缺:parseNotes 把 image 块折叠成「[图片]」字样;FbNoteSheet 编辑用的是单个 TextArea,只认一个 text 块。

要做的(纯鸿蒙端)

  1. parseNotes / FbNoteSheet 能展示 image 块(fbImageSrc 加载附件图,或用已有图片加载链路)。
  2. 编辑态支持插入图片块(选相册/拍照 → 上传 → 作为 image 块),或至少"展示 image 块 + 编辑时不丢已有 image 块"。
  3. 与 text 块混排的排序保持一致(note_blocks 的 position)。

验收

  • 新建一条带图笔记,Web 端能看见图、端上也能看见(不显示「[图片]」)。
  • 端上编辑一条「纯文本」笔记,Web 端的图片块不被清掉。

标签

terminal/harmony · 纯端上


本单由需求拆解生成,主单 laoyang/FamilyBook #22。

## 现象 笔记端上只支持**纯文本**:`FbNoteSheet` 头部注释写明「端上只支持纯文本(服务端 body → 一个 text 块);网页那边可以图文混排(note_blocks 有 image 块),端上先不做」。已有笔记里的图片块在端上显示成「[图片]」,编辑保存还会把图片块弄丢风险。 ## 现状与依据 - 服务端已支持:`Note::BLOCK_KINDS = ['text', 'image']`,`note_blocks` 表按块存(text/image),`imageKey()` / `blocks()` 已能下发 image 块内容。 - 端上缺:`parseNotes` 把 image 块折叠成「[图片]」字样;`FbNoteSheet` 编辑用的是单个 `TextArea`,只认一个 text 块。 ## 要做的(纯鸿蒙端) 1. `parseNotes` / `FbNoteSheet` 能**展示** image 块(`fbImageSrc` 加载附件图,或用已有图片加载链路)。 2. 编辑态支持**插入图片块**(选相册/拍照 → 上传 → 作为 image 块),或至少"展示 image 块 + 编辑时不丢已有 image 块"。 3. 与 text 块混排的排序保持一致(`note_blocks` 的 position)。 ## 验收 - 新建一条带图笔记,Web 端能看见图、端上也能看见(不显示「[图片]」)。 - 端上编辑一条「纯文本」笔记,Web 端的图片块不被清掉。 ## 标签 terminal/harmony · 纯端上 --- > 本单由需求拆解生成,主单 laoyang/FamilyBook #22。
Author
Owner

收尾:已修完、已验证、已部署

两端都已提交并推送,服务端已部署上线。

一个比标题更严重的问题(顺带修了)

盘点时发现「显示成 [图片]」只是表象,更糟的是:端上 updateNote 原来只传 body,
服务端 noteBlocksIn() 会把它折成单个 text 块并整组替换(先 DELETE 再 INSERT)⇒
端上编辑一条带图笔记、点保存,图片块会被静默删光。这是 P0 数据丢失,一并修了。

改了什么

服务端(commit cd56a9d):

  • 补 POST /api/v1/notes/upload —— 笔记图片上传,返回附件 key。
    放 notes() 的 $id>0 分支之前(上传是草稿态,不依赖笔记 id——新建笔记插图时还没有 id)。
    图片先挂 target_id=0,等 blocks 带 key 提交时由 Note::claimUploads 认领(与 Web 端 notes/upload 同一套)。
  • dispatch 里 notes case 改成 notes($id, $sub, $method),否则 $sub='upload' 传不进去(405)。

鸿蒙端(commit 9784602,7 文件):

  • FbNoteItem 加 blocks 字段,parseNotes 把原始块带进来;FbNoteSheet 里 image 块真画图,不再显示「[图片]」。
  • 正文区下加「+ 插图」:选图 → fbUploadKey 上传拿 key → 加入待保存列表;每张图带「×」可删。
  • 保存带图时走 saveNoteWithBlocks(正文 text 块 + 图片 image 块整组提交),修掉上面的丢块问题。
  • fbUploadKey 是 fbUpload 抽出的第二出口,复用同一 multipart 核心,不复制实现。

验证

  • 服务端本地 API 冒烟 _i23_note_image_api.py 11/0:上传返 key · 带 blocks 新建后 text+image 两块都在 · PATCH 后图片块不被删。
  • 反证 _i23_falsify.py:注掉 upload 分支 → ①② 变红(命中 2/2)。
  • 鸿蒙端编译 BUILD SUCCESSFUL;守卫 _fb_arkts_guard.js 1324/0。

部署

服务端 20261028-213517,线上 app/ApiHandler.php md5 与本地一致。两仓库均已 push。

⚠️ 真机点验待设备恢复(USB 物理层断开,hdc list targets 长期 [Empty]):
插图 → 保存 → 看图片 → 重开不丢,这几步的手感要等设备连上再点。

## 收尾:已修完、已验证、已部署 两端都已提交并推送,服务端已部署上线。 ### 一个比标题更严重的问题(顺带修了) 盘点时发现「显示成 [图片]」只是表象,更糟的是:端上 `updateNote` 原来只传 `body`, 服务端 `noteBlocksIn()` 会把它折成**单个 text 块**并**整组替换**(先 DELETE 再 INSERT)⇒ **端上编辑一条带图笔记、点保存,图片块会被静默删光**。这是 P0 数据丢失,一并修了。 ### 改了什么 **服务端**(commit `cd56a9d`): - 补 `POST /api/v1/notes/upload` —— 笔记图片上传,返回附件 key。 放 `notes()` 的 `$id>0` 分支**之前**(上传是草稿态,不依赖笔记 id——新建笔记插图时还没有 id)。 图片先挂 `target_id=0`,等 `blocks` 带 key 提交时由 `Note::claimUploads` 认领(与 Web 端 `notes/upload` 同一套)。 - dispatch 里 `notes` case 改成 `notes($id, $sub, $method)`,否则 `$sub='upload'` 传不进去(405)。 **鸿蒙端**(commit `9784602`,7 文件): - `FbNoteItem` 加 `blocks` 字段,`parseNotes` 把原始块带进来;`FbNoteSheet` 里 image 块**真画图**,不再显示「[图片]」。 - 正文区下加「+ 插图」:选图 → `fbUploadKey` 上传拿 key → 加入待保存列表;每张图带「×」可删。 - 保存带图时走 `saveNoteWithBlocks`(正文 text 块 + 图片 image 块整组提交),修掉上面的丢块问题。 - `fbUploadKey` 是 `fbUpload` 抽出的第二出口,复用同一 multipart 核心,不复制实现。 ### 验证 - 服务端本地 API 冒烟 `_i23_note_image_api.py` **11/0**:上传返 key · 带 blocks 新建后 text+image 两块都在 · **PATCH 后图片块不被删**。 - 反证 `_i23_falsify.py`:注掉 upload 分支 → ①② 变红(命中 2/2)。 - 鸿蒙端编译 **BUILD SUCCESSFUL**;守卫 `_fb_arkts_guard.js` **1324/0**。 ### 部署 服务端 `20261028-213517`,线上 `app/ApiHandler.php` md5 与本地一致。两仓库均已 push。 ⚠️ **真机点验待设备恢复**(USB 物理层断开,`hdc list targets` 长期 `[Empty]`): 插图 → 保存 → 看图片 → 重开不丢,这几步的手感要等设备连上再点。
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: laoyang/FamilyBook#23