[js] 简单查询,让数据从此不再难查,支持显示多字段多视图

简介

功能和特点:

  1. 解决自带 SQL 查询不支持显示多字段的问题
  2. 可渲染不同的视图,如列表,表格,chart,mermaid 等
  3. 可以生成不同的视图,如列表,表格,数据库,chart,mermaid 等,和渲染视图的区别是生成视图指在 SQL 嵌入块的上面或下面插入块,而渲染视图则是直接在嵌入块上渲染
  4. 简单易用,功能丰富,自由度高

快速入门

为什么叫简单查询?

因为它简单,简单到只有一个 query()函数,这个函数是全局函数,任何地方都可以调用。

比如在 SQL 查询框中输入以下 SQL 即可(编辑器输入{{}}即可打开 SQL 查询输入框)

//!js
return query(`select * from blocks limit 3`, item);

查询结果如下

image.png

纳尼?怎么这么丑。

没错,默认显示全部字段的原始数据,和数据中的结果完全一致,你可以当做数据库查询来使用。

但这个可能不是你想要的结果,怎么查询指定的字段呢?

可以这样

//!js
return query(`select id,content,created from blocks limit 3`, item);

结果

image.png

不错,但这还不符合预期,如何表头显示中文?内容加链接文?时间格式化文?能否排序?能否指定字段加颜色?……

可以,这样

//!js
return query(`
    select
    '-' as 序号__no_w80_0,
    content as 内容__ref_1,
    hpath as '路径__color:red_2',
    created as 创建时间__datetime_3
    from blocks
    where type = 'd'
    order by created desc
    limit 3
`, item);

结果

image.png

没错,这个语法和 query 挂件类似,但只是类似,不通用。

这里简单说明下

'-' as 序号__no_w80_0 添加序号,增加一个字段 '-' 即可(这是 SQL 语法),然后后面的 as 里要添加 no 关键词,no 标记这是一个序号字段,w80 意思是字段宽度显示 80px,w 也可以写成 width,80 也可以写成 80px,80em 等,_0 是排序,代表这个排到第一位,数字可以是任意数字,数字越小越靠前,也可以不写排序,不写排序的会排序到带有排序的字段后面

content as 内容__ref_1 ref 代表把内容转为引用链接,也可以用 link 代表转为链接
hpath as '路径__color:red_2' color 代表给文字添加颜色,冒号后面是具体颜色,注意,当使用不是下划线的符号时,as 后面的字段名需要添加单引号(这是 SQL 语法)
created as 创建时间__datetime_3 datetime 代表把字段格式化为日期时间格式,还有 date 格式化为日期,time 格式化为时间,仅对日期和时间字段有效

注意,字段名和标记符之间用双下划线分割,标记符之间用单下划线分割。

sql 字段常用标记符

类似的标记符还有

// 常用字段后缀说明:
// hide 该字段不会显示,简写hd
// datetime 格式日期和时间,简写dt
// date 格式化日期,简写d
// time 格式化时间,简写t
// link 转换为链接,必须查询id字段
// ref 转换为引用,必须查询id字段
// markdown 渲染Markdown代码,简写md
// tag 渲染为tag标签
// left 左对齐,简写l
// right 右对齐,简写r
// top 垂直顶部对齐
// bottom 垂直底部对齐,简写btm
// u 添加下划线
// i 添加斜体
// b 添加加粗
// s 添加删除线
// color:颜色值 设置文字颜色,简写c,比如,c:red c:#ccc等,注意,使用这个后缀字段需要加单引号,比如,content as '内容__ref_c:red_1'
// bg:颜色值 设置背景颜色,比如,bg:red bg:#ccc等,注意,使用这个后缀字段需要加单引号,比如,content as '内容__ref_bg:red_1'
// width40 设置字段宽度,简写w40,40代表40px
// height100 设置行高度,简写h100,100代表100px
// rheight200 设置行高,简写rh200,200代表200px
// hheight200 设置标题行高,简写hh200,200代表200px
// id 标记为id字段
// no 标记为序号字段
// type 显示文档类型文本
// subtype 显示子类型文本,简写stype
// ml5 左侧外边距宽度,这里的5可以是任意数字,第二个字幕是L的小写字母
// mr 右侧外边距宽度,这里的5可以是任意数字
// pl 左侧内边距宽度,这里的5可以是任意数字,第二个字幕是L的小写字母
// pr 右侧内边距宽度,这里的5可以是任意数字
// algin 左中右水平对齐,比如 align:left、align:center、align:right,注意,使用这个后缀字段需要加单引号
// valign 垂直对齐,比如 valign:top、valign:center、valign:bottom,注意,使用这个后缀字段需要加单引号
// halign 表头水平对齐,比如 halign:left、halign:center、halign:right,注意,使用这个后缀字段需要加单引号
// hvalign 表头垂直对齐,比如 hvalign:top、hvalign:center、hvalign:bottom,注意,使用这个后缀字段需要加单引号
// pin:left100:bg#fff:zindex1 列固定,这里pin是标记固定关键词,left代表左侧固定,100代表距离左侧的距离,默认是0,bg代表背景色,#fff是背景颜色,zindex或z代表层级,默认是1,除了pin,其他都是可选,注意,使用这个后缀字段需要加单引号

不错,不错,我想调整表格样式可以吗?

可以,比如

//!js
return query(`
    select
    '-' as 序号__no_w80_0,
    content as 内容__ref_1,
    hpath as '路径__color:red_2',
    created as 创建时间__datetime_3
    from blocks
    where type = 'd'
    order by created desc
    limit 3
`, item, '', '', '',
{
   showEvenOdd: true, // 显示斑马纹
   tableBorderColor: 'lightblue', // 边框颜色
   onlyShowBottomBorder: true, // 只显示底部边框
});

结果

image.png

表格样式常用选项

类似的选项还有

{
    showHeader: true, // 显示表头
    showEvenOdd: false, // 显示斑马纹
    oddColor: '', // 奇数行背景色,从表头开始算起
    evenColor: '', // 偶数行背景色,从表头开始算起
    tableBorder: true, // 显示表格边框
    tableBorderColor: '', // 边框颜色
    tableBorderStyle: '', // 边框样式
    onlyShowBottomBorder: false, // 只显示底部边框
    tableMaxWidth: '', // 表格最大宽度
    tableMaxHeight: '', // 表格最大高度
    tableAlign: '', // 表格对齐
    tableStyle: '', // 表格样式
    cellWidth: '',  // 单元格宽度
    cellHeight: '', // 单元格高度
    cellAlign: '', // 单元格对齐
    cellVAlign: '', // 单元格垂直对齐
    cellStyle: '', // 单元格样式
    headerBackgroundColor:'', // 表头背景色
    headerSticky: false, // 表头是否固定,仅当表格固定高度或tableMaxHeight设置后生效
    headHeight: '', // 表头高度
    headAlign: '', // 表头对齐
    headVAlign: '', // 表头垂直对齐
    headerStyle: '', // 表头样式
    queryLogo: '', // 简单查询logo,可针对不同的查询设置不同的logo
    queryTitle: '', // 简单查询标题,可针对不同的查询设置不同的标题
    queryDesc: '', // 简单查询描述,可针对不同的查询设置不同的描述
}

这些语法记不住,需要查询语法吗?哪里有帮助?

一般不需要特殊记忆,因为 SQL 查询输入框上面增加了两个按钮,可以快速创建 SQL,并含有详细注释。

image.png

当然,本文档也会列出详细参数和说明及陆续推出详细使用教程和示例。

有了以上知识,相信基本上能满足萌新们的日常需求了。


但,如果你是资深用户或者开发者,还可以用更复杂的语法格式。

比如

//!js
return query(
    `select * from blocks where type='d' order by created desc limit 3;`,
    // item, 固定不变,❗️勿动,代表本嵌入块对象
    item,
    '序号,内容,文档类型,路径,创建时间,更新时间',
    ({ row, index, data, options, toLink, toRef, formatDateTime, getTypeText, ...args }) => {
        row.序号 = index + 1;
        row.序号_width = '80px';
        row.序号_pin = '';
        row.内容 = toRef(row.content, row.id);
        row.文档类型 = getTypeText(row.type);
        row.文档类型_color = 'red';
        row.文档类型_bgColor = '#F6E1C0';
        row.路径 = row.hpath;
        row.路径_style = 'background-color:lightyellow';
        row.创建时间 = formatDateTime(row.created);
        row.更新时间 = formatDateTime(row.updated);
    }
);

结果

回调函数字段说明和特殊字段说明

简单说明下

字段说明

左侧的字段对应排序中指定的字段,可随意命名

右侧字段对应从数据库查询出来的字段,即数据库字段名或 as 后面的自定义字段名

如图所示

image.png

函数的调用形式是

return query(sql, item, fields, beforeRender, afterRender, options);

sql 就是 sql 语法了,支持普通的查询和上述的类 query 挂件语法

item,这个代表本嵌入块,必填,固定不变,无需修改

fields,是要显示的字段列表,支持字符串用英文逗号隔开和数组,可用于过滤和排序,如果不为空,则会按照这个字段列表显示指定的字段和指定的顺序

beforeRender,是视图输出前的数据格式化回调函数,可以在这里对数据处理后再输出,函数的参数是一个对象,可以用解构语法{xxx, yyy, zzz, ...args}进行解构。常用的函数有 row, index, data, options, toLink, toRef, formatDateTime, ......,如果想省事,也可以用...args 存储剩余参数。然后就可以直接 args.xxx()调用了或用 console.log(args)打印所有剩余参数。

【扩展】想要查看所有函数也可以在控制台用函数 await query(':funcs'); 打印查看。没错,这里 query 函数摇身变成工具了,也可以直接调用某函数,比如 (await query(':fetchSyncPost'))(url, {}); 或者用 query 直接返回查询结果,比如 const data = await query('sql 语句'); 这里当不传 item 参数时则直接返回查询结果,利用这一特性,你也可以直接对多个查询结果组装后再返回。

这里的数据字段可以添加一些特殊字段,比如 xxx_width, xxx_height, xxx_color, xxx_bgColor, xxx_pin, xxx_style, ......

分别代表

_width 字段宽度

_height 字段高度

_color 字段颜色

_bgColor 字段背景色

_pin 字段列固定,这个字段中还可以添加具体样式,比如 row.序号_pin = 'left:0;background-color:#fff;z-index:1'; 意思是固定到左侧,距左侧距离 0,背景白色显示,垂直层级 1。

这个功能也可以通过 SQL 中的 as 实现,比如 select '-' as '序号__pin:left:bg#fff:z1'

_style 字段的样式

常见的还有

_head_style 增加标头样式

_row_style 增加行样式,除标头外

_align 字段水平对齐方式

_halign 表头字段水平对齐方式

_valign 字段垂直对齐方式

_hvalign 表头字段垂直对齐方式

afterRender,是视图渲染后进一步处理的回调函数,通常是调整样式,添加监听啥的,一般较少用到。

options,和上述中的表格样式调整选项完全一样,用了对整体进行样式调整。

好了,下面给出一个完整格式

//!js
return query(
    // sql查询语句,注意,如果查询数量过多,可能会造成查询卡顿,建议用limit加以限制
    `select * from blocks where type='d' order by created desc limit 3;`,
    // item, 固定不变,❗️勿动,代表本嵌入块对象
    item,
    // 字段列表,可以用于过滤和排序,格式'id,content,created'或数组
    '序号,内容,文档类型,路径,创建时间,更新时间',
    // 嵌入块渲染前数据处理,row代表一行数据,data代表全部数据, index是行索引,从0开始,options是全局选项,这里可以临时更改,如果用return返回,则停止循环并立即返回
    ({ row, index, data, options, toLink, toRef, formatDate, formatDateTime, renderMarkdown, getTypeText, renderListView, renderChartView, renderViewByMarkdown, ...args }) => {
        // 可以打印这些参数查看参数的值,args列出所有剩余的可用对象或函数
        // console.log(row, index, data, args);
        // 这里编写您的主要处理逻辑
        row.序号 = index + 1;
        row.序号_width = '80px';
        row.内容 = toRef(row.content, row.id);
        row.文档类型 = getTypeText(row.type);
        row.路径 = row.hpath;
        row.创建时间 = formatDateTime(row.created);
        row.更新时间 = formatDateTime(row.updated);
    },
    // 嵌入块渲染后执行,options是选项,data是上次查询的数据,此时,这些参数只读,再更改无法使已渲染的结果生效,除非你手动修改渲染结果
    ({ options, data }) => {
        // 可以打印这些参数查看结果
        // console.log(options, data);
        // 这里编写您的主要处理逻辑
  
    },
    // 全局选项配置,可以调整渲染结果的样式等
    {
        showHeader: true, // 显示表头
        showEvenOdd: false, // 显示斑马纹
        oddColor: '', // 奇数行背景色,从表头开始算起
        evenColor: '', // 偶数行背景色,从表头开始算起
        tableBorder: true, // 显示表格边框
        tableBorderColor: '', // 边框颜色
        tableBorderStyle: '', // 边框样式
        onlyShowBottomBorder: false, // 只显示底部边框
        tableMaxWidth: '', // 表格最大宽度
        tableMaxHeight: '', // 表格最大高度
        tableAlign: '', // 表格对齐
        tableStyle: '', // 表格样式
        cellWidth: '',  // 单元格宽度
        cellHeight: '', // 单元格高度
        cellAlign: '', // 单元格对齐
        cellVAlign: '', // 单元格垂直对齐
        cellStyle: '', // 单元格样式
        headerBackgroundColor:'', // 表头背景色
        headerSticky: false, // 表头是否固定,仅当表格固定高度或tableMaxHeight设置后生效
        headHeight: '', // 表头高度
        headAlign: '', // 表头对齐
        headVAlign: '', // 表头垂直对齐
        headerStyle: '', // 表头样式
        queryLogo: '', // 简单查询logo,可针对不同的查询设置不同的logo
        queryTitle: '', // 简单查询标题,可针对不同的查询设置不同的标题
        queryDesc: '', // 简单查询描述,可针对不同的查询设置不同的描述
    }
);

结果

image.png

注意,如果查询数量过多,可能会造成查询卡顿,建议用 limit 加以限制。

另外,复杂代码和简单代码也可以混用。

回调函数中常用函数说明

1. toRef(content, id)

  • 功能: 将内容转换为思源笔记的块引用格式。
  • 参数:
    • content: 要引用的内容(字符串)。
    • id: 块的唯一标识符(字符串)。
  • 返回值: 返回一个块引用格式的 HTML 字符串。

2. toLink(content, url)

  • 功能: 将内容转换为链接格式。
  • 参数:
    • content: 链接的显示文本(字符串)。
    • url: 链接的目标地址(字符串)。
  • 返回值: 返回一个链接格式的 HTML 字符串。

3. toTag(content)

  • 功能: 将内容转换为思源笔记的标签格式。
  • 参数:
    • content: 标签内容(字符串)。
  • 返回值: 返回一个标签格式的 HTML 字符串。

4. toMdLink(content, url, title)

  • 功能: 将内容转换为 Markdown 链接格式。
  • 参数:
    • content: 链接的显示文本(字符串)。
    • url: 链接的目标地址(字符串)。
    • title: 链接的标题(可选,字符串)。
  • 返回值: 返回一个 Markdown 链接格式的字符串。

5. toMdRef(content, id)

  • 功能: 将内容转换为思源笔记的块引用 Markdown 格式。
  • 参数:
    • content: 引用的内容(字符串)。
    • id: 块的唯一标识符(字符串)。
  • 返回值: 返回一个块引用 Markdown 格式的字符串。

6. formatDateTime(content, formatStr)

  • 功能: 格式化日期时间字符串。
  • 参数:
    • content: 原始日期时间字符串(格式为 YYYYMMDDHHmmss)。
    • formatStr: 格式化字符串(默认值为 '$1-$2-$3 $4:$5:$6')。
  • 返回值: 返回格式化后的日期时间字符串。

7. formatDate(content, formatStr)

  • 功能: 格式化日期字符串。
  • 参数:
    • content: 原始日期字符串(格式为 YYYYMMDDHHmmss)。
    • formatStr: 格式化字符串(默认值为 '$1-$2-$3')。
  • 返回值: 返回格式化后的日期字符串。

8. formatTime(content, formatStr)

  • 功能: 格式化时间字符串。
  • 参数:
    • content: 原始时间字符串(格式为 YYYYMMDDHHmmss)。
    • formatStr: 格式化字符串(默认值为 '$4:$5:$6')。
  • 返回值: 返回格式化后的时间字符串。

9. renderMarkdown(markdown)

  • 功能: 渲染 Markdown 内容为 HTML。
  • 参数:
    • markdown: Markdown 格式的字符串。
  • 返回值: 返回渲染后的 HTML 字符串。

10. addColor(content, color)

  • 功能: 为内容添加颜色样式。
  • 参数:
    • content: 要添加颜色的内容(字符串)。
    • color: 颜色值(字符串,如 'red''#ccc')。
  • 返回值: 返回带有颜色样式的 HTML 字符串。

11. addBgColor(content, color)

  • 功能: 为内容添加背景颜色样式。
  • 参数:
    • content: 要添加背景颜色的内容(字符串)。
    • color: 背景颜色值(字符串,如 'red''#ccc')。
  • 返回值: 返回带有背景颜色样式的 HTML 字符串。

更多函数说明

展开查看👇

12. setColor(row, colName, value)

  • 功能: 设置表格单元格的文字颜色。
  • 参数:
    • row: 表格行对象。
    • colName: 列名(字符串)。
    • value: 颜色值(字符串,如 'red''#ccc')。
  • 返回值: 无。

13. setBgColor(row, colName, value)

  • 功能: 设置表格单元格的背景颜色。
  • 参数:
    • row: 表格行对象。
    • colName: 列名(字符串)。
    • value: 背景颜色值(字符串,如 'red''#ccc')。
  • 返回值: 无。

14. toMdList(list)

  • 功能: 将数组转换为 Markdown 列表格式。
  • 参数:
    • list: 数组(包含字符串或对象)。
  • 返回值: 返回 Markdown 列表格式的字符串。

15. toMdTask(list)

  • 功能: 将数组转换为 Markdown 任务列表格式。
  • 参数:
    • list: 数组(包含字符串或对象)。
  • 返回值: 返回 Markdown 任务列表格式的字符串。

16. getTitleImage(ial, maxWidth, maxHeight)

  • 功能: 获取文档封面图片。
  • 参数:
    • ial: 文档的 IAL 字符串。
    • maxWidth: 图片最大宽度(字符串,如 '100px')。
    • maxHeight: 图片最大高度(字符串,如 '100px')。
  • 返回值: 返回图片的 HTML 字符串。

17. getTypeText(type)

  • 功能: 获取块类型的文本描述。
  • 参数:
    • type: 块类型(字符串,如 'd' 表示文档块)。
  • 返回值: 返回块类型的文本描述(字符串)。

18. getSubTypeText(subtype)

  • 功能: 获取块子类型的文本描述。
  • 参数:
    • subtype: 块子类型(字符串,如 'h1' 表示一级标题)。
  • 返回值: 返回块子类型的文本描述(字符串)。

19. addNo(row, colName, value)

  • 功能: 为表格行添加序号。
  • 参数:
    • row: 表格行对象。
    • colName: 列名(字符串)。
    • value: 序号值(数字或字符串)。
  • 返回值: 无。

20. addStyle(content, style)

  • 功能: 为内容添加自定义样式。
  • 参数:
    • content: 要添加样式的内容(字符串)。
    • style: 样式字符串(如 'color: red; font-size: 12px;')。
  • 返回值: 返回带有自定义样式的 HTML 字符串。

21. alignLeft(row, colName)

  • 功能: 设置表格列内容左对齐。
  • 参数:
    • row: 表格行对象。
    • colName: 列名(字符串)。
  • 返回值: 无。

22. alignRight(row, colName)

  • 功能: 设置表格列内容右对齐。
  • 参数:
    • row: 表格行对象。
    • colName: 列名(字符串)。
  • 返回值: 无。

23. setOption(options, key, value, index)

  • 功能: 设置全局选项。
  • 参数:
    • options: 全局选项对象。
    • key: 选项键名(字符串)。
    • value: 选项值。
    • index: 行索引(数字)。
  • 返回值: 无。

24. md2Block(markdown)

  • 功能: 将 Markdown 转换为思源笔记块格式。
  • 参数:
    • markdown: Markdown 格式的字符串。
  • 返回值: 返回思源笔记块格式的 HTML 字符串。

25. block2Md(block)

  • 功能: 将思源笔记块转换为 Markdown 格式。
  • 参数:
    • block: 思源笔记块对象。
  • 返回值: 返回 Markdown 格式的字符串。

26. renderListView(data, refIds, linkUrls)

  • 功能: 渲染列表视图。
  • 参数:
    • data: 数据数组。
    • refIds: 引用 ID 数组(可选)。
    • linkUrls: 链接 URL 数组(可选)。
  • 返回值: 返回渲染后的 HTML 字符串。

27. renderViewByMarkdown(markdown)

  • 功能: 渲染 Markdown 内容为视图。
  • 参数:
    • markdown: Markdown 格式的字符串。
  • 返回值: 返回渲染后的 HTML 字符串。

28. renderViewByDom(dom)

  • 功能: 渲染 DOM 元素为视图。
  • 参数:
    • dom: DOM 元素。
  • 返回值: 返回渲染后的 DOM 元素。

29. renderChartView(option, width, height, align)

  • 功能: 渲染图表视图。
  • 参数:
    • option: 图表配置对象。
    • width: 图表宽度(字符串,如 '100%')。
    • height: 图表高度(字符串,如 '300px')。
    • align: 图表对齐方式(字符串,如 'left''center')。
  • 返回值: 返回图表视图对象。

30. renderMermaidView(code, align)

  • 功能: 渲染 Mermaid 图表视图。
  • 参数:
    • code: Mermaid 代码(字符串)。
    • align: 图表对齐方式(字符串,如 'left''center')。
  • 返回值: 返回 Mermaid 图表视图对象。

31. paddingLeft(content, num, unit)

  • 功能: 为内容添加左侧内边距。
  • 参数:
    • content: 内容(字符串)。
    • num: 内边距值(数字或字符串)。
    • unit: 单位(字符串,如 'px',默认为 'px')。
  • 返回值: 返回带有左侧内边距的 HTML 字符串。

32. paddingRight(content, num, unit)

  • 功能: 为内容添加右侧内边距。
  • 参数:
    • content: 内容(字符串)。
    • num: 内边距值(数字或字符串)。
    • unit: 单位(字符串,如 'px',默认为 'px')。
  • 返回值: 返回带有右侧内边距的 HTML 字符串。

33. marginLeft(content, num, unit)

  • 功能: 为内容添加左侧外边距。
  • 参数:
    • content: 内容(字符串)。
    • num: 外边距值(数字或字符串)。
    • unit: 单位(字符串,如 'px',默认为 'px')。
  • 返回值: 返回带有左侧外边距的 HTML 字符串。

34. marginRight(content, num, unit)

  • 功能: 为内容添加右侧外边距。
  • 参数:
    • content: 内容(字符串)。
    • num: 外边距值(数字或字符串)。
    • unit: 单位(字符串,如 'px',默认为 'px')。
  • 返回值: 返回带有右侧外边距的 HTML 字符串。

35. toLineThrough(content)

  • 功能: 为内容添加删除线样式。
  • 参数:
    • content: 内容(字符串)。
  • 返回值: 返回带有删除线样式的 HTML 字符串。

36. toUnderLine(content)

  • 功能: 为内容添加下划线样式。
  • 参数:
    • content: 内容(字符串)。
  • 返回值: 返回带有下划线样式的 HTML 字符串。

37. toBold(content)

  • 功能: 为内容添加加粗样式。
  • 参数:
    • content: 内容(字符串)。
  • 返回值: 返回带有加粗样式的 HTML 字符串。

38. toItalic(content)

  • 功能: 为内容添加斜体样式。
  • 参数:
    • content: 内容(字符串)。
  • 返回值: 返回带有斜体样式的 HTML 字符串。

39. toS(content)

  • 功能: 为内容添加删除线样式(toLineThrough 的别名)。
  • 参数:
    • content: 内容(字符串)。
  • 返回值: 返回带有删除线样式的 HTML 字符串。

40. toU(content)

  • 功能: 为内容添加下划线样式(toUnderLine 的别名)。
  • 参数:
    • content: 内容(字符串)。
  • 返回值: 返回带有下划线样式的 HTML 字符串。

41. toB(content)

  • 功能: 为内容添加加粗样式(toBold 的别名)。
  • 参数:
    • content: 内容(字符串)。
  • 返回值: 返回带有加粗样式的 HTML 字符串。

42. toI(content)

  • 功能: 为内容添加斜体样式(toItalic 的别名)。
  • 参数:
    • content: 内容(字符串)。
  • 返回值: 返回带有斜体样式的 HTML 字符串。

43. log(data, space)

  • 功能: 打印数据到控制台(格式化输出)。
  • 参数:
    • data: 要打印的数据。
    • space: 缩进空格数(数字,默认为 4)。
  • 返回值: 无。

44. setWidth(row, colName, value)

  • 功能: 设置表格列的宽度。
  • 参数:
    • row: 表格行对象。
    • colName: 列名(字符串)。
    • value: 宽度值(字符串,如 '100px')。
  • 返回值: 无。

45. setHeadHeight(row, colName, value)

  • 功能: 设置表头行的高度。
  • 参数:
    • row: 表格行对象。
    • colName: 列名(字符串)。
    • value: 高度值(字符串,如 '50px')。
  • 返回值: 无。

46. setRowHeight(row, colName, value)

  • 功能: 设置表格行的高度。
  • 参数:
    • row: 表格行对象。
    • colName: 列名(字符串)。
    • value: 高度值(字符串,如 '50px')。
  • 返回值: 无。

47. setHeight(row, colName, value)

  • 功能: 设置表格行的高度(setRowHeight 的别名)。
  • 参数:
    • row: 表格行对象。
    • colName: 列名(字符串)。
    • value: 高度值(字符串,如 '50px')。
  • 返回值: 无。

48. valignTop(row, colName)

  • 功能: 设置表格列内容顶部对齐。
  • 参数:
    • row: 表格行对象。
    • colName: 列名(字符串)。
  • 返回值: 无。

49. valignBottom(row, colName)

  • 功能: 设置表格列内容底部对齐。
  • 参数:
    • row: 表格行对象。
    • colName: 列名(字符串)。
  • 返回值: 无。

50. setAlign(row, colName, value)

  • 功能: 设置表格列内容的水平对齐方式。
  • 参数:
    • row: 表格行对象。
    • colName: 列名(字符串)。
    • value: 对齐方式(字符串,如 'left''center')。
  • 返回值: 无。

51. setVAlign(row, colName, value)

  • 功能: 设置表格列内容的垂直对齐方式。
  • 参数:
    • row: 表格行对象。
    • colName: 列名(字符串)。
    • value: 对齐方式(字符串,如 'top''center')。
  • 返回值: 无。

52. setHAlign(row, colName, value)

  • 功能: 设置表头列内容的水平对齐方式。
  • 参数:
    • row: 表格行对象。
    • colName: 列名(字符串)。
    • value: 对齐方式(字符串,如 'left''center')。
  • 返回值: 无。

53. setHVAlign(row, colName, value)

  • 功能: 设置表头列内容的垂直对齐方式。
  • 参数:
    • row: 表格行对象。
    • colName: 列名(字符串)。
    • value: 对齐方式(字符串,如 'top''center')。
  • 返回值: 无。

54. setPin(row, colName, style)

  • 功能: 设置表格列的固定样式。
  • 参数:
    • row: 表格行对象。
    • colName: 列名(字符串)。
    • style: 固定样式(字符串,如 'left: 0;')。
  • 返回值: 无。

55. generateViewByMarkdown(markdown, item, pos, domType, domSubType, autoUpdate, relation)

  • 功能: 通过 Markdown 生成视图。
  • 参数:
    • markdown: Markdown 格式的字符串。
    • item: 嵌入块对象。
    • pos: 插入位置(字符串,如 'after')。
    • domType: DOM 类型(字符串,如 'NodeCodeBlock')。
    • domSubType: DOM 子类型(字符串,如 'echarts')。
    • autoUpdate: 是否自动更新(布尔值)。
    • relation: 是否关联(布尔值)。
  • 返回值: 返回生成结果对象。

56. generateViewByDom(dom, item, pos, domType, domSubType, autoUpdate, relation)

  • 功能: 通过 DOM 生成视图。
  • 参数:
    • dom: DOM 元素。
    • item: 嵌入块对象。
    • pos: 插入位置(字符串,如 'after')。
    • domType: DOM 类型(字符串,如 'NodeCodeBlock')。
    • domSubType: DOM 子类型(字符串,如 'echarts')。
    • autoUpdate: 是否自动更新(布尔值)。
    • relation: 是否关联(布尔值)。
  • 返回值: 返回生成结果对象。

57. generateListView(data, item, pos, refIds, linkUrls, autoUpdate, relation)

  • 功能: 生成列表视图。
  • 参数:
    • data: 数据数组。
    • item: 嵌入块对象。
    • pos: 插入位置(字符串,如 'after')。
    • refIds: 引用 ID 数组(可选)。
    • linkUrls: 链接 URL 数组(可选)。
    • autoUpdate: 是否自动更新(布尔值)。
    • relation: 是否关联(布尔值)。
  • 返回值: 返回生成结果对象。

58. generateTaskView(data, item, pos, refIds, linkUrls, autoUpdate, relation)

  • 功能: 生成任务列表视图。
  • 参数:
    • data: 数据数组。
    • item: 嵌入块对象。
    • pos: 插入位置(字符串,如 'after')。
    • refIds: 引用 ID 数组(可选)。
    • linkUrls: 链接 URL 数组(可选)。
    • autoUpdate: 是否自动更新(布尔值)。
    • relation: 是否关联(布尔值)。
  • 返回值: 返回生成结果对象。

59. generateTableView(data, item, pos, autoUpdate, relation)

  • 功能: 生成表格视图。
  • 参数:
    • data: 数据数组。
    • item: 嵌入块对象。
    • pos: 插入位置(字符串,如 'after')。
    • autoUpdate: 是否自动更新(布尔值)。
    • relation: 是否关联(布尔值)。
  • 返回值: 返回生成结果对象。

60. generateAVView(data, item, pos, idField, pkField, autoUpdate, relation)

  • 功能: 生成属性视图。
  • 参数:
    • data: 数据数组。
    • item: 嵌入块对象。
    • pos: 插入位置(字符串,如 'after')。
    • idField: ID 字段名(字符串)。
    • pkField: 主键字段名(字符串)。
    • autoUpdate: 是否自动更新(布尔值)。
    • relation: 是否关联(布尔值)。
  • 返回值: 返回生成结果对象。

61. generateDatabaseView(data, item, pos, idField, pkField, autoUpdate, relation)

  • 功能: 生成数据库视图。
  • 参数:
    • data: 数据数组。
    • item: 嵌入块对象。
    • pos: 插入位置(字符串,如 'after')。
    • idField: ID 字段名(字符串)。
    • pkField: 主键字段名(字符串)。
    • autoUpdate: 是否自动更新(布尔值)。
    • relation: 是否关联(布尔值)。
  • 返回值: 返回生成结果对象。

62. insertDatabaseView(data, avBlockId, item, autoUpdate)

  • 功能: 插入数据库视图。
  • 参数:
    • data: 数据数组。
    • avBlockId: 属性视图块的 ID(字符串)。
    • item: 嵌入块对象。
    • autoUpdate: 是否自动更新(布尔值)。
  • 返回值: 返回插入结果对象。

63. generateChartView(code, item, pos, autoUpdate, relation)

  • 功能: 生成图表视图。
  • 参数:
    • code: 图表代码(字符串)。
    • item: 嵌入块对象。
    • pos: 插入位置(字符串,如 'after')。
    • autoUpdate: 是否自动更新(布尔值)。
    • relation: 是否关联(布尔值)。
  • 返回值: 返回生成结果对象。

64. generateMermaidView(code, item, pos, autoUpdate, relation)

  • 功能: 生成 Mermaid 图表视图。
  • 参数:
    • code: Mermaid 代码(字符串)。
    • item: 嵌入块对象。
    • pos: 插入位置(字符串,如 'after')。
    • autoUpdate: 是否自动更新(布尔值)。
    • relation: 是否关联(布尔值)。
  • 返回值: 返回生成结果对象。

65. onLoopEnd(functionName, ...args)

  • 功能: 在循环结束后执行指定函数。
  • 参数:
    • functionName: 函数名(字符串)。
    • ...args: 函数参数。
  • 返回值: 返回一个函数,用于在循环结束后执行。

66. addGenerateQueue(item, functionName, ...args)

  • 功能: 添加生成队列。
  • 参数:
    • item: 嵌入块对象。
    • functionName: 函数名(字符串)。
    • ...args: 函数参数。
  • 返回值: 无。

67. generateQueueViews(item, data)

  • 功能: 执行生成队列中的视图生成任务。
  • 参数:
    • item: 嵌入块对象。
    • data: 数据数组。
  • 返回值: 返回生成结果对象。

68. sortRowCustomFieldsFirst(row, sortFields)

  • 功能: 对表格行按自定义字段排序。
  • 参数:
    • row: 表格行对象。
    • sortFields: 排序字段数组(可选)。
  • 返回值: 返回排序后的表格行对象。

69. sortRowSortFieldsFirst(row, sortFields)

  • 功能: 对表格行按排序字段排序。
  • 参数:
    • row: 表格行对象。
    • sortFields: 排序字段数组(可选)。
  • 返回值: 返回排序后的表格行对象。

70. filterData(data, fields)

  • 功能: 过滤数据,保留指定字段。
  • 参数:
    • data: 数据数组。
    • fields: 字段数组。
  • 返回值: 返回过滤后的数据数组。

71. fetchSyncPost(url, data, returnType)

  • 功能: 同步发送 POST 请求。
  • 参数:
    • url: 请求 URL(字符串)。
    • data: 请求数据(对象或 FormData)。
    • returnType: 返回类型(字符串,如 'json')。
  • 返回值: 返回请求结果。

72. showMessage(message, isError, delay)

  • 功能: 显示消息通知。
  • 参数:
    • message: 消息内容(字符串)。
    • isError: 是否为错误消息(布尔值)。
    • delay: 显示延迟时间(毫秒,默认为 7000)。
  • 返回值: 返回请求结果。

渲染视图

除了对查询结果渲染为表格,还可以渲染为其他视图吗?

列表视图

可以,比如列表

//!js
return query(
    `select * from blocks where type='d' order by created desc limit 3;`,
    // item, 固定不变,❗️勿动,代表本嵌入块对象
    item,
    '序号,内容,文档类型,路径,创建时间,更新时间',
    ({ row, index, data, options, toLink, toRef, formatDateTime, renderListView, ...args }) => {
        const list = data.map(item => item.content);
	return renderListView(list, item);
    }
);

结果

image.png

renderListView 支持嵌套,比如

//!js
return query(
    `select * from blocks where type='d' order by created desc limit 3;`,
    // item, 固定不变,❗️勿动,代表本嵌入块对象
    item,
    '序号,内容,文档类型,路径,创建时间,更新时间',
    ({ row, index, data, options, toLink, toRef, formatDateTime, renderListView, ...args }) => {
	return renderListView([
             1,
             2,
	     [21, 22, [221, 222, 223], 23],
             3,
         ]);
    }
);

结果

image.png

给列表加上链接

这个实现方法很多,这里先用最简单的方式实现,后续可能会有关于这块的详细教程

//!js
return query(
    `select * from blocks where type='d' order by created desc limit 3;`,
    // item, 固定不变,❗️勿动,代表本嵌入块对象
    item,
    '序号,内容,文档类型,路径,创建时间,更新时间',
    ({ row, index, data, options, toLink, toRef, formatDateTime, renderListView, toMdLink, ...args }) => {
        const list = data.map(item => toMdLink(item.content, 'siyuan://blocks/'+item.id));
	return renderListView(list, item);
    }
);

结果

image.png

Chart 视图

示例

//!js
return query(
  `select * from blocks where type='d' order by created desc limit 3;`,
  // item, 固定不变,❗️勿动,代表本嵌入块对象
  item,
  '序号,内容,文档类型,路径,创建时间,更新时间',
  ({ row, index, data, options, toLink, toRef, formatDateTime, renderListView, toMdLink, ...args }) => {
    return args.renderChartView({
      xAxis: {
        type: 'category',
        data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
      },
      yAxis: {
        type: 'value'
      },
      series: [
        {
          data: [150, 230, 224, 218, 135, 147, 260],
          type: 'line'
        }
      ]
    }, item);
  }
);

结果

image.png

renderChartView 全部参数 renderChartView(option, width, height, align),通过 width,height,align 还可以指定宽高和对齐,默认铺满父容器,左对齐,align 值有 left, center, right

Mermaid 视图

示例

//!js
return query(
  `select * from blocks where type='d' order by created desc limit 3;`,
  // item, 固定不变,❗️勿动,代表本嵌入块对象
  item,
  '序号,内容,文档类型,路径,创建时间,更新时间',
  ({ row, index, data, options, toLink, toRef, formatDateTime, renderListView, toMdLink, ...args }) => {
    return args.renderMermaidView(`
      sequenceDiagram
          participant Alice
          participant Bob
          Bob->>Alice: Hi Alice
          Alice->>Bob: Hi Bob
    `);
  }
);

结果

image.png

renderMermaidView 函数 renderMermaidView(code, align),参数 align 的值有 left, center, right,默认左对齐

生成视图

生成视图和渲染视图的区别是生成视图指在 SQL 嵌入块的上面或下面插入块,而渲染视图则是直接在 SQL 嵌入块上渲染结果。

列表视图

示例

//!js
return query(
    `select * from blocks where type='d' order by created desc limit 3;`,
    // item, 固定不变,❗️勿动,代表本嵌入块对象
    item,
    '序号,内容,文档类型,路径,创建时间,更新时间',
    ({ row, index, data, options, toLink, toRef, formatDateTime,  toMdLink, ...args }) => {
        const list = data.map(item => toMdLink(item.content, 'siyuan://blocks/'+item.id));
	return args.generateListView(list, item);
    }
);

结果

image.png

函数原型 generateListView(data, item, pos = 'after', refIds = [], linkUrls = [], autoUpdate = false, relation = true)

data 即传入的列表数据

item 代表本嵌入块,勿动

pos before 代表本嵌入块的上面插入,after 代表本嵌入块下面插入,默认 after

refIds 可传入指定的 id 来生成引用链接,需要与 data 的格式一一对应,通常用不到

linkUrls 可传入指定的 URL 来生成链接,需要与 data 的格式一一对应,通常用不到

autoUpdate 是否刷新时自动更新数据,刷新指加载也面和第一次被动态加载,即非手动执行,默认 false

relation 是指是否把生成的块与本嵌入块关联起来,如果关联,多次生成只会更新原来的块,如果不关联,每次生成新的块,默认 true 关联

任务视图

同列表视图,不再赘述

函数原型 generateTaskView(data, item, pos = 'after', refIds = [], linkUrls = [], autoUpdate = false, relation = true)

表格视图

示例

//!js
return query(
    `select * from blocks where type='d' order by created desc limit 3;`,
    // item, 固定不变,❗️勿动,代表本嵌入块对象
    item,
    '序号,内容,文档类型,路径,创建时间,更新时间',
    ({ row, index, data, options, toLink, toRef, formatDateTime, getTypeText, onLoopEnd, ...args }) => {
        row.序号 = index + 1;
        row.序号_width = '80px';
        row.内容 = toRef(row.content, row.id);
        row.文档类型 = getTypeText(row.type);
        row.路径 = row.hpath;
        row.创建时间 = formatDateTime(row.created);
        row.更新时间 = formatDateTime(row.updated);

        return onLoopEnd('generateTableView', data, item);
    }
);

结果

image.png

说明

你可能注意到,这里用的是 onLoopEnd 调用 generateTableView,而不是像前面那样直接调用 generateTableView 函数。

为什么呢?

因为调用 generateTableView 的地方是在 beforeRender 回调函数的闭包中且在循环体中,如果直接 return generateTableView,则循环立即结束。如果 beforeRender 回调函数中有对 data 数据进的操作,除了第一条数据被处理了,后续的数据都无法处理就直接返回了。而用 onLoopEnd 函数,return 返回一个闭包,即对目标函数(这里是 generateTableView)调用的闭包,这样不会中断循环体,直到所有数据处理完毕后才执行 onLoopEnd,继而执行目标函数。

当然,如果你直接返回 generateTableView 也可以,那么你就要先对 data 中的数据进行格式处理,达到预期后再传入 generateTableView,这里为了偷懒,利用原有函数进行处理罢了。

所有生成函数都可以用 onLoopEnd 进行调用,以充分利用原有格式化函数。

在这里,我相信大多数萌新会一脸懵逼,不知所云,没关系,会用即可,多上手试试,慢慢就明白了。

onLoopEnd 函数的原型 onLoopEnd(functionName, ...args),functionName 是目标函数,args 目标函数的所有参数。

生成表格函数原型 generateTableView(data, item, pos = 'after', autoUpdate = false, relation = true)

data 即传入的列表数据

item 代表本嵌入块,勿动

pos before 代表本嵌入块的上面插入,after 代表本嵌入块下面插入,默认 after

autoUpdate 是否刷新时自动更新数据,刷新指加载也面和第一次被动态加载,即非手动执行,默认 false

relation 是指是否把生成的块与本嵌入块关联起来,如果关联,多次生成只会更新原来的块,如果不关联,每次生成新的块,默认 true 关联

数据库视图

示例

//!js
return query(
    `select * from blocks where type='d' order by created desc limit 3;`,
    // item, 固定不变,❗️勿动,代表本嵌入块对象
    item,
    '序号,内容,文档类型,路径,创建时间,更新时间',
    ({ row, index, data, options, toLink, toRef, formatDateTime, getTypeText, onLoopEnd, ...args }) => {
        row.序号 = index + 1;
        row.序号_width = '80px';
        row.内容 = toRef(row.content, row.id);
        row.文档类型 = getTypeText(row.type);
        row.路径 = row.hpath;
        row.创建时间 = formatDateTime(row.created);
        row.更新时间 = formatDateTime(row.updated);

        return onLoopEnd('generateDatabaseView', data, item);
    }
);

结果

image.png

说明

使用方法和注意事项同上,唯一变化的是调用函数名。

生成数据库函数原型如下,它还有个别名叫 generateAVView

generateDatabaseView(data, item, pos = 'after', idField='', pkField='', autoUpdate = false, relation = true)


另外,还有个叫数据库插入视图的 insertDatabaseView,该函数的功能是把查询结果插入到数据库,需要指定数据库所在块 ID,目前仅支持插入主键的值,已插入的不会再次插入,动态插入时不会影响现有数据库已修改的字段,可选择是否自动更新。

insertDatabaseView 函数原型如下

insertDatabaseView(data, avBlockId, item, autoUpdate = false)

参数说明

data 要传入的数据

avBlockId 数据库所在块的 ID,注意是数据库所在的块 ID,不是数据库的 ID

item 固定值,无需改动,直接写死这个变量名即可

autoUpdate 是否自动更新,true 自动更新,false 不自动更新,默认 false

insertDatabaseView 使用示例

//!js
// 使用帮助:https://ld246.com/article/1736035967300
return query(
    `select * from blocks where type='d' order by created desc limit 3;`,
    // item, 固定不变,❗️勿动,代表本嵌入块对象
    item,
    '序号,内容,文档类型,路径,创建时间,更新时间',
    ({ row, index, data, options, insertDatabaseView, ...args }) => {
        // 查看函数使用手册 https://ld246.com/article/1736035967300#%E5%9B%9E%E8%B0%83%E5%87%BD%E6%95%B0%E4%B8%AD%E5%B8%B8%E7%94%A8%E5%87%BD%E6%95%B0%E8%AF%B4%E6%98%8E
        return insertDatabaseView(data, '20250105170929-l6yvu26', item, true);
    }
);

结果

image.png

注意,第四个参数设置为 true,即可自动更新,请参照代码示例或函数原型。

Chart 和 Mermaid 视图

Chart 代码示例

//!js
return query(
  `select * from blocks where type='d' order by created desc limit 3;`,
  // item, 固定不变,❗️勿动,代表本嵌入块对象
  item,
  '序号,内容,文档类型,路径,创建时间,更新时间',
  ({ row, index, data, options, toLink, toRef, formatDateTime, renderListView, toMdLink, ...args }) => {
    return args.generateChartView({
      xAxis: {
        type: 'category',
        data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
      },
      yAxis: {
        type: 'value'
      },
      series: [
        {
          data: [150, 230, 224, 218, 135, 147, 260],
          type: 'line'
        }
      ]
    }, item);
  }
);

Mermaid 代码示例

//!js
return query(
  `select * from blocks where type='d' order by created desc limit 3;`,
  // item, 固定不变,❗️勿动,代表本嵌入块对象
  item,
  '序号,内容,文档类型,路径,创建时间,更新时间',
  ({ row, index, data, options, toLink, toRef, formatDateTime, renderListView, toMdLink, ...args }) => {
    return args.generateMermaidView(`
      sequenceDiagram
          participant Alice
          participant Bob
          Bob->>Alice: Hi Alice
          Alice->>Bob: Hi Bob
    `, item);
  }
);

批量生成(实验)

以上生成代码块的方法只能单个生成,那如果生成多个该怎么处理呢?

这就用到了批量添加函数 addGenerateQueue()和批量生成函数 generateQueueViews();

示例

//!js
return query(
  `select * from blocks where type='d' order by created desc limit 3;`,
  // item, 固定不变,❗️勿动,代表本嵌入块对象
  item,
  '',
  ({ row, index, data, options, toLink, toRef, addGenerateQueue, generateQueueViews, onLoopEnd, ...args }) => {
    addGenerateQueue(item, 'generateViewByMarkdown', `before1`, item, 'before', '', '', false, false);
    addGenerateQueue(item, 'generateViewByMarkdown', `before2`, item, 'before', '', '', false, false);
    addGenerateQueue(item, 'generateViewByMarkdown', `after1`, item, 'after', '', '', false, false);
    addGenerateQueue(item, 'generateViewByMarkdown', `after2`, item, 'after', '', '', false, false);
    return generateQueueViews(item);
    //return onLoopEnd('generateQueueViews',item);
  }
);

结果

image.png

说明

首先调用 addGenerateQueue 添加要执行的函数和参数,然后需要的时候调用 generateQueueViews 生成数据即可。

同样,也可以使用,return onLoopEnd('generateQueueViews',item); 对所有数据都格式化处理后再执行,不过,这里仅简单的演示用这个 onLoopEnd 打印的数据其实是不合适的,因为这个例子是生成 Markdown 文本,数据是文本,如果用 onLoopEnd 会把 data 数组数据打印成 json 字符串后渲染。

其他

  1. 如何查看 beforeRender 都有哪些参数?可以打印 console.log(...args);查看控制台输出 await query(':funcs');
  2. 如何设置选项?可以直接在最后一个参数里设置,也可以在 beforeRender 回调中 if(index === 0) options.xxxx = xxxx; 设置
  3. 如何扩展函数?可以在调用 query 前面直接定义后然后在回调中直接使用,或者在本代码的用户自定义函数区直接添加
  4. fields 作用?可以筛选和排序,注意,比如 row.xxx = row.yyy 中 xxx 对应的是 fields 中指定的字段名,yyy 对象 sql 查询结果返回的字段名
  5. 如何对列操作?可以通过全局变量与 field 字段结合操作,也可以拿到 data 参数后遍历,然后判断是目标列进行操作即可
  6. 注意,如果查询数量过多,可能会造成查询卡顿,建议用 limit 加以限制
  7. 如果想显示元素效果可以这样,return query('select ** from blocks limit 3', item); 即 select 时使用两个星号,即返回思源原生查询结果
  8. 如何处理多个查询结果?使用 query 时不要传入 item 即返回查询结果,然后对多个结果汇总后再渲染即可,query 的第一个参数可以直接传 data 数据或回调函数,然后会直接对数据进行渲染,详情请参考源码
  9. 使用 renderViewByMarkdownrenderViewByDomgenerateViewByMarkdowngenerateViewByMarkdown,理论上可以渲染或生成任何块
  10. 当出现错误时,可打开控制台查看详细报错信息或在回调函数中加 debugger 调试
  11. 如果你要改造本代码,注意这个代码是一个单实例,你的修改可能会影响到所有查询实例,应避免使用全局变量等可能引起实例共享的操作。为什么用单实例,这是历史原因,本代码一开始只是实现一些快捷键功能的工具,简单起见未严格规划代码架构,后逐步改造而来,因此先这样了
  12. 本代码中的字段排序依赖对象添加顺序,因此,勿用纯数字作为字段的别名,否则纯数字的字段名排序将失效
  13. toMdRef 是 toMdLink 的别名,并非引用链接,原因是 Lute 不支持引用 Markdown 代码转 BlockDom,简单起见,暂时先这样

代码

https://gitee.com/wish163/mysoft/blob/main/%E6%80%9D%E6%BA%90/SQL%E7%AE%80%E5%8D%95%E6%9F%A5%E8%AF%A2.js

使用方法:只需把该代码放到思源 js 代码片段中,然后即可在 SQL 查询嵌入块中按照上面的示例使用啦。

鸣谢

Mermaid 渲染部分参考了 @Frostime 大佬的 QueryView 插件代码,感谢 F 佬!

数据库视图生成部分参考了 @qiancang 大佬的 SQL 查询生成器动作代码,感谢 qiancang 大佬!

手把手教程和示例教程

请参见下面的新年大礼包 👇

新年大礼包

(内含手把手教程和示例教程,常用工具分享和新年彩蛋)

立即打赏激活 👇

打赏 30 积分后可见
30 积分 • 16 打赏
  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    23349 引用 • 94339 回帖
  • 代码片段

    代码片段分为 CSS 与 JS 两种代码,添加在 [设置 - 外观 - 代码片段] 中,这些代码会在思源笔记加载时自动执行,用于改善笔记的样式或功能。

    用户在该标签下分享代码片段时需在帖子标题前添加 [css] [js] 用于区分代码片段类型。

    94 引用 • 635 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • nightstars

    大佬厉害!

  • 是真的大礼包,慢慢学习 ❤️

    感谢大佬的积分!你的 SQL 可以用这个代码试试啦 😄,后续可能会根据大家反馈写一些示例教程,不清楚的可以多反馈哈
    wilsons
  • noitejun

    大神,可以帮忙更新一下,insertDatabaseView 插入数据库怎么写吗?只需要添加主键,已经添加过的不重复添加,想要实现主键相当于手动刷新(自动更好),不影响其他列的数据,感谢 🙏 !

    1 回复
  • YRJ0422

    更希望 D 大出个带 UI 的查询块,这样用起来也方便容易很多

  • wilsons 1

    你是想问的是 insertDatabaseView 怎么使用吗?

    目前的代码确实能满足你的需求,但要注意,要自动更新,第四个参数设为 true 即可。

    请参照下面的示例

    //!js
    // 使用帮助:https://ld246.com/article/1736035967300
    return query(
        `select * from blocks where type='d' order by created desc limit 3;`,
        // item, 固定不变,❗️勿动,代表本嵌入块对象
        item,
        '序号,内容,文档类型,路径,创建时间,更新时间',
        ({ row, index, data, options, insertDatabaseView, ...args }) => {
            // 查看函数使用手册 https://ld246.com/article/1736035967300#%E5%9B%9E%E8%B0%83%E5%87%BD%E6%95%B0%E4%B8%AD%E5%B8%B8%E7%94%A8%E5%87%BD%E6%95%B0%E8%AF%B4%E6%98%8E
            return insertDatabaseView(data, '20250105170929-l6yvu26', item, true);
        }
    );
    

    结果

    image.png

    另外,建议更新下代码,修改了一些细节问题。

    文章中已添加了该教程。

    1 回复
  • noitejun

    👍 是我想要的,非常感谢!!!

  • lichlaughing

    果然还得是你 👍

  • lichlaughing

    我想请教下,能否有办法使用本地的 vscode 编辑代码片段。默认情况下的编辑窗口好难用哦~

    1 回复
  • 论坛已经好几个这个教程了,F 佬也出了个查询插件,可以直接用 js

  • wilsons

    如果是代码片段,可以动态加载 js,然后,用 vscode 编辑 js 文件就可以了

    比如代码片段输入

    {
        // 动态加载js
        const src = '/snippets/query.js';
        const script = document.createElement('script');
        script.src = src;
        document.head.appendChild(script);
    }
    

    比如这里动态加载 query.js,然后,vscode 里直接编辑 query.js 文件就行了。

    注意这里大括号不要删除,这是为了隔离命名空间,防止污染全局变量。

    这里为什么没用 import()函数,因为 import 存在跨域问题,如果加载外网 js 可能有问题。


    如果是 SQL 嵌入块中的代码,有点麻烦,可以先在待加载的 js 中定义一个函数,然后 SQL 嵌入块中动态加载这个 js 并执行函数,

    比如 someQuery.js 中定义一个函数 function someQuery()

    比如

    someQuery.js

    function someQuery(item, protyle) {
        return query(`
            SELECT 
                '-' as 序号__no_w80_0,
                content as 标题__ref_1,
                CASE
                    WHEN ial LIKE '%{: custom-avs="%' THEN '<font color=green>已加入</font>' 
                    ELSE '' 
                END AS 是否加入数据__2,
                id as id__hide
            FROM 
                blocks 
            WHERE 
                type = 'd' 
                AND box = '${protyle.notebookId}'
            ORDER BY created desc
            LIMIT 3;
            `, item);
    }
    

    然后,sql 查询嵌入块中的代码

    //!js
    return (async ()=>{
        // 动态加载自己的查询js文件
        await loadJs('/snippets/someQuery.js');
        return someQuery(item, protyle);
    
        // 动态加载js
        function loadJs(url) {
            return new Promise((resolve, reject) => {
                const script = document.createElement('script');
                script.src = url;
                script.type = 'text/javascript';
                script.onload = () => {
                    resolve();
                };
                script.onerror = () => {
                    reject(new Error(`Failed to load script: ${url}`));
                };
                document.head.appendChild(script);
            });
        }
    })();
    

    然后,在 vscode 中编辑 someQuery.js 就可以了。

    不过,最简单的方式还是在外部编辑器中编辑好后粘贴过来。

请输入回帖内容 ...