如何扩展通知与活动日志系统?避免硬编码动作类型与分类
服装商城通知/活动系统扩展方案
1. 如何扩展动作/分类系统,避免前后端硬编码?
核心思路是元数据驱动+配置化管理:
- 数据库层:强化
activity_categories和activity_action_types的元数据能力,新增字段比如i18n_key(多语言标识)、icon(前端展示图标)、template_code(关联通知模板)、enabled(是否启用)。例如activity_action_types的一条记录:id=1, code=APPLICATION_SUBMITTED, category_id=1, i18n_key=action.application.submitted, icon="📝", template_code="NOTIFY_APPLICATION_SUBMIT" - 后端:提供元数据查询接口(如
/api/activity-metadata)返回分类和动作的完整配置;将硬编码的动作判断替换为基于code的匹配,比如用action.code === 'APPLICATION_SUBMITTED'替代if (action === 'application submitted') - 前端:从接口拉取元数据,动态生成下拉选项、通知展示文案(通过i18n匹配
i18n_key),无需在代码中写死每个动作的名称和样式
2. activity_action_types与activity_categories是否应作为通知的标准来源?
分两种场景判断:
- 如果活动日志和通知的动作/分类完全对齐(比如所有活动日志都需生成通知,或通知动作均来自活动日志),建议共用这套元数据,避免重复维护。可在
activity_action_types中新增generate_notify字段,标记该动作是否需要触发通知。 - 如果通知存在独立业务场景(如营销类通知与业务活动日志无关),可新增
notification_types表,但需保留与活动元数据的关联字段(如activity_action_type_id),避免完全割裂。
优先推荐共用元数据+扩展字段,减少维护成本,保持业务口径一致。
3. 生产系统针对此类场景的常用模式
- 元数据驱动模式:所有动作/分类存储在数据库,前后端通过接口拉取,新增动作仅需在数据库添加记录,无需修改代码(前提是基础逻辑已封装)
- 事件驱动+观察者模式:将动作触发转化为事件(如
ApplicationSubmittedEvent),通知系统作为观察者监听事件并自动生成通知。新增动作只需定义新事件,无需修改通知核心逻辑 - 模板引擎模式:通知的标题、正文以模板形式存储(数据库或配置中心),通过
payload填充变量。例如模板"您的[{application_type}]申请已提交,单号:{order_no}",触发时替换变量即可 - 策略模式:针对不同动作的特殊处理(如不同动作的通知渠道不同),用策略类封装,新增动作仅需添加新策略类,无需修改原有逻辑
4. 如何架构前后端,使新增动作只需最少代码变更?
后端架构
- 封装元数据管理模块:提供CRUD接口管理分类和动作,新增动作直接在后台配置,无需代码变更
- 封装事件分发中心:定义统一事件格式,所有业务模块触发动作时发布事件,通知系统订阅事件生成通知。新增动作只需发布新事件,无需修改通知系统代码
- 封装通知模板引擎:模板存储在数据库,通过
action.code关联模板,新增动作只需配置对应模板,无需硬编码通知内容
前端架构
- 动态渲染组件:所有需要展示动作/分类的场景(如筛选框、通知列表),均从元数据接口拉取数据并动态渲染,无需写死选项
- 全局i18n映射:用
i18n_key匹配多语言文案,新增动作仅需在i18n配置文件添加对应键值对(或把i18n文案也存在数据库,实现完全无代码变更) - 通用通知组件:封装通用的通知展示组件,根据
icon、template_code动态渲染样式和内容,新增动作无需修改组件代码
5. activity_action_types与activity_categories的其他应用场景
- 权限控制:限制不同角色可查看的分类/动作日志,比如供应商仅能查看自身相关的
SUPPLIER_APPLICATION分类下的动作 - 业务统计与分析:按分类/动作统计数据,比如统计每月
APPLICATION_SUBMITTED的数量,分析业务申请趋势 - 流程审计:作为操作日志的分类依据,满足合规要求,比如追踪某个订单的全链路动作记录
- 个性化推荐:根据用户的动作分类(如用户频繁查看
NEW_ARRIVAL分类商品),推送对应品类的商品 - 业务规则触发:当某个动作(如
STOCK_LOW)达到阈值时,自动触发补货申请流程
内容的提问来源于stack exchange,提问作者hanzoera
相关产品推荐
相关产品推荐

