1、domain层<Department> - 实体类 - 需要添加字段
字段案例:
//部门树参数 - 无限极树用 - new ArrayList<>() - 防空指针异常
//用于封装当前部门的子部门
//坑:children这个单词不能乱写,必须与elementUI的上传组件中保持一致,不然前端没有数据
@JsonInclude(JsonInclude.Include.NON_EMPTY) //部门树最后一级没有数据就不显示
private List<Department> children = new ArrayList<>(); |
注意:该表名为department表,如下图示,其中的 parent_id 字段如值2,对应的是本表的 id 字段值 2,即是自己查自己,本案例是针对这种情况实现的,若表中parent_id字段对应的值并不在本表中,原理也是一样的
2. controller层 - 对接前端的接口 - restful风格
类上注解为:
@RestController
@RequestMapping("/department")
@Api(value = "部门接口类", description = "部门相关的CRUD功能接口")
service注入为:
@Autowired
private IDepartmentService departmentService;
部门树接口案例:
/**
* 接口:部门树
* @param
* @return
*/
@ApiOperation(value = "查询部门树")
@GetMapping("/deptTree")
public List<Department> getDeptTree() {
return departmentService.deptTree();
} |
3. service层 - 业务类接口
业务接口案例:
/**
* 接口:部门树
* @param
* @return
*/
List<Department> deptTree(); |
4.impl层 - 业务实现类 -
1)类上加注解
@Service
和
@CacheConfig(cacheNames = "dept") //操作redis缓存 - 关联dept
2)mapper注入:
@Autowired
private DepartmentMapper departmentMapper;
3)业务实现案例:
/**
* 部门树 - 无限极树业务类
*
* @param
* @return
*/
@Override
@Cacheable(cacheNames = "dept", key = "'tree'") //添加缓存到redis
public List<Department> deptTree() {
return getDeptTree();
}
private List<Department> getDeptTree() {
// 1. 一次性查询出所有数据,放到内存中,可以使用map - 做缓存用
// 2. 从所有数据中找出第一层级/顶级部门:这就是我们需要返回的数据
// 3. 遍历所有部门只要不是第一层级的,找自己的上级,并将自己放入上级的children中
//将所有的部门撞到map中 - 每次获取父部门都从这里获取
List<Department> all = departmentMapper.findAll();
Map<Long, Department> map = new HashMap<>();
for (Department department : all) {
map.put(department.getId(), department);
}
//前端需要得到的集合数据 - 部门树
List<Department> deptTree = new ArrayList<>();
for (Department department : all) { //循环置值
if (department.getParentId() == null) {//顶级部门的情况
deptTree.add(department);
} else {//不是顶级部门的情况
//1.想办法找到当前部门的 父部门
Long parent_id = department.getParentId();
//从上面的Map中去获取的 - 以前装进去的对象还是会存在
Department parentDepartment = map.get(parent_id);
if (parentDepartment != null) { //防止空指针,过滤出错数据
//2.将自己装到 父部门 的children中
parentDepartment.getChildren().add(department);
}
}
}
return deptTree;
} |
注意:在业务实现时,其实只用到了 departmentMapper 中的一个 findAll() 方法,即查询所有对象数据,所以在 mapper 层以及 sql 语句中不会有所新增(基础的 CRUD 方法一般而言早就写好了),至此,部门数的后端业务就已经全部实现了,剩下的就是前端的事了。
可能会用到的 redis 依赖:
<!--spirngboot springdata对redis支持-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--整合Redis , 底层可以用jedis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency> |
文章写得有点简陋,但如果能对您有所帮助,鄙人不胜荣幸。