API.zh-CN.md
端点:http://127.0.0.1:6806
均是 POST 方法
需要带参的接口,参数为 JSON 字符串,放置到 body 里,标头 Content-Type 为 application/json
返回值
{
"code": 0,
"msg": "",
"data": {}
}
code:非 0 为异常情况msg:正常情况下是空字符串,异常情况下会返回错误文案data:可能为 {}、[] 或者 NULL,根据不同接口而不同在 <kbd>设置 - 关于</kbd> 里查看 API token,请求标头:Authorization: Token xxx
/api/notebook/lsNotebooks
不带参
返回值
{
"code": 0,
"msg": "",
"data": {
"notebooks": [
{
"id": "20210817205410-2kvfpfn",
"name": "测试笔记本",
"icon": "1f41b",
"sort": 0,
"closed": false
},
{
"id": "20210808180117-czj9bvb",
"name": "思源笔记用户指南",
"icon": "1f4d4",
"sort": 1,
"closed": false
}
]
}
}
/api/notebook/openNotebook
参数
{
"notebook": "20210831090520-7dvbdv0"
}
notebook:笔记本 ID返回值
{
"code": 0,
"msg": "",
"data": null
}
/api/notebook/closeNotebook
参数
{
"notebook": "20210831090520-7dvbdv0"
}
notebook:笔记本 ID返回值
{
"code": 0,
"msg": "",
"data": null
}
/api/notebook/renameNotebook
参数
{
"notebook": "20210831090520-7dvbdv0",
"name": "笔记本的新名称"
}
notebook:笔记本 ID返回值
{
"code": 0,
"msg": "",
"data": null
}
/api/notebook/createNotebook
参数
{
"name": "笔记本的名称"
}
返回值
{
"code": 0,
"msg": "",
"data": {
"notebook": {
"id": "20220126215949-r1wvoch",
"name": "笔记本的名称",
"icon": "",
"sort": 0,
"closed": false
}
}
}
/api/notebook/removeNotebook
参数
{
"notebook": "20210831090520-7dvbdv0"
}
notebook:笔记本 ID返回值
{
"code": 0,
"msg": "",
"data": null
}
/api/notebook/getNotebookConf
参数
{
"notebook": "20210817205410-2kvfpfn"
}
notebook:笔记本 ID返回值
{
"code": 0,
"msg": "",
"data": {
"box": "20210817205410-2kvfpfn",
"conf": {
"name": "测试笔记本",
"closed": false,
"refCreateSavePath": "",
"createDocNameTemplate": "",
"dailyNoteSavePath": "/daily note/{{now | date \"2006/01\"}}/{{now | date \"2006-01-02\"}}",
"dailyNoteTemplatePath": ""
},
"name": "测试笔记本"
}
}
/api/notebook/setNotebookConf
参数
{
"notebook": "20210817205410-2kvfpfn",
"conf": {
"name": "测试笔记本",
"closed": false,
"refCreateSavePath": "",
"createDocNameTemplate": "",
"dailyNoteSavePath": "/daily note/{{now | date \"2006/01\"}}/{{now | date \"2006-01-02\"}}",
"dailyNoteTemplatePath": ""
}
}
notebook:笔记本 ID返回值
{
"code": 0,
"msg": "",
"data": {
"name": "测试笔记本",
"closed": false,
"refCreateSavePath": "",
"createDocNameTemplate": "",
"dailyNoteSavePath": "/daily note/{{now | date \"2006/01\"}}/{{now | date \"2006-01-02\"}}",
"dailyNoteTemplatePath": ""
}
}
/api/filetree/createDocWithMd
参数
{
"notebook": "20210817205410-2kvfpfn",
"path": "/foo/bar",
"markdown": ""
}
notebook:笔记本 IDpath:文档路径,需要以 / 开头,中间使用 / 分隔层级(这里的 path 对应数据库 hpath 字段)markdown:GFM Markdown 内容返回值
{
"code": 0,
"msg": "",
"data": "20210914223645-oj2vnx2"
}
data:创建好的文档 IDpath 重复调用该接口,不会覆盖已有文档/api/filetree/renameDoc
参数
{
"notebook": "20210831090520-7dvbdv0",
"path": "/20210902210113-0avi12f.sy",
"title": "文档新标题"
}
notebook:笔记本 IDpath:文档路径title:新标题返回值
{
"code": 0,
"msg": "",
"data": null
}
通过 id 重命名文档:
/api/filetree/renameDocByID
参数
{
"id": "20210902210113-0avi12f",
"title": "文档新标题"
}
id:文档 IDtitle:新标题返回值
{
"code": 0,
"msg": "",
"data": null
}
/api/filetree/removeDoc
参数
{
"notebook": "20210831090520-7dvbdv0",
"path": "/20210902210113-0avi12f.sy"
}
notebook:笔记本 IDpath:文档路径返回值
{
"code": 0,
"msg": "",
"data": null
}
通过 id 删除文档:
/api/filetree/removeDocByID
参数
{
"id": "20210902210113-0avi12f"
}
id:文档 ID返回值
{
"code": 0,
"msg": "",
"data": null
}
/api/filetree/moveDocs
参数
{
"fromPaths": ["/20210917220056-yxtyl7i.sy"],
"toNotebook": "20210817205410-2kvfpfn",
"toPath": "/"
}
fromPaths:源路径toNotebook:目标笔记本 IDtoPath:目标路径返回值
{
"code": 0,
"msg": "",
"data": null
}
通过 id 移动文档:
/api/filetree/moveDocsByID
参数
{
"fromIDs": ["20210917220056-yxtyl7i"],
"toID": "20210817205410-2kvfpfn"
}
fromIDs:源文档 IDtoID:目标父文档 ID 或笔记本 ID返回值
{
"code": 0,
"msg": "",
"data": null
}
/api/filetree/getHPathByPath
参数
{
"notebook": "20210831090520-7dvbdv0",
"path": "/20210917220500-sz588nq/20210917220056-yxtyl7i.sy"
}
notebook:笔记本 IDpath:路径返回值
{
"code": 0,
"msg": "",
"data": "/foo/bar"
}
/api/filetree/getHPathByID
参数
{
"id": "20210917220056-yxtyl7i"
}
id:块 ID返回值
{
"code": 0,
"msg": "",
"data": "/foo/bar"
}
/api/filetree/getPathByID
参数
{
"id": "20210808180320-fqgskfj"
}
id:块 ID返回值
{
"code": 0,
"msg": "",
"data": {
"notebook": "20210808180117-czj9bvb",
"path": "/20200812220555-lj3enxa/20210808180320-fqgskfj.sy"
}
}
/api/filetree/getIDsByHPath
参数
{
"path": "/foo/bar",
"notebook": "20210808180117-czj9bvb"
}
path:人类可读路径notebook:笔记本 ID返回值
{
"code": 0,
"msg": "",
"data": [
"20200813004931-q4cu8na"
]
}
/api/asset/upload
参数为 HTTP Multipart 表单
assetsDirPath:资源文件存放的文件夹路径,以 data 文件夹作为根路径,比如:
"/assets/":工作空间/data/assets/ 文件夹"/assets/sub/":工作空间/data/assets/sub/ 文件夹常规情况下建议用第一种,统一存放到工作空间资源文件夹下,放在子目录有一些副作用,请参考用户指南资源文件章节。
file[]:上传的文件列表
返回值
{
"code": 0,
"msg": "",
"data": {
"errFiles": [""],
"succMap": {
"foo.png": "assets/foo-20210719092549-9j5y79r.png"
}
}
}
errFiles:处理时遇到错误的文件名succMap:处理成功的文件,key 为上传时的文件名,value 为 assets/foo-id.png,用于将已有 Markdown 内容中的资源文件链接地址替换为上传后的地址/api/block/insertBlock
参数
{
"dataType": "markdown",
"data": "foo**bar**{: style=\"color: var(--b3-font-color8);\"}baz",
"nextID": "",
"previousID": "20211229114650-vrek5x6",
"parentID": ""
}
dataType:待插入数据类型,值可选择 markdown 或者 domdata:待插入的数据nextID:后一个块的 ID,用于锚定插入位置previousID:前一个块的 ID,用于锚定插入位置parentID:父块 ID,用于锚定插入位置nextID、previousID、parentID 三个参数必须至少存在一个有值,优先级为 nextID > previousID > parentID
返回值
{
"code": 0,
"msg": "",
"data": [
{
"doOperations": [
{
"action": "insert",
"data": "<div data-node-id=\"20211230115020-g02dfx0\" data-node-index=\"1\" data-type=\"NodeParagraph\" class=\"p\"><div contenteditable=\"true\" spellcheck=\"false\">foo<strong style=\"color: var(--b3-font-color8);\">bar</strong>baz</div><div class=\"protyle-attr\" contenteditable=\"false\"></div></div>",
"id": "20211230115020-g02dfx0",
"parentID": "",
"previousID": "20211229114650-vrek5x6",
"retData": null
}
],
"undoOperations": null
}
]
}
action.data:新插入块生成的 DOMaction.id:新插入块的 ID/api/block/prependBlock
参数
{
"data": "foo**bar**{: style=\"color: var(--b3-font-color8);\"}baz",
"dataType": "markdown",
"parentID": "20220107173950-7f9m1nb"
}
dataType:待插入数据类型,值可选择 markdown 或者 domdata:待插入的数据parentID:父块的 ID,用于锚定插入位置返回值
{
"code": 0,
"msg": "",
"data": [
{
"doOperations": [
{
"action": "insert",
"data": "<div data-node-id=\"20220108003710-hm0x9sc\" data-node-index=\"1\" data-type=\"NodeParagraph\" class=\"p\"><div contenteditable=\"true\" spellcheck=\"false\">foo<strong style=\"color: var(--b3-font-color8);\">bar</strong>baz</div><div class=\"protyle-attr\" contenteditable=\"false\"></div></div>",
"id": "20220108003710-hm0x9sc",
"parentID": "20220107173950-7f9m1nb",
"previousID": "",
"retData": null
}
],
"undoOperations": null
}
]
}
action.data:新插入块生成的 DOMaction.id:新插入块的 ID/api/block/appendBlock
参数
{
"data": "foo**bar**{: style=\"color: var(--b3-font-color8);\"}baz",
"dataType": "markdown",
"parentID": "20220107173950-7f9m1nb"
}
dataType:待插入数据类型,值可选择 markdown 或者 domdata:待插入的数据parentID:父块的 ID,用于锚定插入位置返回值
{
"code": 0,
"msg": "",
"data": [
{
"doOperations": [
{
"action": "insert",
"data": "<div data-node-id=\"20220108003642-y2wmpcv\" data-node-index=\"1\" data-type=\"NodeParagraph\" class=\"p\"><div contenteditable=\"true\" spellcheck=\"false\">foo<strong style=\"color: var(--b3-font-color8);\">bar</strong>baz</div><div class=\"protyle-attr\" contenteditable=\"false\"></div></div>",
"id": "20220108003642-y2wmpcv",
"parentID": "20220107173950-7f9m1nb",
"previousID": "20220108003615-7rk41t1",
"retData": null
}
],
"undoOperations": null
}
]
}
action.data:新插入块生成的 DOMaction.id:新插入块的 ID/api/block/updateBlock
参数
{
"dataType": "markdown",
"data": "foobarbaz",
"id": "20211230161520-querkps"
}
dataType:待更新数据类型,值可选择 markdown 或者 domdata:待更新的数据id:待更新块的 ID返回值
{
"code": 0,
"msg": "",
"data": [
{
"doOperations": [
{
"action": "update",
"data": "<div data-node-id=\"20211230161520-querkps\" data-node-index=\"1\" data-type=\"NodeParagraph\" class=\"p\"><div contenteditable=\"true\" spellcheck=\"false\">foo<strong>bar</strong>baz</div><div class=\"protyle-attr\" contenteditable=\"false\"></div></div>",
"id": "20211230161520-querkps",
"parentID": "",
"previousID": "",
"retData": null
}
],
"undoOperations": null
}
]
}
action.data:更新块生成的 DOM/api/block/deleteBlock
参数
{
"id": "20211230161520-querkps"
}
id:待删除块的 ID返回值
{
"code": 0,
"msg": "",
"data": [
{
"doOperations": [
{
"action": "delete",
"data": null,
"id": "20211230162439-vtm09qo",
"parentID": "",
"previousID": "",
"retData": null
}
],
"undoOperations": null
}
]
}
/api/block/moveBlock
参数
{
"id": "20230406180530-3o1rqkc",
"previousID": "20230406152734-if5kyx6",
"parentID": "20230404183855-woe52ko"
}
id:待移动块 IDpreviousID:前一个块的 ID,用于锚定插入位置parentID:父块的 ID,用于锚定插入位置,previousID 和 parentID 不能同时为空,同时存在的话优先使用 previousID返回值
{
"code": 0,
"msg": "",
"data": [
{
"doOperations": [
{
"action": "move",
"data": null,
"id": "20230406180530-3o1rqkc",
"parentID": "20230404183855-woe52ko",
"previousID": "20230406152734-if5kyx6",
"nextID": "",
"retData": null,
"srcIDs": null,
"name": "",
"type": ""
}
],
"undoOperations": null
}
]
}
/api/block/foldBlock
参数
{
"id": "20231224160424-2f5680o"
}
id:待折叠块的 ID返回值
{
"code": 0,
"msg": "",
"data": null
}
/api/block/unfoldBlock
参数
{
"id": "20231224160424-2f5680o"
}
id:待展开块的 ID返回值
{
"code": 0,
"msg": "",
"data": null
}
/api/block/getBlockKramdown
参数
{
"id": "20201225220955-l154bn4"
}
id:待获取块的 ID返回值
{
"code": 0,
"msg": "",
"data": {
"id": "20201225220955-l154bn4",
"kramdown": "* {: id=\"20201225220955-2nn1mns\"}新建笔记本,在笔记本下新建文档\n {: id=\"20210131155408-3t627wc\"}\n* {: id=\"20201225220955-uwhqnug\"}在编辑器中输入 <kbd>/</kbd> 触发功能菜单\n {: id=\"20210131155408-btnfw88\"}\n* {: id=\"20201225220955-04ymi2j\"}((20200813131152-0wk5akh \"在内容块中遨游\"))、((20200822191536-rm6hwid \"窗口和页签\"))\n {: id=\"20210131155408-hh1z442\"}"
}
}
/api/block/getChildBlocks
参数
{
"id": "20230506212712-vt9ajwj"
}
id:父块 ID返回值
{
"code": 0,
"msg": "",
"data": [
{
"id": "20230512083858-mjdwkbn",
"type": "h",
"subType": "h1"
},
{
"id": "20230513213727-thswvfd",
"type": "s"
},
{
"id": "20230513213633-9lsj4ew",
"type": "l",
"subType": "u"
}
]
}
/api/block/transferBlockRef
参数
{
"fromID": "20230612160235-mv6rrh1",
"toID": "20230613093045-uwcomng",
"refIDs": ["20230613092230-cpyimmd"]
}
fromID:定义块 IDtoID:目标块 IDrefIDs:指向定义块 ID 的引用所在块 ID,可选,如果不指定,所有指向定义块 ID 的块引用 ID 都会被转移返回值
{
"code": 0,
"msg": "",
"data": null
}
/api/attr/setBlockAttrs
参数
{
"id": "20210912214605-uhi5gco",
"attrs": {
"custom-attr1": "line1\nline2"
}
}
id:块 IDattrs:块属性,自定义属性必须以 custom- 作为前缀返回值
{
"code": 0,
"msg": "",
"data": null
}
/api/attr/getBlockAttrs
参数
{
"id": "20210912214605-uhi5gco"
}
id:块 ID返回值
{
"code": 0,
"msg": "",
"data": {
"custom-attr1": "line1\nline2",
"id": "20210912214605-uhi5gco",
"title": "PDF 标注双链演示",
"type": "doc",
"updated": "20210916120715"
}
}
/api/query/sql
参数
{
"stmt": "SELECT * FROM blocks WHERE content LIKE'%content%' LIMIT 7"
}
stmt:SQL 脚本返回值
{
"code": 0,
"msg": "",
"data": [
{ "列": "值" }
]
}
注意:为保证数据安全,发布模式下禁止访问该接口。
/api/sqlite/flushTransaction
不带参
返回值
{
"code": 0,
"msg": "",
"data": null
}
/api/template/render
参数
{
"id": "20220724223548-j6g0o87",
"path": "F:\\SiYuan\\data\\templates\\foo.md"
}
id:调用渲染所在的文档 IDpath:模板文件绝对路径返回值
{
"code": 0,
"msg": "",
"data": {
"content": "<div data-node-id=\"20220729234848-dlgsah7\" data-node-index=\"1\" data-type=\"NodeParagraph\" class=\"p\" updated=\"20220729234840\"><div contenteditable=\"true\" spellcheck=\"false\">foo</div><div class=\"protyle-attr\" contenteditable=\"false\"></div></div>",
"path": "F:\\SiYuan\\data\\templates\\foo.md"
}
}
/api/template/renderSprig
参数
{
"template": "/daily note/{{now | date \"2006/01\"}}/{{now | date \"2006-01-02\"}}"
}
template:模板内容返回值
{
"code": 0,
"msg": "",
"data": "/daily note/2023/03/2023-03-24"
}
/api/file/getFile
参数
{
"path": "/data/20210808180117-6v0mkxr/20200923234011-ieuun1p.sy"
}
path:工作空间路径下的文件路径返回值
响应状态码 200: 文件内容
响应状态码 202: 异常信息
{
"code": 404,
"msg": "",
"data": null
}
code: 非零的异常值
-1: 参数解析错误403: 无访问权限 (文件不在工作空间下)404: 未找到 (文件不存在)405: 方法不被允许 (这是一个目录)500: 服务器错误 (文件查询失败 / 文件读取失败)msg: 一段描述错误的文本
/api/file/putFile
参数为 HTTP Multipart 表单
path:工作空间路径下的文件路径isDir:是否为创建文件夹,为 true 时仅创建文件夹,忽略 filemodTime:最近访问和修改时间,Unix timefile:上传的文件返回值
{
"code": 0,
"msg": "",
"data": null
}
/api/file/removeFile
参数
{
"path": "/data/20210808180117-6v0mkxr/20200923234011-ieuun1p.sy"
}
path:工作空间路径下的文件路径返回值
{
"code": 0,
"msg": "",
"data": null
}
/api/file/renameFile
参数
{
"path": "/data/assets/image-20230523085812-k3o9t32.png",
"newPath": "/data/assets/test-20230523085812-k3o9t32.png"
}
path:工作空间路径下的文件路径newPath:新的文件路径返回值
{
"code": 0,
"msg": "",
"data": null
}
/api/file/readDir
参数
{
"path": "/data/20210808180117-6v0mkxr/20200923234011-ieuun1p"
}
path:工作空间路径下的文件夹路径返回值
{
"code": 0,
"msg": "",
"data": [
{
"isDir": true,
"isSymlink": false,
"name": "20210808180303-6yi0dv5",
"updated": 1691467624
},
{
"isDir": false,
"isSymlink": false,
"name": "20210808180303-6yi0dv5.sy",
"updated": 1663298365
}
]
}
/api/export/exportMdContent
参数
{
"id": ""
}
id:要导出的文档块 ID返回值
{
"code": 0,
"msg": "",
"data": {
"hPath": "/0 请从这里开始",
"content": "## 🍫 内容块\n\n在思源中,唯一重要的核心概念是..."
}
}
hPath:人类可读的路径content:Markdown 内容/api/export/exportResources
参数
{
"paths": [
"/conf/appearance/boot",
"/conf/appearance/langs",
"/conf/appearance/emojis/conf.json",
"/conf/appearance/icons/index.html"
],
"name": "zip-file-name"
}
paths:要导出的文件或文件夹路径列表,相同名称的文件/文件夹会被覆盖name:(可选)导出的文件名,未设置时默认为 export-YYYY-MM-DD_hh-mm-ss.zip返回值
{
"code": 0,
"msg": "",
"data": {
"path": "temp/export/zip-file-name.zip"
}
}
path:创建的 *.zip 文件路径
zip-file-name.zip 中的目录结构如下所示:
zip-file-name
bootlangsconf.jsonindex.html/api/convert/pandoc
工作目录
工作空间/temp/convert/pandoc/${test} 下写入文件 将待转换文件写入该目录获取文件 获取转换后的文件内容
通过 Markdown 创建文档importStdMd 将转换后的文件夹直接导入参数
{
"dir": "test",
"args": [
"--to", "markdown_strict-raw_html",
"foo.epub",
"-o", "foo.md"
]
}
args:Pandoc 命令行参数返回值
{
"code": 0,
"msg": "",
"data": {
"path": "/temp/convert/pandoc/test"
}
}
path:工作空间下的路径/api/notification/pushMsg
参数
{
"msg": "test",
"timeout": 7000
}
timeout:消息持续显示时间,单位为毫秒。可以不传入该字段,默认为 7000 毫秒返回值
{
"code": 0,
"msg": "",
"data": {
"id": "62jtmqi"
}
}
id:消息 ID/api/notification/pushErrMsg
参数
{
"msg": "test",
"timeout": 7000
}
timeout:消息持续显示时间,单位为毫秒。可以不传入该字段,默认为 7000 毫秒返回值
{
"code": 0,
"msg": "",
"data": {
"id": "qc9znut"
}
}
id:消息 ID/api/network/forwardProxy
参数
{
"url": "https://b3log.org/siyuan/",
"method": "GET",
"timeout": 7000,
"contentType": "text/html",
"headers": [
{
"Cookie": ""
}
],
"payload": {},
"payloadEncoding": "text",
"responseEncoding": "text"
}
url:转发的 URL
method:HTTP 方法,默认为 GET
timeout:超时时间,单位为毫秒,默认为 7000 毫秒
contentType:HTTP Content-Type,默认为 application/json
headers:HTTP 请求标头
payload:HTTP 请求体,对象或者是字符串
payloadEncoding:pyaload 所使用的编码方案,默认为 text,可选值如下所示
textbase64 | base64-stdbase64-urlbase32 | base32-stdbase32-hexhexresponseEncoding:响应数据中 body 字段所使用的编码方案,默认为 text,可选值如下所示
textbase64 | base64-stdbase64-urlbase32 | base32-stdbase32-hexhex返回值
{
"code": 0,
"msg": "",
"data": {
"body": "",
"bodyEncoding": "text",
"contentType": "text/html",
"elapsed": 1976,
"headers": {
},
"status": 200,
"url": "https://b3log.org/siyuan"
}
}
bodyEncoding:body 所使用的编码方案,与请求中 responseEncoding 字段一致,默认为 text,可能的值如下所示
textbase64 | base64-stdbase64-urlbase32 | base32-stdbase32-hexhex/api/system/bootProgress
不带参
返回值
{
"code": 0,
"msg": "",
"data": {
"details": "Finishing boot...",
"progress": 100
}
}
/api/system/version
不带参
返回值
{
"code": 0,
"msg": "",
"data": "1.3.5"
}
/api/system/currentTime
不带参
返回值
{
"code": 0,
"msg": "",
"data": 1631850968131
}
data: 精度为毫秒数据库(内核中为“属性视图”)以字段(列)和条目(行)的形式存储结构化数据。每个数据库由 avID 标识,可通过一个或多个数据库块(blockID)嵌入到文档中。一个数据库可包含多个不同布局类型的视图(viewID):table(表格)、gallery(卡片)和 kanban(看板)。
字段类型(keyType)如下:
| 取值 | 说明 |
|---|---|
block | 主键(绑定的块) |
text | 文本 |
number | 数字 |
date | 日期 |
select | 单选 |
mSelect | 多选 |
url | URL |
email | 邮箱 |
phone | 电话 |
mAsset | 资源 |
template | 模板 |
created | 创建时间 |
updated | 更新时间 |
checkbox | 复选框 |
relation | 关联 |
rollup | 汇总 |
lineNumber | 行号 |
/api/av/renderAttributeView
参数
{
"id": "20240118120204-kwyzf77",
"blockID": "20240118120201-kldj15t",
"viewID": "",
"page": 1,
"pageSize": 50,
"query": "",
"groupPaging": {},
"createIfNotExist": true
}
id: 数据库 IDblockID: 嵌入该数据库的数据库块,用于解析当前视图和发布权限。渲染独立数据库时可省略viewID: 要渲染的视图。省略时使用当前视图(viewID 字段)page: 页码,从 1 开始。默认为 1pageSize: 每页条目数。-1 或省略表示使用视图默认值(50)query: 可选的主键值全文过滤关键字groupPaging: 分组(看板)视图的可选分页配置createIfNotExist: 为 true(默认)时,若数据库不存在视图则创建默认视图返回值(真实响应,表格布局,展示一行):
{
"code": 0,
"msg": "",
"data": {
"name": "API 测试",
"id": "20240118120204-kwyzf77",
"viewType": "table",
"viewID": "20240118120204-7rnmyc1",
"isMirror": false,
"views": [
{
"id": "20240118120204-7rnmyc1",
"icon": "",
"name": "表格",
"desc": "",
"hideAttrViewName": false,
"type": "table",
"pageSize": 50
}
],
"view": {
"id": "20240118120204-7rnmyc1",
"icon": "",
"name": "表格",
"desc": "",
"hideAttrViewName": false,
"filters": [],
"sorts": [],
"group": null,
"pageSize": 50,
"showIcon": true,
"wrapField": false,
"groupFolded": false,
"groupHidden": 0,
"columns": [
{
"id": "20240118120204-w6cggab",
"name": "主键",
"type": "block",
"icon": "",
"wrap": false,
"hidden": false,
"desc": "",
"calc": null,
"numberFormat": "",
"template": "",
"pin": false,
"width": ""
}
],
"rows": [
{
"id": "20240118203831-fkfvvtx",
"cells": [
{
"id": "20240118203911-xrg9obl",
"value": {
"id": "20240118203911-xrg9obl",
"keyID": "20240118120204-w6cggab",
"blockID": "20240118203831-fkfvvtx",
"type": "block",
"createdAt": 1706843791000,
"updatedAt": 1706843791000,
"block": {
"id": "20240118203831-fkfvvtx",
"content": "3",
"created": 1706843791000,
"updated": 1706843791000
}
},
"valueType": "block",
"color": "",
"bgColor": ""
}
]
}
],
"rowCount": 5
}
}
}
data.view: 渲染后的视图实例。结构随 viewType 而变——table 返回 columns/rows/rowCount,gallery 返回 columns/rows,kanban 返回 columns/groups(每个分组本身也是视图实例,含 groupKey/groupValue)。view 还包含 filters/sorts/group/showIcon/wrapField/groupFolded/groupHidden。注意:启用的过滤/分组可能使 rows 为空,即使 rowCount > 0data.view.columns[]: 每列含 id/name/type/icon/wrap/hidden/desc/calc/numberFormat/template/pin/width;select/mSelect 列还额外包含 optionsdata.view.rows[].id: 行 ID(一个条目 ID)。对于绑定行,它等于绑定的块 ID;对于独立行,它是生成的条目 ID,与任何块都不同data.view.rows[].cells[].value: 一个 Value 对象——所有 value 形态见 设置单元格值。createdAt/updatedAt 为 int64 毫秒时间戳data.views: 所有视图的元数据(不含行数据)data.isMirror: 当数据库块为数据库的镜像(只读副本)时为 true/api/av/getAttributeView
参数
{
"id": "20240118120204-kwyzf77"
}
id: 数据库 ID返回值(真实响应,已裁剪——keyValues/views 数组做了截断):
{
"code": 0,
"msg": "",
"data": {
"av": {
"spec": 4,
"id": "20240118120204-kwyzf77",
"name": "API 测试",
"keyValues": [
{
"key": {
"id": "20240118120204-w6cggab",
"name": "主键",
"type": "block",
"icon": "",
"desc": "",
"numberFormat": "",
"template": ""
},
"values": [
{
"id": "20240118203911-xrg9obl",
"keyID": "20240118120204-w6cggab",
"blockID": "20240118203831-fkfvvtx",
"type": "block",
"createdAt": 1706843791000,
"updatedAt": 1706843791000,
"block": {
"id": "20240118203831-fkfvvtx",
"content": "3",
"created": 1706843791000,
"updated": 1706843791000
}
}
]
}
],
"keyIDs": null,
"viewID": "20240118120204-7rnmyc1",
"views": [
{
"id": "20240118120204-7rnmyc1",
"icon": "",
"name": "表格",
"hideAttrViewName": false,
"desc": "",
"pageSize": 50,
"type": "table",
"table": {
"spec": 0,
"id": "20240118120204-grokgmm",
"showIcon": true,
"wrapField": false,
"columns": [
{
"id": "20240118120204-w6cggab",
"wrap": false,
"hidden": false,
"pin": false,
"width": ""
}
],
"rowIds": null
},
"itemIds": ["20240118203818-ct041hj", "20240118203855-sqzbja0", "20240118203831-fkfvvtx", "20240118203842-kc31ovy", "20240531235026-uiap07y"],
"groupCreated": 0,
"groupItemIds": null,
"groupFolded": false,
"groupHidden": 0,
"groupSort": 0
}
]
}
}
}
data.av: 完整的 AttributeView 定义——字段(keyValues)、字段顺序(keyIDs,可能为 null)、当前视图(viewID)、以及所有视图的原始布局配置(table/gallery/kanban)和条目顺序(itemIds)。返回原始定义(不含渲染后的行或分页);需要计算后的行数据请使用 渲染/api/av/getAttributeViewPrimaryKeyValues
参数
{
"id": "20240118120204-kwyzf77",
"keyword": "",
"page": 1,
"pageSize": 16
}
id: 数据库 IDkeyword: 可选的主键文本子串过滤(不区分大小写)page: 页码,从 1 开始。默认为 1pageSize: 每页条目数。-1 或省略表示 16。结果按 block.updated 倒序排序返回值(真实响应,展示一个值):
{
"code": 0,
"msg": "",
"data": {
"name": "API 测试",
"blockIDs": ["20240118120201-kldj15t"],
"rows": {
"key": {
"id": "20240118120204-w6cggab",
"name": "主键",
"type": "block",
"icon": "",
"desc": "",
"numberFormat": "",
"template": ""
},
"values": [
{
"id": "20240118203911-xrg9obl",
"keyID": "20240118120204-w6cggab",
"blockID": "20240118203831-fkfvvtx",
"type": "block",
"createdAt": 1706843791000,
"updatedAt": 1706843791000,
"block": {
"id": "20240118203831-fkfvvtx",
"content": "3",
"created": 1706843791000,
"updated": 1706843791000
}
}
]
}
}
}
data.rows: 一个 KeyValues 对象,包含主键(block)字段及其分页后的值data.blockIDs: 引用该数据库的所有数据库块(镜像)ID/api/av/searchAttributeView
参数
{
"keyword": "API",
"excludes": []
}
keyword: 搜索关键字(匹配数据库名称)excludes: 可选,需从结果中排除的数据库 ID 列表返回值(真实响应):
{
"code": 0,
"msg": "",
"data": {
"results": [
{
"avID": "20240118120204-kwyzf77",
"avName": "API 测试",
"viewName": "",
"viewID": "",
"viewLayout": "",
"blockID": "20240118120201-kldj15t",
"hPath": "正在跟进的问题/数据库/API",
"children": [
{
"avID": "20240118120204-kwyzf77",
"avName": "API 测试",
"viewName": "表格",
"viewID": "20240118120204-7rnmyc1",
"viewLayout": "table",
"blockID": "20240118120201-kldj15t",
"hPath": "正在跟进的问题/数据库/API"
}
]
}
]
}
}
data.results[]: 每个顶层结果按 avID 聚合一个数据库;其 children[] 列出该数据库的各个视图(viewName/viewID/viewLayout)更新单个单元格(某一行的某个字段)。这是单元格值的主要写入接口。请求中的 value 是一个部分 Value 对象,其结构取决于字段的 keyType。常见 value 结构如下:
keyType | value 结构 |
|---|---|
block | {"block": {"content": "第一行", "id": "<绑定块ID>"}, "isDetached": false} |
text | {"text": {"content": "文本"}} |
number | {"number": {"content": 42, "isNotEmpty": true}}(清空用 {"isNotEmpty": false}) |
date | {"date": {"content": 1676042451000, "isNotEmpty": true}}(毫秒时间戳) |
select | {"mSelect": [{"content": "已完成", "color": "1"}]}(至多一个选项) |
mSelect | {"mSelect": [{"content": "A", "color": "1"}, {"content": "B", "color": "2"}]} |
url | {"url": {"content": "https://siyuan.com"}} |
email | {"email": {"content": "[email protected]"}} |
phone | {"phone": {"content": "1234567890"}} |
checkbox | {"checkbox": {"checked": true}} |
⚠️
itemID是行 ID(渲染 返回的rows[].id)。对于绑定行,行 ID 等于绑定的块 ID;对于独立行,它是生成的条目 ID。传入错误的 ID 会把值存为孤儿数据,不会出现在渲染后的单元格中。
/api/av/setAttributeViewBlockAttr
参数
{
"avID": "20240118120204-kwyzf77",
"keyID": "20240531232156-ahsyx8l",
"itemID": "20240118203831-fkfvvtx",
"value": {
"type": "number",
"number": {
"content": 42,
"isNotEmpty": true
}
}
}
avID: 数据库 IDkeyID: 字段 ID(被更新的列)itemID: 行 ID(渲染 返回的 rows[].id)。旧参数 rowID 已弃用,将于 2026-12-01 后删除,请改用 itemIDvalue: 部分 Value 对象(见上表)。未知或不支持的键会被忽略返回值(真实响应,数字值):
{
"code": 0,
"msg": "",
"data": {
"value": {
"id": "20240531235048-4zisj1p",
"keyID": "20240531232156-ahsyx8l",
"blockID": "20240118203831-fkfvvtx",
"type": "number",
"createdAt": 1717170648596,
"updatedAt": 1781610266432,
"number": {
"content": 42,
"isNotEmpty": true,
"format": "",
"formattedContent": "42"
}
}
}
}
data.value: 更新后规范化完成的值(含 number.formattedContent 等计算字段)。请使用该返回值刷新 UI,无需重新发送请求体添加一个或多个条目(行)。每个来源既可绑定已有块(isDetached: false),也可创建仅存在于视图内的独立行(isDetached: true)。
/api/av/addAttributeViewBlocks
参数
{
"avID": "20240118120204-kwyzf77",
"blockID": "20240118120201-kldj15t",
"viewID": "",
"groupID": "",
"previousID": "",
"srcs": [
{
"id": "20240118120201-kldj15t",
"isDetached": false,
"content": "新行"
}
],
"ignoreDefaultFill": false
}
avID: 数据库 IDblockID: 拥有该数据库的数据库块(用于解析目标视图/分组)viewID: 目标视图。省略时使用当前视图groupID: 看板视图的目标分组 ID。表格/卡片视图可省略previousID: 在此条目 ID 之后插入。为空表示追加到末尾srcs[].id: 绑定块时(isDetached: false)为要绑定的块 ID,需符合节点 ID 格式srcs[].isDetached: true 创建独立行;false 绑定已有块srcs[].content: 主键的显示文本(isDetached: true 时使用,或覆盖绑定块的内容)srcs[].itemID: 可选,显式指定条目 ID。省略时自动生成ignoreDefaultFill: 为 true 时,跳过向过滤/分组字段自动填充默认值返回值
{
"code": 0,
"msg": "",
"data": null
}
null;成功后请调用 渲染 获取更新后的行(含更新单元格所需的新行 ID)移除一个或多个条目(行)。独立行会被删除;绑定块会解绑(不会删除底层文档块)。
/api/av/removeAttributeViewBlocks
参数
{
"avID": "20240118120204-kwyzf77",
"srcIDs": ["20240118203831-fkfvvtx"]
}
avID: 数据库 IDsrcIDs: 要移除的行 ID(渲染 返回的 rows[].id)列表返回值
{
"code": 0,
"msg": "",
"data": null
}
在 table(表格)、gallery(卡片)和 kanban(看板)之间切换当前视图的布局类型。成功时服务端会重新渲染并返回视图(结构与 渲染 相同)。
/api/av/changeAttrViewLayout
参数
{
"avID": "20240118120204-kwyzf77",
"blockID": "20240118120201-kldj15t",
"layoutType": "kanban"
}
avID: 数据库 IDblockID: 拥有该视图的数据库块layoutType: 目标布局——table、gallery、kanban 之一返回值:与 渲染 返回结构相同。当切换到 kanban 且已配置分组时,data.view 携带 groups[] 数组;每个分组是视图实例,含 groupKey、groupValue,以及看板特有字段(coverFrom、cardAspectRatio、cardSize、fitImage、displayFieldName、fillColBackgroundColor、fields)
为看板视图设置或清除分组规则。当 group.field 为空时移除分组。成功时服务端会重新渲染并返回视图。
/api/av/setAttrViewGroup
参数
{
"avID": "20240118120204-kwyzf77",
"blockID": "20240118120201-kldj15t",
"group": {
"field": "20240118203822-io6ofxb",
"method": 0,
"order": 0,
"hideEmpty": false
}
}
avID: 数据库 IDblockID: 拥有该视图的数据库块group: 分组规则group.field: 用于分组的字段(列)ID。为空字符串表示移除分组group.method: 分组方式——0 按值、1 按数字范围、2 按相对日期、3 按天、4 按周、5 按月、6 按年group.range: 可选。method 为 1(数字范围)时必填:{ "numStart": 0, "numEnd": 100, "numStep": 10 }group.order: 分组排序——0 升序、1 降序、2 手动、3 按选项顺序group.hideEmpty: 是否隐藏空分组返回值:与 渲染 返回结构相同
返回绑定到数据库块的视图当前的过滤和排序规则。
/api/av/getAttributeViewFilterSort
参数
{
"id": "20240118120204-kwyzf77",
"blockID": "20240118120201-kldj15t"
}
id: 数据库 IDblockID: 拥有该视图的数据库块返回值(真实响应,未配置过滤/排序):
{
"code": 0,
"msg": "",
"data": {
"filters": [],
"sorts": []
}
}
配置后(真实抓取的响应),过滤与排序形如:
{
"code": 0,
"msg": "",
"data": {
"filters": [
{
"column": "20240118203822-io6ofxb",
"operator": "=",
"value": {
"type": "select",
"mSelect": [
{ "content": "已完成", "color": "1" }
]
}
}
],
"sorts": [
{
"column": "20240118120204-w6cggab",
"order": "DESC"
}
]
}
}
data.filters: ViewFilter 数组。顶层为单个根组节点 { "combination": "and"|"or", "filters": [...] },数组元素既可以是叶子过滤条件,也可以是嵌套的分组节点,支持递归的且/或组合data.filters[].column: 过滤规则作用的字段(列)ID(仅叶子节点)data.filters[].operator: 过滤操作符(见下方操作符表;仅叶子节点)data.filters[].value: 过滤值,一个 Value 对象(结构见 设置单元格值;仅叶子节点)data.filters[].relativeDate: 可选,日期过滤使用的相对时间描述({ "count": 7, "unit": 0, "direction": -1 };unit:0 天、1 周、2 月、3 年;direction:-1 前、0 当前、1 后;仅叶子节点)data.filters[].combination: 分组组合方式,"and" 或 "or"(仅分组节点)data.filters[].filters: 子过滤节点,递归的 ViewFilter(仅分组节点)data.sorts: ViewSort 数组data.sorts[].column: 排序规则作用的字段(列)IDdata.sorts[].order: ASC 或 DESC过滤操作符:
| 取值 | 说明 |
|---|---|
= | 等于 |
!= | 不等于 |
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
Contains | 包含 |
Does not contains | 不包含 |
Is empty | 为空 |
Is not empty | 不为空 |
Starts with | 以...开头 |
Ends with | 以...结尾 |
Is between | 介于之间 |
Is true | 为真(复选框) |
Is false | 为假(复选框) |
/api/av/setAttrViewFilters
参数
{
"avID": "20240118120204-kwyzf77",
"blockID": "20240118120201-kldj15t",
"data": [
{
"column": "20240118203822-io6ofxb",
"operator": "=",
"value": {
"type": "select",
"mSelect": [
{ "content": "已完成", "color": "1" }
]
}
}
]
}
avID: 数据库 IDblockID: 拥有该视图的数据库块data: 完整的 ViewFilter 新数组,将整体替换视图现有过滤规则(结构见 获取过滤与排序)。传 [] 可清空全部过滤规则。顶层为单个根组节点 { "combination": "and"|"or", "filters": [...] },数组元素既可以是叶子过滤条件,也可以是嵌套的分组节点,支持递归的且/或组合返回值
{
"code": 0,
"msg": "",
"data": null
}
/api/av/setAttrViewSorts
参数
{
"avID": "20240118120204-kwyzf77",
"blockID": "20240118120201-kldj15t",
"data": [
{
"column": "20240118120204-w6cggab",
"order": "DESC"
}
]
}
avID: 数据库 IDblockID: 拥有该视图的数据库块data: 完整的 ViewSort 新数组,将整体替换视图现有排序规则(结构见 获取过滤与排序)。传 [] 可清空全部排序规则返回值
{
"code": 0,
"msg": "",
"data": null
}
添加新字段(列)。该字段会被添加到每个视图(表格/卡片/看板)中 previousKeyID 之后的位置(为空时使用默认位置)。
/api/av/addAttributeViewKey
参数
{
"avID": "20240118120204-kwyzf77",
"keyID": "20240118120204-7k9wzbp",
"keyName": "状态",
"keyType": "select",
"keyIcon": "",
"previousKeyID": "20240118120204-w6cggab"
}
avID: 数据库 IDkeyID: 新字段 ID。需为 Lute.NewNodeID() 生成的合法节点 ID(14 位时间戳 + - + 7 位随机字母数字,如 20240118120204-abc1234)keyName: 字段显示名keyType: 字段类型——text、number、date、select、mSelect、url、email、phone、mAsset、template、created、updated、checkbox、relation、rollup、lineNumber 之一。block(主键)不能通过该接口添加keyIcon: 可选字段图标(emoji 或空字符串)previousKeyID: 在此字段 ID 之后插入新列。为空字符串时使用布局默认位置(表格插入到首位,卡片/看板插入到末尾)返回值
{
"code": 0,
"msg": "",
"data": null
}
移除字段(列)及其所有值。若 keyID 不存在,返回 code: -1、msg: "key not found"。
/api/av/removeAttributeViewKey
参数
{
"avID": "20240118120204-kwyzf77",
"keyID": "20240118120204-7k9wzbp",
"removeRelationDest": false
}
avID: 数据库 IDkeyID: 要移除的字段 IDremoveRelationDest: 为 true 且字段为关联类型时,同时移除目标数据库中对应的反向关联字段。默认为 false返回值
{
"code": 0,
"msg": "",
"data": null
}
全局重排字段(列)——将 keyID 移动到字段顺序中 previousKeyID 之后的位置,影响所有视图。
/api/av/sortAttributeViewKey
参数
{
"avID": "20240118120204-kwyzf77",
"keyID": "20240118203822-io6ofxb",
"previousKeyID": "20240118120204-w6cggab"
}
avID: 数据库 IDkeyID: 要移动的字段 IDpreviousKeyID: keyID 应置于其后的字段 ID。为空字符串表示移动到首位返回值
{
"code": 0,
"msg": "",
"data": null
}
在单个视图的布局内重排列(例如表格的列顺序),不改变全局字段顺序。
/api/av/sortAttributeViewViewKey
参数
{
"avID": "20240118120204-kwyzf77",
"viewID": "20240118120204-7rnmyc1",
"keyID": "20240118203822-io6ofxb",
"previousKeyID": "20240118120204-w6cggab"
}
avID: 数据库 IDviewID: 目标视图。为空时使用当前视图keyID: 要移动的字段 IDpreviousKeyID: keyID 应置于其后的字段 ID。为空字符串表示移动到首位返回值
{
"code": 0,
"msg": "",
"data": null
}