随机漫游文档加入渐进的想法实现

本贴最后更新于 1053 天前,其中的信息可能已经事过景迁

前文:添加顶栏按钮,随机打开文档(随机漫游) - 链滴 (ld246.com)

增加了个后台文件存储已查看的文档 id,初步条件是 7 天内不会刷到重复的文档,我想法是基于随机文档,通过 dn 进一步将文档简练和记忆使用,实现较粗糙,慢慢优化吧

使用该代码块,需要先创建 /data/assets/extConfig/randomList.json 文件,初始文件内容 [] 即可


// 请求函数
function request(url, data = null, method = "POST") {
    return new Promise((resolve, reject) => {
        if (method.toUpperCase() == "POST") {
            fetch(url, {
                method: "POST",
                headers: { "Content-Type": "application/json" },
                body: JSON.stringify(data),
            })
                .then(
                    (data) => resolve(data.json()),
                    (error) => {
                        reject(error);
                    }
                )
                .catch((err) => {
                    console.error("请求失败:", err);
                });
        }
    });
}

function 获取数组里指定元素(id, arr) {
  for (let r in arr) {
    // console.log(12111,r,arr[r])
    if (arr[r].id == id) {
      return arr[r];
    }
  }
}

// 打开随机文档,编辑sql选定范围
async function randomNote() {

    let sql =
    "select distinct root_id from blocks where type='d' and path like '/20211209181026-i3s9wiq%' and fcontent not in ('2021','2022','2023','01','02','03','04','05','06','07','08','09','10','11','12','收集箱【inbox】','Index') order by random()";
  // 查出SQL结果
  let queryRes = await request("/api/query/sql", { stmt: sql });

  //   获取当天日期
  let nowDate = new Date();
  let today =nowDate.getFullYear() +"-" +(nowDate.getMonth() + 1) +"-" +nowDate.getDate();

  let 所有待查看id = [];
  if (queryRes) {
    // let index = Math.floor(Math.random() * queryRes.data.length);
    // console.log(0,queryRes.data[0].root_id)
    for (let r in queryRes.data) {
      // console.log(r)
      所有待查看id.push(queryRes.data[r].root_id);
    }
    console.log(所有待查看id);
    // window.open("siyuan://blocks/" + res.data[index].root_id);
  }

  // 获取已查看ID
  let 已查看数据 = await fetch(`/assets/extConfig/randomList.json`)
    .then(async (res) => {
      if (res.status == 404) {
        alert("需创建/assets/extConfig/randomList.json文件");
      } else {
        return await res.json();
      }
    })
    .then(async (e) => {
      return e;
    });

  //   1. 查出的列表为随机排序的所有id,对比已查看的,无则在已查看里新增ID和日期
  //   2. 如果有,判断时间值,暂定,如果在7天以上的,还是打开
  let 所有已查看id = 已查看数据.map((e) => {
    return e.id;
  });

//   console.log("所有已查看id", 所有已查看id, 所有已查看id.indexOf("111") == -1);

  for (let index in 所有待查看id) {
    let 待查看id = 所有待查看id[index]
    if (所有已查看id.indexOf(待查看id) == -1) {
      // =-1表示不包含
      // 打开文档,添加id
      已查看数据.push({ id: 待查看id, rq: today });
      window.open("siyuan://blocks/" + 待查看id);
      break;
    } else if (
      (new Date(today) -new Date(获取数组里指定元素(待查看id, 已查看数据).rq)) /(1000 * 60 * 60 * 24) >=7 ) {
      // 打开文档,修改id
      for (let r in 已查看数据) {
        if (已查看数据[r].id == 待查看id) {
          已查看数据[r].rq = today;
        }
      }
      window.open("siyuan://blocks/" + 待查看id);
      break;
    }
  }
  console.log("修改过后", 已查看数据);

  //   将已查看数据写入到文件中

  let saveDataBlob = new Blob([JSON.stringify(已查看数据),],{ type: "application/json" });
  let 数据文件 = new File([saveDataBlob], "randomList.json", {lastModified: Date.now(),});
  let data = new FormData();
  data.append("path", "/data/assets/extConfig/randomList.json");
  data.append("file", 数据文件);
  // let filepath = ""
  await fetch("/api/file/putFile", {
    body: data,
    method: "POST",
    headers: {  },
  }).then(function (response) {
    console.log(response);
    return response.json();
  });
  
}

// 添加一个按钮
const barMode = document.getElementById("barMode");
barMode.insertAdjacentHTML(
    "beforebegin",
    '<div id="randomNotes" class="toolbar__item b3-tooltips b3-tooltips__se" aria-label="随机漫游" ></div>'
);
const randomNotesBtn = document.getElementById("randomNotes");
randomNotesBtn.style.width = "auto";
const randomNotesIcon = `<svg t="1674130669751" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4526" width="200" height="200"><path d="M928 160H96a32 32 0 0 0-32 32v672a32 32 0 0 0 32 32h832a32 32 0 0 0 32-32V192a32 32 0 0 0-32-32z m-32 672H128V224h768v608z" p-id="4527" fill="#9aa0a6"></path><path d="M230.592 448.096H544a32 32 0 1 0 0-64H230.592a32 32 0 0 0 0 64zM230.592 640.096H544a32 32 0 1 0 0-64H230.592a32 32 0 1 0 0 64zM768 704a32 32 0 0 0 32-32V350.016a32 32 0 1 0-64 0V672a32 32 0 0 0 32 32z" p-id="4528" fill="#9aa0a6"></path></svg>`;
randomNotesBtn.innerHTML = randomNotesIcon;
randomNotesBtn.addEventListener(
    "click",
    (e) => {
        randomNote();
        e.stopPropagation();
        e.preventDefault();
        //input data
        // var cardData={id:'1'},
        // grade=-1,//Grade `-1` means learn new card,and `0, 1, 2` means review old card (0:forget 1:remember 2:grasp).
        // globalData=null;

        // var outputData = fsrs(cardData,grade,globalData)//Return {cardData,globalData}. You can save this output data and use it as input data the next time you update grade.

        // console.log(outputData)
    },
    true
);


  • 思源笔记

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

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

    28441 引用 • 119746 回帖

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • gRpc
    11 引用 • 9 回帖 • 116 关注
  • Openfire

    Openfire 是开源的、基于可拓展通讯和表示协议 (XMPP)、采用 Java 编程语言开发的实时协作服务器。Openfire 的效率很高,单台服务器可支持上万并发用户。

    6 引用 • 7 回帖 • 133 关注
  • 安全

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

    202 引用 • 818 回帖
  • SEO

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

    36 引用 • 200 回帖 • 54 关注
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3206 引用 • 8217 回帖
  • NGINX

    NGINX 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 NGINX 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。

    316 引用 • 547 回帖 • 4 关注
  • Oracle

    Oracle(甲骨文)公司,全称甲骨文股份有限公司(甲骨文软件系统有限公司),是全球最大的企业级软件公司,总部位于美国加利福尼亚州的红木滩。1989 年正式进入中国市场。2013 年,甲骨文已超越 IBM,成为继 Microsoft 后全球第二大软件公司。

    107 引用 • 127 回帖 • 329 关注
  • 服务

    提供一个服务绝不仅仅是简单的把硬件和软件累加在一起,它包括了服务的可靠性、服务的标准化、以及对服务的监控、维护、技术支持等。

    41 引用 • 24 回帖 • 2 关注
  • 黑曜石

    黑曜石是一款强大的知识库工具,支持本地 Markdown 文件编辑,支持双向链接和关系图。

    A second brain, for you, forever.

    34 引用 • 333 回帖
  • Jenkins

    Jenkins 是一套开源的持续集成工具。它提供了非常丰富的插件,让构建、部署、自动化集成项目变得简单易用。

    54 引用 • 37 回帖
  • ActiveMQ

    ActiveMQ 是 Apache 旗下的一款开源消息总线系统,它完整实现了 JMS 规范,是一个企业级的消息中间件。

    19 引用 • 13 回帖 • 706 关注
  • 书籍

    宋真宗赵恒曾经说过:“书中自有黄金屋,书中自有颜如玉。”

    85 引用 • 414 回帖
  • Electron

    Electron 基于 Chromium 和 Node.js,让你可以使用 HTML、CSS 和 JavaScript 构建应用。它是一个由 GitHub 及众多贡献者组成的活跃社区共同维护的开源项目,兼容 Mac、Windows 和 Linux,它构建的应用可在这三个操作系统上面运行。

    16 引用 • 143 回帖 • 6 关注
  • JVM

    JVM(Java Virtual Machine)Java 虚拟机是一个微型操作系统,有自己的硬件构架体系,还有相应的指令系统。能够识别 Java 独特的 .class 文件(字节码),能够将这些文件中的信息读取出来,使得 Java 程序只需要生成 Java 虚拟机上的字节码后就能在不同操作系统平台上进行运行。

    180 引用 • 120 回帖 • 1 关注
  • Quicker

    Quicker 您的指尖工具箱!操作更少,收获更多!

    39 引用 • 170 回帖
  • Laravel

    Laravel 是一套简洁、优雅的 PHP Web 开发框架。它采用 MVC 设计,是一款崇尚开发效率的全栈框架。

    19 引用 • 23 回帖 • 769 关注
  • 持续集成

    持续集成(Continuous Integration)是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。

    15 引用 • 7 回帖
  • 千千插件

    千千块(自定义块 css 和 js)
    可以用 ai 提示词来无限创作思源笔记

    32 引用 • 69 回帖 • 1 关注
  • CongSec

    本标签主要用于分享网络空间安全专业的学习笔记

    1 引用 • 1 回帖 • 55 关注
  • danl
    216 关注
  • Mobi.css

    Mobi.css is a lightweight, flexible CSS framework that focus on mobile.

    1 引用 • 6 回帖 • 799 关注
  • 思源笔记

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

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

    28441 引用 • 119746 回帖
  • 心情

    心是产生任何想法的源泉,心本体会陷入到对自己本体不能理解的状态中,因为心能产生任何想法,不能分出对错,不能分出自己。

    59 引用 • 369 回帖 • 2 关注
  • QQ

    1999 年 2 月腾讯正式推出“腾讯 QQ”,在线用户由 1999 年的 2 人(马化腾和张志东)到现在已经发展到上亿用户了,在线人数超过一亿,是目前使用最广泛的聊天软件之一。

    45 引用 • 557 回帖
  • OpenStack

    OpenStack 是一个云操作系统,通过数据中心可控制大型的计算、存储、网络等资源池。所有的管理通过前端界面管理员就可以完成,同样也可以通过 Web 接口让最终用户部署资源。

    10 引用 • 9 关注
  • RYMCU

    RYMCU 致力于打造一个即严谨又活泼、专业又不失有趣,为数百万人服务的开源嵌入式知识学习交流平台。

    4 引用 • 6 回帖 • 56 关注
  • H2

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

    11 引用 • 54 回帖 • 691 关注