記事:Decap CMSをHexoのバックエンドとして使用してオンライン編集を実現する方法(親切なチュートリアル)

公開日: 2024-08-16 14:35 更新日: 2024-08-16 22:21 6657文字 34 min read

静的サイトの構築コストは低く、セキュアで軽量ですが、最大の欠点はバックエンドがなく、サイトの更新が面倒です。Decap CMSはこの問題を解決できます。本記事ではDecap CMSについて紹介し、Decap CMSのデプロイチュートリアルを詳しく説明します。これにより、オンラインで静的サイトを更新できるようになります。注意:本チュートリアルは一気呵成で(😂)、お付き合いください。

AIモデル Qwen/Qwen3-8B による翻訳。

原文言語:Simplified Chinese、翻訳先言語:japanese、翻訳時間:2026-05-01 15:22

。

AI 翻訳は参考に限り、内容の完全な正確性を保証できません。原文をご参照ください。

前言

静的サイトの構築コストは低く、セキュアで軽量ですが、最大の欠点はバックエンドが存在せず、サイトの更新が面倒です。Decap CMS はこの問題を解決します。

本文では Decap CMS を紹介し、Decap CMS のデプロイチュートリアルを詳しく説明します。これにより、静的サイトをオンラインで更新できるようになります。

注意:本チュートリアルは一気呵成に進めます(😂)。お手伝いしてくださいますようお願いします。

Decap CMS 紹介

Decap CMS
Decap CMS

Decap CMS(以前は Netlify CMS と呼ばれていました)は Git に基づき、オープンソースのコンテンツ管理システム(CMS)であり、静的サイトおよびヘッドレス(headless)CMS アーキテクチャに特化しています。Hexo、Jekyll、Hugo などの静的サイトジェネレータと組み合わせて使用され、ユーザーは直感的なグラフィカルインターフェースを通じてサイトのコンテンツを管理できます。

オープンソースで無料です。Github には 17.7k のスターがついています。

メリット

  • サーバー不要
  • オープンソース
  • 始めやすい(個人的には)
  • ユーザーフレンドリーなインターフェース
  • GitHub アカウントがなくてもすぐにアクセス可能
  • Git で管理される
  • ローカルに自動的に記事のバックアップを保存(localStorage)

デメリット

  • インターフェースが少し見栄えしない(おそらく自分の要求が高すぎる)
  • 他のサイトで全選択してコピーした内容を Decap CMS に貼り付けると、Markdown に変換されない (素早くコピペ)

デプロイ前の準備

  • GitHub アカウントがあり、自分のブログのソースコードを格納する Rope を GitHub 上に用意していること
  • Netlify アカウントがあり、ブログのソースコード Rope に接続された Site を持っていること
  • Hexo についてある程度の知識があること

開始

本文は大きく3つの部分に分けることができます。個人的には source\admin\config.yml の設定が最も難しいと感じています。configuration-options を参考にしながら、少しずつ設定を行ってください。

  1. Netlifyの設定
  2. Hexoのソースコードとフロントエンドの変更
  3. あなたのDecap CMSにアクセス

Netlifyの設定

Netlify で自分のサイトを開き、Site configuration > Identity に移動します。Enable Identity をクリックして Netlify Identity を有効化します。

Netlify Identity
Netlify Identity

下にスクロールして、Registration preferences を見つけ、Configure をクリックします。Registration を Invite only に設定してください。Ctrl キーを押しながら Identity tab を新しいタブで開きます。後で使用します。

Registration preferences
Registration preferences

さらに下にスクロールして、Git Gateway を見つけ、Enable Git Gateway をクリックして有効化します。

Git Gateway
Git Gateway

これでこのタブは閉じても大丈夫です。次に Identity tab タブに移動し、Invite users をクリックして自分のメールアドレスを入力し、Send をクリックしてください。あなたのメールアドレスには招待メールが届きますが、今は気にしなくても大丈夫です。

Identity tab
Identity tab
邀请邮件
邀请邮件

Netlify の設定はこれで完了です。

Hexoのソースコードとフロントエンドの変更

_config.yml を編集し、admin ディレクトリのレンダリングをスキップしてください。admin は Decap CMS を設定するためのディレクトリです。admin に他の path を指定する場合は可能です。ただし、以下の admin の記述をあなたの path に変更する必要があります。

skip_render:
    - 'admin/**/*'
_config.yml
_config.yml

source\admin ディレクトリを作成し、そのディレクトリ内に index.html を作成してください。以下のコードを貼り付けてください。

<!doctype html>
<html>
    <head>
        <meta charset="utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <meta http-equiv="x-UA-Compatible" content="IE=Edge">
        <meta name="robots" content="noindex" />
        <title>Decap CMS</title>
        <!-- <link rel="icon" type="image/svg+xml" sizes="180x180" href="favicon.svg"> -->
        <script type="text/javascript" src="https://identity.netlify.com/v1/netlify-identity-widget.js"></script>
        <link href="/admin/config.yml" type="text/yaml" rel="cms-config-url">
    </head>
    <body>
        <script src="https://unpkg.com/decap-cms@^3.0.0/dist/decap-cms.js"></script>
    </body>
</html>
index.html
index.html

config.yml を作成し、以下のコードを貼り付けてください。

例示コード
backend:
  name: git-gateway
  branch: master # 要更新的分支(可选;默认为主分支)
  commit_messages:
    create: Create {{collection}} “{{slug}}”
    update: Update {{collection}} “{{slug}}”
    delete: Delete {{collection}} “{{slug}}”
    uploadMedia: Upload “{{path}}”
    deleteMedia: Delete “{{path}}”
    openAuthoring: '{{message}}'


logo_url: /favicon.svg # 你的 logo


# 禁用部署预览链接
# show_preview_links: false


# This line should *not* be indented
publish_mode: editorial_workflow


# This line should *not* be indented
media_folder: "source/images/uploads" # 媒体文件将存储在图片/上载下的Repo中。
public_folder: "/images/uploads" # 上传的媒体的src属性将以/images/uploads开头。


site_url: https://xxxxxx.org/ # 网站网址
display_url: https://xxxxxx.org/ # 显示网址


locale: "zh_Hans" # 语言环境


collections: 


  - name: "posts" # 在路由中使用,例如:/admin/collections/blog。
    label: "Posts" # 在用户界面中使用
    folder: "source/_posts/" # 存储文件的文件夹的路径。
    # filter: {field: "categories", value: "Posts"} # 筛选
    create: true # 允许用户在这个集合中创建新的文件。
    fields: # 每份文件的字段,通常是前面的内容。
      - {label: "标题", name: "title", default: "Posts: ", widget: "string"}
      - {label: "发布日期", name: "date", widget: "datetime", format: "YYYY-MM-DD HH:mm:ss", dateFormat: "YYYY-MM-DD", timeFormat: "HH:mm:ss", required: false}
      - {label: "更新日期", name: "updated", widget: "datetime", format: "YYYY-MM-DD HH:mm:ss", dateFormat: "YYYY-MM-DD", timeFormat: "HH:mm:ss", required: false}
      - {label: "标签", name: "tags", widget: "list", required: false}
      - {label: "分类", name: "categories", widget: "list", required: false}
      - {label: "关键词", name: "keywords", widget: "list", required: false}
      - {label: "摘要", name: "description", widget: "string", required: false}
      - {label: "永久链接", name: "permalink", widget: "string", required: false}
      - {label: "评论", name: "comments", widget: "boolean", default: true, required: false}
      - {label: "置顶", name: "pin", widget: "boolean", default: false, required: false}
      - {label: "密码", name: "password", widget: "string", required: false}
      - {label: "abstract", name: "abstract", default: "有东西被加密了, 请输入密码查看.", widget: "string", required: false}
      - {label: "message", name: "message", default: "您好, 这里需要密码.", widget: "string", required: false}
      - {label: "wrong_pass_message", name: "wrong_pass_message", default: "抱歉, 这个密码看着不太对, 请再试试.", widget: "string", required: false}
      - {label: "wrong_hash_message", name: "wrong_hash_message", default: "抱歉, 这个文章不能被校验, 不过您还是能看看解密后的内容.", widget: "string", required: false}
      - {label: "内容", name: "body", widget: "markdown", required: false}




  # - name: "pages"
  #   label: "Pages"
  #   files:
  #     - file: "source/about/index.md"
  #       name: "about"
  #       label: "关于"
  #       fields:
  #         - {label: "标题", name: "title", widget: "string"}
  #         - {label: "评论", name: "comments", widget: "boolean", default: false, required: false}
  #         - {label: "发布日期", name: "date", widget: "datetime", format: "YYYY-MM-DD HH:mm:ss", dateFormat: "YYYY-MM-DD", timeFormat: "HH:mm:ss", required: false}
  #         - {label: "更新日期", name: "updated", widget: "datetime", format: "YYYY-MM-DD HH:mm:ss", dateFormat: "YYYY-MM-DD", timeFormat: "HH:mm:ss", required: false}
  #         - {label: "layout", name: "layout", widget: "string", required: false}
  #         - {label: "摘要", name: "description", widget: "string", required: false}
  #         - {label: "内容", name: "body", widget: "markdown", required: false}


  # - name: all
  #   label: 'all posts and pages (测试)'
  #   folder: 'source'
  #   create: true
  #   # 添加嵌套对象将显示集合文件夹结构
  #   nested:
  #     depth: 100 # 在收藏树中显示的最大深度
  #     summary: '{{title}}' # 树节点的可选摘要,默认为推断出的标题字段
  #   fields:
  #         - {label: "标题", name: "title", widget: "string"}
  #         - {label: "评论", name: "comments", widget: "boolean", default: false, required: false}
  #         - {label: "发布日期", name: "date", widget: "datetime", format: "YYYY-MM-DD HH:mm:ss", dateFormat: "YYYY-MM-DD", timeFormat: "HH:mm:ss", required: false}
  #         - {label: "更新日期", name: "updated", widget: "datetime", format: "YYYY-MM-DD HH:mm:ss", dateFormat: "YYYY-MM-DD", timeFormat: "HH:mm:ss", required: false}
  #         - {label: "layout", name: "layout", widget: "string", required: false}
  #         - {label: "摘要", name: "description", widget: "string", required: false}
  #         - {label: "密码", name: "password", widget: "string", required: false}
  #         - {label: "abstract", name: "abstract", default: "有东西被加密了, 请输入密码查看.", widget: "string", required: false}
  #         - {label: "message", name: "message", default: "您好, 这里需要密码.", widget: "string", required: false}
  #         - {label: "wrong_pass_message", name: "wrong_pass_message", default: "抱歉, 这个密码看着不太对, 请再试试.", widget: "string", required: false}
  #         - {label: "wrong_hash_message", name: "wrong_hash_message", default: "抱歉, 这个文章不能被校验, 不过您还是能看看解密后的内容.", widget: "string", required: false}
  #         - {label: "内容", name: "body", widget: "markdown", required: false}
  #   # 添加带有路径属性的元对象,可以编辑条目的路径
  #   # 移动现有条目会将该条目整个子树移动到新位置
  #   meta: { path: { widget: string, label: 'Path', index_file: 'index' } }


  # - name: 'data'
  #   label: 'Data'
  #   label_singular: 'data'
  #   description: 'Manage the list of data.'
  #   files:
  #     - name: 'friends'
  #       label: 'Friends List'
  #       file: 'source/_data/friends.yml'
  #       fields:
  #         - label: 'friendlinks'
  #           name: 'friendlinks'
  #           widget: 'list'
  #           fields:
  #             - label: '分组标题'
  #               name: 'group'
  #               widget: 'string'
  #             - label: '分组描述'
  #               name: 'description'
  #               widget: 'string'
  #               required: false
  #             - label: 'Items'
  #               name: 'items'
  #               widget: 'list'
  #               fields:
  #                 - label: '名称'
  #                   name: 'title'
  #                   widget: 'string'
  #                 - label: '头像'
  #                   name: 'avatar'
  #                   widget: 'string'
  #                 - label: '链接'
  #                   name: 'url'
  #                   widget: 'string'
  #                 - label: '日期'
  #                   name: 'adddate'
  #                   widget: "datetime"
  #                   format: "YYYY-MM-DD HH:mm:ss"
  #                   dateFormat: "YYYY-MM-DD"
  #                   timeFormat: "HH:mm:ss"
  #                   required: false
  #                 - label: 'RSS'
  #                   name: 'rss'
  #                   widget: 'string'
  #                   required: false
  #                 - label: '联系方式'
  #                   name: 'contact'
  #                   widget: 'string'
  #                   required: false
  #                 - label: '截图'
  #                   name: 'screenshot'
  #                   widget: 'string'
  #                   required: false
  #                 - label: '关键词'
  #                   name: 'keywords'
  #                   widget: 'string'
  #                   required: false
  #                 - label: '描述'
  #                   name: 'description'
  #                   widget: 'string'
  #                   required: false
  #     - name: 'sites'
  #       label: 'Sites List'
  #       file: 'source/_data/sites.yml'
  #       fields:
  #         - label: 'sites'
  #           name: 'sites'
  #           widget: 'list'
  #           fields:
  #             - label: '分组标题'
  #               name: 'group'
  #               widget: 'string'
  #             - label: '分组描述'
  #               name: 'description'
  #               widget: 'string'
  #               required: false
  #             - label: 'Items'
  #               name: 'items'
  #               widget: 'list'
  #               fields:
  #                 - label: '名称'
  #                   name: 'title'
  #                   widget: 'string'
  #                 - label: '头像'
  #                   name: 'avatar'
  #                   widget: 'string'
  #                 - label: '链接'
  #                   name: 'url'
  #                   widget: 'string'
  #                 - label: '截图'
  #                   name: 'screenshot'
  #                   widget: 'string'
  #                   required: false
  #                 - label: '关键词'
  #                   name: 'keywords'
  #                   widget: 'string'
  #                   required: false
  #                 - label: '描述'
  #                   name: 'description'
  #                   widget: 'string'
  #                   required: false
config.yml
config.yml

上記の設定ファイル内の logo_url、site_url、display_url を自分のものに変更してください。

logo_url: /favicon.svg # 你的 logo
site_url: https://xxxxx.org/ # 网站网址
display_url: https://xxxxx.org/ # 显示网址

これは設定ファイルの例です。設定ファイルを編集することで、Decap CMS 上で記事を新規作成・公開したり、ページを追加・編集したり、友達リンクを追加したり、テーマの設定を変更したりすることが可能です。

設定ファイルの内容は非常に複雑で煩雑です。ここでは詳細には説明しません。configuration-options にアクセスして、自分のカスタマイズ設定を行ってください。

私のコードを添付します
backend:
  name: git-gateway
  branch: master # 要更新的分支(可选;默认为主分支)
  commit_messages:
    create: Create {{collection}} “{{slug}}”
    update: Update {{collection}} “{{slug}}”
    delete: Delete {{collection}} “{{slug}}”
    uploadMedia: Upload “{{path}}”
    deleteMedia: Delete “{{path}}”
    openAuthoring: '{{message}}'


logo_url: https://assets.buasis.eu.org/me/favicon.svg


# 禁用部署预览链接
# show_preview_links: false


# This line should *not* be indented
publish_mode: editorial_workflow


# This line should *not* be indented
media_folder: "source/images/uploads" # 媒体文件将存储在图片/上载下的Repo中。
public_folder: "/images/uploads" # 上传的媒体的src属性将以/images/uploads开头。


site_url: https://buasis.eu.org/ # 网站网址
display_url: https://buasis.eu.org/ # 显示网址


locale: "zh_Hans" # 语言环境


collections:


  - name: "all-posts" # 在路由中使用,例如:/admin/collections/blog。
    label: "All-Posts" # 在用户界面中使用
    folder: "source/_posts/" # 存储文件的文件夹的路径。
    # filter: {field: "categories", value: "Posts"}
    create: false # 允许用户在这个集合中创建新的文件。
    fields: # 每份文件的字段,通常是前面的内容。
      - {label: "标题", name: "title", default: "Posts: ", widget: "string"}
      - {label: "发布日期", name: "date", widget: "datetime", format: "YYYY-MM-DD HH:mm:ss", dateFormat: "YYYY-MM-DD", timeFormat: "HH:mm:ss", required: false}
      - {label: "更新日期", name: "updated", widget: "datetime", format: "YYYY-MM-DD HH:mm:ss", dateFormat: "YYYY-MM-DD", timeFormat: "HH:mm:ss", required: false}
      - {label: "标签", name: "tags", widget: "list", required: false}
      - {label: "分类", name: "categories", widget: "list", required: false}
      - {label: "关键词", name: "keywords", widget: "list", required: false}
      - {label: "摘要", name: "description", widget: "string", required: false}
      - {label: "永久链接", name: "permalink", widget: "string", required: false}
      - {label: "评论", name: "comments", widget: "boolean", default: true, required: false}
      - {label: "置顶", name: "pin", widget: "boolean", default: false, required: false}
      - {label: "密码", name: "password", widget: "string", required: false}
      - {label: "abstract", name: "abstract", default: "有东西被加密了, 请输入密码查看.", widget: "string", required: false}
      - {label: "message", name: "message", default: "您好, 这里需要密码.", widget: "string", required: false}
      - {label: "wrong_pass_message", name: "wrong_pass_message", default: "抱歉, 这个密码看着不太对, 请再试试.", widget: "string", required: false}
      - {label: "wrong_hash_message", name: "wrong_hash_message", default: "抱歉, 这个文章不能被校验, 不过您还是能看看解密后的内容.", widget: "string", required: false}
      - {label: "内容", name: "body", widget: "markdown", required: false}


  - name: "posts" # 在路由中使用,例如:/admin/collections/blog。
    label: "Posts" # 在用户界面中使用
    folder: "source/_posts/" # 存储文件的文件夹的路径。
    filter: {field: "categories", value: "Posts"}
    create: true # 允许用户在这个集合中创建新的文件。
    fields: # 每份文件的字段,通常是前面的内容。
      - {label: "标题", name: "title", default: "Posts: ", widget: "string"}
      - {label: "发布日期", name: "date", widget: "datetime", format: "YYYY-MM-DD HH:mm:ss", dateFormat: "YYYY-MM-DD", timeFormat: "HH:mm:ss", required: false}
      - {label: "更新日期", name: "updated", widget: "datetime", format: "YYYY-MM-DD HH:mm:ss", dateFormat: "YYYY-MM-DD", timeFormat: "HH:mm:ss", required: false}
      - {label: "标签", name: "tags", widget: "list", required: false}
      - {label: "分类", name: "categories", default: "Posts", widget: "list", required: false}
      - {label: "关键词", name: "keywords", widget: "list", required: false}
      - {label: "摘要", name: "description", widget: "string", required: false}
      - {label: "永久链接", name: "permalink", widget: "string", required: false}
      - {label: "评论", name: "comments", widget: "boolean", default: true, required: false}
      - {label: "置顶", name: "pin", widget: "boolean", default: false, required: false}
      - {label: "密码", name: "password", widget: "string", required: false}
      - {label: "abstract", name: "abstract", default: "有东西被加密了, 请输入密码查看.", widget: "string", required: false}
      - {label: "message", name: "message", default: "您好, 这里需要密码.", widget: "string", required: false}
      - {label: "wrong_pass_message", name: "wrong_pass_message", default: "抱歉, 这个密码看着不太对, 请再试试.", widget: "string", required: false}
      - {label: "wrong_hash_message", name: "wrong_hash_message", default: "抱歉, 这个文章不能被校验, 不过您还是能看看解密后的内容.", widget: "string", required: false}
      - {label: "内容", name: "body", widget: "markdown", required: false}


  - name: "ssn" # 在路由中使用,例如:/admin/collections/blog。
    label: "碎碎念" # 在用户界面中使用
    folder: "source/_posts" # 存储文件的文件夹的路径。
    filter: {field: "categories", value: "碎碎念"}
    create: true # 允许用户在这个集合中创建新的文件。
    fields: # 每份文件的字段,通常是前面的内容。
      - {label: "标题", name: "title", default: "碎碎念: ", widget: "string"}
      - {label: "发布日期", name: "date", widget: "datetime", format: "YYYY-MM-DD HH:mm:ss", dateFormat: "YYYY-MM-DD", timeFormat: "HH:mm:ss", required: false}
      - {label: "更新日期", name: "updated", widget: "datetime", format: "YYYY-MM-DD HH:mm:ss", dateFormat: "YYYY-MM-DD", timeFormat: "HH:mm:ss", required: false}
      - {label: "标签", name: "tags", widget: "list", default: "S:N" , required: true}
      - {label: "分类", name: "categories", widget: "list", default: "碎碎念", required: false}
      - {label: "关键词", name: "keywords", widget: "list", required: false}
      - {label: "摘要", name: "description", widget: "list", required: false}
      - {label: "永久链接", name: "permalink", widget: "string", required: false}
      - {label: "评论", name: "comments", widget: "boolean", default: true, required: false}
      - {label: "置顶", name: "pin", widget: "boolean", default: false, required: false}
      - {label: "密码", name: "password", widget: "string", required: false}
      - {label: "abstract", name: "abstract", default: "有东西被加密了, 请输入密码查看.", widget: "string", required: false}
      - {label: "message", name: "message", default: "您好, 这里需要密码.", widget: "string", required: false}
      - {label: "wrong_pass_message", name: "wrong_pass_message", default: "抱歉, 这个密码看着不太对, 请再试试.", widget: "string", required: false}
      - {label: "wrong_hash_message", name: "wrong_hash_message", default: "抱歉, 这个文章不能被校验, 不过您还是能看看解密后的内容.", widget: "string", required: false}
      - {label: "内容", name: "body", widget: "markdown", required: false}




  - name: "sy" # 在路由中使用,例如:/admin/collections/blog。
    label: "摄影" # 在用户界面中使用
    folder: "source/_posts" # 存储文件的文件夹的路径。
    filter: {field: "categories", value: "摄影"}
    create: true # 允许用户在这个集合中创建新的文件。
    fields: # 每份文件的字段,通常是前面的内容。
      - {label: "标题", name: "title", default: "摄影: ", widget: "string"}
      - {label: "发布日期", name: "date", widget: "datetime", format: "YYYY-MM-DD HH:mm:ss", dateFormat: "YYYY-MM-DD", timeFormat: "HH:mm:ss", required: false}
      - {label: "更新日期", name: "updated", widget: "datetime", format: "YYYY-MM-DD HH:mm:ss", dateFormat: "YYYY-MM-DD", timeFormat: "HH:mm:ss", required: false}
      - {label: "标签", name: "tags", widget: "list", required: false}
      - {label: "分类", name: "categories", widget: "list", default: "摄影", required: false}
      - {label: "关键词", name: "keywords", widget: "list", required: false}
      - {label: "摘要", name: "description", widget: "string", required: false}
      - {label: "永久链接", name: "permalink", widget: "string", required: false}
      - {label: "评论", name: "comments", widget: "boolean", default: true, required: false}
      - {label: "置顶", name: "pin", widget: "boolean", default: false, required: false}
      - {label: "密码", name: "password", widget: "string", required: false}
      - {label: "abstract", name: "abstract", default: "有东西被加密了, 请输入密码查看.", widget: "string", required: false}
      - {label: "message", name: "message", default: "您好, 这里需要密码.", widget: "string", required: false}
      - {label: "wrong_pass_message", name: "wrong_pass_message", default: "抱歉, 这个密码看着不太对, 请再试试.", widget: "string", required: false}
      - {label: "wrong_hash_message", name: "wrong_hash_message", default: "抱歉, 这个文章不能被校验, 不过您还是能看看解密后的内容.", widget: "string", required: false}
      - {label: "内容", name: "body", widget: "markdown", required: false}


  - name: "zc" # 在路由中使用,例如:/admin/collections/blog。
    label: "摘抄" # 在用户界面中使用
    folder: "source/_posts/zc" # 存储文件的文件夹的路径。
    filter: {field: "categories", value: "摘抄"}
    create: true # 允许用户在这个集合中创建新的文件。
    fields: # 每份文件的字段,通常是前面的内容。
      - {label: "标题", name: "title", default: "摘抄: ", widget: "string"}
      - {label: "发布日期", name: "date", widget: "datetime", format: "YYYY-MM-DD HH:mm:ss", dateFormat: "YYYY-MM-DD", timeFormat: "HH:mm:ss", required: false}
      - {label: "更新日期", name: "updated", widget: "datetime", format: "YYYY-MM-DD HH:mm:ss", dateFormat: "YYYY-MM-DD", timeFormat: "HH:mm:ss", required: false}
      - {label: "标签", name: "tags", widget: "list", required: false}
      - {label: "分类", name: "categories", widget: "list", default: "摘抄", required: false}
      - {label: "关键词", name: "keywords", widget: "list", required: false}
      - {label: "摘要", name: "description", widget: "string", required: false}
      - {label: "永久链接", name: "permalink", widget: "string", required: false}
      - {label: "评论", name: "comments", widget: "boolean", default: true, required: false}
      - {label: "置顶", name: "pin", widget: "boolean", default: false, required: false}
      - {label: "密码", name: "password", widget: "string", required: false}
      - {label: "abstract", name: "abstract", default: "有东西被加密了, 请输入密码查看.", widget: "string", required: false}
      - {label: "message", name: "message", default: "您好, 这里需要密码.", widget: "string", required: false}
      - {label: "wrong_pass_message", name: "wrong_pass_message", default: "抱歉, 这个密码看着不太对, 请再试试.", widget: "string", required: false}
      - {label: "wrong_hash_message", name: "wrong_hash_message", default: "抱歉, 这个文章不能被校验, 不过您还是能看看解密后的内容.", widget: "string", required: false}
      - {label: "内容", name: "body", widget: "markdown", required: false}


  - name: "bj" # 在路由中使用,例如:/admin/collections/blog。
    label: "便笺" # 在用户界面中使用
    folder: "source/_posts/bj" # 存储文件的文件夹的路径。
    filter: {field: "categories", value: "便笺"}
    create: true # 允许用户在这个集合中创建新的文件。
    fields: # 每份文件的字段,通常是前面的内容。
      - {label: "标题", name: "title", default: "便笺: ", widget: "string"}
      - {label: "发布日期", name: "date", widget: "datetime", format: "YYYY-MM-DD HH:mm:ss", dateFormat: "YYYY-MM-DD", timeFormat: "HH:mm:ss", required: false}
      - {label: "更新日期", name: "updated", widget: "datetime", format: "YYYY-MM-DD HH:mm:ss", dateFormat: "YYYY-MM-DD", timeFormat: "HH:mm:ss", required: false}
      - {label: "标签", name: "tags", widget: "list", required: false}
      - {label: "分类", name: "categories", widget: "list", default: "便笺", required: false}
      - {label: "关键词", name: "keywords", widget: "list", required: false}
      - {label: "摘要", name: "description", widget: "string", required: false}
      - {label: "永久链接", name: "permalink", widget: "string", required: false}
      - {label: "评论", name: "comments", widget: "boolean", default: true, required: false}
      - {label: "置顶", name: "pin", widget: "boolean", default: false, required: false}
      - {label: "密码", name: "password", widget: "string", required: false}
      - {label: "abstract", name: "abstract", default: "有东西被加密了, 请输入密码查看.", widget: "string", required: false}
      - {label: "message", name: "message", default: "您好, 这里需要密码.", widget: "string", required: false}
      - {label: "wrong_pass_message", name: "wrong_pass_message", default: "抱歉, 这个密码看着不太对, 请再试试.", widget: "string", required: false}
      - {label: "wrong_hash_message", name: "wrong_hash_message", default: "抱歉, 这个文章不能被校验, 不过您还是能看看解密后的内容.", widget: "string", required: false}
      - {label: "内容", name: "body", widget: "markdown", required: false}


  - name: "pages"
    label: "Pages"
    files:
      - file: "source/about/index.md"
        name: "about"
        label: "关于"
        fields:
          - {label: "标题", name: "title", widget: "string"}
          - {label: "评论", name: "comments", widget: "boolean", default: false, required: false}
          - {label: "发布日期", name: "date", widget: "datetime", format: "YYYY-MM-DD HH:mm:ss", dateFormat: "YYYY-MM-DD", timeFormat: "HH:mm:ss", required: false}
          - {label: "更新日期", name: "updated", widget: "datetime", format: "YYYY-MM-DD HH:mm:ss", dateFormat: "YYYY-MM-DD", timeFormat: "HH:mm:ss", required: false}
          - {label: "layout", name: "layout", widget: "string", required: false}
          - {label: "摘要", name: "description", widget: "string", required: false}
          - {label: "内容", name: "body", widget: "markdown", required: false}


      - file: "source/all-web/index.md"
        name: "all-web"
        label: "All-Web"
        fields:
          - {label: "标题", name: "title", widget: "string"}
          - {label: "评论", name: "comments", widget: "boolean", default: false, required: false}
          - {label: "发布日期", name: "date", widget: "datetime", format: "YYYY-MM-DD HH:mm:ss", dateFormat: "YYYY-MM-DD", timeFormat: "HH:mm:ss", required: false}
          - {label: "更新日期", name: "updated", widget: "datetime", format: "YYYY-MM-DD HH:mm:ss", dateFormat: "YYYY-MM-DD", timeFormat: "HH:mm:ss", required: false}
          - {label: "密码", name: "password", widget: "string", required: false}
          - {label: "abstract", name: "abstract", default: "有东西被加密了, 请输入密码查看.", widget: "string", required: false}
          - {label: "message", name: "message", default: "您好, 这里需要密码.", widget: "string", required: false}
          - {label: "wrong_pass_message", name: "wrong_pass_message", default: "抱歉, 这个密码看着不太对, 请再试试.", widget: "string", required: false}
          - {label: "wrong_hash_message", name: "wrong_hash_message", default: "抱歉, 这个文章不能被校验, 不过您还是能看看解密后的内容.", widget: "string", required: false}
          - {label: "layout", name: "layout", widget: "string", required: false}
          - {label: "摘要", name: "description", widget: "string", required: false}
          - {label: "内容", name: "body", widget: "markdown", required: false}


      - file: "source/music/index.md"
        name: "music"
        label: "网易云音乐"
        fields:
          - {label: "标题", name: "title", widget: "string"}
          - {label: "评论", name: "comments", widget: "boolean", default: false, required: false}
          - {label: "发布日期", name: "date", widget: "datetime", format: "YYYY-MM-DD HH:mm:ss", dateFormat: "YYYY-MM-DD", timeFormat: "HH:mm:ss", required: false}
          - {label: "更新日期", name: "updated", widget: "datetime", format: "YYYY-MM-DD HH:mm:ss", dateFormat: "YYYY-MM-DD", timeFormat: "HH:mm:ss", required: false}
          - {label: "layout", name: "layout", widget: "string", required: false}
          - {label: "摘要", name: "description", widget: "string", required: false}
          - {label: "内容", name: "body", widget: "markdown", required: false}


      - file: "source/name/index.md"
        name: "name"
        label: "NAME MD5值"
        fields:
          - {label: "标题", name: "title", widget: "string"}
          - {label: "评论", name: "comments", widget: "boolean", default: false, required: false}
          - {label: "发布日期", name: "date", widget: "datetime", format: "YYYY-MM-DD HH:mm:ss", dateFormat: "YYYY-MM-DD", timeFormat: "HH:mm:ss", required: false}
          - {label: "更新日期", name: "updated", widget: "datetime", format: "YYYY-MM-DD HH:mm:ss", dateFormat: "YYYY-MM-DD", timeFormat: "HH:mm:ss", required: false}
          - {label: "密码", name: "password", widget: "string", required: false}
          - {label: "abstract", name: "abstract", default: "有东西被加密了, 请输入密码查看.", widget: "string", required: false}
          - {label: "message", name: "message", default: "您好, 这里需要密码.", widget: "string", required: false}
          - {label: "wrong_pass_message", name: "wrong_pass_message", default: "抱歉, 这个密码看着不太对, 请再试试.", widget: "string", required: false}
          - {label: "wrong_hash_message", name: "wrong_hash_message", default: "抱歉, 这个文章不能被校验, 不过您还是能看看解密后的内容.", widget: "string", required: false}
          - {label: "layout", name: "layout", widget: "string", required: false}
          - {label: "摘要", name: "description", widget: "string", required: false}
          - {label: "内容", name: "body", widget: "markdown", required: false}
          
      - file: "source/reading/index.md"
        name: "reading"
        label: "阅读足迹"
        fields:
          - {label: "标题", name: "title", widget: "string"}
          - {label: "评论", name: "comments", widget: "boolean", default: false, required: false}
          - {label: "发布日期", name: "date", widget: "datetime", format: "YYYY-MM-DD HH:mm:ss", dateFormat: "YYYY-MM-DD", timeFormat: "HH:mm:ss", required: false}
          - {label: "更新日期", name: "updated", widget: "datetime", format: "YYYY-MM-DD HH:mm:ss", dateFormat: "YYYY-MM-DD", timeFormat: "HH:mm:ss", required: false}
          - {label: "密码", name: "password", widget: "string", required: false}
          - {label: "abstract", name: "abstract", default: "有东西被加密了, 请输入密码查看.", widget: "string", required: false}
          - {label: "message", name: "message", default: "您好, 这里需要密码.", widget: "string", required: false}
          - {label: "wrong_pass_message", name: "wrong_pass_message", default: "抱歉, 这个密码看着不太对, 请再试试.", widget: "string", required: false}
          - {label: "wrong_hash_message", name: "wrong_hash_message", default: "抱歉, 这个文章不能被校验, 不过您还是能看看解密后的内容.", widget: "string", required: false}
          - {label: "layout", name: "layout", widget: "string", required: false}
          - {label: "摘要", name: "description", widget: "string", required: false}
          - {label: "内容", name: "body", widget: "markdown", required: false}


      - file: "source/software/index.md"
        name: "software"
        label: "我的宝藏软件"
        fields:
          - {label: "标题", name: "title", widget: "string"}
          - {label: "评论", name: "comments", widget: "boolean", default: false, required: false}
          - {label: "发布日期", name: "date", widget: "datetime", format: "YYYY-MM-DD HH:mm:ss", dateFormat: "YYYY-MM-DD", timeFormat: "HH:mm:ss", required: false}
          - {label: "更新日期", name: "updated", widget: "datetime", format: "YYYY-MM-DD HH:mm:ss", dateFormat: "YYYY-MM-DD", timeFormat: "HH:mm:ss", required: false}
          - {label: "layout", name: "layout", widget: "string", required: false}
          - {label: "摘要", name: "description", widget: "string", required: false}
          - {label: "内容", name: "body", widget: "markdown", required: false}


      - file: "source/friends/index.md"
        name: "friends"
        label: "友链"
        fields:
          - {label: "标题", name: "title", widget: "string"}
          - {label: "评论", name: "comments", widget: "boolean", default: false, required: false}
          - {label: "发布日期", name: "date", widget: "datetime", format: "YYYY-MM-DD HH:mm:ss", dateFormat: "YYYY-MM-DD", timeFormat: "HH:mm:ss", required: false}
          - {label: "更新日期", name: "updated", widget: "datetime", format: "YYYY-MM-DD HH:mm:ss", dateFormat: "YYYY-MM-DD", timeFormat: "HH:mm:ss", required: false}
          - {label: "layout", name: "layout", widget: "string", required: false}
          - {label: "摘要", name: "description", widget: "string", required: false}
          - {label: "内容", name: "body", widget: "markdown", required: false}


  - name: pages-test
    label: 'Pages (测试)'
    label_singular: 'Page'
    folder: 'source'
    create: true
    # 添加嵌套对象将显示集合文件夹结构
    nested:
      depth: 100 # 在收藏树中显示的最大深度
      summary: '{{title}}' # 树节点的可选摘要,默认为推断出的标题字段
    filter:
      exclude: 
        - '_post' # 排除 source/_post 文件夹中的内容
    fields:
          - {label: "标题", name: "title", widget: "string"}
          - {label: "评论", name: "comments", widget: "boolean", default: false, required: false}
          - {label: "发布日期", name: "date", widget: "datetime", format: "YYYY-MM-DD HH:mm:ss", dateFormat: "YYYY-MM-DD", timeFormat: "HH:mm:ss", required: false}
          - {label: "更新日期", name: "updated", widget: "datetime", format: "YYYY-MM-DD HH:mm:ss", dateFormat: "YYYY-MM-DD", timeFormat: "HH:mm:ss", required: false}
          - {label: "layout", name: "layout", widget: "string", required: false}
          - {label: "摘要", name: "description", widget: "string", required: false}
          - {label: "密码", name: "password", widget: "string", required: false}
          - {label: "abstract", name: "abstract", default: "有东西被加密了, 请输入密码查看.", widget: "string", required: false}
          - {label: "message", name: "message", default: "您好, 这里需要密码.", widget: "string", required: false}
          - {label: "wrong_pass_message", name: "wrong_pass_message", default: "抱歉, 这个密码看着不太对, 请再试试.", widget: "string", required: false}
          - {label: "wrong_hash_message", name: "wrong_hash_message", default: "抱歉, 这个文章不能被校验, 不过您还是能看看解密后的内容.", widget: "string", required: false}
          - {label: "内容", name: "body", widget: "markdown", required: false}
    # 添加带有路径属性的元对象,可以编辑条目的路径
    # 移动现有条目会将该条目整个子树移动到新位置
    meta: { path: { widget: string, label: 'Path', index_file: 'index' } }


  - name: 'data'
    label: 'Data'
    label_singular: 'data'
    description: 'Manage the list of data.'
    files:
      - name: 'friends'
        label: 'Friends List'
        file: 'source/_data/friends.yml'
        fields:
          - label: 'friendlinks'
            name: 'friendlinks'
            widget: 'list'
            fields:
              - label: '分组标题'
                name: 'group'
                widget: 'string'
              - label: '分组描述'
                name: 'description'
                widget: 'string'
                required: false
              - label: 'Items'
                name: 'items'
                widget: 'list'
                fields:
                  - label: '名称'
                    name: 'title'
                    widget: 'string'
                  - label: '头像'
                    name: 'avatar'
                    widget: 'string'
                  - label: '链接'
                    name: 'url'
                    widget: 'string'
                  - label: '日期'
                    name: 'adddate'
                    widget: "datetime"
                    format: "YYYY-MM-DD HH:mm:ss"
                    dateFormat: "YYYY-MM-DD"
                    timeFormat: "HH:mm:ss"
                    required: false
                  - label: 'RSS'
                    name: 'rss'
                    widget: 'string'
                    required: false
                  - label: '联系方式'
                    name: 'contact'
                    widget: 'string'
                    required: false
                  - label: '截图'
                    name: 'screenshot'
                    widget: 'string'
                    required: false
                  - label: '关键词'
                    name: 'keywords'
                    widget: 'string'
                    required: false
                  - label: '描述'
                    name: 'description'
                    widget: 'string'
                    required: false
      - name: 'sites'
        label: 'Sites List'
        file: 'source/_data/sites.yml'
        fields:
          - label: 'sites'
            name: 'sites'
            widget: 'list'
            fields:
              - label: '分组标题'
                name: 'group'
                widget: 'string'
              - label: '分组描述'
                name: 'description'
                widget: 'string'
                required: false
              - label: 'Items'
                name: 'items'
                widget: 'list'
                fields:
                  - label: '名称'
                    name: 'title'
                    widget: 'string'
                  - label: '头像'
                    name: 'avatar'
                    widget: 'string'
                  - label: '链接'
                    name: 'url'
                    widget: 'string'
                  - label: '截图'
                    name: 'screenshot'
                    widget: 'string'
                    required: false
                  - label: '关键词'
                    name: 'keywords'
                    widget: 'string'
                    required: false
                  - label: '描述'
                    name: 'description'
                    widget: 'string'
                    required: false

保存後に Git を GitHub にプッシュしてください。

あなたの Decap CMS にアクセスする

あなたのメールボックスを開き、招待メールを見つけます。右クリックして『Accept the invite』を選択し、リンクをコピーしてください。

mail
mail

リンクは一般的に https://xxxxxx.org/#invite_token=xxxxxx です。リンクを https://xxxxxx.org/admin/#invite_token=xxxxxx に変更し、ブラウザで https://xxxxxx.org/admin/#invite_token=xxxxxx を開きます。開くと Complete your signup というポップアップが表示されます。自分のパスワードを入力し、Sign up をクリックして登録を完了してください。

Sign up
Sign up

その後、楽しく記事を執筆できます。

愉快地码文章
愉快地码文章

本チュートリアルで何か問題に遭遇した場合は、下記のディスカッションセクションでご相談ください。

気に入ったならばコメントを残してくださいね~