角色数据隔离 + 策略路由
业务背景这个系统管的是工地上的塔机/升降机参与方有8 种角色角色枚举值roleId干什么的产权单位PROPERTY(1)1001塔机的房东设备归他安装单位INSTALL(2)1003负责把塔机装起来使用单位USE(4)1005工地上实际用塔机的监理单位SUPERVISE(8)1017盯着大家干活的检测单位TEST(16)1009检测塔机合不合格维保单位MAINTENANCE(32)1011负责日常保养维修总包单位TOTAL(64)1016工地总负责人终端单位TERMINAL(128)1015管物联网终端设备的核心矛盾同样点设备列表这个菜单产权单位看到的应该是我名下的设备安装单位看到的应该是我装过的设备使用单位看到的应该是我正在用的设备。数据必须隔离不能串。角色数据隔离 (Role-based Data Isolation)策略路由 (Strategy Routing)第一部分角色数据隔离它解决了什么问题如果8 种角色都用同一个设备列表接口但每种角色看到的设备范围完全不同。最笨的办法是写一个巨大的 SQL把所有权限条件都塞进去。但那样 SQL 会极其复杂、难维护、容易出 bug。怎么做的核心方法queryCraneList逻辑很直白1. 拿到当前用户的 roleId角色ID 2. 拿到当前用户的 organId机构ID 3. 根据 roleId 走不同的 if 分支 4. 每个分支调对应的 Mapper 方法都传 organId 进去比如安装单位roleId1003登录走selectInstallUsingCraneList(req, organId)SQL 里天然带了WHERE organ_id ?只查出这个安装单位装过的设备。使用单位登录走selectUseUsingCraneList查的是使用单位在用的设备。数据隔离靠的不是复杂的权限框架而是每个角色调自己的 SQLSQL 里自带 organId 过滤。简单粗暴但极其有效。还有一个细节在用/已用安装单位、使用单位、总包/监理这三种角色还要区分在用设备和已用设备历史设备通过req.getUsingState()参数控制。相当于每个角色内部还分两套查询。而终端单位不需要区分只查一个列表。总包/监理的特殊处理总包和监理共用一套查询方法selectTotalOrSuperviseUsingCraneList但额外传了roleId参数。因为总包和监理虽然看同样的设备但在 SQL 里的关联条件略有不同需要 roleId 来区分。第二部分策略路由applyMap 反射路由表它解决了什么问题系统有17 种业务申请安装告知、顶升申请、拆卸告知、使用登记、设备检测、终端绑定、设备停用、设备复工… 每种申请存在不同的数据库表里由不同的 Mapper 管理。setDataSource方法要干的活是拿到一批申请日志ApplyLog给每条日志补充这条数据来自哪个地市平台。笨办法是写 17 个 if-elseif(INSTALL.equals(type)){InformApplyapplyinformApplyMapper.selectById(applyId);platformIdapply.getPlatformId();}elseif(UP.equals(type)){UpApplyapplyupApplyMapper.selectById(applyId);platformIdapply.getPlatformId();}elseif(USE.equals(type)){UseApplyapplyuseApplyMapper.selectById(applyId);platformIdapply.getPlatformId();}// ... 再来 14 个这样写又臭又长每加一种申请类型就得改这个方法。怎么做的第一步启动时注册路由表PostConstruct initMap()在 Spring 启动时自动执行把 17 种申请类型注册到一个 Map 里applyMap.put(INSTALL,Triple.of(informApplyMapper,InformApply.class,platformId));applyMap.put(UP,Triple.of(upApplyMapper,UpApply.class,platformId));// ... 17 种每个 Triple 存了三样东西left用哪个 Mapper 查如informApplyMappermiddle查出来是什么类如InformApply.classright要读哪个字段如platformId第二步运行时查表 反射setDataSource遍历每条日志拿到applyType从 Map 里查到对应的 Triple然后1. 用 mapper.selectById(applyId) 查出申请记录 2. 用反射 clazz.getDeclaredField(platformId) 拿到字段 3. 用 field.get(apply) 读出 platformId 的值 4. 用 platformId 查平台名称设置到日志上核心思想把哪种类型用哪个 Mapper、哪个类、哪个字段这个映射关系预先注册好运行时通过查表 反射动态执行避免了硬编码的 if-else 链。两者的关联这两个设计其实是配合使用的角色数据隔离解决的是不同角色看不同设备列表策略路由解决的是不同申请类型用不同的查询方式一个按角色分发一个按申请类型分发思路一样——用枚举做 key用查表代替 if-else。区别是角色隔离走的是 if-else 分支因为分支少且每个分支逻辑差异大策略路由走的是 Map 反射因为分支多且每个分支逻辑结构相同只是参数不同。

相关新闻

免费解锁NVIDIA显卡隐藏性能:Profile Inspector终极配置指南

免费解锁NVIDIA显卡隐藏性能:Profile Inspector终极配置指南

免费解锁NVIDIA显卡隐藏性能:Profile Inspector终极配置指南 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector 你是否知道你的NVIDIA显卡还隐藏着200多项官方控制面板无法访问的高级设置&…

2026/10/10 20:51:30 阅读更多 →
coalecing

coalecing

Memory Coalescing(内存合并访问) 是 GPU 编程中针对 Global Memory(全局内存) 最基础且最重要的访存性能优化机制。 它的核心思想是:当一个 Warp(32 个线程)同时发起全局内存读写时&#xff0c…

2026/10/10 20:51:29 阅读更多 →
Dommel支持的数据库:从SQL Server到PostgreSQL全兼容方案

Dommel支持的数据库:从SQL Server到PostgreSQL全兼容方案

Dommel支持的数据库:从SQL Server到PostgreSQL全兼容方案 【免费下载链接】Dommel CRUD operations with Dapper made simple. 项目地址: https://gitcode.com/gh_mirrors/do/Dommel Dommel作为一款轻量级ORM工具,通过与Dapper的无缝集成&#xf…

2026/10/10 15:32:33 阅读更多 →

最新新闻

2026 深圳网页设计公司推荐-本地供需与外协生态的十家扫描

2026 深圳网页设计公司推荐-本地供需与外协生态的十家扫描

一家深圳的设计公司接到的单子,未必都来自它自己谈的客户。相当一部分活儿,是从别的服务商、广告公司、甚至自由设计师手里转过来的;也有一部分,是它自己接不完再转出去的。 这条上下游之间的人员与订单流动,构成了本地…

2026/10/11 0:06:30 阅读更多 →
MLflow实验跟踪与模型注册中心:ai-infra-engineer-learning中的MLOps完整实践指南

MLflow实验跟踪与模型注册中心:ai-infra-engineer-learning中的MLOps完整实践指南

【免费下载链接】ai-infra-engineer-learning AI Infrastructure Engineer Learning Track - Production ML infrastructure curriculum (2-4 years experience) 项目地址: https://gitcode.com/gh_mirrors/ai/ai-infra-engineer-learning 点击查看 免费下载 ai-in…

2026/10/11 0:05:30 阅读更多 →
AI Toolbox Image工作台评测:本地化AI图片生成渠道管理的完整指南

AI Toolbox Image工作台评测:本地化AI图片生成渠道管理的完整指南

【免费下载链接】ai-toolbox Personal AI Toolbox 项目地址: https://gitcode.com/gh_mirrors/aitoolbo/ai-toolbox 点击查看 免费下载 🖼️ AI Toolbox Image工作台 是开源项目 AI Toolbox 内置的图片生成与改图模块,帮你在一套本地化的界面…

2026/10/11 0:05:30 阅读更多 →
iPhone 终于能装扩展了!Reynard Browser 的 Firefox 插件安装与使用教程

iPhone 终于能装扩展了!Reynard Browser 的 Firefox 插件安装与使用教程

【免费下载链接】reynard-browser An experimental Gecko-based web browser for iOS 13. 项目地址: https://gitcode.com/gh_mirrors/re/reynard-browser 点击查看 免费下载 Reynard Browser 是一款基于 Firefox Gecko 引擎的 iOS 13 实验性开源浏览器&#xff0c…

2026/10/11 0:05:30 阅读更多 →
zotero-AI-Butler快速上手:5分钟完成安装、API配置与首篇论文总结

zotero-AI-Butler快速上手:5分钟完成安装、API配置与首篇论文总结

人工智能大模型AI 应用科研 【免费下载链接】zotero-AI-Butler 【Zotero AI 管家】调用大模型,自动精读论文库里的论文,总结为Zotero笔记。支持主流大模型平台!您只需像往常一样把文献丢进 Zotero, 管家会自动帮您精读论文&#x…

2026/10/11 0:05:29 阅读更多 →
Airbyte Paperform 声明式连接器全解析:基于 Low-Code CDK 的表单数据同步实现

Airbyte Paperform 声明式连接器全解析:基于 Low-Code CDK 的表单数据同步实现

数据工程数据集成ETL后端大数据 【免费下载链接】airbyte Open-source data movement for ELT pipelines and AI agents — from APIs, databases & files to warehouses, lakes, and AI applications. Both self-hosted and Cloud. 项目地址: https://gitcode.…

2026/10/11 0:05:29 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →