Posts: Using Decap CMS as Hexo Backend for Online Editing (Comprehensive Tutorial)

Published 2024-08-16 14:35 Updated 2024-08-16 22:21 6067 words 31 min read

Static website hosting is cost-effective, secure, and lightweight, but its biggest drawback is the lack of a backend, making website updates cumbersome. Decap CMS can solve this issue. This article will introduce Decap CMS and provide a detailed deployment tutorial, allowing you to update your static website online. Note that this tutorial is comprehensive (😂), please follow along closely.

Translated by AI model Qwen/Qwen3-8B.

Source Language: Simplified Chinese, Target Language: english, Translation Time: 2026-05-01 14:55

.

AI translation is for reference only. Accuracy is not guaranteed, please refer to the original text.

Introduction

Static site hosting has low costs, is secure, and lightweight, but its biggest drawback is the lack of a backend, making updates to the website cumbersome. Decap CMS can solve this problem.

This article will introduce Decap CMS and provide a detailed deployment tutorial. It will enable you to update your static website online.

Note, this tutorial is written in one go (😂), please follow along closely.

Decap CMS Introduction

Decap CMS
Decap CMS

Decap CMS (formerly known as Netlify CMS) is an open-source content management system (CMS) based on Git, designed specifically for static websites and headless CMS architectures. It is primarily used in conjunction with static site generators (such as Hexo, Jekyll, Hugo, etc.), allowing users to manage website content through an intuitive graphical interface.

Open source and free, with 17.7k stars on GitHub.

Advantages

  • No server required
  • Open source
  • Easy to get started (personally think so)
  • Friendly user interface
  • Can be accessed immediately without a GitHub account
  • Based on Git management
  • Automatically saves article backups to local (localStorage)

Disadvantages

  • The interface isn't very attractive (probably my standards are too high), not mobile-friendly
  • Can only edit some articles and modify files, no other features (what am I expecting?)
  • After copying all content from other websites, the pasted content cannot be converted to Markdown~~ (quick copy-paste)~~

Pre-deployment Preparation

  • Have a GitHub account, and a repository on GitHub containing your blog's source code
  • Have a Netlify account, and a Site connected to your blog's source code repository
  • Have some understanding of Hexo

Start

This article can be simply divided into three parts. Personally, the most difficult part is configuring source\admin\config.yml. Follow the configuration-options step by step to configure it.

  1. Configure Netlify
  2. Hexo Source Code and Frontend Modifications
  3. Access Your Decap CMS

Configure Netlify

Open your website on Netlify, go to Site configuration > Identity, click Enable Identity to activate Netlify Identity.

Netlify Identity
Netlify Identity

Scroll down to find Registration preferences, click Configure, set Registration to Invite only, and hold down the Ctrl key to click the Identity tab in a new tab, which will be used later.

Registration preferences
Registration preferences

Continue scrolling down to find Git Gateway, click Enable Git Gateway to activate it.

Git Gateway
Git Gateway

At this point, you can close this tab. Switch to the Identity tab tab, click Invite users, enter your email address, and click Send. You will receive an invitation email, but you don't need to handle it for now.

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

Netlify configuration is now complete.

Hexo Source Code and Frontend Modifications

Modify _config.yml, skip rendering the admin directory. The admin directory is where you will configure Decap CMS. If you want to change it to another path, that's also possible, but remember to change all subsequent references to admin to your own path.

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

Create a new directory source\admin, and create a new index.html file inside it, pasting the following code.

<!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

Create a config.yml file, and paste the following code.

Example code
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

Please replace the logo_url, site_url, and display_url in the above configuration with your own.

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

This is just an example configuration file. By modifying the configuration file, you can achieve functions such as creating and publishing articles, adding or modifying pages, adding friend links, and changing theme configurations on Decap CMS.

The content of the configuration file is too complex and cumbersome to explain in detail here. Please complete your personalized configuration on the official website's configuration-options.

Attached is my code
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

Remember to Git push to Github after saving.

Enter your Decap CMS

Open your email, find the invitation email, right-click Accept the invite and copy the link.

mail
mail

Links are generally in the format of https://xxxxxx.org/#invite_token=xxxxxx, change the link to https://xxxxxx.org/admin/#invite_token=xxxxxx, and open it in the browser. After opening, a pop-up titled Complete your signup will appear. Enter your password and click Sign up to finish the registration.

Sign up
Sign up

Then you can happily write articles.

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

If you encounter any issues during this tutorial, feel free to discuss below.

If you enjoyed this, leave a comment~