当前位置: 主页 > 数据库

数据库权限管理设计-数据权限 设计

发布时间:2023-02-13 11:04   浏览次数:次   作者:佚名

vhr部门管理模块已更新! 为了让小伙伴们快速了解部门管理模块的实现思路,我想通过3篇短文介绍大致的实现思路和核心代码。 本文是【SpringBoot+Vue前后端分离,使用SpringSecurity完美处理权限问题】系列文章的续篇。 建议大家先阅读前面的文章,对理解本文有帮助。

1.

2.

3.

4.

5.

6.

项目地址:

好吧,让我们看看本文的数据库设计和存储过程的编写。

总的来说,部门数据库比较简单,如下:

数据权限 设计_数据权限设计思路_数据库权限管理设计

都是常规字段数据库权限管理设计,脚本可以在项目中下载。 depPath是为了查询方便,isParent表示该项是否是上级部门。 为了简化程序中的逻辑,我在存储过程中设置了depPath和isParent。

数据权限 设计_数据库权限管理设计_数据权限设计思路

添加部门存储过程

添加部门的存储过程如下:

DELIMITER $$
USE `vhr`$$
DROP PROCEDURE IF EXISTS `addDep`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `addDep`(in depName varchar(32),in parentId int,in enabled boolean,out result int,out result2 int)
begin
  declare did int;
  declare pDepPath varchar(64);

数据权限设计思路_数据权限 设计_数据库权限管理设计

 insert into department set name=depName,parentId=parentId,enabled=enabled;  select row_count() into result;  select last_insert_id() into did;  set result2=did;  select depPath into pDepPath from department where id=parentId;  update department set depPath=concat(pDepPath,'.',did) where id=did;  update department set isParent=true where id=parentId; end$$ DELIMITER ;

关于这个存储过程,我说如下:

1.存储过程接收五个参数。 三个入参分别是部门名称、上级部门Id、部门是否启用。 两个输出参数表示受影响的行数和插入成功后id的值。

数据权限设计思路_数据库权限管理设计_数据权限 设计

2、存储过程先执行插入操作,插入完成后,将受影响的行数赋值给result。

3.然后通过last_insert_id()得到刚刚插入的id赋值给result2。

4、接下来查询父部门的depPath数据库权限管理设计,与刚刚生成的id结合为刚刚插入的部门的depPath。

5. 将父部门的isParent 字段更新为true。

将这些逻辑写在存储过程中可以简化我们代码中的逻辑。

删除部门存储过程

删除部也是我写成存储过程的,主要是删除的过程中要做几件事情。 核心代码如下:

DELIMITER $$
USE `vhr`$$
DROP PROCEDURE IF EXISTS `deleteDep`$$

数据权限设计思路_数据库权限管理设计_数据权限 设计

CREATE DEFINER=`root`@`localhost` PROCEDURE `deleteDep`(in did int,out result int) begin  declare ecount int;  declare pid int;  declare pcount int;  select count(*) into ecount from employee where departmentId=did;  if ecount>0 then set result=-1;  else  select parentId into pid from department where id=did;  delete from department where id=did and isParent=false;  select row_count() into result;

数据权限 设计_数据权限设计思路_数据库权限管理设计

 select count(*) into pcount from department where parentId=pid;  if pcount=0 then update department set isParent=false where id=pid;  end if;  end if; end$$ DELIMITER ;

关于这个存储过程,我说如下:

1、入参为待删除数据的id,出参为删除结果。

2.如果该部门下有员工,则不能删除该部门。

3、删除部门时注意添加条件isParent=false,即父部门不可删除。 我在前端已经对这一点做出了判断。 正常情况下,上级部门的删除请求是不会发送的,但是考虑到前端的数据是不可信任的,所以我们只好在后台进行限制。

4. 删除成功后,查看被删除部门的上级部门是否有其他子部门。 如果不是,修改parent department的isParent为false。

其他一些琐碎的技术不值得介绍。 大家可以在源码中自行研究。 如果您有任何问题,请留言讨论。