集合与字段

本页内容

集合(collection)是一种内容类型(文章、页面、产品)。它的字段定义设置每个条目的数据结构。

创建集合

通过管理面板的内容类型创建集合。每个集合具有以下属性:

EmDash内容类型展示页面、文章和自定义集合及其功能
属性描述
slugURL安全标识符(例如 postsproducts)
label显示名称(例如”博客文章”)
labelSingular单数形式(例如”文章”)
description编辑者的可选描述
icon管理侧边栏的Lucide图标名称
supports草稿、修订、预览、计划、搜索、SEO等功能

集合功能

创建集合时,启用您需要的功能:

功能描述
drafts启用草稿/已发布工作流
revisions通过版本快照跟踪内容历史
preview为草稿内容生成签名预览URL
scheduling安排在未来日期发布内容

以下集合启用了所有四项功能:

{
  slug: "posts",
  label: "Blog Posts",
  labelSingular: "Post",
  supports: ["drafts", "revisions", "preview", "scheduling"]
}

字段类型

EmDash支持16种字段类型,这些类型映射到SQLite列类型。

文本字段

string

短文本输入。映射到TEXT列。

{ slug: "title", type: "string", label: "Title" }

text

多行文本区域。映射到TEXT列。

{ slug: "excerpt", type: "text", label: "Excerpt" }

slug

URL安全slug字段。映射到TEXT列。

{ slug: "handle", type: "slug", label: "URL Handle" }

富内容

portableText

富文本编辑器(TipTap/ProseMirror)。以JSON存储。

{ slug: "content", type: "portableText", label: "Content" }

Portable Text是一种基于块的格式,在不嵌入HTML的情况下保留结构。

json

任意JSON数据。以JSON存储。

{ slug: "metadata", type: "json", label: "Custom Metadata" }

数字

number

十进制数。映射到REAL列。

{ slug: "price", type: "number", label: "Price" }

integer

整数。映射到INTEGER列。

{ slug: "quantity", type: "integer", label: "Stock Quantity" }

布尔值和日期

boolean

真/假切换。映射到INTEGER(0/1)。

{ slug: "featured", type: "boolean", label: "Featured Post" }

datetime

日期和时间选择器。以ISO 8601字符串存储。

{ slug: "eventDate", type: "datetime", label: "Event Date" }

选择

select

列表中的单个选项。映射到TEXT列。

{
  slug: "status",
  type: "select",
  label: "Product Status",
  validation: {
    options: ["active", "discontinued", "coming_soon"]
  }
}

multiSelect

列表中的多个选项。以JSON数组存储。

{
  slug: "features",
  type: "multiSelect",
  label: "Product Features",
  validation: {
    options: ["wireless", "waterproof", "eco-friendly"]
  }
}

媒体和引用

image

媒体库中的图像选择器。将媒体ID存储为TEXT

{ slug: "featuredImage", type: "image", label: "Featured Image" }

file

媒体库中的文件选择器。将媒体ID存储为TEXT

{ slug: "attachment", type: "file", label: "PDF Attachment" }

reference

对另一个集合条目的引用。将条目ID存储为TEXT

{
  slug: "author",
  type: "reference",
  label: "Author",
  options: {
    collection: "authors"
  }
}

字段属性

每个字段支持这些属性:

属性类型描述
slugstring数据库中的列名
labelstring管理界面中的显示标签
typeFieldType16种字段类型之一
requiredboolean字段是否必须有值
uniqueboolean值是否必须在条目之间唯一
defaultValueunknown新条目的默认值
validationobject类型特定的验证规则
widgetstring自定义小部件标识符
optionsobject小部件特定配置
sortOrdernumber编辑器中的显示顺序

验证规则

validation对象因字段类型而异。其完整形式为:

interface FieldValidation {
	required?: boolean; // All types
	min?: number; // number, integer
	max?: number; // number, integer
	minLength?: number; // string, text
	maxLength?: number; // string, text
	pattern?: string; // string (regex)
	options?: string[]; // select, multiSelect
}

以下字段需要一个与模式匹配的唯一电子邮件地址:

{
  slug: "email",
  type: "string",
  label: "Email Address",
  required: true,
  unique: true,
  validation: {
    pattern: "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$"
  }
}

小部件选项

options对象配置字段特定的UI行为。其完整形式为:

interface FieldWidgetOptions {
	rows?: number; // text (textarea rows)
	showPreview?: boolean; // image, file
	collection?: string; // reference (target collection)
	allowMultiple?: boolean; // reference (multiple refs)
	[key: string]: unknown; // Custom widget options
}

以下引用字段链接多个产品:

{
  slug: "relatedProducts",
  type: "reference",
  label: "Related Products",
  options: {
    collection: "products",
    allowMultiple: true
  }
}

查询集合

使用提供的查询函数来获取内容。这些遵循Astro的实时集合模式,返回结构化结果。以下示例显示了常见的查询选项:

import { getEmDashCollection, getEmDashEntry } from "emdash";

// Get all entries - returns { entries, error }
const { entries: posts } = await getEmDashCollection("posts");

// Filter by status
const { entries: drafts } = await getEmDashCollection("posts", {
	status: "draft",
});

// Limit results
const { entries: recent } = await getEmDashCollection("posts", {
	limit: 5,
});

// Filter by taxonomy
const { entries: newsPosts } = await getEmDashCollection("posts", {
	where: { category: "news" },
});

// Get a single entry by slug - returns { entry, error, isPreview }
const { entry: post } = await getEmDashEntry("posts", "my-post-slug");

// Handle errors
const { entries, error } = await getEmDashCollection("posts");
if (error) {
	console.error("Failed to load posts:", error);
}

类型生成

运行npx emdash types从您的架构生成TypeScript类型。生成的文件包含每个集合的一个接口:

export interface Post {
	title: string;
	content: PortableTextBlock[];
	excerpt?: string;
	featuredImage?: string;
	author: string; // reference ID
}

export interface Product {
	title: string;
	price: number;
	description: PortableTextBlock[];
}

数据库映射

字段类型映射到SQLite列类型如下:

字段类型SQLite类型注释
stringTEXT
textTEXT
slugTEXT
urlTEXT
numberREAL64位浮点数
integerINTEGER64位有符号整数
booleanINTEGER0或1
datetimeTEXTISO 8601格式
selectTEXT
multiSelectJSON字符串数组
portableTextJSON块数组
imageTEXT媒体ID
fileTEXT媒体ID
referenceTEXT条目ID
jsonJSON任意JSON
repeaterJSON子字段数组

下一步