Payload CMS 和 Astro
PayloadCMS 是一个无头的开源内容管理系统,可用于为你的 Astro 项目提供内容。
与 Astro 集成
标题为“与 Astro 集成”的部分先决条件
标题为“先决条件”的部分- 一个 Astro 项目 - 如果你还没有 Astro 项目,我们的安装指南将帮助你快速启动并运行。
- 一个 MongoDB 数据库 - PayloadCMS 在创建新项目时会要求你提供 MongoDB 连接字符串。你可以在本地设置一个,或者使用 MongoDBAtlas 在网上免费托管一个数据库。
- 一个 PayloadCMS REST API - 创建一个 PayloadCMS 项目,并在设置过程中将其连接到你的 MongoDB 数据库。
在 PayloadCMS 安装过程中,你会被问到是否要使用一个模板。
在此步骤中选择任何可用的模板(例如“blog”)会自动为你生成额外的集合供你使用。否则,你将需要手动创建你的 PayloadCMS 集合。
为你的 PayloadCMS 集合配置 Astro
标题为“为你的 PayloadCMS 集合配置 Astro”的部分你的 Payload 项目模板将在 src/collections/
中包含一个名为 Posts.ts 的文件。如果在安装过程中你没有选择为你创建内容集合的模板,你可以通过手动添加此配置文件来创建新的 Payload CMS 集合。下面的示例显示了一个名为 posts
的集合的此文件,它需要 title
、content
和 slug
字段。
import { CollectionConfig } from "payload/types";
const Posts: CollectionConfig = { slug: "posts", admin: { useAsTitle: "title", }, access: { read: () => true, },
fields: [ { name: "title", type: "text", required: true, }, { name: "content", type: "text", required: true, }, { name: "slug", type: "text", required: true, }, ],};
export default Posts;
-
在
payload.config.ts
文件中,导入并添加Users
(在所有 PayloadCMS 项目中都可用)和任何其他集合(例如Posts
)到可用的集合中。src/payload.config.ts import { buildConfig } from "payload/config";import path from "path";import Users from "./collections/Users";import Posts from "./collections/Posts";export default buildConfig({serverURL: "https://:4321",admin: {user: Users.slug,},collections: [Users, Posts],typescript: {outputFile: path.resolve(__dirname, "payload-types.ts"),},graphQL: {schemaOutputFile: path.resolve(__dirname, "generated-schema.graphql"),},});这将在你的 PayloadCMS 仪表盘中的“Users”集合旁边出现一个名为“Posts”的新集合。
-
进入“Posts”集合并创建一个新帖子。保存后,你会注意到 API URL 出现在右下角。
-
在开发服务器运行的情况下,在浏览器中打开
https://:4321/api/posts
。你应该会看到一个 JSON 文件,其中包含你创建的帖子作为一个对象。{"docs":[{"id":"64098b16483b0f06a7e20ed4","title":"Astro & PayloadCMS Title 🚀","content":"Astro & PayloadCMS Content","slug":"astro-payloadcms-slug","createdAt":"2023-03-09T07:30:30.837Z","updatedAt":"2023-03-09T07:30:30.837Z"}],"totalDocs":1,"limit":10,"totalPages":1,"page":1,"pagingCounter":1,"hasPrevPage":false,"hasNextPage":false,"prevPage":null,"nextPage":null}
默认情况下,Astro 和 PayloadCMS 都会使用 4321 端口。你可能需要在 src/server.ts
文件中更改 PayloadCMS 的端口。别忘了也要在 src/payload.config.ts
中更新 serverURL
。
获取数据
标题为“获取数据”的部分通过你网站独特的 REST API URL 和你的内容路由来获取你的 PayloadCMS 数据。(默认情况下,PayloadCMS 会通过 /api
挂载所有路由。)然后,你可以使用 Astro 的 set:html=""
指令来渲染你的数据属性。
与你的帖子一起,PayloadCMS 会返回一些顶层元数据。实际的文档嵌套在 docs
数组中。
例如,要显示帖子标题及其内容的列表
---import HomeLayout from "../layouts/HomeLayout.astro";
const res = await fetch("https://:5000/api/posts") // https://:4321/api/posts by defaultconst posts = await res.json()---
<HomeLayout title='Astro Blog'> { posts.docs.map((post) => ( <h2 set:html={post.title} /> <p set:html={post.content} /> )) }</HomeLayout>
使用 PayloadCMS 和 Astro 构建博客
标题为“使用 PayloadCMS 和 Astro 构建博客”的部分创建一个博客索引页面 src/pages/index.astro
来列出你的每篇帖子,并附上指向其各自页面的链接。
通过 API 获取会返回一个对象(帖子)数组,其中包括以下属性:
title
content
slug
---import HomeLayout from "../layouts/HomeLayout.astro";
const res = await fetch("https://:5000/api/posts") // https://:4321/api/posts by defaultconst posts = await res.json()---
<HomeLayout title='Astro Blog'> <h1>Astro + PayloadCMS 🚀</h1> <h2>Blog posts list:</h2> <ul> { posts.docs.map((post) =>( <li> <a href={`posts/${post.slug}`} set:html={post.title} /> </li> )) } </ul></HomeLayout>
使用 PayloadCMS API 生成页面
标题为“使用 PayloadCMS API 生成页面”的部分创建一个页面 src/pages/posts/[slug].astro
为每个帖子动态生成一个页面。
---import PostLayout from "../../layouts/PostLayout.astro"
const {title, content} = Astro.props
// The getStaticPaths() is required for static Astro sites.// If using SSR, you will not need this function.export async function getStaticPaths() { let data = await fetch("https://:5000/api/posts") let posts = await data.json()
return posts.docs.map((post) => { return { params: {slug: post.slug}, props: {title: post.title, content: post.content}, }; });}---<PostLayout title={title}> <article> <h1 set:html={title} /> <p set:html={content} /> </article></PostLayout>
发布你的站点
标题为“发布你的网站”的部分要部署你的网站,请访问我们的部署指南,并按照你首选的托管提供商的说明进行操作。
社区资源
标题为“社区资源”的部分- 查看官方的 Astro Payload CMS 集成。
- 试试这个 Payload CMS & Astro 模板。
- 查看 Astroad,以便使用 Docker 轻松进行开发和 VPS 部署。