集合(collection)是一种内容类型(文章、页面、产品)。它的字段定义设置每个条目的数据结构。
创建集合
通过管理面板的内容类型创建集合。每个集合具有以下属性:
| 属性 | 描述 |
|---|---|
slug | URL安全标识符(例如 posts、products) |
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"
}
} 字段属性
每个字段支持这些属性:
| 属性 | 类型 | 描述 |
|---|---|---|
slug | string | 数据库中的列名 |
label | string | 管理界面中的显示标签 |
type | FieldType | 16种字段类型之一 |
required | boolean | 字段是否必须有值 |
unique | boolean | 值是否必须在条目之间唯一 |
defaultValue | unknown | 新条目的默认值 |
validation | object | 类型特定的验证规则 |
widget | string | 自定义小部件标识符 |
options | object | 小部件特定配置 |
sortOrder | number | 编辑器中的显示顺序 |
验证规则
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类型 | 注释 |
|---|---|---|
string | TEXT | |
text | TEXT | |
slug | TEXT | |
url | TEXT | |
number | REAL | 64位浮点数 |
integer | INTEGER | 64位有符号整数 |
boolean | INTEGER | 0或1 |
datetime | TEXT | ISO 8601格式 |
select | TEXT | |
multiSelect | JSON | 字符串数组 |
portableText | JSON | 块数组 |
image | TEXT | 媒体ID |
file | TEXT | 媒体ID |
reference | TEXT | 条目ID |
json | JSON | 任意JSON |
repeater | JSON | 子字段数组 |