画流程图/架构图。**先定载体,再动手** —— 同一张图在 GitHub、飞书、网页里 要用完全不同的做法,而用错载体的后果是「图没画出来,却看起来像画了」。 含飞书画板 API 的完整备忘(节点/连线/箭头/标签/导出,全是试出来的)。 触发方式:/draw-flowchart,或用户说「画个流程图」「画架构图」「这图改成流程图」。 ⚠️ 铁律:**画完必须把成品看一眼**,接口返回 0 只说明它收下了。
Install
npx skillscat add 843773296-rgb/lanxiu-yunshang-agent/draw-flowchart Install via the SkillsCat registry.
画流程图
第一步:定载体。用错载体 = 白画
| 图要给谁看 | 用什么 | 为什么不能用别的 |
|---|---|---|
| GitHub / 仓库里的 md | mermaid 代码块 | 直接渲染,源码即图,可 diff |
| 飞书文档 | 画板 API 画真节点 | 飞书的 markdown 导入不认 mermaid —— 那三段只会变成代码块,读者看到源码,等于一张图都没有 |
| 网页 / 要分享的页面 | HTML + 原生 mermaid | |
| 要自己检查画得对不对 | 导出成图片,用眼睛看 | 见下面那条铁律 |
⚠️ 别默认 markdown 里放 mermaid 就万事大吉。 先问一句「这图最后在哪儿看」。
铁律:画完必须看成品
接口返回 code=0 只说明它收下了,不说明画出来是对的。 这条在一次任务里救了四回:
| 现象 | 只看返回码时的样子 |
|---|---|
| 四条边的标签挤成一团,「一模一样的参数再试已经成功过一次还写」糊成一行 | 全绿 |
连线一个箭头都没有(没设 arrow_style) |
全绿 |
| 分支标签三种写法接口都收,导出来一个字没有 | 全绿 |
| 菱形里的字被切掉 | 全绿 |
自动布局尤其要看:第一版「最长路径分层 + 层内按插入顺序」把判定框和它的拒绝框排到同一行两端,
于是每条线 45° 斜穿整张图 —— 而节点数量核对是全对的。
「节点数对上了」和「画出来是对的」是两件事。
排版约定(照着排,不要让算法猜)
- 主链一条竖直线,自上而下,x 固定
- 分支一律甩到右边,同一个 x,短横线进出
- 判定框上进下出,分支从右尖出 —— 靠
snap_to指定,别用auto - 标签放在线中间:纵向放两框之间的空档,横向放线的上方
- 只在有语义的地方上色(拒绝=红、通过=绿、判定=黄)。全上色等于没上色
- 三张以内的已知图,手写坐标比自动布局稳。自动布局是另一个项目
飞书画板 API 备忘
官方文档站是单页应用抓不到正文,下面每条都是靠错误信息逼出来的,直接抄。
① 建画板(在文档里插 block_type=43 的块,它的 board.token 就是 whiteboard_id)
POST /open-apis/docx/v1/documents/{doc}/blocks/{doc}/children
{"children":[{"block_type":43,"board":{}}], "index": <根块的直接子块数>}⚠️ index 是根块的直接子块数,不是文档总块数。给大了报 invalid param ——
而这个错和权限不足长得一点都不像,很容易被当成权限问题。
② 画图形
POST /open-apis/board/v1/whiteboards/{wid}/nodes
{"nodes":[{"type":"composite_shape",
"composite_shape":{"type":"round_rect"}, // rect / diamond / ellipse
"x":0,"y":0,"width":300,"height":90,
"text":{"text":"模型"},
"style":{"fill_color":"#E4EFEA"}}]}③ 画连线(要先画完图形拿到 id)
{"type":"connector","connector":{
"start":{"attached_object":{"id":"o1:1","snap_to":"bottom"}},
"end": {"attached_object":{"id":"o1:2","snap_to":"top"},
"arrow_style":"line_arrow"}, // ⚠️ 在 end 这一层,不在 attached_object 里
"shape":"curve"}}⚠️ arrow_style 放错一层不报错,只是箭头静静地消失 —— 线还在,方向没了。
arrow_style:line_arrow(solid / arrow / triangle 都会被拒)shape:curve(elbowed / polyline / orthogonal 都会被拒)snap_to:auto/top/bottom/left/right
④ 分支标签:不要用 connector 的 caption
caption / caption.text / caption.data.text 三种写法接口都返回 0,但画不出来。
改用独立的透明文字块贴在线边上:
{"type":"composite_shape","composite_shape":{"type":"rect"},
"text":{"text":"否"},"style":{"border_opacity":0,"fill_opacity":0}}⑤ 导出来看
GET /open-apis/board/v1/whiteboards/{wid}/download_as_image // 返回 JPEG⑥ 权限
board:whiteboard:node:read / :create / :update / :delete⚠️ 后台加权限后必须重新授权:缓存里的 token 是按旧 scope 签发的,不会自己变强 ——
而「token 还能用」和「token 有新权限」在调用失败之前长得一模一样。
⑦ 一条没走通的路(别再试一遍)
POST /board/v1/whiteboards/{wid}/nodes/plantuml 接口确实存在
(对照:同前缀的假路径返回 404,它返回字段校验错),字段名是 plant_uml_code
(空串报 field validation,非空报 parse result empty —— 说明名字对了)。
但试过的所有 PlantUML 方言(活动图 / 时序图 / 类图 / mindmap / base64 / deflate)
都被解析成空。如果它能用,就不必手摆坐标了 —— 值得再查官方文档,但别再盲试。
顺序:发布在前,画在后
若发布脚本是「新建文档 + 清同名旧版」,那画板必须在发布之后画,
否则下一次发布会连同文档一起把图换掉。
把 mermaid 块换成一行占位段,发布后按占位段定位插图。
插入要从后往前 —— 前面插完后面的序号全变,而这种错不报错,只会插错地方。