部门管理-Saas多租户平台开发

部门管理-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 功能如下

  • 列表

  • 添加

  • 修改

  • 删除

  • 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'
        })
      }
    
  • 详细代码:

见码仓库。

  • 图示:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o0kD7DL3-1607435053324)(./images/2020-12-08_dept.png)]

前后端工程详细代码见下面码云仓库。

后记

本项目为参考某马视频开发,相关视频及配套资料可自行度娘或者联系本人。上面为自己编写的开发文档,持续更新。欢迎交流,本人QQ:806797785

后端JAVA源代码地址:https://gitee.com/gaogzhen/ihrm-parent    // 后端项目
前端项目源代码地址:https://gitee.com/gaogzhen/ihrm-vue    // 前端后台管理系统

猜你喜欢

转载自blog.csdn.net/gaogzhen/article/details/110895080