发送和订阅通知
Halo 的通知功能提供了事件驱动的消息提醒机制,让用户能够及时获取系统内的关键事件。 开发者可以根据需求定义事件类型和通知方式(如站内消息、邮件等),并支持个性化的推送策略,提升用户体验和系统可扩展性。
通知系统通过事件机制将关键消息推送给用户。开发者可以自定义通知类型、消息格式和推送方式,主要应用于以下场景:
- 用户互动:如文章评论、点赞等;
- 订单和流程提醒:如订单创建、处理完成等;
- 内容更新:如文章发布、系统公告等。
通知系统工作流程
下图展示了 Halo 通知功能的工作流程,包括事件声明、订阅查找、通知发送等关键步骤。
- 声明事件类型:开发者首先需要声明通知事件的类型 (ReasonType),指定事件的名称、描述和事件所需的属性。
- 插件触发事件:当插件中的某个业务操作发生时,插件需要触发相应的事件。
- 创建 Reason 实例:Halo 根据发送的事件创建一个 Reason 实例,表示具体的事件信息,步骤 2 和 3 可以合并为
业务代码创建 Reason
。 - 订阅查找:Halo 通知中心会根据事件的类型和属性查找匹配的订阅。
- 通知发送:如果找到匹配的订阅,系统根据用户的偏好设置通过不同的通知器(如站内消息、邮件等)发送通知。
- 用户接收和处理通知:用户通过预设的通知渠道接收事件通知,并可以在系统中查看或处理这些通知。
通知事件
在 Halo 通知系统中,ReasonType
和 Reason
是两个核心自定义模型,用于定义通知事件的类别和具体的事件实例。
理解它们的字段对于开发者扩展通知功能至关重要。
下面将详细说明这两个模型的字段及其 作用。
ReasonType 模型
ReasonType
是用于定义通知事件类别的模型。每个 ReasonType
都代表一类特定的事件,例如文章评论、新文章发布等。通过 ReasonType
,系统可以了解该事件的特定属性和数据结构。
用户个人中心的通知设置页面会根据 ReasonType
的名称和描述展示事件类型和通知方式。
ReasonType 字段说明
字段名 | 类型 | 是否必填 | 说明 |
---|---|---|---|
apiVersion | string | 是 | API 版本号,定义为 notification.halo.run/v1alpha1 |
kind | string | 是 | 自定义资源类型,必须为 ReasonType |
metadata.name | string | 是 | 事件类别的唯一标识名称,例如 comment |
spec.displayName | string | 是 | 事件类别的展示名称,用户界面中显示的事件名称 |
spec.description | string | 否 | 事件类别的描述,说明此事件的用途和含义 |
spec.properties | array | 是 | 此事件包含的属性字段,用于定义该类事 件应携带的数据 |
spec.properties 字段
properties
字段用于定义该通知事件需要传递的参数或属性。每个属性都是一个对象,通常包含以下字段:
字段名 | 类型 | 是否必填 | 说明 |
---|---|---|---|
name | string | 是 | 属性的名称,表示事件数据中的某个字段 |
type | string | 是 | 属性的数据类型,例如 string 、boolean 等,仅用于描述 |
description | string | 否 | 对该属性的描述,说明其在事件中的作用 |
optional | boolean | 否 | 该属性是否为可选字段,默认值为 false ,false 表示必填 |
properties.type
字段仅用于文档性目的,不会在运行时进行数据类型检查。有了此描述,便于编写通知模板时使用正确的数据类型。
示例: 声明评论事件的 ReasonType
apiVersion: notification.halo.run/v1alpha1
kind: ReasonType
metadata:
name: comment
spec:
displayName: "评论事件"
description: "用户在文章上收到评论时触发。"
properties:
- name: postName
type: string
description: "文章的名称。"
- name: commenter
type: string
description: "评论者用户名。"
- name: content
type: string
description: "评论内容。"
在这个示例中,ReasonType
定义了一个评论事件,该事件包括三种属性:postName
(文章名)、commenter
(评论者)和 content
(评论内容),这些属性在触发事件时将传递给通知系统。
这一类型的资源声明非常适合放在插件的 resources
目录下,以便插件安装时自动创建。参考 声明自定义模型对象
Reason 模型
Reason
模型用于描述具体的事件实例,它是 ReasonType
的一个实例化,包含触发该事件时的具体数据。
Reason
通常在某个事件发生时创建,例如某篇文章收到评论时生成一个 Reason
,记录具体的评论信息。
Reason 字段说明
字段名 | 类型 | 是否必填 | 说明 |
---|---|---|---|
apiVersion | string | 是 | API 版本号,定义为 notification.halo.run/v1alpha1 |
kind | string | 是 | 自定义资源类型,必须为 Reason |
metadata.name | string | 是 | 该事件实例的唯一标识名称,通常自动生成 |
spec.reasonType | string | 是 | 引用的 ReasonType 名称,表示该事件实例属于哪个事件类型 |
spec.author | string | 是 | 事件的触发者或创建者,通常为用户或系统的标识符 |
spec.subject | object | 是 | 事件的主题,指向该事件所涉及的具体对象(如文章、评论等) |
spec.attributes | object | 是 | 包含事件具体数据的键值对,内容与 ReasonType 中定义的属性一致 |
spec.subject 字段
subject
字段描述了与该事件相关的主体对象,例如,评论事件中的文章对象。subject
通常包含以下字段:
字段名 | 类型 | 是否必填 | 说明 |
---|---|---|---|
apiVersion | string | 是 | 主题对象的 API 版本号,例如 content.halo.run/v1alpha1 |
kind | string | 是 | 主题对象的类型,例如 Post 表示文章 |
name | string | 是 | 主题对象的唯一标识,通常是对象的名称或 ID |
title | string | 是 | 主题对象的标题,通常是人类可读的名称 |
url | string | 否 | 主题对象的访问链接或详情页面的 URL |
参考 Reason 自定义模型