前言:
相信写过后台管理系统的人都知道,部门管理这个版块是非常之常见的,这个版块的作用就是管理一个公司的部门和部门下的人员,那么我们就要根据实际情况来设计,给使用者带来便捷。其实,这个东西初次接触觉得没啥东西,但是对于一个后端人员来说还是比较实用的,对于新接触后台管理的系统的小白,就更大有用处了。
准备:
- 样式排版(左边部门管理,右边部门人员管理)——这样不就简单明了,方便操作。部门展现用树结构,部门人员展现用列表形式,看上去是不是很舒服。
- 数据库设计
部门表——department
部门人员关系表——department_user
注意:有需要添加的字段的可以自己设计
- 左边部门管理需要准备的接口(增删改查)
- 部门树的查询
- 新增部门
- 修改部门
- 删除部门——删除部门的同时,不仅需要删除自身还需要删除对应下的所有子级部门,并且删除部门人员关系
- 右边部门人员管理需要准备的接口(增删改查)
- 部门添加人员
- 查询部门人员列表
- 移除部门人员
- 任命领导
- 查询所有有效的后台人员(排除已经添加过的人员)——供部门添加人员的时候选择
实际操作:
- 创建实体类——对应数据库名,成员对应字段值(这里我就省略了)
- Controller层——基本写法我也省略了
- Service层——逻辑层挺重要的,难点的地方我觉得就是树结构的查询,还有删除部门。这里我上代码
- Dao层——基本写法
- sql文件——对照着表都能写出来吧,基本写法。
部门树的查询代码:
/** * @Description 查询部门资源树 * @author HeLiu * @date 2018/11/22 16:07 */ public List<Department> queryDepartmentTree() { //查询部门信息列表 List<Department> departmentList = departmentDao.queryDepartmentList(); return buildResource(departmentList); } /** * @Description 构建资源树 * @author HeLiu * @date 2018/11/22 16:22 */ public List<Department> buildResource(List<Department> list) { List<Department> target = new ArrayList<>(); if (!list.isEmpty()) { // 根元素 list.stream().filter(department -> department.getParentId() == 0).forEach(department -> {// 根元素 List<Department> children = getChildren(department, list); department.setChildren(children); target.add(department); }); } return target; } private List<Department> getChildren(Department department, List<Department> list) { List<Department> children = new ArrayList<>(); if (!list.isEmpty()) { list.stream().filter(child -> department.getId() == child.getParentId()).forEach(child -> { List<Department> tmp = getChildren(child, list); child.setChildren(tmp); if (tmp.isEmpty()) { child.setLeaf(true); } children.add(child); }); } return children; }
删除部门:
/** * @Description 删除部门 * @author HeLiu * @date 2018/11/23 10:21 */ public int delDepartment(Integer departmentId) { //删除如部门同时果存在子级部门一同删除,并删除部门人员关系 //查询部门信息列表 List<Department> departmentList = departmentDao.queryDepartmentList(); //获取父级下所有子级部门编号 List<Integer> childrenDepartmentIds = getChildrenDepartmentIds(departmentId, departmentList); //把自身加上 childrenDepartmentIds.add(departmentId); logger.info("删除部门的所有编号departmentIds{}:" + childrenDepartmentIds.toString()); return transactionTemplate.execute(new TransactionCallback<Integer>() { @Override public Integer doInTransaction(TransactionStatus status) { //删除部门下人员关系 departmentUserDao.delDepartmentUserByDepartmentIds(childrenDepartmentIds); //删除部门 return departmentDao.delDepartment(childrenDepartmentIds); } }); } /** * @Description 获取父级下所有子级部门ID * departmentId-父级部门Id,list-所有部门列表集合 * @author HeLiu * @date 2018/11/29 10:18 */ public List<Integer> getChildrenDepartmentIds(Integer departmentId, List<Department> list) { List<Integer> childrenDepartmentIds = new ArrayList<>(); if (!list.isEmpty()) { list.stream().filter(child -> departmentId == child.getParentId()).forEach(child -> { Integer departId = child.getId(); childrenDepartmentIds.add(departId); List<Integer> childrenDepartIds = getChildrenDepartmentIds(departId, list); if (!childrenDepartIds.isEmpty()) { childrenDepartmentIds.addAll(childrenDepartIds); } }); } return childrenDepartmentIds; }
结尾:
这里只是提供思路,后端管理系统的页面拿到接口数据应该都是很好处理的,怎么把数据展现出来,每个页面框架各有千秋类似Extjs,EasyUI等等,就看大佬们自由发挥了。