供稿人:刘少林
项目中会有这样的需求,按照固定的格式输出一些信息,比如发送一条短信 “尊敬的用户你好,xxx给你发来一封邮件请登录查看.....”,这句提示信息中,会变化的只有“XXX”(发件人),其他的文字都是不变的。
通常,我们会写一个方法,把“XXX”当成一个参数传过来,并返回拼接好的文字,挺方便也容易理解,但是有个问题,如果文字有变动的话,每次都要手动去改相关的代码。
此时,可以使用“消息模板”功能进行开发,如果模板发生变化,可以由管理员直接在后台维护,并且支持国际化。
有两种方式创建消息模板,一种是使用管理员登录到后台,在“数据字典/其他/消息模板”中新建消息模板,如下图所示,关键信息包括:
- 模板代码:用于在程序中调用的模板代码,必须唯一。
可以添加 i18n 后缀以支持国际化,比如消息 FOOBAR,可以分别定义 FOOBAR_zh_CN、FOOBAR_en_US 中、英文模板 - 是否是HTML:通过API拼装消息时,原样返回的标记
- 标题:消息标题(如果有的话,如邮件)
- 内容:消息正文
其中,标题和内容模板支持命名参数或顺序参数,如图例中的 {title} 使用的就是命名参数,还可以使用类似 “待办提醒:{0}” 的传参模式(和 i18n 下的 properties 文件类似),通过不同的 API 调用时,会自动将这些参数替换成实际的值。

另外一种维护方式是在工程启动时(如 BootStrap)调用API自动创建,如下例所示:
import bropen.framework.plugins.message.MessageTemplateService
class BootStrap {
MessageTemplateService messageTemplateServices
....
messageTemplateService.createTemplateIfNotExists("MESSAGE_TEST_CODE", "消息模块test", null, "尊敬的用户你好,{name}给你发来一封邮件请登录查看.....", false)
....
}
messageTemplateService.createTemplateIfNotExists 详细参数说明请参考 API 手册。
通过 MessageTemplateService.getMessage 来生成消息,返回值是一个 Map,如 [title: "标题", body: “内容(正文)”, isHTML: ture/false]:
assert messageTemplateService.getMessage("MESSAGE_TEST_CODE", [name: "张三"]) == "尊敬的用户你好,张三给你发来一封邮件请登录查看....."
由于上面的示例定义的是命名参数,因此这里调用的是以 Map 为参数的 getMessage 版本,此外,还有以列表为参数的版本,详细参考 API 手册。