elunez / eladmin

eladmin jpa 版本:项目基于 Spring Boot 2.6.4、 Jpa、 Spring Security、Redis、Vue的前后端分离的后台管理系统,项目采用分模块开发方式, 权限控制采用 RBAC,支持数据字典与数据权限管理,支持一键生成前后端代码,支持动态路由
https://eladmin.vip/demo
Apache License 2.0
21.04k stars 7.33k forks source link

部门管理修改树状结构的父子级时可能会出现数据环形 #803

Closed luocheng0208 closed 1 year ago

luocheng0208 commented 1 year ago

复现步骤 image 如上图红框所示,有个三层树结构: 顶级 ——111 ————222

现在我想要将111的父级设置成为222,系统会提示成功,如下图所示 image 但是此时就会导致111的父级是222(即111的pid=222的id),但原本222的父级就是111(即222的pid=111的id)。如此一来111的父级是222,222的父级又是111,这样一来就导致了父子之间的数据环形,界面上已经无法展示111和222之间的树状关系,如下图修改成功后的界面: image

但是实际数据库中这两条数据还存在,但是由于111和222的两者的pid导致了数据环形,界面上却无法显示,数据库截图如下: image

总的来说:就是当修改一行数据的所属父级时,只要选择的父级是该行数据下的子级,就会发生这样的错误,一旦错误,就会导致该行数据以及它下面的子级数据形成数据环形,无法形成树状结构,且导致数据库的数据成为脏数据。

此问题所有地方有树状结构编辑的地方都可能发生,例如菜单管理也是树状结构,可以检查所有有树状结构编辑的地方,以免遗漏。

luocheng0208 commented 1 year ago

@elunez 您好,你这样做虽然避免了在界面上操作出现错误的可能,但实际上这个错误还是存在的(治标不治本),比如直接调用接口,不从界面进行操作,这是存在于业务逻辑上的错误。是不是在业务代码中多添加一层逻辑上的判断,判读它选的pid不能是它自己子级的id。个人见解,望君参考,如有不同见解,还请指点一二。

elunez commented 1 year ago

之前写代码修复了下,父子节点互换是没问题,但是父节点换到子节点的子节点还是会出现问题,于是就弄成了这种方式。 如果加判断,编辑会变得复杂化。而且后台管理一般不会存在 api 调用接口去修改这个东西,以后如果有时间再改改这个