前言:
相信写过后台管理系统的人都知道,部门管理这个版块是非常之常见的,这个版块的作用就是管理一个公司的部门和部门下的人员,那么我们就要根据实际情况来设计,给使用者带来便捷。其实,这个东西初次接触觉得没啥东西,但是对于一个后端人员来说还是比较实用的,对于新接触后台管理的系统的小白,就更大有用处了。
准备:
- 样式排版(左边部门管理,右边部门人员管理)——这样不就简单明了,方便操作。部门展现用树结构,部门人员展现用列表形式,看上去是不是很舒服。
- 数据库设计
部门表——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等等,就看大佬们自由发挥了。