层级设计以及算法,treetable的实现

在开发工具类项目的过程中,或多或少都会涉及到层级关系展示的问题,比如区域、机构,我这里选取机构作为例子,前端选取了treetable,treetable需要数据是父-->子1-->子1子子,子2-->子2子子。所以选择在后端保存数据按照这个思路设计。

数据库设计:

DROP TABLE IF EXISTS `t_department`;
CREATE TABLE `t_department` (
  `id` int(10) NOT NULL AUTO_INCREMENT COMMENT '部门编号',
  `name` varchar(128) COLLATE utf8_bin NOT NULL COMMENT '部门名称',
  `pid` int(10) DEFAULT NULL COMMENT '父级编号',
  `pids` varchar(128) COLLATE utf8_bin DEFAULT NULL COMMENT '所有父级编号',
  `remark` varchar(512) COLLATE utf8_bin DEFAULT NULL COMMENT '备注',
  `creater` varchar(64) COLLATE utf8_bin NOT NULL COMMENT '创建者',
  `create_time` datetime NOT NULL COMMENT '创建时间',
  `updater` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT '更新者',
  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  `del_flag` char(1) COLLATE utf8_bin NOT NULL DEFAULT '0' COMMENT '删除标记',
  `seq` varchar(250) COLLATE utf8_bin NOT NULL COMMENT '排序号',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='部门表';

取数据:

SELECT * FROM t_department WHERE 1=1 ORDER BY seq;


保存数据算法:

如果没有父类,seq设置为1,如果有,根据父ID(pid)计算自己是第几个孩子,seq = pseq + count;

pseq 即父类的排序号,count 为自己是父的第几个孩子。


部分代码如下:

int cnt = departmentService.countByPid(department.getPid()) + 1;
Department pdep = departmentService.single(department.getPid());
String pseq = pdep == null ? "1" : pdep.getSeq();
department.setSeq(pseq + cnt);


结果如下:

层级设计以及算法,treetable的实现_第1张图片

展示效果


层级设计以及算法,treetable的实现_第2张图片

层级设计以及算法,treetable的实现_第3张图片

层级设计以及算法,treetable的实现_第4张图片

其实这个设计是有一个坑的,哈哈。




你可能感兴趣的:(java)