请问思源挂件数据持久化有哪些解决方案呢?有官方的存储方案吗?

本贴最后更新于 687 天前,其中的信息可能已经水流花落

最近在开发一款挂件,想要永久存储用户的配置数据到本地,发现数据持久化让我比较头疼

想了几种,感觉都有缺点:

  1. localStorage: 这个我暂时没用过,因为我记得在某版的思源发布后,有挂件作者反映 localstorage 不好用还是怎么的(存疑),而且也不符合我的使用场景,因为我要保存的是用户的配置数据,需要一直保存,且多端同步保存

    1. 官方我看到有如下 api:(没研究过 go 语言,还不知道该传啥参数)

      ginServer.Handle("POST","/api/storage/setLocalStorage",model.CheckAuth,setLocalStorage)
      ginServer.Handle("POST", "/api/storage/getLocalStorage", model.CheckAuth, getLocalStorage)
      ginServer.Handle("POST", "/api/storage/setLocalStorageVal", model.CheckAuth, setLocalStorageVal)
      ginServer.Handle("POST", "/api/storage/removeLocalStorageVal", model.CheckAuth, removeLocalStorageVal)2.
  2. 存储到特定文档或者某个特定的 block 的属性中,这种也不太好,因为万一那个文档或者 block,用户不再需要,删除了,那数据就清空了。(此方案的衍生方案:向特定的文档写入 html 片段,数据放在 html 片段 的 dataset 属性上,但是如果此 html 片段被误删,那配置文件也就没了)

  3. 引导用户新建一个设置文档,在此设置文档的属性上面或者文档内的特定 block 的属性上存储数据,此方案的优点是:

    1.可以确保用户不会轻易删除自己的配置,即使误删,也有官方的回收站做背书,数据比较不容易丢;

    2.可以在文档内的不同 block 的属性上存入数据,以此达到,一个设置文档,管理多个挂件的数据(当然,需要各个挂件的作者都把数据存入这个文档内的特定 block 上)

    3.可以开发一个挂件,可视化编辑此文档中存储的各个挂件的配置,(模板作者也可以存储数据到此文档);

    4.如果要删除某个挂件的配置,只需要删除存储了那个挂件配置的 block 即可,可视化操作(缺点是 block 太容易删除了,都没有弹框确认,或许可以官方下场,哈哈哈哈);
    5.用户掌控所有数据,包括挂件的,完美契合思源笔记的设计哲学;

    缺点:

    1.太有侵入性了(大胆!小小挂件,竟然胆敢让本王在朕的数字花园新建一个文档!)

    2.存储的数据单一,只能存储文本类的配置数据(但是大多数挂件似乎也不太需要更高级的数据类型了?反正我不需要)

    3.删除挂件,需要用户手动删除相关 block,有误删成其它 block 的可能性

  4. 思源官方提供 api,将数据存储在用户的本地数据目录下(或许已经有了?只是我不知道?有的话请大佬们告诉我)

  5. 将数据存储在某个挂件本身挂载的 block 的属性上:这种是个人感觉挺好的方法了 😄

    1. 优点:当用户不再需要这个挂件了,直接移除即可,相应的配置数据也一并移除了,没有额外的操作,也没有垃圾数据残留;并且多个相同挂件的数据互不影响,方便隔离
    2. 缺点:目前没有找到啥 api 能在挂件内准确的获取该挂件所在 block 的 id

总结:还有一些其它的基于云端的方案,都被我率先放弃,毕竟本地优先,个人认为,上述方案 4 和 5 是我能想到的比较不错的方案,但是都需要额外的官方 api 支撑。如果大家有什么好的解决方案,欢迎讨论指导,如果我的描述大家有疑惑,也欢迎指出~谢谢大家看到这里,感谢

  • 思源笔记

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

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

    22929 引用 • 92191 回帖 • 1 关注
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    8405 引用 • 38303 回帖 • 156 关注

相关帖子

欢迎来到这里!

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

注册 关于
请输入回帖内容 ...
    1. 我看 HbuilderX 主题里面用了以下代码(/conf/appereance/themes/HBuilderX-light/theme.js);补充 API 文档-获取/写入文件
    写入文件("/data/widgets/HBuilderX-Light.config.json", JSON.stringify(window.HBuilderXLight.config, undefined, 4), (a) => { funs() });
    
       async function 写入文件(path, filedata, then = null, obj = null, isDir = false, modTime = Date.now()) {
       
           let blob = new Blob([filedata]);
           let file = new File([blob], path.split('/').pop());
           let formdata = new FormData();
           formdata.append("path", path);
           formdata.append("file", file);
           formdata.append("isDir", isDir);
           formdata.append("modTime", modTime);
           await fetch(
               "/api/file/putFile", {
               body: formdata,
               method: "POST",
               headers: {
                   Authorization: `Token ""`,
               },
           }).then((v) => {
               setTimeout(() => {
                   if (then) then(obj);
               }, 200)
           });
       }
    
    
    
    async function 获取文件(path, then = null, obj = null) {
        let url = '/api/file/getFile';
        await 向思源请求数据(url, {
            path: path
        }).then((v) => {
            if (then) then(v, obj);
        });
    }
    
    1. 我不了解 api,我一般用这个从页面上获取挂件 id:window.frameElement.parentElement.parentElement.dataset.nodeId;

    `

    1 操作
    Undii 在 2023-01-31 21:12:00 更新了该回帖
  • 其他回帖
  • 你好用的哪种方案哈,想了解下挂件的存储,有个之前的自己写的插件想改成挂件

    1 回复
  • RenaEmiya

    嗯确实直接获取挂件块,读挂件块的属性就行

        var node = window.frameElement.parentElement.parentElement;
        var conf = node.getAttribute("custom-conf")
    
  • localStorage 不会进行数据同步,需要数据同步的场景不要用。正如其他开发者提到的,建议使用文件读写 API,但是需要注意的是数据同步以后再去获取数据。

    目前启动时会进行首次数据同步,但是启动时的同步只是获取变更列表,并不会实际同步数据,获取到变更列表后 7s 才会再次发起实际数据同步请求。这段时间内我们会锁定待变更的文档以防止用户编辑后产生冲突,但是这个逻辑目前尚未推广到更通用的场景上,可能还需要和大家讨论一下这里的设计。

  • 查看全部回帖

推荐标签 标签

  • 新人

    让我们欢迎这对新人。哦,不好意思说错了,让我们欢迎这位新人!
    新手上路,请谨慎驾驶!

    52 引用 • 228 回帖 • 1 关注
  • 开源中国

    开源中国是目前中国最大的开源技术社区。传播开源的理念,推广开源项目,为 IT 开发者提供了一个发现、使用、并交流开源技术的平台。目前开源中国社区已收录超过两万款开源软件。

    7 引用 • 86 回帖
  • 尊园地产

    昆明尊园房地产经纪有限公司,即:Kunming Zunyuan Property Agency Company Limited(简称“尊园地产”)于 2007 年 6 月开始筹备,2007 年 8 月 18 日正式成立,注册资本 200 万元,公司性质为股份经纪有限公司,主营业务为:代租、代售、代办产权过户、办理银行按揭、担保、抵押、评估等。

    1 引用 • 22 回帖 • 770 关注
  • Openfire

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

    6 引用 • 7 回帖 • 100 关注
  • SendCloud

    SendCloud 由搜狐武汉研发中心孵化的项目,是致力于为开发者提供高质量的触发邮件服务的云端邮件发送平台,为开发者提供便利的 API 接口来调用服务,让邮件准确迅速到达用户收件箱并获得强大的追踪数据。

    2 引用 • 8 回帖 • 485 关注
  • FreeMarker

    FreeMarker 是一款好用且功能强大的 Java 模版引擎。

    23 引用 • 20 回帖 • 464 关注
  • 微信

    腾讯公司 2011 年 1 月 21 日推出的一款手机通讯软件。用户可以通过摇一摇、搜索号码、扫描二维码等添加好友和关注公众平台,同时可以将自己看到的精彩内容分享到微信朋友圈。

    132 引用 • 795 回帖
  • V2EX

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

    17 引用 • 236 回帖 • 316 关注
  • Swift

    Swift 是苹果于 2014 年 WWDC(苹果开发者大会)发布的开发语言,可与 Objective-C 共同运行于 Mac OS 和 iOS 平台,用于搭建基于苹果平台的应用程序。

    36 引用 • 37 回帖 • 535 关注
  • C++

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

    107 引用 • 153 回帖 • 1 关注
  • JVM

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

    180 引用 • 120 回帖 • 2 关注
  • 安全

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

    200 引用 • 816 回帖
  • H2

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

    11 引用 • 54 回帖 • 652 关注
  • NGINX

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

    313 引用 • 547 回帖
  • SQLServer

    SQL Server 是由 [微软] 开发和推广的关系数据库管理系统(DBMS),它最初是由 微软、Sybase 和 Ashton-Tate 三家公司共同开发的,并于 1988 年推出了第一个 OS/2 版本。

    21 引用 • 31 回帖 • 3 关注
  • 区块链

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

    91 引用 • 751 回帖
  • GAE

    Google App Engine(GAE)是 Google 管理的数据中心中用于 WEB 应用程序的开发和托管的平台。2008 年 4 月 发布第一个测试版本。目前支持 Python、Java 和 Go 开发部署。全球已有数十万的开发者在其上开发了众多的应用。

    14 引用 • 42 回帖 • 780 关注
  • Sphinx

    Sphinx 是一个基于 SQL 的全文检索引擎,可以结合 MySQL、PostgreSQL 做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。

    1 引用 • 221 关注
  • 面试

    面试造航母,上班拧螺丝。多面试,少加班。

    325 引用 • 1395 回帖
  • 单点登录

    单点登录(Single Sign On)是目前比较流行的企业业务整合的解决方案之一。SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

    9 引用 • 25 回帖 • 1 关注
  • MyBatis

    MyBatis 本是 Apache 软件基金会 的一个开源项目 iBatis,2010 年这个项目由 Apache 软件基金会迁移到了 google code,并且改名为 MyBatis ,2013 年 11 月再次迁移到了 GitHub。

    170 引用 • 414 回帖 • 384 关注
  • BND

    BND(Baidu Netdisk Downloader)是一款图形界面的百度网盘不限速下载器,支持 Windows、Linux 和 Mac,详细介绍请看这里

    107 引用 • 1281 回帖 • 34 关注
  • 职场

    找到自己的位置,萌新烦恼少。

    127 引用 • 1706 回帖
  • 小薇

    小薇是一个用 Java 写的 QQ 聊天机器人 Web 服务,可以用于社群互动。

    由于 Smart QQ 从 2019 年 1 月 1 日起停止服务,所以该项目也已经停止维护了!

    34 引用 • 467 回帖 • 747 关注
  • RIP

    愿逝者安息!

    8 引用 • 92 回帖 • 363 关注
  • Firefox

    Mozilla Firefox 中文俗称“火狐”(正式缩写为 Fx 或 fx,非正式缩写为 FF),是一个开源的网页浏览器,使用 Gecko 排版引擎,支持多种操作系统,如 Windows、OSX 及 Linux 等。

    8 引用 • 30 回帖 • 411 关注
  • SMTP

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

    4 引用 • 18 回帖 • 624 关注