java-多级部门自定义化实现

首先很重要的是数据库的建表

在这里插入图片描述

CREATE TABLE `dept` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(30) NOT NULL COMMENT '部门名称',
  `parent_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '父级部门id,0为顶级部门',
  `state` int(11) unsigned DEFAULT '1' COMMENT '状态:1为启用,0为隐藏',
  `is_parent` int(11) DEFAULT '0' COMMENT '是否为父级部门:1为是,0为不是',
  `sort_order` int(11) DEFAULT NULL COMMENT '在分类中的排序',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `update_time` datetime DEFAULT NULL COMMENT '修改时间',
  `update_user` int(11) unsigned DEFAULT NULL COMMENT '修改人',
  `company_id` int(11) unsigned DEFAULT NULL COMMENT '公司外键id',
  PRIMARY KEY (`id`),
  UNIQUE KEY `dept_company_id_name` (`company_id`,`name`) USING BTREE,
  CONSTRAINT `fk_dept_company_id_on_id` FOREIGN KEY (`company_id`) REFERENCES `company` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8 COMMENT='部门表';


之后不管你dao层要用什么技术,总之都需要拿到所有部门信息的list吧,这里建议创建如下实体类来接收数据
public class DeptMenu {
    private Integer id;

    private String name;

    private Integer parentId;

    private Integer state;

    private Integer isParent;

    private Integer sortOrder;

    private List<DeptMenu> children = new ArrayList<>();
}
最后就是service做的解析了
public List<DeptMenu> getAllDeptMenuByCompanyId(int companyId) {
        List<DeptMenu> allDeptByCompanyId = deptMapper.getAllDeptByCompanyId(companyId);
        if (allDeptByCompanyId == null)
        {
            return null;
        }

        for (DeptMenu deptMenu: allDeptByCompanyId){
            Integer parentId = deptMenu.getParentId();
            if(parentId != 0){
                for (DeptMenu deptMenu1:allDeptByCompanyId){
                    if(deptMenu1.getId() == parentId){
                        List<DeptMenu> children = deptMenu1.getChildren();
                        children.add(deptMenu);
                        deptMenu1.setChildren(children);
                    }
                }

            }
        }

        Iterator<DeptMenu> it = allDeptByCompanyId.iterator();
        while(it.hasNext()){
            DeptMenu x = it.next();
            Integer parentId = x.getParentId();
            if(parentId != 0){
                it.remove();
            }
        }

        return allDeptByCompanyId;
    }
返回的json样式是这样子的,相信前端完全可以拿去做展示
{
    "result_msg": "操作成功",
    "result_code": "SUCCESS",
    "result_num": 200,
    "data": [
        {
            "id": 1,
            "name": "测试1部门",
            "parentId": 0,
            "state": 1,
            "isParent": 1,
            "sortOrder": 1,
            "children": [
                {
                    "id": 6,
                    "name": "子测试4部门",
                    "parentId": 1,
                    "state": 1,
                    "isParent": 0,
                    "sortOrder": 1,
                    "children": []
                },
                {
                    "id": 8,
                    "name": "子测试5部门",
                    "parentId": 1,
                    "state": 1,
                    "isParent": 1,
                    "sortOrder": 2,
                    "children": [
                        {
                            "id": 9,
                            "name": "子测试6部门",
                            "parentId": 8,
                            "state": 1,
                            "isParent": 0,
                            "sortOrder": 1,
                            "children": []
                        }
                    ]
                }
            ]
        },
        {
            "id": 2,
            "name": "部门2",
            "parentId": 0,
            "state": 0,
            "isParent": 0,
            "sortOrder": 2,
            "children": []
        },
        {
            "id": 3,
            "name": "部门3",
            "parentId": 0,
            "state": 1,
            "isParent": 0,
            "sortOrder": 3,
            "children": []
        }
    ]
}

(因为是自己思考然后实现的,在具体细节或者性能上可能需要继续提升,欢迎大家指点~)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值