你的内容模型是网站存储的集合和字段的集合。你可以在管理面板或使用 CLI 定义它,随时更改它,并可选择从中生成 TypeScript 类型。本页介绍如何使用它。
集合和字段
集合是一种内容类型(文章、产品、作者)。每个集合都有你定义的字段(标题、正文、价格)。每个条目还具有 EmDash 为你管理的系统字段。
你可以在管理面板的 Content Types 下以可视化方式创建和编辑集合和字段,或使用 CLI。更改立即生效,非开发人员也可以执行此操作。
系统字段
除了你定义的字段外,每个条目都有这些字段,始终存在:
| 字段 | 用途 |
|---|---|
id | 稳定的唯一标识符 |
slug | URL 安全的标识符,每个语言环境唯一 |
status | draft、published 或 scheduled |
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 }>;
}
更改模型后重新运行该命令以保持类型同步。
工作流程
两种工作流程都会更改同一模型。
非开发人员使用管理面板:
- 在管理面板中打开 Content Types。
- 点击 Add Collection。
- 使用可视化构建器定义字段。
- 开始创建内容。
开发人员可以使用 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" });
查看种子文件格式以获取完整架构。