Skip to content

文章数据存储

文章数据存储

存储一致性

统一且明确的数据结构有助于提高数据处理的可靠性。

  • 数据库:写入或更新时遵守约定的数据结构。
  • 前端:根状态中的 files 使用统一的数据结构。数据应经过 model 层规范化;不同场景可以派生视图数据,但不应直接改变根状态中的文章结构。

数据来源

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

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

  1. 离线模式:用户手动上传的文章(来源不可控,需要校验并规范化)。

可以通过 model 层将不同来源的数据规范化为统一结构。以下为示意数据:

const generatorDefaultData = () => {
  return {
    files: [
      {
        version: 2,
        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 文档:可根据内容拆分章节;拆分逻辑由阅读器处理。

历史版本管理

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

如果持久化数据结构发生变化,可以通过版本号和迁移函数兼容历史数据。以下为伪代码,示例中的转换函数需要由项目实现:

// 规范化文章内容
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;
}