Skip to content

文章数据存储

存储一致性

简单明确的数据存储,鲁棒性更高。

  • 数据库:内部的数据结构一致(数据库写入或者更改时,必须满足规范的数据结构)
  • 前端:根节点存储的 files 数据结构一致(根节点都经过 Modal 处理,返回满足的文档类型,不同使用场景可以转换数据结构,但是不能修改根节点的文章数据结构)

数据来源

1、软件初始化,内置预览的文章(可控)

2、在线模式,从数据库下载的文章(可控)

3、离线模式,用户手动上传的文章(不可控,前后端需要规范)

所有的操作都是通过 model 规范化数据结构即可,如下

const generatorDefaultData = () => {
  return {
    files: [
      {
        id: "7hts",
        name: "text.md",
        detail:
          "this is test file.this is test file.this is test file.this is test file.",
        brief: "this is test file.",
        author: "Mike",
        size: 300,
        tag: "历史 推断",
        cover_photo:
          "https://bookcover.yuewen.com/qdbimg/349573/1037135031/90.webp",
        created_at: "",
        price: 100,
      },
    ],
  };
};
  • id:文章标识(唯一)
  • name: 文章标题(包括后缀名)
  • detail: 文章全部内容
  • brief:文章概要
  • author:文章作者,可选
  • size:文章字数(全文字符串的个数)
  • tag: 文章标签,可选
  • cover_photo: 文章封面图的图片链接,可选
  • created_at:文章创建时间,自动生成
  • price:文章价格,可选

数据展示

渲染文章时,根据不同类型的文章,渲染不同的阅读器

  • markdown 格式的文档,不支持分章节,直接显示全部内容
  • 代码格式的文档,默认按照代码解析器处理
  • txt 格式的文档,根据文档的长度,支持分章节,具体分章节部分,在渲染部分完成

历史版本管理(TODO)

需求:实际软件开发中,由于功能更迭,某些数据对象确实需要增减参数,那么已有的历史数据也需要正常处理。

前端可以使用版本管理方式,处理不同版本下的数据结构,后期可扩展性更高(符合实际需求),伪代码如下。

// 规范化文章内容
normalizeFile(file) {
  // 缺少文章或者缺少版本号,去掉这个数据
  if (!file || !file['version']) {
    file = null;
  }
  // 版本1的文章,使用版本1的函数处理
  else if (file['version'] === 1) {
    file = convert1(file);
  }
  // 版本2的文章,使用版本2的函数处理
  else if (file['version'] === 2) {
    file = convert2(file);
  }
  else {
    file = null;
  }
  return file;
}