MDP 主数据平台 V1.6.0 升级日志
更新周期:2026-09-16 ~ 2026-10-08,后端 62 次提交、前端 55 次提交
✨ 亮点特性
👥 用户体系与组织权限重构
- 完成用户身份与角色组织权限体系设计,集成账号操作矩阵(启用/禁用/重置密码/删除等操作的权限守卫)
- 新增组织可见性服务:用户、岗位列表按当前操作人可见组织树过滤,岗位保存校验所属组织可见性
- 新增系统硬保护:内置组织识别并禁用相关操作(前端同步禁用),保护运营管理员及其权限集合角色
- 组织性质统一同步逻辑:部门性质冗余同步所属公司,删除相关冗余代码
🧩 字段权限(菜单 × 角色 × 字段)
- 全新字段权限体系:菜单上配置受控字段(隐藏/脱敏),角色按菜单树做字段受限授权(拒绝模型:勾选=受限,运营管理员豁免)
- 鉴权落在响应层:
FieldPermAdvice 按当前请求 URI 反查菜单,经 FieldPermEngine 对象树遍历处理(深度/对象数兜底、循环引用防御);脱敏复用 MaskManager 内置 9 种规则并支持自定义注册
- 性能设计:URI→菜单预解析映射 + 用户受限集双层 Redis 缓存,绝大多数请求一次查空即放行;配置/授权/角色变更全链路缓存失效
- 前端配套:菜单管理「字段配置」标签页、角色管理「字段授权」标签页(按应用分组)、列表页列隐藏/脱敏渲染、编辑页防回写(隐藏字段无条件剔除、脱敏字段未修改才剔除)
🛡️ 数据权限(按角色 × 菜单授权)
- 重构数据权限模块:移除旧实现,新增统一组织单元支持,实现角色数据权限授权(角色 × 菜单粒度)
- 支持用户角色数据范围及自定义数据权限,优化角色数据权限校验与菜单树构建逻辑
- 前端配套:角色/角色模板数据权限授权界面、权限集合数据规则、VbenVxeTree 数据权限菜单树
🔌 接口权限(资源关联接口)
- 新增接口权限模型(mdc_resource_api):菜单/按钮关联接口,提供全量与用户级放行集缓存及统一校验引擎(ApiPermChecker)
- 网关认证拦截器接入统一接口权限校验,单体与网关两套入口共用 SPI
- 前端配套:资源菜单"关联接口"管理页(扫描绑定、手动录入、已绑定接口展示)
- 移除旧按钮独立模块(按钮统一由菜单行承载),优化角色资源变更后的用户接口权限缓存失效链路
- 生产环境支持白名单模式:
not-config-uri-allow: false 时未配置接口一律拒绝
🗂️ 菜单与授权的级联治理
- 菜单删除级联:关联接口配置、字段规则与角色字段关系、数据权限授权一并清除,全链路缓存同步失效
- 菜单禁用级联(读时过滤,可逆):禁用后整棵子树的菜单/按钮、关联接口、字段规则、数据权限配置全部失效,启用后自动恢复,不污染原有状态
- 取消应用授权级联:同一角色+应用下的功能权限、数据权限、字段权限一并清除
- 删除角色级联:应用权限、数据权限、字段权限、功能权限、角色绑定的用户一并删除
- 新增角色数据与字段权限授权聚合数据接口(按应用分组的授权树一次性返回)
📝 表单更新语义升级
updateDtoById 由全量更新升级为"按请求体提交字段更新":提交为 null 的字段显式置空、未提交的字段不动(新增 UpdateFieldAdvice 采集请求体字段,后端内部调用保持原语义),消除"DTO 有而表单未渲染的字段被误置 null"与"无法置空字段"两类历史问题
- 前端校验框架增强:表单字段校验规则合并逻辑修正、字符串长度约束兼容性、数组类型字段非空校验
📊 统计大屏完善
- 统计数据域隔离:用户与组织统计按当前登录人顶级公司的组织性质限定范围(运营=全平台,其他=tree_path 子树)
- 类型分布统计调整为机构性质分布;用户增长趋势支持多曲线(总用户 + 各组织性质)、新增性别分布图表、中国地图组件支持全屏切换
- 统计口径修正:组织性质分布与趋势曲线统一为"同一性质内按用户去重"(COUNT DISTINCT),避免用户同时挂公司与部门被重复计数
🔐 认证与 OAuth2
- 支持多种新认证类型及 SSO ticket 模式登录,登录接口增加 appKey 参数
- OAuth2:DTO/VO 迁移至核心模块并重构接口实现,密码模式登录失败抛出标准 OAuth2 异常,优化登录错误处理
- 前端 OAuth2 登录逻辑模块化拆分;确认权限页应用名称显示修复;退出登录支持客户端标识参数;个人中心增加 OAuth2 应用跳转
🔄 重构与优化
- DTO/VO/实体的字段描述与注释全量对齐数据库字段注释(约 130 个文件),清理旧代码生成器残留标记
- Mapper 层 Db/Row 直查替换为 Mapper/Service 调用,消除 SQL 字符串拼接
- 统计 SQL 动态化:null 参数(日期区间、组织前缀、角色性质)经
<if> 动态拼接,不再发送死条件
- 登录组织上下文解析重构:单位保留校验改用"所属单位及上级单位"集合(修复只挂部门用户被误判失效),失效项降级为当场重算,顶级单位改由当前单位 treePath 唯一推导
- 用户编辑优化:仅部门关系变更时才校正"最近登录组织"(失效项置空,登录时自动重新默认),未提交部门字段不再误删用户部门关系
- 手机号/邮箱空白值统一归一化为 null(空串与 null 等价),避免空串占用唯一索引导致多用户冲突(管理端新增/修改/注册、开放接口批量保存/修改全覆盖)
- 角色相关代码格式与逻辑校验调整;角色/角色模板数据结构及接口调整;移除 RoleDto 中的 orgNature 字段
- sa-token 1.45 → 1.46 适配:fork 的 SSO 模型/配置类补齐
SaJsonType JSON 序列化标记接口;网关白名单匹配收敛至 AntPathMatcher 通道
- 自动配置自包含:
MdMybatisFlexConfiguration 自行激活 DatabaseProperties,不再依赖 md-common-config 的间接激活(修复微服务网关启动缺 bean)
- 前端:VxeSplitter 替换 ColPage 布局;Page 自动内容高度支持 Modal/抽屉场景;内容区尺寸实测写入 CSS 变量;vben 框架合并升级 3 次;locales 英文翻译优化
- 接口权限 SPI 入口类改依赖接口(ApiPermProvider)而非实现类
🐛 缺陷修复
- 修复统计查询幻影表问题(QueryWrapper.create 误用导致
FROM query_wrapper),补充 SQL 结构离线测试
- 修复缓存模型反序列化失败(UserApiPerm 缺无参构造导致 Redis 读取报错)
- 修复 SSO 免密换 token 后组织参数丢失:公司/顶级公司保留校验误用直属机构集合,导致只挂部门的用户每次换 token 公司参数被误清
- 修复字段权限引擎分页数据不生效:mybatis-flex Page 被框架包前缀整体拦截,records 永远遍历不到
- 修复字段权限对模型类写入整体失效:项目统一的
@Accessors(chain = true) 链式 setter 不符合 JavaBeans 写方法规范,回退为字段直写
- 修复删除角色报 UnsupportedOperationException:
Stream.toList() 返回不可变列表,追加缓存 key 时抛出(缓存失效列表改为可变 ArrayList 包装)
- 修复单体启动失败(Spring Framework 6.2 行为变更):
classpath:/ 静态资源映射归一化后路径为空触发断言,调整为标准 /static/** 映射
- 修复网关白名单匹配报错:sa-token 1.46 的 PathPatternParser 不支持多段
** 通配 pattern
- 修复用户列表查询与页面数据不同步;用户筛选新增模糊匹配
- 修正消息任务接收人列表的回填逻辑;消息管理表单及发布消息功能优化
- 修复性别分布"全部时间"场景查询为空(null 日期参数被当作过滤值)
- 修复 TokenContextFilter 会话获取方式;当前组织性质为空时角色查询异常
- 前端:路由异常处理避免无限循环;节点切换监听支持 Tab 懒挂载;v-model 兼容性;树组件选中逻辑与性能;docInfo 同步和发布操作逻辑与提示;禁用自动加载避免首次重复请求
🚨 升级注意事项
行为变更提醒:
updateDtoById 语义变更:不再全量更新,仅更新请求体中出现的字段。若前端页面此前依赖"提交全量表单"的习惯无需调整;后端内部调用 updateDtoById 的服务逻辑不受影响(保持全量语义)。建议回归测试含可清空字段(头像、备注、下拉)的编辑页
- 接口权限校验启用后,未配置接口权限的接口默认放行策略由配置项控制;如需严格管控,请先在菜单管理完成接口绑定。生产环境已启用白名单模式(
not-config-uri-allow: false,未配置一律拒绝),上线前请确保在用接口已全部纳管(接口扫描入库),且 anyUser/anyone 名单内接口不受影响
- sa-token 升级 1.46:Redis 需 ≥ 6.0(session 更新改用
SET ... KEEPTTL 保持 TTL);新增 JSON 反序列化全局类型白名单——fork 的 SSO 模型/配置类已补齐 SaJsonType 标记,若二开中有自定义类型经 sa-token DAO 序列化(如 session.set 自定义对象),需同步实现 SaJsonType 或经 SaJsonStrategy.registerAllowType 注册
- Spring Framework 6.2 静态资源断言收紧:
addResourceLocations("classpath:/") 写法不再合法(归一化后为空路径),请检查二开中的同类配置
- 菜单禁用语义:禁用后整棵子树的接口/字段规则/数据权限整枝失效(读时过滤),启用即自动恢复;菜单删除会级联清除关联接口、字段配置与数据权限授权,删除前请确认
- 用户类型分布统计口径变更(去重),数值可能略小于升级前,属预期修正
数据库变更:
mdc_resource_field 结构修正:新增 rule_type/mask_rule 列,唯一键调整为 (menu_id, property)
- 新增
mdc_role_field_rel(角色字段受限关系)表
- 迁移脚本见
docs/用户体系/field-permission-migration.sql,接口资源初始化见 docs/用户体系/field-permission-resource-api-init.sql
📚 文档
- 补充用户体系四个阶段设计方案(数据模型、身份注册、可见性保护、数据范围)与数据权限设计文档
- 补充字段权限设计文档(配置 → 授权 → 鉴权全链路、缓存与失效矩阵)
- 补充 Sa-Token 全局过滤器说明、Mapper 继承及注解要求文档
🌟 关注我们
MDP(Master Data Platform)主数据平台 —— 基于 Java 17、SpringBoot 3.x、SpringCloud、Vue3 + TypeScript 的企业级中后台快速开发平台,内置权限管理、单点登录、代码生成、数据同步、监控审计等核心能力,开箱即用,助力企业数字化建设。
专注于单点登录解决方案。内置用户中心、开发者平台、管理后台3个应用。包含:单点登录、Oauth2 登录、用户身份管理、应用申请、应用接入、主数据维护、主数据订阅、主数据广播、应用接口调用、接口管理管理和查看、系统配置等功能。
项目持续迭代中,欢迎 Star、Fork、提 Issue 参与共建!