記事: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 をクリックします。RegistrationInvite 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_urlsite_urldisplay_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

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

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

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

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