构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(24)-权限管理系统-将权限授权给角色
回到头看到SysRightOperate表的IsValid,我们将授权角色和模块和操作码这3张表关联起来,其中IsValid字段是来标识是否有操作的权限,当第一次授权,那么是向SysRightOperate添加一条记录,如果下次更新先判断是否已经授权如果没有,那么删除或者更新IsValid,我这里是更新,你也可以删除掉,一样的道理。
之前我们已经新建过SysRight这个表的DAL层和BLL层了,根据想法,我们只要建立多两个方法
更新SysRightOperate(即上面所说)
和按选择的角色及模块加载模块的权限项(确定操作码是否被授权,即图中的复选框)
现在向ISysRightRepository添加2个方法
//更新
int UpdateRight(SysRightOperate model);
//按选择的角色及模块加载模块的权限项
List<P_Sys_GetRightByRoleAndModule_Result> GetRightByRoleAndModule(string roleId, string moduleId);
P_Sys_GetRightByRoleAndModule_Result这个是存储过程,由于这2个方法比较复杂,这里用存储过程来做
复制代码
Create proc [dbo].[P_Sys_GetRightByRoleAndModule]
@roleId varchar(50),@moduleId varchar(50)
as
--按选择的角色及模块加载模块的权限项
begin
select a.Id,a.Name,a.KeyCode,a.ModuleId,ISNULL(b.IsValid,0) as isvalid,a.Sort,@roleId+@moduleId as RightId
from SysModuleOperate a
left outer join(
select c.Id,a.IsValid from SysRightOperate a,SysRight b, SysModuleOperate c
where RightId in
(select Id From SysRight where RoleId =@roleId and ModuleId =@moduleId)
and a.RightId=b.Id
and b.ModuleId=c.ModuleId
and a.KeyCode =c.KeyCode) b
on a.Id = b.Id
where a.ModuleId =@moduleId
end
复制代码
所以必须要把这个存储过程添加到EF,并生成复杂类型的实体P_Sys_GetRightByRoleAndModule_Result
然后创建P_Sys_UpdateSysRightRightFlag
复制代码
Create proc [dbo].[P_Sys_UpdateSysRightRightFlag]
@moduleId varchar(200),@roleId varchar(200)
as
begin
--计算上级模块的rightflag标识
declare @count int
--第一层:由操作权限项计算模块权限
select @count=COUNT(*) from SysRightOperate where RightId=@roleId+@moduleId and IsValid=1
if(@count>0)
begin
update SysRight set Rightflag=1 where ModuleId=@moduleId and RoleId=@roleId
end
else
begin
update SysRight set Rightflag=0 where ModuleId=@moduleId and RoleId=@roleId
end
--计算下一层
declare @parentId varchar(50)
set @parentId=@moduleId
while(@parentId<>'0')
begin
select @parentid=ParentId from SysModule where Id=@parentId
if (@parentId is null)
begin
return
end
select @count=COUNT(*) from SysRight where ModuleId in
(select Id from SysModule where ParentId=@parentId)
and RoleId =@roleId
and Rightflag=1
if(@count>0)
begin
update SysRight set Rightflag=1 where ModuleId=@parentId and RoleId=@roleId
end
else
begin
update SysRight set Rightflag=0 where ModuleId=@parentId and RoleId=@roleId
end
end
end
复制代码
这个是计算上级模块的rightflag标识也就是开头所说的RightFlag字段,这个字段将决定导航条的显示,所以每一次授权操作都要执行
下面添加SysRightRepository逻辑代码
复制代码
public int UpdateRight(SysRightOperateModel model)
{
//转换
SysRightOperate rightOperate = new SysRightOperate();
rightOperate.Id = model.Id;
rightOperate.RightId = model.RightId;
rightOperate.KeyCode = model.KeyCode;
rightOperate.IsValid = model.IsValid;
//判断rightOperate是否存在,如果存在就更新rightOperate,否则就添加一条
using (DBContainer db = new DBContainer())
{
SysRightOperate right = db.SysRightOperate.Where(a => a.Id == rightOperate.Id).FirstOrDefault();
if (right != null)
{
right.IsValid = rightOperate.IsValid;
}
else
{
db.SysRightOperate.AddObject(rightOperate);
}
if (db.SaveChanges() > 0)
{
//更新角色--模块的有效标志RightFlag
var sysRight = (from r in db.SysRight
where r.Id == rightOperate.RightId
select r).First();
db.P_Sys_UpdateSysRightRightFlag(sysRight.ModuleId, sysRight.RoleId);
return 1;
}
}
return 0;
}
//按选择的角色及模块加载模块的权限项
public List<P_Sys_GetRightByRoleAndModule_Result> GetRightByRoleAndModule(string roleId, string moduleId)
{
List<P_Sys_GetRightByRoleAndModule_Result> result = null;
using (DBContainer db = new DBContainer())
{
result = db.P_Sys_GetRightByRoleAndModule(roleId,moduleId).ToList();
}
return result;
}
复制代码
按照习惯,我们要向IBLL 和BLL 添加代码,大家自行添加访问DAL层的代码即可
上一篇: 2种Excel批量插入多个空白行的方法操作简单且快捷
下一篇: win10的mysql服务无法启动
推荐阅读
-
构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(24)-权限管理系统-将权限授权给角色
-
构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(26)-权限管理系统-分配角色给用户
-
构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(27)-权限管理系统-分配用户给角色
-
构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(26)-权限管理系统-分配角色给用户
-
构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(27)-权限管理系统-分配用户给角色