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

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

前文:添加顶栏按钮,随机打开文档(随机漫游) - 链滴 (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
);


  • 思源笔记

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

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

    28448 引用 • 119792 回帖

相关帖子

欢迎来到这里!

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

注册 关于
请输入回帖内容 ...
  • 大佬,现在插件系统开发出来了,可以开发一个随机漫游文档的插件吗?

    1 回复
  • 其他回帖
  • image.png

    我创建好了呀

    1 回复
  • lwt586361 2 评论

    哦,你 SQL 查不到东西,你得改成你自己的,或者你把那个 id 的条件去掉吧

    去哪一块呀,代码小白不太懂 😂
    ilovesiyuan
    @ilovesiyuan 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()"; 这个 and path like '/20211209181026-i3s9wiq%'可以去掉,建议了解下 SQL 基础
    lwt586361
  • 查看全部回帖

推荐标签 标签

  • SVN

    SVN 是 Subversion 的简称,是一个开放源代码的版本控制系统,相较于 RCS、CVS,它采用了分支管理系统,它的设计目标就是取代 CVS。

    29 引用 • 98 回帖 • 694 关注
  • 设计模式

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

    201 引用 • 120 回帖 • 1 关注
  • 反馈

    Communication channel for makers and users.

    120 引用 • 906 回帖 • 307 关注
  • 快应用

    快应用 是基于手机硬件平台的新型应用形态;标准是由主流手机厂商组成的快应用联盟联合制定;快应用标准的诞生将在研发接口、能力接入、开发者服务等层面建设标准平台;以平台化的生态模式对个人开发者和企业开发者全品类开放。

    15 引用 • 127 回帖
  • WordPress

    WordPress 是一个使用 PHP 语言开发的博客平台,用户可以在支持 PHP 和 MySQL 数据库的服务器上架设自己的博客。也可以把 WordPress 当作一个内容管理系统(CMS)来使用。WordPress 是一个免费的开源项目,在 GNU 通用公共许可证(GPLv2)下授权发布。

    46 引用 • 114 回帖 • 140 关注
  • SMTP

    SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。

    4 引用 • 18 回帖 • 663 关注
  • jsDelivr

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

    5 引用 • 31 回帖 • 120 关注
  • 支付宝

    支付宝是全球领先的独立第三方支付平台,致力于为广大用户提供安全快速的电子支付/网上支付/安全支付/手机支付体验,及转账收款/水电煤缴费/信用卡还款/AA 收款等生活服务应用。

    29 引用 • 347 回帖 • 2 关注
  • Oracle

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

    107 引用 • 127 回帖 • 329 关注
  • Laravel

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

    19 引用 • 23 回帖 • 770 关注
  • Vditor

    Vditor 是一款浏览器端的 Markdown 编辑器,支持所见即所得、即时渲染(类似 Typora)和分屏预览模式。它使用 TypeScript 实现,支持原生 JavaScript、Vue、React 和 Angular。

    386 引用 • 1892 回帖
  • 旅游

    希望你我能在旅途中找到人生的下一站。

    105 引用 • 908 回帖
  • Dubbo

    Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,是 [阿里巴巴] SOA 服务化治理方案的核心框架,每天为 2,000+ 个服务提供 3,000,000,000+ 次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。

    60 引用 • 82 回帖 • 636 关注
  • 阿里巴巴

    阿里巴巴网络技术有限公司(简称:阿里巴巴集团)是以曾担任英语教师的马云为首的 18 人,于 1999 年在中国杭州创立,他们相信互联网能够创造公平的竞争环境,让小企业通过创新与科技扩展业务,并在参与国内或全球市场竞争时处于更有利的位置。

    43 引用 • 221 回帖 • 11 关注
  • PostgreSQL

    PostgreSQL 是一款功能强大的企业级数据库系统,在 BSD 开源许可证下发布。

    23 引用 • 22 回帖
  • Folo

    Folo 是一个 RSS 阅读和信息聚合应用,整合多种内容源到统一时间线。

    项目地址:https://github.com/RSSNext/Folo

    1 引用 • 3 回帖 • 2 关注
  • jsoup

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

    6 引用 • 1 回帖 • 516 关注
  • 印象笔记
    3 引用 • 21 回帖 • 2 关注
  • CSS

    CSS(Cascading Style Sheet)“层叠样式表”是用于控制网页样式并允许将样式信息与网页内容分离的一种标记性语言。

    200 引用 • 545 回帖 • 2 关注
  • RemNote
    2 引用 • 16 回帖 • 39 关注
  • SEO

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

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

    Notion - The all-in-one workspace for your notes, tasks, wikis, and databases.

    10 引用 • 80 回帖
  • Ruby

    Ruby 是一种开源的面向对象程序设计的服务器端脚本语言,在 20 世纪 90 年代中期由日本的松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)设计并开发。在 Ruby 社区,松本也被称为马茨(Matz)。

    7 引用 • 31 回帖 • 298 关注
  • Netty

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

    49 引用 • 33 回帖 • 63 关注
  • Mac

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

    168 引用 • 598 回帖
  • frp

    frp 是一个可用于内网穿透的高性能的反向代理应用,支持 TCP、UDP、 HTTP 和 HTTPS 协议。

    17 引用 • 7 回帖 • 1 关注
  • C++

    C++ 是在 C 语言的基础上开发的一种通用编程语言,应用广泛。C++ 支持多种编程范式,面向对象编程、泛型编程和过程化编程。

    110 引用 • 153 回帖