Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

创建 dailynote 支持自动添加到数据库 #12587

Closed
Achuan-2 opened this issue Sep 25, 2024 · 13 comments
Closed

创建 dailynote 支持自动添加到数据库 #12587

Achuan-2 opened this issue Sep 25, 2024 · 13 comments
Labels

Comments

@Achuan-2
Copy link
Member

Achuan-2 commented Sep 25, 2024

In what scenarios do you need this feature?

思源笔记创建dailynote很方便,但是我觉得思源笔记还一直欠缺对dailynote的全局管理和浏览
不方便从全局的角度来看这几天、这几周、这几个月每天在干什么
我最近几个月开始尝试用数据库来管理dailynote,存放全年的dailynote,发现这种方式可以很方便地快速回顾每日日记,可以通过建立视图,设置筛选条件来建立每月日记视图,还可以在数据库中添加打分、状态(灵感来源:微信状态)、总结、反思等列
PixPin_2024-09-25_14-03-41

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

Describe the optimal solution

创建 dailynote 支持自动添加到数据库
笔记本设置添加「自动添加到数据库」功能
PixPin_2024-09-25_14-10-44

Describe the candidate solution

No response

Other information

No response

@TCOTC
Copy link
Contributor

TCOTC commented Sep 25, 2024

我觉得可以在 Database Automations #10863 支持添加一个 新建日记 的触发器、添加一个 添加文档到数据库 的执行操作。这样就不只可以添加到一个数据库了,还能有更多样的操作方式。

@Achuan-2
Copy link
Member Author

Achuan-2 commented Sep 25, 2024

我觉得可以在 Database Automations #10863 支持添加一个 新建日记 的触发器、添加一个 添加文档到数据库 的执行操作。这样就不只可以添加到一个数据库了,还能有更多样的操作方式。

notion 的Database Automations只是用于数据库里的条目和属性增删改吧,没有全局的触发器

@TCOTC
Copy link
Contributor

TCOTC commented Sep 25, 2024

在这一点上没必要完全照抄 Notion,我觉得只要思源能实现就行

@Achuan-2
Copy link
Member Author

Achuan-2 commented Sep 25, 2024

没必要完全照抄 Notion,只要思源能实现就行

dailynote、新建文档添加到指定数据库,只需要2-3个数据库就好了,过多反而没必要
每个数据库里都加一个这个功能不太合理,除了管理日记和所有笔记外,应该没有其他应用场景了

@5kyfkr
Copy link

5kyfkr commented Sep 25, 2024

https://ld246.com/article/1725515886241#comments
可以试试这个SQL,有自动导入子文档到数据库的功能,建议先新建个文档和数据库调试以防内核崩溃

@Achuan-2
Copy link
Member Author

https://ld246.com/article/1725515886241#comments 可以试试这个SQL,有自动导入子文档到数据库的功能,建议先新建个文档和数据库调试以防内核崩溃

貌似还是要刷新,做不到子文档添加后,自动添加到数据库,不过这个代码我可以抄一抄,改为监听日记创建事件,自动添加到数据库里

@5kyfkr
Copy link

5kyfkr commented Sep 26, 2024

https://ld246.com/article/1725515886241#comments 可以试试这个SQL,有自动导入子文档到数据库的功能,建议先新建个文档和数据库调试以防内核崩溃

貌似还是要刷新,做不到子文档添加后,自动添加到数据库,不过这个代码我可以抄一抄,改为监听日记创建事件,自动添加到数据库里

可以的,里面配置把自动更新那一项改成true打开就行了,就是下面这句

// 加载时是否执行,默认false,加载时不执行,true为加载时执行
const runOnLoad = true;

可以实现打开这个sql所在的笔记就自动刷新添加子文档到数据库,如果是要完全后台自动刷新那还做不到

@Achuan-2
Copy link
Member Author

https://ld246.com/article/1725515886241#comments 可以试试这个SQL,有自动导入子文档到数据库的功能,建议先新建个文档和数据库调试以防内核崩溃

貌似还是要刷新,做不到子文档添加后,自动添加到数据库,不过这个代码我可以抄一抄,改为监听日记创建事件,自动添加到数据库里

可以的,里面配置把自动更新那一项改成true打开就行了,就是下面这句

// 加载时是否执行,默认false,加载时不执行,true为加载时执行 const runOnLoad = true;

可以实现打开这个sql所在的笔记就自动刷新添加子文档到数据库,如果是要完全后台自动刷新那还做不到

我指的是要打开文档,才会运行代码

@Achuan-2
Copy link
Member Author

Achuan-2 commented Sep 26, 2024

用js片段简单实现了按alt+5创建或者打开日记,就可以自动添加到指定数据库

(async ()=>{

window.addEventListener('keydown', function(event) {
    // 检查是否按下了 Alt 键和数字 5 键
    if (event.altKey && event.key === '5') {
        // 模拟按钮点击
        console.log('Alt + 5 被按下了!');
        dailynoteAddDatabase();     
    }
});
async function dailynoteAddDatabase() {
    //设置日记自动存放的数据库块id   
    dbBlockId = '20240911002857-lgav146';
    // 获取当前选择笔记本
    boxid = window.siyuan.storage["local-dailynoteid"]
    // 获取日记id
    const create_dailynote_result =await fetchSyncPost('/api/filetree/createDailyNote', {notebook: boxid, app:  siyuan.ws.app.appId})
    const dailynote_ids = [create_dailynote_result.data.id];
    //console.log(dailynote_ids);

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


    // 组装文档数据参数
    const srcs = dailynote_ids.map(docId => ({
        "id": docId,
        "isDetached": false,
    }));
    // 获取当前时间
    const nowTime = formatDate(new Date());
    // 插入文档数据到数据库
    // see https://github.com/siyuan-note/siyuan/blob/b244f8aed18e7a41d4b27889d870442154ba1462/app/src/protyle/util/editorCommonEvent.ts#L1043
    const result = await fetchSyncPost('/api/transactions', {
        "session":  siyuan.ws.app.appId,
        "app": siyuan.ws.app.appId,
        "transactions": [{
            "doOperations": [{
                    "action": "insertAttrViewBlock",
                    "avID": avId,
                    "previousID": "",
                    "srcs": srcs,
                    "blockID": dbBlockId
                },
                {
                    "action": "doUpdateUpdated",
                    "id": dbBlockId,
                    "data": nowTime
                }
            ],
            "undoOperations": [{
                    "action": "removeAttrViewBlock",
                    "srcIDs": dailynote_ids,
                    "avID": avId
                },
                {
                    "action": "doUpdateUpdated",
                    "id": dbBlockId,
                    "data": nowTime
                }
            ]
        }],
        "reqId": new Date().getTime()
    });

    // 错误返回
    if (result.code !== 0) {
        await fetchSyncPost('/api/notification/pushErrMsg', { "msg": `日记自动添加数据库失败,错误信息:${result.msg}`, "timeout": 7000 })
    }

    //成功返回结果

    //await fetchSyncPost('/api/notification/pushMsg', { "msg": `日记自动添加数据库成功:${dailynote_path}`, "timeout": 7000 })



    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 } : "";
        }
    }

    function formatDate(date) {
        var yy = date.getFullYear().toString();
        var mm = (date.getMonth() + 1).toString(); // 注意月份是从0开始的
        var dd = date.getDate().toString();
        var hh = date.getHours().toString();
        var ii = date.getMinutes().toString();
        var ss = date.getSeconds().toString();
        return yy + (mm[1] ? mm : '0' + mm[0]) + (dd[1] ? dd : '0' + dd[0]) +
            (hh[1] ? hh : '0' + hh[0]) + (ii[1] ? ii : '0' + ii[0]) +
            (ss[1] ? ss : '0' + ss[0]);
    }
}

})();


@5kyfkr
Copy link

5kyfkr commented Sep 26, 2024

用js片段简单实现了按alt+5创建或者打开日记,就可以自动添加到指定数据库

似乎只有alt+5能识别到,其他方式创建没识别到,不过也够用了,除了手机上,电脑上一般都是alt 5创建

@88250
Copy link
Member

88250 commented Sep 28, 2024

这个考虑通过插件实现吧,如果需要新增参数请告诉我们,谢谢。

@88250 88250 closed this as completed Sep 28, 2024
@88250 88250 added the Idea label Sep 28, 2024
@Achuan-2
Copy link
Member Author

好的,那请问剪藏添加到数据库有计划嘛?
#10824

@88250
Copy link
Member

88250 commented Sep 29, 2024 via email

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

4 participants