跳转到内容

Payload CMS 和 Astro

PayloadCMS 是一个无头的开源内容管理系统,可用于为你的 Astro 项目提供内容。

  1. 一个 Astro 项目 - 如果你还没有 Astro 项目,我们的安装指南将帮助你快速启动并运行。
  2. 一个 MongoDB 数据库 - PayloadCMS 在创建新项目时会要求你提供 MongoDB 连接字符串。你可以在本地设置一个,或者使用 MongoDBAtlas 在网上免费托管一个数据库。
  3. 一个 PayloadCMS REST API - 创建一个 PayloadCMS 项目,并在设置过程中将其连接到你的 MongoDB 数据库。

你的 Payload 项目模板将在 src/collections/ 中包含一个名为 Posts.ts 的文件。如果在安装过程中你没有选择为你创建内容集合的模板,你可以通过手动添加此配置文件来创建新的 Payload CMS 集合。下面的示例显示了一个名为 posts 的集合的此文件,它需要 titlecontentslug 字段。

src/collections/Posts.ts
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;
  1. 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”的新集合。

  2. 进入“Posts”集合并创建一个新帖子。保存后,你会注意到 API URL 出现在右下角。

  3. 在开发服务器运行的情况下,在浏览器中打开 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
    }

通过你网站独特的 REST API URL 和你的内容路由来获取你的 PayloadCMS 数据。(默认情况下,PayloadCMS 会通过 /api 挂载所有路由。)然后,你可以使用 Astro 的 set:html="" 指令来渲染你的数据属性。

与你的帖子一起,PayloadCMS 会返回一些顶层元数据。实际的文档嵌套在 docs 数组中。

例如,要显示帖子标题及其内容的列表

src/pages/index.astro
---
import HomeLayout from "../layouts/HomeLayout.astro";
const res = await fetch("https://:5000/api/posts") // https://:4321/api/posts by default
const posts = await res.json()
---
<HomeLayout title='Astro Blog'>
{
posts.docs.map((post) => (
<h2 set:html={post.title} />
<p set:html={post.content} />
))
}
</HomeLayout>

创建一个博客索引页面 src/pages/index.astro 来列出你的每篇帖子,并附上指向其各自页面的链接。

通过 API 获取会返回一个对象(帖子)数组,其中包括以下属性:

  • title
  • content
  • slug
src/pages/index.astro
---
import HomeLayout from "../layouts/HomeLayout.astro";
const res = await fetch("https://:5000/api/posts") // https://:4321/api/posts by default
const 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>

创建一个页面 src/pages/posts/[slug].astro 为每个帖子动态生成一个页面

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>

要部署你的网站,请访问我们的部署指南,并按照你首选的托管提供商的说明进行操作。

更多 CMS 指南

贡献 社区 赞助