[js] 添加日记,自动添加到数据库,并自动填充数据库某一文本列的内容

本贴最后更新于 185 天前,其中的信息可能已经东海扬尘

背景

目前我用数据库管理全年的日记,之前也写了添加日记,自动添加到数据库的代码:[js] 创建 dailynote 自动添加到数据库 - 链滴

不过,我的日记数据库有一列 summary,我用来做每日的总结。这个总结我自己有一个模板

📂Research
📂Project
📂Area
📂Resources
📂Life

目前需要每次都填入,有点麻烦,就需要新建日记添加到数据库的时候自动填入,因此对原来的代码进行了改进

PixPin20241102160035.png

效果

自动添加到数据库,并自动填充数据库某一文本列的内容

PixPin20241102155847.png

JS 代码片段

(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'; // 设置文本列keyID const keyID = '20240601175531-vjfh3qj'; // 设置文本列要设置的模板 const content = '📂Research\n📂Project\n📂Area\n📂Resources\n📂Life'; // 获取当前选择笔记本 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); // ------------设置属性 ------------ // await fetchSyncPost("/api/av/setAttributeViewBlockAttr", { avID: avID, keyID: keyID, rowID: docID, value: { "text": { "content": content } }, }); 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 } : ""; } } } } })();
  • 思源笔记

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

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

    25381 引用 • 104837 回帖
  • 代码片段

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

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

    160 引用 • 1041 回帖
5 操作
Achuan-2 在 2024-11-03 12:44:28 更新了该帖
Achuan-2 在 2024-11-02 18:03:38 更新了该帖
Achuan-2 在 2024-11-02 17:52:25 更新了该帖
Achuan-2 在 2024-11-02 16:40:23 更新了该帖 Achuan-2 在 2024-11-02 16:12:38 更新了该帖

相关帖子

欢迎来到这里!

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

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