内容模型

本页内容

你的内容模型是网站存储的集合和字段的集合。你可以在管理面板或使用 CLI 定义它,随时更改它,并可选择从中生成 TypeScript 类型。本页介绍如何使用它。

集合和字段

集合是一种内容类型(文章、产品、作者)。每个集合都有你定义的字段(标题、正文、价格)。每个条目还具有 EmDash 为你管理的系统字段。

你可以在管理面板的 Content Types 下以可视化方式创建和编辑集合和字段,或使用 CLI。更改立即生效,非开发人员也可以执行此操作。

系统字段

除了你定义的字段外,每个条目都有这些字段,始终存在:

字段用途
id稳定的唯一标识符
slugURL 安全的标识符,每个语言环境唯一
statusdraftpublishedscheduled
author_id创建条目的用户
created_at / updated_at / published_at时间戳
deleted_at软删除时设置;保留行
version每次保存时递增

删除条目是软删除:可以恢复。

随时更改模型

你可以随时通过管理面板或 CLI 在活动集合上添加、重命名、删除或重新设置字段类型。现有内容会被保留。

TypeScript 类型

类型生成是可选的,但建议使用。从当前模型生成类型:

npx emdash types

这会写入 .emdash/types.ts,其中包含每个集合的接口和类型化的查询重载,因此 getEmDashCollection("posts") 会返回完全类型化的条目:

export interface Post {
	title: string;
	content: PortableTextBlock[];
	excerpt?: string;
}

declare module "emdash" {
	export function getEmDashCollection(
		type: "posts",
	): Promise<{ entries: ContentEntry<Post>[]; error?: Error }>;
}

更改模型后重新运行该命令以保持类型同步。

工作流程

两种工作流程都会更改同一模型。

非开发人员使用管理面板:

  1. 在管理面板中打开 Content Types
  2. 点击 Add Collection
  3. 使用可视化构建器定义字段。
  4. 开始创建内容。

开发人员可以使用 CLI 生成类型并在环境之间移动模型:

npx emdash types                     # 生成 TypeScript 类型
npx emdash export-seed > seed.json   # 将模型导出为种子文件

种子文件

种子文件是集合、分类法和菜单的 JSON 描述。模板附带一个,你可以导出自己的用于版本控制或设置另一个环境。

{
	"version": "1",
	"collections": [
		{
			"slug": "posts",
			"label": "Blog Posts",
			"labelSingular": "Post",
			"supports": ["drafts", "revisions", "preview"],
			"fields": [
				{ "slug": "title", "type": "string", "required": true },
				{ "slug": "content", "type": "portableText" }
			]
		}
	],
	"taxonomies": [{ "name": "category", "label": "Categories", "hierarchical": true }],
	"menus": [{ "name": "primary", "label": "Primary Navigation" }]
}

应用种子是幂等的,因此可以安全地重新运行:

import { applySeed, validateSeed } from "emdash/seed";
import seedData from "./.emdash/seed.json";

const { valid, errors } = validateSeed(seedData);
await applySeed(db, seedData, { includeContent: true, onConflict: "skip" });

查看种子文件格式以获取完整架构。

下一步