物联网后端数据可视化消息队列【免费下载链接】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),仅供参考