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

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

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

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

  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 支撑。如果大家有什么好的解决方案,欢迎讨论指导,如果我的描述大家有疑惑,也欢迎指出~谢谢大家看到这里,感谢

  • 思源笔记

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

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

    19148 引用 • 72004 回帖 • 2 关注
  • Q&A

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

    6681 引用 • 29969 回帖 • 241 关注

相关帖子

欢迎来到这里!

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

注册 关于
请输入回帖内容 ...
    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 更新了该回帖
  • 其他回帖
  • localStorage 不会进行数据同步,需要数据同步的场景不要用。正如其他开发者提到的,建议使用文件读写 API,但是需要注意的是数据同步以后再去获取数据。

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

  • RenaEmiya

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

        var node = window.frameElement.parentElement.parentElement;
        var conf = node.getAttribute("custom-conf")
    
  • suka

    感谢大家 了解了并用上了 谢谢大家的回复

    1 回复
  • 查看全部回帖

推荐标签 标签

  • OpenStack

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

    10 引用 • 5 关注
  • Hexo

    Hexo 是一款快速、简洁且高效的博客框架,使用 Node.js 编写。

    21 引用 • 140 回帖 • 29 关注
  • Oracle

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

    103 引用 • 126 回帖 • 444 关注
  • 知乎

    知乎是网络问答社区,连接各行各业的用户。用户分享着彼此的知识、经验和见解,为中文互联网源源不断地提供多种多样的信息。

    10 引用 • 66 回帖
  • 房星科技

    房星网,我们不和没有钱的程序员谈理想,我们要让程序员又有理想又有钱。我们有雄厚的房地产行业线下资源,遍布昆明全城的 100 家门店、四千地产经纪人是我们坚实的后盾。

    6 引用 • 141 回帖 • 561 关注
  • GAE

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

    14 引用 • 42 回帖 • 699 关注
  • 自由行
    4 关注
  • BND

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

    107 引用 • 1281 回帖 • 26 关注
  • 30Seconds

    📙 前端知识精选集,包含 HTML、CSS、JavaScript、React、Node、安全等方面,每天仅需 30 秒。

    • 精选常见面试题,帮助您准备下一次面试
    • 精选常见交互,帮助您拥有简洁酷炫的站点
    • 精选有用的 React 片段,帮助你获取最佳实践
    • 精选常见代码集,帮助您提高打码效率
    • 整理前端界的最新资讯,邀您一同探索新世界
    488 引用 • 383 回帖 • 1 关注
  • SSL

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络连接进行加密。

    69 引用 • 190 回帖 • 487 关注
  • V2Ray
    1 引用 • 15 回帖
  • 黑曜石

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

    A second brain, for you, forever.

    10 引用 • 86 回帖
  • Hprose

    Hprose 是一款先进的轻量级、跨语言、跨平台、无侵入式、高性能动态远程对象调用引擎库。它不仅简单易用,而且功能强大。你无需专门学习,只需看上几眼,就能用它轻松构建分布式应用系统。

    9 引用 • 17 回帖 • 605 关注
  • Q&A

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

    6681 引用 • 29969 回帖 • 241 关注
  • Android

    Android 是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    333 引用 • 323 回帖 • 53 关注
  • 七牛云

    七牛云是国内领先的企业级公有云服务商,致力于打造以数据为核心的场景化 PaaS 服务。围绕富媒体场景,七牛先后推出了对象存储,融合 CDN 加速,数据通用处理,内容反垃圾服务,以及直播云服务等。

    26 引用 • 221 回帖 • 153 关注
  • TextBundle

    TextBundle 文件格式旨在应用程序之间交换 Markdown 或 Fountain 之类的纯文本文件时,提供更无缝的用户体验。

    1 引用 • 2 回帖 • 49 关注
  • Wide

    Wide 是一款基于 Web 的 Go 语言 IDE。通过浏览器就可以进行 Go 开发,并有代码自动完成、查看表达式、编译反馈、Lint、实时结果输出等功能。

    欢迎访问我们运维的实例: https://wide.b3log.org

    30 引用 • 218 回帖 • 613 关注
  • 爬虫

    网络爬虫(Spider、Crawler),是一种按照一定的规则,自动地抓取万维网信息的程序。

    106 引用 • 275 回帖
  • 负能量

    上帝为你关上了一扇门,然后就去睡觉了....努力不一定能成功,但不努力一定很轻松 (° ー °〃)

    86 引用 • 1201 回帖 • 450 关注
  • IBM

    IBM(国际商业机器公司)或万国商业机器公司,简称 IBM(International Business Machines Corporation),总公司在纽约州阿蒙克市。1911 年托马斯·沃森创立于美国,是全球最大的信息技术和业务解决方案公司,拥有全球雇员 30 多万人,业务遍及 160 多个国家和地区。

    16 引用 • 53 回帖 • 123 关注
  • Swagger

    Swagger 是一款非常流行的 API 开发工具,它遵循 OpenAPI Specification(这是一种通用的、和编程语言无关的 API 描述规范)。Swagger 贯穿整个 API 生命周期,如 API 的设计、编写文档、测试和部署。

    26 引用 • 35 回帖 • 12 关注
  • 数据库

    据说 99% 的性能瓶颈都在数据库。

    331 引用 • 614 回帖
  • 链滴

    链滴是一个记录生活的地方。

    记录生活,连接点滴

    133 引用 • 3655 回帖
  • 脑图

    脑图又叫思维导图,是表达发散性思维的有效图形思维工具 ,它简单却又很有效,是一种实用性的思维工具。

    21 引用 • 58 回帖
  • Scala

    Scala 是一门多范式的编程语言,集成面向对象编程和函数式编程的各种特性。

    13 引用 • 11 回帖 • 110 关注
  • HHKB

    HHKB 是富士通的 Happy Hacking 系列电容键盘。电容键盘即无接点静电电容式键盘(Capacitive Keyboard)。

    5 引用 • 74 回帖 • 415 关注