Bỏ qua để đến nội dung

Quản lý Nội dung

Một headless CMS với collections, entries, locales và releases. Quản lý nội dung từ panel Content hoặc SDK.

Proyecta có một headless CMS đầy đủ tính năng. Hệ thống hoạt động theo hướng schema-first: bạn định nghĩa các collections (kiểu nội dung có cấu trúc), sau đó tạo các entries tuân theo các trường của từng collection. Entries có thể được bản địa hóa và nhóm lại thành các releases.

Nội dung có thể được quản lý thông qua SDK hoặc bằng cách yêu cầu AI. Content API có sáu loại tài nguyên:

Tab / Tài nguyênDùng để làm gì
CollectionsĐịnh nghĩa và quản lý các content schema (ví dụ: “Blog Post”, “FAQ”, “Product Spec”)
FieldsCác slot có kiểu dữ liệu trong một collection (quản lý như một sub-resource của Collections)
EntriesDuyệt, tạo, chỉnh sửa, publish và xóa entries trong một collection
LocalesThêm và quản lý các locale ngôn ngữ/vùng cho nội dung được dịch
ReleasesNhóm các entries để phát hành (hoặc hủy phát hành) cùng nhau; publish thủ công qua releases.publish()
AssetsUpload và quản lý các file media (hình ảnh, video, PDF) có thể tham chiếu từ entries

Nhấp vào một collection trong tab Collections để chuyển đến các entries của nó. Tab Entries cho phép bạn tạo, chỉnh sửa, publish và xóa từng mục nội dung.

Bạn cũng có thể quản lý mọi thứ theo hướng lập trình thông qua SDK (proyecta.content).

Khái niệmLà gì
CollectionMột schema — hình dạng của một kiểu nội dung (ví dụ: “Blog Post”, “FAQ”, “Product Spec”)
FieldMột slot có kiểu dữ liệu trong một collection (ví dụ: title: string, body: rich_text, coverImage: asset)
EntryMột instance đơn lẻ của một collection (một bài blog, một mục FAQ)
AssetMột file media đã upload có thể tham chiếu từ entries
LocaleMột ngôn ngữ/vùng mà nội dung được dịch sang
ReleaseMột nhóm các entries được lên lịch phát hành (hoặc hủy phát hành) cùng một lúc
import Proyecta from '@proyecta-ai/sdk';
const proyecta = new Proyecta({ apiKey: process.env.PROYECTA_API_KEY });
// 1. Define a collection
const blog = await proyecta.content.collections.create({
api_id: 'blogPost',
name: 'Blog Post',
// fields are added via collections.fields.create()
});
// 2. Create an entry
const post = await proyecta.content.entries.create({
collection_id: blog.id,
data: {
title: 'Hello, world',
body: 'My very first post.',
},
});
// 3. Publish it
await proyecta.content.entries.publish({ entryId: post.id });
// Browse collections
for await (const collection of proyecta.content.collections.list()) {
console.log(collection.name);
}
// Add or remove fields on a collection
await proyecta.content.collections.fields.create(blog.id, {
/* field definition */
});
await proyecta.content.collections.fields.delete(blog.id, fieldId);

Entries là các hàng nội dung thực tế. Mỗi entry thuộc về một collection và mang dữ liệu khớp với các trường của collection đó.

// Browse entries (pass the collection's api_id, not its numeric id)
for await (const entry of proyecta.content.entries.list({ collection: 'blogPost' })) {
console.log(entry);
}
// Update an entry
await proyecta.content.entries.update(post.id, { data: { title: 'Updated title' } });
// Publish an entry
await proyecta.content.entries.publish({ entryId: post.id });
// Delete an entry
await proyecta.content.entries.delete(post.id);

Upload asset là tính năng hạng nhất — dùng chúng để đính kèm hình ảnh, video hoặc PDF vào entries của bạn:

// Browse assets
for await (const asset of proyecta.content.assets.list()) {
console.log(asset);
}
// Upload, update, or delete via assets.create / assets.update / assets.delete

Để upload file qua chat (kéo thả vào builder), xem Files & Media.

Nội dung có thể được dịch sang nhiều locale. Mỗi locale là một bản ghi được quản lý qua proyecta.content.locales:

await proyecta.content.locales.create({
/* code, name, etc. */
});
for await (const locale of proyecta.content.locales.list()) {
console.log(locale);
}

Khi bạn lấy các entries, bạn có thể yêu cầu bản dịch của một locale cụ thể. Xem Internationalization để có cái nhìn tổng quan hơn về i18n.

Một release là một gói các entries phát hành (hoặc hủy phát hành) cùng một lúc. Điều này cho phép bạn dàn dựng một đợt phát hành nội dung phối hợp — một chiến dịch marketing, một trang sản phẩm mới, một đợt làm mới FAQ — và mọi thứ sẽ được chuyển đổi đồng thời.

Lưu ý: Tính năng tự động publish theo lịch chưa được triển khai. Các release có ngày scheduled_at sẽ chuyển sang trạng thái scheduled nhưng phải được publish thủ công qua releases.publish(). Tính năng tự động publish vào thời điểm đã chỉ định sẽ sớm ra mắt.

// Create a release (optionally with a target date)
const release = await proyecta.content.releases.create({
name: 'Monday launch',
scheduled_at: '2024-01-08T09:00:00Z',
});
// Manually publish a release when ready
await proyecta.content.releases.publish({ releaseId: release.id });
// Browse releases
for await (const r of proyecta.content.releases.list()) {
console.log(r);
}

Để thay đổi lịch của một release, hãy xóa và tạo lại — không có endpoint update.

Các pattern phổ biến (để AI xây dựng cho bạn)

Phần tiêu đề “Các pattern phổ biến (để AI xây dựng cho bạn)”
  • "Build a blog using the Proyecta Content API. Collection 'Blog Post' with fields: title, slug, excerpt, body (rich text), coverImage (asset), author. Public route at /blog and /blog/[slug]."
  • "Create an FAQ collection in Proyecta Content. Build an admin page where I can add/edit FAQs and a public /faq page."
  • "Set up a multi-language landing page using Proyecta Content with English and Spanish locales."
  • "Create a release containing three blog posts and publish it manually when ready."

Khi nào dùng Content và khi nào dùng Database

Phần tiêu đề “Khi nào dùng Content và khi nào dùng Database”
Trường hợp sử dụngDùng cái này
Nội dung biên tập (bài viết, FAQ, nội dung marketing) — cần trạng thái publish/draft, lên lịch, bản địa hóaContent API
Dữ liệu ứng dụng (người dùng, đơn hàng, mục hàng) — cần tốc độ truy vấn, transaction, real-timeDatabase
Static assets trong codeThư mục public/ trong project của bạn
File do người dùng uploadFiles & Media
  • Trình chỉnh sửa rich-text — chỉnh sửa WYSIWYG đầy đủ cho các trường rich_text trong panel Content
  • Live preview các thay đổi nội dung so với ứng dụng của bạn
  • Content roles — phân tách quyền của editor khỏi quyền của developer