部门管理-Saas多租户平台开发
目录
文章目录
内容
1、部门表
正常的公司部门会涉及层级问题,表设计的时候通过添加parent_id字段表示父级id,实现层级数据的表存储。
-
具体部门表sql如下:
SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for tb_co_department -- ---------------------------- DROP TABLE IF EXISTS `tb_co_department`; CREATE TABLE `tb_co_department` ( `id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '主键', `company_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '企业ID', `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '部门名称', `code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '部门编码', `category` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '部门类别', `manager_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '负责人ID', `city` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '城市', `introduce` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '介绍', `create_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间', `pids` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '祖辈部门ids', `parent_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '父级部门ID', `level` tinyint(2) NULL DEFAULT NULL COMMENT '层级', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '部门管理' ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of tb_co_department -- ---------------------------- INSERT INTO `tb_co_department` VALUES ('4234234', '34242', '技术部', 'sn2020001', NULL, '1', 'ff23f23', 'f23f23f23', '2020-12-04 11:48:05', NULL, '0', 1); INSERT INTO `tb_co_department` VALUES ('535235', '34242', '财务部', '1', NULL, '1', '该个网关热工', '荣一特 ', '2020-12-04 21:23:36', NULL, '0', 1); INSERT INTO `tb_co_department` VALUES ('65355', '34242', 'java开发', 'sn2020002', NULL, '1', 'ff23f23', '发2防2防f', '2020-12-04 11:48:05', NULL, '4234234', 2); INSERT INTO `tb_co_department` VALUES ('756', '34242', '数据库开发', 'sn2020003', NULL, '1', 'ff23f', 'h4g34', '2020-12-04 11:50:27', NULL, '4234234', 2); SET FOREIGN_KEY_CHECKS = 1;
2、后端接口
后端基本的增删改查我们用之前的自动生成代码生成,这么重点讲下部门有层级,删除部门的时候需要吧它及它下面的部门都删除。
- 层级数据的删除
- 递归
- 优点:逻辑简单明了,代码简洁
- 树形结构深度优先删除算法
- 优点:适用于大数据量,深层级。
- 递归
本项目实际应用中,不管企业大小,部门都不会很多,数据量不会很大,我们选择递归方式解决。
-
代码如下:
@Override @Transactional public void deleteSub(String id) { CoDepartmentEntity coDepartmentEntity = coDepartmentDao.selectById(id); if (ObjectUtils.isEmpty(coDepartmentEntity)) { throw new RRException("部门不存在", 500); } List<CoDepartmentEntity> list = new LambdaQueryChainWrapper<>(coDepartmentDao) .gt(CoDepartmentEntity::getLevel, coDepartmentEntity.getLevel()) .list(); List<String> ids = new LinkedList<>(); ids.add(id); querySubRecursive(coDepartmentEntity, list, 3, ids); coDepartmentDao.deleteBatchIds(ids); } /** * 递归封装子级id集合 * @param vo 上一级元素 * @param districtEntityVoList 总集合 * @param level 目标层级 * @param ids 子级id集合 */ private void querySubRecursive(CoDepartmentEntity vo, List<CoDepartmentEntity> districtEntityVoList, int level, List<String> ids) { // 1、如果是指定层级或者集合为空结束递归调用 if (vo.getLevel() == level || districtEntityVoList == null || districtEntityVoList.size() == 0) { return; } // 2、遍历查找集合中pid和目标id相同的元素 List<CoDepartmentEntity> children = new LinkedList<>(); Iterator<CoDepartmentEntity> iterator = districtEntityVoList.iterator(); while (iterator.hasNext()) { CoDepartmentEntity next = iterator.next(); if (next.getParentId().equals(vo.getId())) { // 2.1、找到元素,加入子集合;同时删除在原有集合中移除 children.add(next); ids.add(next.getId()); iterator.remove(); } } if (children.size() > 0) { // 3、子集合不为空,递归封装层级数据 vo.setChildren(children); for (CoDepartmentEntity child: children) { querySubRecursive(child, districtEntityVoList, level, ids); } } }
关于使用树形工具类,后面我们会在后面部分讲到,包括数据结构-树的java实现,树形结构工具类的封装,树形遍历的广度优先于深度优先算法等等。
3、API
使用之前的swagger2在线API文档,如图:
4、前端页面
部门管理页面 department.vue 功能如下
-
列表
扫描二维码关注公众号,回复: 12407616 查看本文章 -
添加
-
修改
-
删除
-
api接口文件 api/dept/department.js,如下
import request from '@/utils/http' // 查询全部数据 export function fetchList(query) { return request({ url: '/codepartment/list', method: 'get', params: query }) } // 模糊查询 export function querySome(query) { return request({ url: `/codepartment/querySome`, method: 'get', params: query }) } // 根据id查询 export function fetchDepartment(id) { return request({ url: `/codepartment/info/${id}`, method: 'get' }) } // 新增 export function createDepartment(data) { return request({ url: '/codepartment/save', method: 'post', data }) } // 更新 export function updateDepartment(data) { return request({ url: '/codepartment/update', method: 'post', data }) } // 根据ID删除 export function deleteDepartment(id) { return request({ url: `/codepartment/delete/${id}`, method: 'delete' }) }
-
详细代码:
见码仓库。
- 图示:
前后端工程详细代码见下面码云仓库。
后记 :
本项目为参考某马视频开发,相关视频及配套资料可自行度娘或者联系本人。上面为自己编写的开发文档,持续更新。欢迎交流,本人QQ:806797785
后端JAVA源代码地址:https://gitee.com/gaogzhen/ihrm-parent // 后端项目
前端项目源代码地址:https://gitee.com/gaogzhen/ihrm-vue // 前端后台管理系统