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> |
文章写得有点简陋,但如果能对您有所帮助,鄙人不胜荣幸。