// 各个角色是否存在对应的菜单项
while not ADODataSetRole.Eof do begin
// 不是系统管理角色(系统管理拥有所有权限),则添加
if ADODataSetRole.FieldValues['RoleID']<>Role_SystemAdmin then begin
// 不存在该角色对应的权限,则添加(查询字段,查询字段,需要返回值的字段)
V := ADODataSetRoleRight.Lookup('RoleID;MenuItemName',
VarArrayOf([ADODataSetRole.FieldValues['RoleID'], Menu.Name]), 'RoleRight');
if (VarType(V) in [varNull]) then begin
ADODataSetRoleRight.Append;
ADODataSetRoleRight.FieldValues['RoleID'] := ADODataSetRole.FieldValues['RoleID'];
ADODataSetRoleRight.FieldValues['MenuItemName'] := Menu.Name;
ADODataSetRoleRight.FieldValues['MenuRemark'] := Menu.Caption;
ADODataSetRoleRight.FieldValues['RoleRight'] := 0;
ADODataSetRoleRight.Post;
end;
end;
ADODataSetRole.Next;
end;
ADODataSetRoleRight.Filter :='';
end;
end;
Exit;
end
else begin // 是一个含有子菜单的菜单项目
for MenuRow := 0 to Menu.Count-1 do begin
SearchSubMenu( Menu.Items[MenuRow] );
end;
end;
end;
begin
// 这里仅对主菜单进行权限设置
if (ObjName Is TMainMenu) then begin
// 遍历菜单中的每个菜单项
for MenuCol := 0 to (ObjName as TMainMenu).Items.Count-1 do begin
MenuTemp := (ObjName as TMainMenu).Items[MenuCol];
SearchSubMenu( MenuTemp );
end;
end;
end;
因篇幅有限,AddRoleRight过程仅对主菜单中的菜单项设置使用权限,第48-51行代码用于遍历菜单中的每个主菜单项,并递归调用SearchSubMenu过程完成每个下级菜单项的遍历工作;第14、16和31行代码用于遍历角色表中的每个角色;第20-29行先判断该菜单项目在角色权限表中是否存在,若不存在则在角色权限表中添加该对象;第38-42行代码表示检测到一个含有子菜单的菜单项目,则再递归调用SearchSubMenu过程完成其下级所有子菜单项目的检测。如此执行当AddRoleRight调用结束时,则菜单中的所有菜单项目都自动地添加到ADODataSetRoleRight所指向的角色权限表RoleRight中。
|