黑名单关联关系
引用文件
本文引用的文件
- docs/blacklist/index.md
- docs/blacklist/mac-relation.md
- docs/blacklist/region-restriction.md
- yudao-module-blacklist/yudao-module-blacklist-api/src/main/java/cn/iocoder/yudao/module/blacklist/enums/BlacklistedTypeEnum.java
- yudao-module-blacklist/yudao-module-blacklist-biz/src/main/java/cn/iocoder/yudao/module/blacklist/controller/admin/blacklisted/AppBlacklistedController.java
- yudao-module-blacklist/yudao-module-blacklist-biz/src/main/java/cn/iocoder/yudao/module/blacklist/service/blacklisted/AppBlacklistedServiceImpl.java
- yudao-module-blacklist/yudao-module-blacklist-biz/src/main/java/cn/iocoder/yudao/module/blacklist/dal/dataobject/blacklisted/FlowBlacklistedMacDO.java
- yudao-module-blacklist/yudao-module-blacklist-biz/src/main/java/cn/iocoder/yudao/module/blacklist/dal/dataobject/blacklisted/FlowBlacklistedChannelDO.java
- yudao-module-blacklist/yudao-module-blacklist-biz/src/main/java/cn/iocoder/yudao/module/blacklist/dal/dataobject/blacklisted/FlowBlacklistedRegionDO.java
- yudao-module-blacklist/yudao-module-blacklist-biz/src/main/resources/mapper/blacklisted/AppBlacklistedMapper.xml
- yudao-module-blacklist/yudao-module-blacklist-biz/src/main/resources/mapper/blacklisted/FlowBlacklistedMacMapper.xml
- yudao-module-blacklist/yudao-module-blacklist-biz/src/main/resources/mapper/blacklisted/FlowBlacklistedChannelMapper.xml
- yudao-module-blacklist/yudao-module-blacklist-biz/src/main/resources/mapper/blacklisted/FlowBlacklistedRegionMapper.xml
- yudao-module-device/yudao-module-device-biz/src/main/java/cn/iocoder/yudao/module/device/dal/mysql/channel/ChannelMapper.java
- yudao-module-device/yudao-module-device-biz/src/main/java/cn/iocoder/yudao/module/device/dal/mysql/region/SysRegionMapper.java
- yudao-module-device/yudao-module-device-biz/src/main/java/cn/iocoder/yudao/module/device/dal/mysql/device/DeviceMacTypeMapper.java
- yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/mac/MacUtil.java
- yudao-module-task/api/export/ExportTaskApi.java
- yudao-module-task/util/ExportTaskUtil.java
- yudao-module-task/event/dto/ExportTaskEvent.java
目录
简介
本章节聚焦“黑名单关联关系”的设计与实现,覆盖黑名单与设备MAC地址、渠道、区域三类实体之间的多对多关联管理。内容包括:
- 关联表设计与外键约束策略
- 级联与变更状态同步机制
- 批量导入/导出(Excel)、异步导出任务与错误恢复
- 实时更新与缓存一致性保障
- 最佳实践与性能优化建议
项目结构
黑名单模块由“API层 + 业务层 + 数据访问层 + 配置映射”构成,核心控制器负责对外暴露黑名单及其关联关系的CRUD与导出接口;业务实现层负责审批流、草稿、缓存与批量处理;数据对象与Mapper映射MySQL表结构。
图表来源
- yudao-module-blacklist/yudao-module-blacklist-biz/src/main/java/cn/iocoder/yudao/module/blacklist/controller/admin/blacklisted/AppBlacklistedController.java
- yudao-module-blacklist/yudao-module-blacklist-biz/src/main/java/cn/iocoder/yudao/module/blacklist/service/blacklisted/AppBlacklistedServiceImpl.java
- yudao-module-blacklist/yudao-module-blacklist-biz/src/main/resources/mapper/blacklisted/AppBlacklistedMapper.xml
- yudao-module-blacklist/yudao-module-blacklist-biz/src/main/resources/mapper/blacklisted/FlowBlacklistedMacMapper.xml
- yudao-module-blacklist/yudao-module-blacklist-biz/src/main/resources/mapper/blacklisted/FlowBlacklistedChannelMapper.xml
- yudao-module-blacklist/yudao-module-blacklist-biz/src/main/resources/mapper/blacklisted/FlowBlacklistedRegionMapper.xml
章节来源
核心组件
- 控制器层:提供黑名单及三类关联关系的分页查询、创建、更新、删除、导出、取消变更等接口。
- 业务实现层:封装审批流、草稿、缓存、批量导入/导出、异步任务等逻辑。
- 数据对象层:三类关联DO分别映射 flow_blacklisted_mac、flow_blacklisted_channel、flow_blacklisted_region。
- 映射层:MyBatis XML 定义分页查询、批量插入/更新、按条件删除等SQL。
章节来源
- yudao-module-blacklist/yudao-module-blacklist-biz/src/main/java/cn/iocoder/yudao/module/blacklist/controller/admin/blacklisted/AppBlacklistedController.java
- yudao-module-blacklist/yudao-module-blacklist-biz/src/main/java/cn/iocoder/yudao/module/blacklist/service/blacklisted/AppBlacklistedServiceImpl.java
- yudao-module-blacklist/yudao-module-blacklist-biz/src/main/java/cn/iocoder/yudao/module/blacklist/dal/dataobject/blacklisted/FlowBlacklistedMacDO.java
- yudao-module-blacklist/yudao-module-blacklist-biz/src/main/java/cn/iocoder/yudao/module/blacklist/dal/dataobject/blacklisted/FlowBlacklistedChannelDO.java
- yudao-module-blacklist/yudao-module-blacklist-biz/src/main/java/cn/iocoder/yudao/module/blacklist/dal/dataobject/blacklisted/FlowBlacklistedRegionDO.java
架构总览
黑名单关联关系采用“主表 + 三张子表”的多对多设计,通过审批流与草稿机制实现变更的非即时生效与回滚能力。业务层统一协调三类关联的创建、更新、删除与批量导入,并通过导出任务实现异步导出。
图表来源
- yudao-module-blacklist/yudao-module-blacklist-biz/src/main/java/cn/iocoder/yudao/module/blacklist/controller/admin/blacklisted/AppBlacklistedController.java
- yudao-module-blacklist/yudao-module-blacklist-biz/src/main/java/cn/iocoder/yudao/module/blacklist/service/blacklisted/AppBlacklistedServiceImpl.java
- yudao-module-task/api/export/ExportTaskApi.java
- yudao-module-task/util/ExportTaskUtil.java
详细组件分析
1) 关联表设计与外键约束
- flow_blacklisted_mac
- 字段:id、blacklistedId、mac、draft、valid
- 说明:mac字段存储格式化后的MAC地址;valid用于审批状态;draft用于草稿记录。
- flow_blacklisted_channel
- 字段:id、blacklistedId、channelId、draft、valid
- 说明:channelId指向渠道表;与黑名单主表形成多对多。
- flow_blacklisted_region
- 字段:id、blacklistedId、regionId、draft、valid
- 说明:regionId指向区域表;与黑名单主表形成多对多。
外键约束策略
- 三张子表均以 blacklistedId 关联主表 app_blacklisted,采用软删除与valid状态标记实现“级联删除/更新”的可控性。
- 业务层在删除或更新时区分“未生效(NO)”与“已生效(YES/UPDATE/DELETE)”两类,未生效数据直接物理删除,已生效数据打上删除/修改标记并走审批流。
章节来源
- yudao-module-blacklist/yudao-module-blacklist-biz/src/main/java/cn/iocoder/yudao/module/blacklist/dal/dataobject/blacklisted/FlowBlacklistedMacDO.java
- yudao-module-blacklist/yudao-module-blacklist-biz/src/main/java/cn/iocoder/yudao/module/blacklist/dal/dataobject/blacklisted/FlowBlacklistedChannelDO.java
- yudao-module-blacklist/yudao-module-blacklist-biz/src/main/java/cn/iocoder/yudao/module/blacklist/dal/dataobject/blacklisted/FlowBlacklistedRegionDO.java
2) 多对多关系维护与审批流
- 创建/更新/删除均通过业务层统一入口,先校验是否可编辑,再根据是否涉及主表关键字段决定是否进入审批流。
- 草稿机制:BpmDraft 记录变更前后差异,未生效状态下可随时取消。
- 状态机:valid字段承载“未生效/已生效/更新中/删除中/修改中”等状态,配合审批流推进。
图表来源
章节来源
3) 批量关联与取消关联
- 批量导入MAC
- 接口:POST /flow-blacklisted-mac/import
- 处理:逐文件解析Excel,格式化MAC,分批插入/更新(每批上限控制),最后统一更新审批状态。
- 同步/异步导出
- 同步导出:GET /flow-blacklisted-mac/export-excel/sync,直接生成CSV并打包下载。
- 异步导出:GET /flow-blacklisted-mac/export-excel,创建导出任务,后续在任务中心查看进度。
- 取消变更
- 支持取消未审批的MAC/渠道/区域关联;未生效数据直接删除,已生效数据清除草稿并回滚状态。
图表来源
- yudao-module-blacklist/yudao-module-blacklist-biz/src/main/java/cn/iocoder/yudao/module/blacklist/controller/admin/blacklisted/AppBlacklistedController.java
- yudao-module-blacklist/yudao-module-blacklist-biz/src/main/java/cn/iocoder/yudao/module/blacklist/service/blacklisted/AppBlacklistedServiceImpl.java
章节来源
- docs/blacklist/mac-relation.md
- yudao-module-blacklist/yudao-module-blacklist-biz/src/main/java/cn/iocoder/yudao/module/blacklist/controller/admin/blacklisted/AppBlacklistedController.java
- yudao-module-task/api/export/ExportTaskApi.java
- yudao-module-task/util/ExportTaskUtil.java
4) 关联关系状态同步与缓存一致性
- 缓存穿透防护:Redis缓存中不存在时,通过分布式锁避免并发穿透,同时写入占位值。
- 缓存更新:主表更新后主动清理/重建Redis缓存,确保读取一致性。
- 本地缓存:使用本地缓存注解承载短期热点数据,降低数据库压力。
图表来源
章节来源
5) 与渠道、区域、MAC实体的集成
- 渠道关联:flow_blacklisted_channel 通过 channelId 关联设备模块的渠道表。
- 区域关联:flow_blacklisted_region 通过 regionId 关联设备模块的区域表。
- MAC关联:flow_blacklisted_mac 通过 mac 字段与设备模块的MAC类型表关联,导入前统一格式化。
章节来源
- yudao-module-blacklist/yudao-module-blacklist-biz/src/main/java/cn/iocoder/yudao/module/blacklist/dal/dataobject/blacklisted/FlowBlacklistedChannelDO.java
- yudao-module-blacklist/yudao-module-blacklist-biz/src/main/java/cn/iocoder/yudao/module/blacklist/dal/dataobject/blacklisted/FlowBlacklistedRegionDO.java
- yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/mac/MacUtil.java
- yudao-module-device/yudao-module-device-biz/src/main/java/cn/iocoder/yudao/module/device/dal/mysql/channel/ChannelMapper.java
- yudao-module-device/yudao-module-device-biz/src/main/java/cn/iocoder/yudao/module/device/dal/mysql/region/SysRegionMapper.java
- yudao-module-device/yudao-module-device-biz/src/main/java/cn/iocoder/yudao/module/device/dal/mysql/device/DeviceMacTypeMapper.java
依赖分析
- 控制器依赖业务层;业务层依赖Mapper与任务模块;Mapper依赖设备模块的渠道/区域/设备MAC表。
- 三类关联的CRUD接口集中在控制器中,业务层统一协调审批流与草稿机制。
图表来源
- yudao-module-blacklist/yudao-module-blacklist-biz/src/main/java/cn/iocoder/yudao/module/blacklist/controller/admin/blacklisted/AppBlacklistedController.java
- yudao-module-blacklist/yudao-module-blacklist-biz/src/main/java/cn/iocoder/yudao/module/blacklist/service/blacklisted/AppBlacklistedServiceImpl.java
- yudao-module-device/yudao-module-device-biz/src/main/java/cn/iocoder/yudao/module/device/dal/mysql/channel/ChannelMapper.java
- yudao-module-device/yudao-module-device-biz/src/main/java/cn/iocoder/yudao/module/device/dal/mysql/region/SysRegionMapper.java
- yudao-module-device/yudao-module-device-biz/src/main/java/cn/iocoder/yudao/module/device/dal/mysql/device/DeviceMacTypeMapper.java
章节来源
- yudao-module-blacklist/yudao-module-blacklist-biz/src/main/java/cn/iocoder/yudao/module/blacklist/controller/admin/blacklisted/AppBlacklistedController.java
- yudao-module-blacklist/yudao-module-blacklist-biz/src/main/java/cn/iocoder/yudao/module/blacklist/service/blacklisted/AppBlacklistedServiceImpl.java
性能考虑
- 批量导入
- 分批插入:每批固定大小(如5000),减少单次事务压力与内存占用。
- 格式化前置:导入前统一格式化MAC,避免重复转换。
- 导出
- 异步导出:大数据量场景优先异步,避免阻塞请求线程。
- CSV生成与压缩:导出完成后压缩,减小IO与网络传输。
- 缓存
- 分布式锁:缓存缺失时加锁,避免缓存击穿。
- 占位值:缓存穿透时写入占位值,缩短后续请求等待。
- 审批流
- 草稿最小化:仅记录变更差异,减少持久化开销。
- 状态机:通过valid字段快速判断是否需要进入审批流。
故障排查指南
- 导入失败
- 现象:导入Excel报错或部分数据未生效。
- 排查:检查Excel格式、MAC格式化是否正确、是否存在重复项、是否触发审批流。
- 参考路径:批量导入MAC实现
- 取消变更无效
- 现象:取消未审批的关联未生效。
- 排查:确认关联记录状态是否为“未生效”,确认业务层取消逻辑是否执行。
- 参考路径:取消MAC变更
- 导出任务未完成
- 现象:异步导出任务无响应或长时间未完成。
- 排查:检查任务中心状态、磁盘空间、导出参数范围限制。
- 参考路径:异步导出接口
章节来源
- yudao-module-blacklist/yudao-module-blacklist-biz/src/main/java/cn/iocoder/yudao/module/blacklist/service/blacklisted/AppBlacklistedServiceImpl.java
- yudao-module-blacklist/yudao-module-blacklist-biz/src/main/java/cn/iocoder/yudao/module/blacklist/controller/admin/blacklisted/AppBlacklistedController.java
结论
黑名单关联关系通过“主表 + 三类子表 + 审批流 + 草稿 + 缓存 + 任务”的组合,实现了对MAC、渠道、区域的灵活多对多管理。业务层在保证数据一致性的同时,提供了批量导入/导出、异步处理与错误恢复能力,满足大规模运营场景下的稳定性与可维护性需求。
附录
- 黑名单类型枚举:DELETE(卸载)、KILL(杀死/闪退),用于区分不同业务类型的关联关系与导出范围。
- 文档入口:黑名单管理模块概览与子功能入口说明。
章节来源