新闻详情

新闻详情

首页 / 资讯中心 / 详情

ThingsBoard 用户注册通知模板化:参数、修饰符与本地化完整实战指南

发布时间:2026/10/2 8:16:49来源:尧图网络
ThingsBoard 用户注册通知模板化:参数、修饰符与本地化完整实战指南
物联网后端数据可视化消息队列【免费下载链接】thingsboardAll-in-one IoT Platform - Device management, data collection, processing and visualization.项目地址https://gitcode.com/GitHub_Trending/th/thingsboard点击查看免费下载导读当租户开启用户自助注册Sign Up后任何新用户的注册事件都会触发 ThingsBoard 的USER_REGISTERED用户已注册系统通知其主题、消息正文均支持模板化Templatization与本地化Localization。本文基于 ThingsBoard 官方帮助文档结合仓库源码通知中心、模板处理引擎、前端帮助与国际化文件系统讲解该通知类型的全部可用参数、${...}语法、upperCase/lowerCase/capitalize/translate后缀修饰规则及真实示例。读完本文你将能独立编写出高度个性化、多语言适配的用户注册通知模板。一、通知类型与触发场景在 ThingsBoard 中USER_REGISTERED是平台预置的系统通知类型System Notification。源码中的类型枚举定义于 NotificationType.javaUSER_ACTIVATED(true), USER_REGISTERED(true),构造器中的true表示该类型属于系统级通知由平台内部自动触发而非普通用户手动创建。触发链路位于 SignUpController.java 的自助注册流程中用户提交注册并完成邮箱验证邮件发送后系统立即构造通知信息并投递sendUserActivityNotification(tenantId, NotificationType.USER_REGISTERED, Optional.ofNullable(firstName).orElse() Optional.ofNullable(lastName).orElse(), email, selfRegistrationParams.getNotificationRecipient());即新用户注册成功那一刻平台向指定的通知收件人recipient发送一条 USER_REGISTERED 通知收件人由租户自助注册参数中的notificationRecipient指定。通知的标题subject与消息正文message均可模板化且不同模板类型template type提供不同的参数集合。二、可用模板参数USER_REGISTERED通知模板支持两类参数事件数据参数描述“谁注册了”与收件人参数描述“发给谁”。事件数据参数由 UserRegisteredNotificationInfo.java 的getTemplateData()提供参数名含义userFullName新注册用户的完整姓名名 姓拼接userEmail新注册用户的邮箱地址后端构造数据时以firstName lastName作为userFullName以注册提交的邮箱作为userEmail与文档描述一一对应。收件人参数由 NotificationProcessingContext.java 的createTemplateContextForRecipient()为每个收件人动态注入参数名含义recipientTitle收件人的标题若配置了名/姓则取“名 姓”否则回退为邮箱recipientEmail收件人的邮箱recipientFirstName收件人的名first namerecipientLastName收件人的姓last namereturn Map.of( recipientTitle, recipient.getTitle(), recipientEmail, Strings.nullToEmpty(recipient.getEmail()), recipientFirstName, Strings.nullToEmpty(recipient.getFirstName()), recipientLastName, Strings.nullToEmpty(recipient.getLastName()) );注意recipientTitle的“名 姓优先、邮箱兜底”逻辑体现在收件人实体NotificationRecipient的getTitle()实现中模板层直接消费该值。前端类型定义与帮助映射可参看 notification.models.ts其中将USER_REGISTERED关联到本文所依托的帮助文档[NotificationType.USER_REGISTERED, { name: notification.template-type.user-registered, helpId: notification/user_registered } ],三、模板语法规则1. 参数占位符所有参数名必须使用${...}包裹例如${recipientFirstName}模板引擎通过正则\$\{(.?)(:[a-zA-Z])?\}匹配占位符见 TemplateUtils.java其中第一部分是参数名可选第二部分是修饰函数名。2. 未知参数的处理若模板中引用了模板类型未提供的参数名引擎不会抛错而是原样保留占位符文本不渲染、不替换if (!context.containsKey(key)) { return \\ matchResult.group(); // 保留 ${...} 原文 }因此建议在编写模板时只使用本文第二节列出的参数避免出现未渲染的占位符。3. 值转换null 安全参数值为null时按空字符串处理nullToEmpty不会产生 null 字样。四、参数修饰后缀模板引擎内置三个值修饰函数定义于 TemplateUtils.java后缀效果示例:upperCase全部转为大写${recipientFirstName:upperCase}:lowerCase全部转为小写${recipientFirstName:lowerCase}:capitalize首字母大写其余不变${recipientFirstName:capitalize}private static final MapString, UnaryOperatorString FUNCTIONS Map.of( upperCase, String::toUpperCase, lowerCase, String::toLowerCase, capitalize, StringUtils::capitalize );例如收件人名为john${recipientFirstName:upperCase}→JOHN${recipientFirstName:lowerCase}→john${recipientFirstName:capitalize}→John五、本地化translate 后缀通知模板支持多语言渲染。使用:translate后缀引用翻译键模板引擎会根据收件人的语言偏好profile settings 中的 locale默认 English去对应的翻译文件中取值。语法${some.translation.key:translate}工作原理在 NotificationProcessingContext.java 中收件人的 locale 优先取用户资料的locale字段缺省使用Locale.USString locale recipient instanceof User user ? user.getLocale() : Locale.US.toString();随后注册translate自定义函数按key - locale两层缓存查找翻译值L149-L156private String translate(String key, String locale) { return translations.computeIfAbsent(key, k - new ConcurrentHashMap()) .computeIfAbsent(locale, k - { JsonNode fullTranslation fullTranslations.computeIfAbsent(locale, translationProvider); return Optional.ofNullable(JacksonUtil.getByKeyPath(fullTranslation, key)) .map(JsonNode::asText).orElse(); }); }翻译值本身仍可嵌套模板参数——translate 执行后会再次对结果执行模板替换processTemplate递归调用这正是官方示例中“翻译值里还能写${userFullName}”的底层原因。完整示例假设你在租户自定义翻译中配置了翻译键{ custom: { notifications: { user-registered: ${userFullName} just registered } } }那么模板${custom.notifications.user-registered:translate}在收件人语言为 English、新用户全名为John Smith时将被渲染为John Smith just registered平台自带的翻译键ThingsBoard 前端国际化文件中即包含该通知的默认文案例如 locale.constant-en_US.json 与 locale.constant-zh_CN.json英文user-registered: User registered中文user-registered: 用户已注册这提示我们租户也可以复用平台的翻译键如notification.template-type.user-registered并在自己的翻译覆盖文件中定制文案实现同一模板在不同语言收件人面前自动切换语言。六、完整示例以下示例均来自官方帮助文档并经源码验证。假设新用户tenantthingsboard.org完成了注册。示例一最简用法模板${userEmail} was registered渲染结果tenantthingsboard.org was registered示例二事件数据 收件人问候组合模板Hi, ${recipientFirstName}! A new user ${userFullName} (${userEmail}) has just registered on the platform.若收件人为John Doe渲染结果Hi, John! A new user John Smith (tenantthingsboard.org) has just registered on the platform.示例三修饰符 本地化混用模板${recipientFirstName:capitalize}, ${custom.notifications.user-registered:translate}若自定义翻译键的值为${userFullName} just registered新用户全名为John Smith渲染结果John, John Smith just registered七、源码级运行流程小结将以上知识点串联起来一次 USER_REGISTERED 通知的模板渲染完整链路为触发SignUpController.java 调用notificationCenter.sendSystemNotification(...)携带NotificationInfo.userRegistered(userFullName, userEmail)。数据装配UserRegisteredNotificationInfo.java 的getTemplateData()产出事件侧参数NotificationProcessingContext.java 按收件人产出recipient*参数并注入translate函数。渲染TemplateUtils.processTemplate() 通过正则逐段替换占位符应用upperCase/lowerCase/capitalize修饰并对translate结果递归再渲染。投递处理后的 subject/message 按各通知渠道Email、Slack、SMS、移动端等发送给目标收件人。八、模板配置入口在 ThingsBoard UI 中进入Notifications → Templates选择或创建类型为User registered的模板即可在标题Subject与正文Message中使用上述全部语法。模板选择器组件源码见 template-autocomplete.component.html支持按模板名称搜索、直接基于当前模板新建副本等操作。每一条模板可针对不同投递方式Email / SMS / Slack 等分别配置启停与文案模板化语法在各渠道间完全一致。总结参数即数据USER_REGISTERED事件提供userFullName、userEmail收件人侧提供recipientTitle、recipientEmail、recipientFirstName、recipientLastName。语法即规则${param}占位、:upperCase|:lowerCase|:capitalize修饰、:translate本地化三者组合即可覆盖绝大多数个性化通知场景。行为有源码可查参数装配见 UserRegisteredNotificationInfo.java 与 NotificationProcessingContext.java替换逻辑见 TemplateUtils.java触发入口见 SignUpController.java。掌握这套模板机制后你可以让“新用户注册”通知在第一时间以收件人熟悉的语言、称呼和格式到达显著提升租户侧多租户运营与用户管理体验。赞分享物联网后端数据可视化消息队列【免费下载链接】thingsboardAll-in-one IoT Platform - Device management, data collection, processing and visualization.项目地址https://gitcode.com/GitHub_Trending/th/thingsboard点击查看免费下载相关推荐ThingsBoard Plan Upgrade Request 通知模板化参数、修饰符与本地化完整指南ThingsBoard Plan Upgrade Request 通知模板化参数、修饰符与本地化完整指南 在 ThingsBoard 物联网平台中当租户管理物联网后端数据可视化消息队列ThingsBoard API 用量限制通知模板化指南参数、修饰符与本地化实战ThingsBoard API 用量限制通知模板化指南参数、修饰符与本地化实战 导读 本文以 ThingsBoard 通知中心Notification Ce物联网后端数据可视化消息队列VSCode 中 Claude 子代理Subagents的一等公民支持SDK 相关性推断与转录服务的工程实录VSCode 中 Claude 子代理Subagents的一等公民支持SDK 相关性推断与转录服务的工程实录 导读 本文基于 VSCode 源码仓库中 A物联网后端数据可视化消息队列上一篇Superlinked延迟求值设计DelayedEvaluator的优雅实现机制下一篇Voice Pitch Analyzer免费安卓音高分析工具一次录音拿到你的音域数据创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

COMSOL正方晶格光子晶体能带仿真全流程:从边界条件到特征频率详解 2026/10/2 8:59:28

COMSOL正方晶格光子晶体能带仿真全流程:从边界条件到特征频率详解

各位做光学计算和光子器件设计的朋友,肯定对COMSOL Multiphysics不陌生。它在光子晶体能带仿真这块可以说是最常用的工具之一,但也是最容易让人“翻车”的地方。尤其是正方晶格光子晶体,作为入门频率最高、概念最基础的模型,很多人…

阅读更多 →
找搭子+点单社群系统源码:部署实战与订单状态机解析 2026/10/2 8:59:28

找搭子+点单社群系统源码:部署实战与订单状态机解析

简介:一套用于搭建交友社群、找搭子、陪玩点单等场景的企业级系统源码,功能完整度与市场上售价过万的版本相当,面向具备前后端开发经验的技术人员、社群运营者或创业者。压缩包内共2002个文件,以JS和CSS文件为主,辅以M…

阅读更多 →
云边端协同算力体系:从分布式推理到确定性调度 2026/10/2 8:59:22

云边端协同算力体系:从分布式推理到确定性调度

1. 这不是“云边端”口号,而是一场算力分配方式的底层重构最近和几个做工业视觉检测的老朋友吃饭,聊到他们新上线的产线质检系统——原来部署在机房里的GPU服务器,现在被拆成了三块:模型训练扔进公有云集群,中间层推理…

阅读更多 →
南华大学数据库原理实验报告:SQL Server建库到嵌套查询完整复现 2026/10/2 8:59:22

南华大学数据库原理实验报告:SQL Server建库到嵌套查询完整复现

简介:这份南华大学《数据库原理》实验报告面向大数据技术等专业学生,用于课程实验的参考与复盘,帮助读者系统掌握数据库管理系统操作与SQL语言应用。报告围绕SQL Server Management Studio展开,涵盖数据库与数据表的创建、主码外码…

阅读更多 →
MySQL安装到增删改查全教程:环境配置、Workbench操作与SQL实践 2026/10/2 8:59:15

MySQL安装到增删改查全教程:环境配置、Workbench操作与SQL实践

简介:面向MySQL零基础学员的安装与使用教程,覆盖数据库环境搭建与基础操作的全流程,特别适合初次接触关系型数据库、需要完成课程实验或本地开发环境部署的读者。教程从官网下载官方安装向导讲起,针对安装过程中的密码设置、组件下…

阅读更多 →
Spring Boot医院医疗仪器管理系统:从业务梳理到落地实践 2026/10/2 8:59:09

Spring Boot医院医疗仪器管理系统:从业务梳理到落地实践

我第一次接手医院仪器管理系统这个需求时,内心其实有点不屑——医院设备管理不就是个资产台账吗?无非是把Excel搬到网页上,增删改查加个导出,Spring Boot一个单体应用跑起来就完事了。直到我真的坐到设备科办公室,看到…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉