[js] 创建 dailynote 自动添加到数据库

思源笔记创建 dailynote 很方便,但是我觉得思源笔记还一直欠缺对 dailynote 的全局管理和浏览
不方便从全局的角度来看这几天、这几周、这几个月每天在干什么

我最近几个月开始尝试用数据库来管理 dailynote,存放全年的 dailynote,发现这种方式可以很方便地快速回顾每日日记,可以通过建立视图,设置筛选条件来建立每月日记视图,还可以在数据库中添加打分、状态(灵感来源:微信状态)、总结、反思等列

这个数据库的位置,我会在年、每月的复盘笔记里

PixPin20240926214926.png

不过目前我只能创建 dailynote 后,再将其手动拖到数据库中,要是新建日记的时候,能自动化添加到指定的数据库,就会省心很多

于是提了一个 issue:创建 dailynote 支持自动添加到数据库 · Issue #12587 · siyuan-note/siyuan (github.com)

但暂时还没有回应,不知道官方会不会做

代码片段

看到有大佬写了自动把子文档添加到数据库的功能,见批量导入文档到数据库 0.0.6 版全新发布 - 链滴 (ld246.com)

参考了下,简单写了一个 js 代码片段,对 alt+5 快捷键进行监控(没有对左上方的创建日记按钮进行监控,因为不会),这样创建或打开日记时,就将 dailynote 放进指定的数据库
使用时,只需要配置数据库块 id 即可,变量为 dbBlockId

注意:本代码只会把所有笔记本创建的 dailynote 统统放进一个数据库里,有些人可能有多个笔记本,每个笔记本的 dailynote 如果需要放在不同的数据库,或者只有某个笔记本的 dailynote 才要放进数据库。本代码暂时没对这两种场景做优化,因为个人只用一个笔记本,暂时没有改进需求(代码能用就行哈哈哈)。

(async () => {
    // 标志变量,用于防止重复触发
    let isCreatingDailyNote = false;
    const originalFetch = window.fetch;

    // 重写 fetch 函数
    window.fetch = async function (...args) {
        // 检查是否是我们要监听的API调用
        if (args[0] === '/api/filetree/createDailyNote' && args[1]?.method === 'POST' && !isCreatingDailyNote) {
            console.log('创建每日笔记的API被调用了!');

            // 设置标志位,防止重复进入
            isCreatingDailyNote = true;

            // 执行创建日记后的逻辑
            await dailynoteAddDatabase();

            // 重置标志位
            isCreatingDailyNote = false;
        }

        // 调用原始的 fetch 函数并返回结果
        return originalFetch.apply(this, args);
    };

    // 创建日记的逻辑,监听创建每日笔记的事件时触发
    async function dailynoteAddDatabase() {
        //设置日记自动存放的数据库块id   
        const dbBlockId = '20240911002857-lgav146';
        // 设置哪个笔记本创建日记才添加到数据库,其他笔记本创建日记代码不作用
        const notebookID = '20241028223345-d9ifjv0';

        // 获取当前选择笔记本
        const boxid = window.siyuan.storage["local-dailynoteid"];
        if (boxid === notebookID) {

            // 调用 /api/filetree/createDailyNote 获得日记 ID
            const create_dailynote_result = await fetchSyncPost('/api/filetree/createDailyNote', { notebook: boxid, app: siyuan.ws.app.appId });
            const docID = create_dailynote_result.data.id;

            // 添加日记到数据库中
            const db = await getDataBySql(`SELECT * FROM blocks where type ='av' and id='${dbBlockId}'`);
            if (db.length === 0) {
                console.error("未找到数据库文档块,请检查数据库文档块id是否正确");
                return;
            }

            const avID = db.map(av => getDataAvIdFromHtml(av.markdown))[0];

            // 检测 dailynote 是否已经在数据库里
            let isInResult = await fetchSyncPost("/api/av/getAttributeViewKeys", { id: docID });
            let foundItem = isInResult.data.find(item => item.avID === avID);
            if (foundItem && foundItem.keyValues) {
                console.log(docID + " 已经在数据库");
                return;
            }
            // ------------添加日记到数据库 ------------ // 
            // 组装文档数据参数
            const srcs = [{
                "id": docID,
                "isDetached": false,
            }];

            const input = {
                "avID": avID,
                'srcs': srcs
            };

            await fetchSyncPost('/api/av/addAttributeViewBlocks', input);
            console.log(docID + " 添加到数据库"+avID);


            function getDataAvIdFromHtml(htmlString) {
                // 使用正则表达式匹配data-av-id的值
                const match = htmlString.match(/data-av-id="([^"]+)"/);
                if (match && match[1]) {
                    return match[1]; // 返回匹配的值
                }
                return ""; // 如果没有找到匹配项,则返回空
            }
            async function getDataBySql(sql) {
                const result = await fetchSyncPost('/api/query/sql', { "stmt": sql });
                if (result.code !== 0) {
                    console.error("查询数据库出错", result.msg);
                    return [];
                }
                return result.data;
            }
            async function fetchSyncPost(url, data, returnType = 'json') {
                const init = {
                    method: "POST",
                };
                if (data) {
                    if (data instanceof FormData) {
                        init.body = data;
                    } else {
                        init.body = JSON.stringify(data);
                    }
                }
                try {
                    const res = await fetch(url, init);
                    const res2 = returnType === 'json' ? await res.json() : await res.text();
                    return res2;
                } catch (e) {
                    console.log(e);
                    return returnType === 'json' ? { code: e.code || 1, msg: e.message || "", data: null } : "";
                }
            }
        }
    }
})();


最近对数据库的功能改进期待

之前用 notion,只觉得数据库折腾

现在用思源,才发现数据库,真好用呀真好用

期待下面的 issue,能早日推进

  • 思源笔记

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

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

    22390 引用 • 89648 回帖
  • 代码片段

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

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

    70 引用 • 375 回帖
4 操作
Achuan-2 在 2024-11-03 12:51:16 更新了该帖
Achuan-2 在 2024-11-03 12:48:21 更新了该帖
Achuan-2 在 2024-09-28 12:17:01 更新了该帖
Achuan-2 在 2024-09-26 22:04:07 更新了该帖

相关帖子

欢迎来到这里!

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

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

    我看已经有人开始制作这方面的插件了,不过 bug 还是挺多的,估计还得等明年把画廊视图做出来了,把整个数据库模块做差不多了再优化优化了

    image.png

  • 其他回帖
  • 爱了爱了,很早就像用这个了,终于有大佬写出来了 😄

  • obito624

    我感觉数据库属性显示很重要,但是似乎优先级不高。

    1 回复
  • Achuan-2

    指的是像 notion 一样,打开数据库里的文档,可以在文档内就显示属性,便于查看和修改

    1 回复
  • 查看全部回帖
Achuan-2
给时间以生命而不是给生命以时间,如果你喜欢我的分享,欢迎给我买杯咖啡 https://www.yuque.com/achuan-2 上海

推荐标签 标签

  • V2EX

    V2EX 是创意工作者们的社区。这里目前汇聚了超过 400,000 名主要来自互联网行业、游戏行业和媒体行业的创意工作者。V2EX 希望能够成为创意工作者们的生活和事业的一部分。

    17 引用 • 236 回帖 • 328 关注
  • wolai

    我来 wolai:不仅仅是未来的云端笔记!

    2 引用 • 14 回帖
  • 设计模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

    200 引用 • 120 回帖 • 1 关注
  • Android

    Android 是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    334 引用 • 323 回帖 • 2 关注
  • jsDelivr

    jsDelivr 是一个开源的 CDN 服务,可为 npm 包、GitHub 仓库提供免费、快速并且可靠的全球 CDN 加速服务。

    5 引用 • 31 回帖 • 59 关注
  • 开源

    Open Source, Open Mind, Open Sight, Open Future!

    408 引用 • 3575 回帖 • 1 关注
  • Mac

    Mac 是苹果公司自 1984 年起以“Macintosh”开始开发的个人消费型计算机,如:iMac、Mac mini、Macbook Air、Macbook Pro、Macbook、Mac Pro 等计算机。

    166 引用 • 595 回帖 • 1 关注
  • Git

    Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

    209 引用 • 358 回帖
  • Netty

    Netty 是一个基于 NIO 的客户端-服务器编程框架,使用 Netty 可以让你快速、简单地开发出一个可维护、高性能的网络应用,例如实现了某种协议的客户、服务端应用。

    49 引用 • 33 回帖 • 22 关注
  • 大疆创新

    深圳市大疆创新科技有限公司(DJI-Innovations,简称 DJI),成立于 2006 年,是全球领先的无人飞行器控制系统及无人机解决方案的研发和生产商,客户遍布全球 100 多个国家。通过持续的创新,大疆致力于为无人机工业、行业用户以及专业航拍应用提供性能最强、体验最佳的革命性智能飞控产品和解决方案。

    2 引用 • 14 回帖
  • IBM

    IBM(国际商业机器公司)或万国商业机器公司,简称 IBM(International Business Machines Corporation),总公司在纽约州阿蒙克市。1911 年托马斯·沃森创立于美国,是全球最大的信息技术和业务解决方案公司,拥有全球雇员 30 多万人,业务遍及 160 多个国家和地区。

    17 引用 • 53 回帖 • 136 关注
  • Facebook

    Facebook 是一个联系朋友的社交工具。大家可以通过它和朋友、同事、同学以及周围的人保持互动交流,分享无限上传的图片,发布链接和视频,更可以增进对朋友的了解。

    4 引用 • 15 回帖 • 453 关注
  • 安全

    安全永远都不是一个小问题。

    199 引用 • 816 回帖
  • 前端

    前端技术一般分为前端设计和前端开发,前端设计可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,包括 HTML、CSS 以及 JavaScript 等。

    247 引用 • 1348 回帖 • 2 关注
  • H2

    H2 是一个开源的嵌入式数据库引擎,采用 Java 语言编写,不受平台的限制,同时 H2 提供了一个十分方便的 web 控制台用于操作和管理数据库内容。H2 还提供兼容模式,可以兼容一些主流的数据库,因此采用 H2 作为开发期的数据库非常方便。

    11 引用 • 54 回帖 • 653 关注
  • 爬虫

    网络爬虫(Spider、Crawler),是一种按照一定的规则,自动地抓取万维网信息的程序。

    106 引用 • 275 回帖 • 2 关注
  • RESTful

    一种软件架构设计风格而不是标准,提供了一组设计原则和约束条件,主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

    30 引用 • 114 回帖 • 1 关注
  • 区块链

    区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法 。

    91 引用 • 751 回帖 • 4 关注
  • flomo

    flomo 是新一代 「卡片笔记」 ,专注在碎片化时代,促进你的记录,帮你积累更多知识资产。

    5 引用 • 107 回帖
  • Log4j

    Log4j 是 Apache 开源的一款使用广泛的 Java 日志组件。

    20 引用 • 18 回帖 • 29 关注
  • 外包

    有空闲时间是接外包好呢还是学习好呢?

    26 引用 • 232 回帖 • 4 关注
  • 微服务

    微服务架构是一种架构模式,它提倡将单一应用划分成一组小的服务。服务之间互相协调,互相配合,为用户提供最终价值。每个服务运行在独立的进程中。服务于服务之间才用轻量级的通信机制互相沟通。每个服务都围绕着具体业务构建,能够被独立的部署。

    96 引用 • 155 回帖 • 2 关注
  • SEO

    发布对别人有帮助的原创内容是最好的 SEO 方式。

    35 引用 • 200 回帖 • 23 关注
  • Rust

    Rust 是一门赋予每个人构建可靠且高效软件能力的语言。Rust 由 Mozilla 开发,最早发布于 2014 年 9 月。

    58 引用 • 22 回帖
  • jsoup

    jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。

    6 引用 • 1 回帖 • 476 关注
  • SpaceVim

    SpaceVim 是一个社区驱动的模块化 vim/neovim 配置集合,以模块的方式组织管理插件以
    及相关配置,为不同的语言开发量身定制了相关的开发模块,该模块提供代码自动补全,
    语法检查、格式化、调试、REPL 等特性。用户仅需载入相关语言的模块即可得到一个开箱
    即用的 Vim-IDE。

    3 引用 • 31 回帖 • 101 关注
  • 30Seconds

    📙 前端知识精选集,包含 HTML、CSS、JavaScript、React、Node、安全等方面,每天仅需 30 秒。

    • 精选常见面试题,帮助您准备下一次面试
    • 精选常见交互,帮助您拥有简洁酷炫的站点
    • 精选有用的 React 片段,帮助你获取最佳实践
    • 精选常见代码集,帮助您提高打码效率
    • 整理前端界的最新资讯,邀您一同探索新世界
    488 引用 • 384 回帖 • 9 关注