数据库权限管理设计-数据权限 设计
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。
其他一些琐碎的技术不值得介绍。 大家可以在源码中自行研究。 如果您有任何问题,请留言讨论。