文章数据存储
文章数据存储¶
存储一致性¶
统一且明确的数据结构有助于提高数据处理的可靠性。
- 数据库:写入或更新时遵守约定的数据结构。
- 前端:根状态中的
files使用统一的数据结构。数据应经过 model 层规范化;不同场景可以派生视图数据,但不应直接改变根状态中的文章结构。
数据来源¶
1、软件初始化,内置预览的文章(可控)
2、在线模式,从数据库下载的文章(可控)
- 离线模式:用户手动上传的文章(来源不可控,需要校验并规范化)。
可以通过 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;
}