內容模型

本頁內容

你的內容模型是網站儲存的集合和欄位的集合。你可以在管理面板或使用 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" });

查看種子檔案格式以取得完整架構。

下一步