在应用软件中,通常将软件的功能分为若干个子程序,通过主程序调用。那么,通过众多客户来说,如果设置各人的权限呢?
一、模板的权限
.主程序MainFrm.EXE,通过菜单调用几十个子程序(模块)。如:
1、主程序Main.EXE,通过菜单调用打开子程序,即模块程序:
2、调用子程序又有三级菜单,打开业务窗口
3、设置主程序调用的模块的权限
通过(用户)登录名和密码,读取相关模块的权限,进入模块(子程序)。
二、模块、子程序的管理权限
1、模块的菜单
每个模块通过三级菜单,通过管理40个左右窗口。仅有部门需要权限。那么,对于用户的权限一般有三个权限:
(1)浏览的权限,可进入窗口观看数据;
(2)编辑的权限,可对数据进行修改、增加、删除操作;
(3)打印和导出EXCEL、PDF等文件操作;
通常,我们将2、3权限合并。这样,对于每个窗口,用户就是二个权限:一是进入浏览权限,二是编辑打印的权限。
2、设置模块、菜单、窗口的数据关系(用户与窗口权限的关系表)
这里,要建立数据表,将模块、菜单、窗口和指定的二个权限,进行关联。见 上图。
例如:A0 B0一对字段,对应一个这窗口的浏览权和编辑权,由此表指定。
3、 在模块程序中,设置“本模块”的管理权限
设置字段A0..A39, B0..B39,分别对应窗口的浏览权和编辑权。i
数据表中一人一条信息,对应设置窗口的管理权限。
4、建立确定是否设置管理权限的函数
function GetPermissions_QX(s1,s2:string):Boolean; // 获取是否设置权限
// S1模块名 S2菜单2名称 // 数据空 返回True
var SQL:string;
T:Boolean;
begin
Result := False;
SQL:='select 权限 From 系统_模块窗口配置 '+
'where (模块='+#39+S1+#39+') and (分支='+#39+sFCID+#39+')';
DataModule1.ClientDataSet101.Active:=False;
DataModule1.ClientDataSet101.DataRequest(SQL);
DataModule1.ClientDataSet101.Active:=True;
if DataModule1.ClientDataSet101.RecordCount<=0 then // 未设置权限 任何人都有权
begin
Result := True;
Exit;
end;
//SQL:='select 权限,菜单2,模块 From 系统_模块窗口配置 '+
SQL:='select 权限 From 系统_模块窗口配置 '+
'where (模块='+#39+S1+#39+') and (菜单2='+#39+S2+#39+') and (分支='+#39+sFCID+#39+') and (用户='+#39+sName+#39+')';
// showmessage(SQL);
try
DataModule1.ClientDataSet101.Active:=False;
DataModule1.ClientDataSet101.DataRequest(SQL);
DataModule1.ClientDataSet101.Active:=True;
if DataModule1.ClientDataSet101.RecordCount>0
then Result:=DataModule1.ClientDataSet101.FieldByName('权限').AsBoolean // 权限
else Result:=False; // 无数据 不调权限
DataModule1.ClientDataSet101.Active:=False;
except
end;
end;
这个函数关键:
(1)数据表数据为空,既未设置权限,末设置
(2)只要设置一条窗口权限,搜索该窗口是否设置权限,否则末设置。
(3)确定设置了管理权限,下一步再读取用户权限。
这样,对不是一些不需要使用用户管理权限的单位,不设置,就可以了。
6、读取用户窗口权限函数(用户与窗口权限的关系表)
function GetPermissions(DataName,Field1,S1,Field2:string):Boolean; // 打开SQL数据库 读出权限
var SQL:string;
T:boolean;
begin
Result := False;
if S1='' then Exit;
if S1='AAAAAAA' then // 默认管理员 都有权
begin
Result := True;
Exit;
end
else begin
SQL:='select '+Field2+' From '+DataName+' where (分支='+#39+sFCID+#39+') and ('+Field1+'='+#39+S1+#39+')';
try
DataModule1.ClientDataSet101.Active:=False;
DataModule1.ClientDataSet101.DataRequest(SQL);
DataModule1.ClientDataSet101.Active:=True;
if DataModule1.ClientDataSet101.RecordCount>0 then
T:=DataModule1.ClientDataSet101.FieldByName(Field2).AsBoolean;
except
Result:=False;
end;
end;
Result:=T;
end;
7、进入窗口菜单事件代码
三层判断,
第一层判断是否设置权限,如果没有设置,权限为真,否则进入下一层;
第二层判断,模块权限中是否则有此用户,无此用户,权限为假,否则进入下一层;
第二层判断,找到窗口的字段名,读取该用户,该字段的权限。
代码如下:
procedure TBarPanel_1.sSpeedButton11Click(Sender: TObject);
var sField:string;
T:boolean;
begin
T:=False;
if not GetPermissions_QX('医疗服务','医嘱') then
begin
T:=True;
end
else begin
sField:=GetPermissions_QX_Firld('医疗服务','医嘱',1); // 获取模块窗口 浏览 编辑 字段
if sField<>'' then
begin
T:=GetPermissions('管理权限_模块_医疗','用户',OperateName,sField); // 读取权限
end
else begin
T:=True;
end;
end;
if T then MainFrm.CreateTabSheet(TY_Standing_orders_Frm,'长期医嘱','1013');
end;
8、保存数据、打印、导出的按键事件代码
procedure TY_Daily_orders_Frm.Button13Click(Sender: TObject);
begin
if GetPermissions('权限_医疗','用户',OperateName,'B30') // 读取权限
then GridppReport2.PrintPreview(True)
else ShowMessage('你无权打印!');
end;
procedure TY_Daily_orders_Frm.Button10Click(Sender: TObject);
begin
if GetPermissions('权限_医疗','用户',OperateName,'B30') // 读取权限
then UpDataClientDBGridEhAll(DBGridEh2,ClientDataSet2,'药品_医嘱_常用',True,True)
else ShowMessage('你无编辑权权限!');
end;