前言:
相信寫過後臺管理系統的人都知道,部門管理這個版塊是非常之常見的,這個版塊的作用就是管理一個公司的部門和部門下的人員,那麼我們就要根據實際情況來設計,給使用者帶來便捷。其實,這個東西初次接觸覺得沒啥東西,但是對於一個後端人員來說還是比較實用的,對於新接觸後臺管理的系統的小白,就更大有用處了。
準備:
- 樣式排版(左邊部門管理,右邊部門人員管理)——這樣不就簡單明瞭,方便操作。部門展現用樹結構,部門人員展現用列表形式,看上去是不是很舒服。
- 數據庫設計
部門表——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等等,就看大佬們自由發揮了。