Content Type

最后更新:2026年7月3日

Content Type 是内容所遵循的框架(schema). 它定义了内容拥有哪些字段, 以及每个字段的类型, 是否多语言, 是否必填, 以及校验规则. 以服装购物商城的 "商品" 为例, 商品名, 价格, 详细说明, 主图这样的项目构成由一个 Content Type "商品" 来规定, 而实际的每个商品则作为遵循该框架的 Content 创建.

在 CMA 中, Content TypeSpace 的下级资源, 其路径以 /spaces/{spaceId}/content-types 为基准. 创建, 修改, 取消发布等管理操作在 CMA 中执行, 已发布的快照通过 CDA 进行传递. 但 Content Type 在创建, 修改时会自动发布, 因此与 Content 不同, 无需单独的发布调用即可立即进入 Published 状态(参见下文状态与自动发布).

资源结构

下面是 Content Type "商品" 的单个查询响应. 它带有 sys(系统属性), 以及 name, displayField, publishWithAuthor, fields 等正文属性.

{
  "sys": {
    "id": "3trmXRLdJF4GBlAjtcuoZ7Pnxj8dlA",
    "type": "ContentType",
    "space": { "sys": { "id": "HnQ32YiH", "type": "Refer", "targetType": "Space" } },
    "publish": {
      "version": 7,
      "at": "2026-06-17T03:13:49.973Z",
      "firstAt": "2026-06-14T17:04:46.953Z",
      "counter": 4,
      "by": { "sys": { "id": "3p4tcFbQRwz503VXdtHXNI5dZH5TVB", "type": "Refer", "targetType": "User" } }
    },
    "createdBy": { "sys": { "id": "3p4tcFbQRwz503VXdtHXNI5dZH5TVB", "type": "Refer", "targetType": "User" } },
    "createdAt": "2026-06-14T17:04:46.846Z",
    "updatedBy": { "sys": { "id": "3p4tcFbQRwz503VXdtHXNI5dZH5TVB", "type": "Refer", "targetType": "User" } },
    "updatedAt": "2026-06-17T03:13:49.973Z",
    "version": 8,
    "status": "Published"
  },
  "name": "商品",
  "displayField": "productName",
  "publishWithAuthor": false,
  "fields": [
    { "id": "5n06s7ocmwdi", "name": "商品名称", "apiName": "productName", "type": "ShortText", "localized": true, "required": true, "validations": [], "disabled": false },
    { "id": "1gecyz8g4llwf", "name": "价格", "apiName": "price", "type": "Long", "localized": false, "required": false, "validations": [], "disabled": false },
    { "id": "3ow4popgz54zg", "name": "详细说明", "apiName": "description", "type": "RichText", "localized": true, "required": false, "validations": [], "disabled": false },
    { "id": "2alxdptmdub1s", "name": "主图", "apiName": "photo", "type": "Refer", "localized": false, "required": false, "validations": [], "disabled": false, "targetType": "Media" },
    {
      "id": "2a80lehazfx3t",
      "name": "品牌",
      "apiName": "brand",
      "type": "Refer",
      "localized": false,
      "required": false,
      "validations": [
        { "referContentType": [ { "sys": { "id": "3trmXRM3RqbgSnifyg7OveRYWnJWEG", "type": "Refer", "targetType": "ContentType" } } ] }
      ],
      "disabled": false,
      "targetType": "Content"
    }
  ]
}

主要的键:

  • sys.id: Content Type 的唯一标识符. 它会填入单个查询, 修改, 删除路径中的 {contentTypeId}.
  • name: Content Type 的名称(例如 商品).
  • displayField: 在内容工作室列表中代表展示每个 Content 的字段的 apiName(例如 productName).
  • publishWithAuthor: 是否在 Content 发布时一并包含作者信息. 默认值为 false.
  • fields: 该框架所定义的字段列表. 每一项的结构在下文字段中说明.

photo 字段的 typeRefertargetTypeMedia, 因此指向上传的文件资产. brand 字段为 Refer + targetType: Content, 并通过 validations 中的 referContentType 限制为只能引用特定 Content Type(此处为 "品牌")的 Content.

系统属性 (sys)

每个 Content Type 都在 sys 对象中携带公共系统属性以及 Content Type 专有属性. space, createdBy, updatedByRefer 形态({ "sys": { "id", "type": "Refer", "targetType" } })填入.

属性类型说明
idstring资源唯一标识符.
typestring资源种类. Content Type 始终为 "ContentType".
spaceRefer<Space>Content Type 所属的 Space.
createdByRefer<User>创建者.
createdAtstring (date-time)创建时间.
updatedByRefer<User>最后修改者.
updatedAtstring (date-time)最后修改时间.
versioninteger (≥1)资源版本. 创建, 修改, 发布, 取消发布等每次变更都会加 1.
statusstring (enum)发布状态. 为 Draft, Changed, Published, Archived 之一.
publishobject发布历史. 参见下方的键.

publish 对象的键:

类型说明
versioninteger最后一次发布时刻的 sys.version.
atstring (date-time)最后一次发布时间.
firstAtstring (date-time)首次发布时间. 即使取消发布也会保留.
counterinteger累计发布次数.
byRefer<User>最后一次发布者.

取消发布(DELETE .../publish)后, publish 中的 version, at, by 会被移除, 只保留 firstAt, counter.

Content Typesys 中没有 Contentsys 所具有的 contentType(自引用)属性. 这是因为 Content Type 本身就是框架. 它也没有 archive 属性.

字段

fields 是该 Content Type 所定义字段的列表. 每一项具有如下结构(FieldDefinition).

类型说明
idstring (1-64)字段的唯一标识符. 创建时自动分配.
namestring (1-50)在内容工作室中显示的字段名称(例如 商品名称).
apiNamestring (1-64)在 API 中指代该字段的键. 模式 ^[a-zA-Z0-9][a-zA-Z0-9-_]*$(以英文, 数字开头, 之后为英文, 数字, -, _).
typestring (enum)字段的类型. 参见下文字段种类 (type).
localizedboolean是否可以拥有多语言值.
requiredboolean是否必填.
validationsarray应用于值的校验规则列表. 没有规则时为空数组 []. 参见下文校验 (validations).
disabledboolean是否停用.
targetTypestring (enum)仅当 typeRefer 时. 引用对象是 Content 还是 Media.
itemsobject仅当 typeArray 时. 数组元素的定义(Refer 元素或 ShortText 元素).

字段种类 (type)

type 决定值被存储, 查询的方式. 部分类型的检索行为不同.

type含义备注
ShortText短的单行文本.适合精确关键词查询.
LongText较长的正文文本.支持全文(full-text)相似度检索.
RichText带格式的正文.不作为检索对象, 用于格式表现.
Long整数.例如价格 price.
Number实数(含小数).
Boolean真/假.
Date日期, 时间.
Json任意 JSON 结构.
Location位置(坐标).
Refer指向其他资源的引用.通过 targetType 指定 ContentMedia.
Array容纳多个值的数组.通过 items 附带元素定义.

在 "商品" 示例中, 商品名称ShortText, 价格Long, 详细说明RichText, 主图Refer(targetType: Media), 品牌Refer(targetType: Content).

校验 (validations)

validations 是应用于字段值的规则数组. 每一项携带下列键之一.

形态说明
size{ "min", "max" }文本长度或数组大小的最小, 最大值.
uniqueboolean禁止在同一 Content Type 内出现重复值.
regexp{ "pattern", "flags" }值必须与正则表达式模式匹配. pattern 必填.
prohibitRegexp{ "pattern", "flags" }值若与正则表达式模式匹配则拒绝. pattern 必填.
inarray允许值列表. 只有列表中的值才能通过.
range{ "min", "max" }数字值的最小, 最大值.
dateRange{ "min", "max", "after", "before" }日期值的允许范围.
mediaMimetypeGrouparrayRefer(Media)字段中允许的文件类型列表. 参见下方 enum.
mediaImageDimensions{ "width", "height" }图像的宽, 高像素约束.
mediaFileSize{ "min", "max" }文件大小(字节)的最小, 最大值.
referContentTypearrayRefer(Content)字段中允许引用的 Content Type 列表. 每一项为 Refer<ContentType> 形态.
messagestring校验失败时显示的自定义消息.

mediaMimetypeGroup 可用的值(12 种): Attachment, Plaintext, Image, Audio, Video, RichText, Presentation, Spreadsheet, PdfDocument, Archive, Code, Markup.

"商品" 示例的 brand 字段通过 referContentType 限制为只能引用 "品牌" Content Type(其 sys.id3trmXRM3RqbgSnifyg7OveRYWnJWEG).

状态与自动发布

Content Type创建, 修改, 部分修改时会自动发布. 这一点与 Content 不同. Content 在创建后需要单独的发布调用才能进入传递路径, 而 Content Type 的创建响应会直接返回 status: "Published".

status 为下列 4 种之一.

status含义
Draft未发布的状态.
Changed曾经发布过, 但之后的变更尚未发布的状态.
Published已发布且没有未发布变更的状态.
Archived已归档的状态.

sys.version 在每次变更时加 1. 由于 Content Type 的修改与发布会一次性发生, 因此一次修改会使 version 增加 2(修改本身 +1, 自动发布 +1). 在示例 "公告" 中, 创建之后 version 为 2(创建 +1, 自动发布 +1), publish.counter 为 1. 随后修改时 version 变为 4, publish.counter 变为 2.

Content Type 进入 Draft 的唯一途径是显式取消发布(DELETE .../publish). 取消发布后 status 变为 Draft, 并且 publish 对象中去掉 version, at, by, 只保留 firstAt, counter.

约束

对象约束
name(Content Type)1-64 字, 必填.
description128 字以内, 可选.
fields创建时 1-80 个, 修改时至少 1 个.
name(字段)1-50 字, 必填.
apiName(字段)1-64 字, 模式 ^[a-zA-Z0-9][a-zA-Z0-9-_]*$, 必填.

删除守护: 删除必须同时满足两个条件.

  • 只要存在任何一个使用该 Content TypeContent, 就无法删除(WGL422010). 请先删除所有相关的 Content. 这项检查最先触发.
  • 处于发布状态(Published, Changed)的 Content Type 无法直接删除(WGL422009). 请先取消发布(DELETE .../publish)使其变为 Draft 后再删除(Archived 状态也可删除).

API

下面所有端点的基准 URL 为 https://cma.weegloo.com/v1, 并且 Authorization 头需要用于 CMA 认证的 Bearer 令牌. 修改, 部分修改, 发布, 取消发布为了乐观并发控制, 需要一并发送 X-Weegloo-Version 头(当前资源的 sys.version).