📄 privilegefrm.~pas
字号:
else if aNode.CheckState in [csMixedNormal, csMixedPressed] then
bHavMixed := true;
aNode := aNode.NextSibling;
end;
if pNode=nil then Exit;
if bHavMixed then
pNode.CheckState := csMixedNormal
else if iChecked=iCount then
pNode.CheckState := csCheckedNormal
else if iChecked=0 then
pNode.CheckState := csUncheckedNormal
else
pNode.CheckState := csMixedNormal;
end;
procedure TFmPrivilege.vTreePrivMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
MouseState := Button;
end;
procedure TFmPrivilege.vTreePrivMouseUp(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
// MouseState := mbMiddle;
end;
procedure TFmPrivilege.BtnCollapseClick(Sender: TObject);
begin
vTreePriv.FullCollapse;
end;
procedure TFmPrivilege.BtnExpandClick(Sender: TObject);
begin
vTreePriv.FullExpand;
end;
procedure TFmPrivilege.lvUserRoleKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
var Item: TListItem;
sUserID: String;
iPrID: Integer;
begin
Item := lvUserRole.Selected;
if Item=nil then Exit;
if Key=VK_Delete then begin
sUserID := cdsUsers.Fields[0].AsString;
if (CurrUserID=sUserID)and(SaveUserPrivChange(false)=-1) then
Exit;
if Application.MessageBox('确定移除选择的角色吗?', '确认', MB_YESNO+MB_ICONQUESTION)=IDNO then
Exit;
iPrID := Integer(Item.Data);
SvrSysManage.AppServer.RemoveRoleOfUser(IFmMain.IFmMainEx.ClientID, IntToStr(iPrID), sUserID);
Item.Delete;
if CurrUserID=sUserID then begin
cdsPrivilege.Refresh;
vTreePriv.BeginUpdate;
try
InitNodeCheckState(nil);
finally
vTreePriv.EndUpdate;
end;
end;
end;
end;
{判断并保存分配的用户权限
返回值:0:权限没有改变, 1:用户权限有变,且已保存
2:权限已改变,但用户没有保存权限 -1:用户选择取消
}
function TFmPrivilege.SaveUserPrivChange(bNeedRefresh: Boolean): Integer;
var str: String;
ChangedNodes: Array of PVirtualNode;
sChangePrivs: TStringList;
Procedure NodeCheckStateChanged(pNode: PVirtualNode);
var vNode: PVirtualNode;
NodeData: PModuleData;
k, iID: Integer;
b1: Boolean;
sNewPriv, sOldPriv: String;
begin
if pNode=nil then
pNode := vTreePriv.GetFirst
else
pNode := pNode.FirstChild;
if TabSet1.Tag=0 then//如果选中的是价格体系授权
begin
while pNode<>nil do
begin
if pNode.CheckState=csCheckedNormal then
sNewPriv := '$'
else
sNewPriv := '';
NodeData := vTreePriv.GetNodeData(pNode);
if bRole then
begin
b1 := cdsPrivRoleDtl.Locate('ModuleID', NodeData^.ModuleID, []);
if b1 then
sOldPriv := cdsPrivRoleDtl.FieldByName('PrivChar').AsString;
end else
begin
b1 := cdsUserPriv.Locate('ModuleID', NodeData^.ModuleID, []);
if b1 then
sOldPriv := cdsUserPriv.FieldByName('PrivChar').AsString;
end;
if not b1 then
sOldPriv := '';
b1 := sNewPriv<>sOldPriv;
if b1 then
begin
k := Length(ChangedNodes);
SetLength(ChangedNodes, k+1);
ChangedNodes[k] := pNode;
sChangePrivs.Add(sNewPriv);
end;
pNode := pNode.NextSibling;
end;
Exit;
end;
while pNode<>nil do
begin
NodeData := vTreePriv.GetNodeData(pNode);
if (vTreePriv.ChildCount[pNode]>0) then
begin
if NodeData^.Kind=-2 then //连接到功能模块的节点
begin
sNewPriv := '';
iID := NodeData^.ModuleID;
vNode := pNode.FirstChild;
While vNode<>nil do begin
NodeData := vTreePriv.GetNodeData(vNode);
if vNode.CheckState=csCheckedNormal then
sNewPriv := sNewPriv+NodeData^.Popedoms;
vNode := vNode.NextSibling;
end;
if bRole then begin
b1 := cdsPrivRoleDtl.Locate('ModuleID', iID, []);
if b1 then
sOldPriv := cdsPrivRoleDtl.FieldByName('PrivChar').AsString;
end else begin
b1 := cdsUserPriv.Locate('ModuleID', iID, []);
if b1 then
sOldPriv := cdsUserPriv.FieldByName('PrivChar').AsString;
end;
if not b1 then
sOldPriv := '';
b1 := sNewPriv<>sOldPriv;
if b1 then begin
k := Length(ChangedNodes);
SetLength(ChangedNodes, k+1);
ChangedNodes[k] := pNode;
sChangePrivs.Add(sNewPriv);
end;
end else
NodeCheckStateChanged(pNode);
end;
pNode := pNode.NextSibling;
end;
end;
procedure SavePriv;
var i, k, iID: integer;
sField, sNewPriv: String;
vNode: PVirtualNode;
NodeData: PModuleData;
DataSet: TckClientDataSet;
b1: Boolean;
begin
if bRole then begin
sField := 'PrID';
DataSet := cdsPrivRoleDtl;
end else begin
sField := 'UserID';
DataSet := cdsUserPriv;
end;
k := Length(ChangedNodes);
for i:=0 to k-1 do begin
vNode := ChangedNodes[i];
NodeData := vTreePriv.GetNodeData(vNode);
iID := NodeData^.ModuleID;
sNewPriv := sChangePrivs[i];
b1 := DataSet.Locate('ModuleID', iID, []);
if b1 then begin
if sNewPriv='' then
DataSet.Delete
else begin
DataSet.Edit;
DataSet.FieldByName('PrivChar').AsString := sNewPriv;
DataSet.Post;
end;
end else begin
DataSet.Append;
DataSet.FieldByName(sField).AsString := CurrUserID;
DataSet.FieldByName('ModuleID').AsInteger := iID;
DataSet.FieldByName('PrivChar').AsString := sNewPriv;
if not bRole then
DataSet.FieldByName('Kind').AsInteger := 0;
DataSet.Post;
end;
end;
if DataSet.ApplyUpdates(0)>0 then
raise Exception.Create('数据更新失败,请刷新数据后再试一次!');
DataSet.Refresh;
Application.MessageBox('权限已保存!', '成功', MB_OK+MB_ICONINFORMATION);
end;
begin
Result := 0;
if cdsUsers.IsEmpty then Exit;
sChangePrivs := TStringList.Create;
NodeCheckStateChanged(nil);
if sChangePrivs.Count>0 then begin
if bRole then
str := '角色"'+CurrUserName
else
str := '用户"'+CurrUserName;
str := str+'"共有'+IntToStr(Length(ChangedNodes))+'项权限已更改,是否确定授予此权限?';
case Application.MessageBox(PChar(str), '确定授权', MB_YESNOCANCEL+MB_ICONQUESTION) of
IDYES:Result := 1;
IDNO: Result := 2;
else Result := -1;
end;
if Result=1 then begin
SavePriv;
if bRole then begin//先判断是否是对角色授权,所以下面的CurrUserID其实是角色ID
SvrSysManage.AppServer.CkRedundantUserPriv(IFmMain.IFmMainEx.ClientID, CurrUserID);
SvrSysManage.AppServer.UpdRolesUserRolePriv(IFmMain.IFmMainEx.ClientID, CurrUserID);
end else
SvrSysManage.AppServer.UpdateUserRolePriv(IFmMain.IFmMainEx.ClientID, CurrUserID);
if bNeedRefresh then
cdsPrivilege.Refresh;
end;
end;
sChangePrivs.Free;
end;
procedure TFmPrivilege.BtnSaveClick(Sender: TObject);
begin
SaveUserPrivChange(true);
end;
procedure TFmPrivilege.BtnCancelClick(Sender: TObject);
begin
if Application.MessageBox('确定撤消所作的修改吗?', '撤消授权', MB_YESNO+MB_ICONQUESTION)=IDNO then
Exit;
vTreePriv.BeginUpdate;
try
InitNodeCheckState(nil);
finally
vTreePriv.EndUpdate;
end;
end;
procedure TFmPrivilege.RActNewRoleExecute(Sender: TObject);
var i: Integer;
begin
with TFmRoleEd.Create(self) do begin
cdsPrivRole.Last;
i := cdsPrivRole.FieldByName('PrID').AsInteger;
cdsPrivRole.Append;
cdsPrivRole.FieldByName('PrID').AsInteger := i+1;
DataSource1.DataSet := cdsPrivRole;
if ShowModal=mrOk then begin
cdsPrivRole.Post;
if cdsPrivRole.ApplyUpdates(0)=0 then
InitPrivRoles
else begin
Application.MessageBox('数据更新失败!', '消息', MB_ICONINFORMATION);
Exit;
end;
end else
cdsPrivRole.CancelUpdates;
Free;
end;
end;
procedure TFmPrivilege.RActEditRoleExecute(Sender: TObject);
var Item: TListItem;
begin
Item := lvPrivRole.Selected;
if Item=nil then
Exit;
if not cdsPrivRole.Locate('PrID', Integer(Item.Data), []) then
raise Exception.Create('无法定位记录,请重启本模块再试一次!');
with TFmRoleEd.Create(self) do begin
cdsPrivRole.Edit;
DataSource1.DataSet := cdsPrivRole;
if ShowModal=mrOk then begin
if cdsPrivRole.ApplyUpdates(0)=0 then begin
Item.Caption := cdsPrivRole.FieldbyName('PrName').AsString;
end else begin
Application.MessageBox('数据更新失败!', '消息', MB_ICONINFORMATION);
Exit;
end;
end else
cdsPrivRole.CancelUpdates;
Free;
end;
end;
procedure TFmPrivilege.RActDelRoleExecute(Sender: TObject);
var Item: TListItem;
begin
Item := lvPrivRole.Selected;
if Item=nil then
Exit;
if Application.MessageBox('如果删除此角色,将会使所有拥有该角色的用户失去该角色对应的权限,继续吗?', '警告', MB_YESNO+MB_ICONWARNING)=IDNO then
Exit;
if not cdsPrivRole.Locate('PrID', Integer(Item.Data), []) then
raise Exception.Create('无法定位记录,请重启本模块再试一次!');
cdsPrivRole.Delete;
if cdsPrivRole.ApplyUpdates(0)=0 then begin
Item.Delete;
end else begin
Application.MessageBox('数据更新失败!', '消息', MB_ICONINFORMATION);
Exit;
end;
end;
procedure TFmPrivilege.cdsUserPrivReconcileError(
DataSet: TCustomClientDataSet; E: EReconcileError;
UpdateKind: TUpdateKind; var Action: TReconcileAction);
begin
ShowMessage(E.Message);
end;
procedure TFmPrivilege.FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
begin
CanClose := SaveUserPrivChange(false)>=0;
end;
procedure TFmPrivilege.cdsUsersBeforeGetRecords(Sender: TObject;
var OwnerData: OleVariant);
begin
if VarIsNull(OwnerData) then
Application.MessageBox('the OwnerData is null!', 'ERROR!', MB_ICONINFORMATION);
end;
procedure TFmPrivilege.cdsUserPrivBeforeApplyUpdates(Sender: TObject;
var OwnerData: OleVariant);
begin
Inherited;
// OwnerData := IFmMain.IFmMainEx.ClientID;
end;
procedure TFmPrivilege.cdsUsersReconcileError(
DataSet: TCustomClientDataSet; E: EReconcileError;
UpdateKind: TUpdateKind; var Action: TReconcileAction);
begin
Messagebox(Handle,Pchar(E.Message),'错误:',16);
Action := raCancel;
end;
procedure TFmPrivilege.RActEditUserExecute(Sender: TObject);
Var Str : String;
begin
if cdsUsers.IsEmpty then Exit;
with TFmUserEd.Create(self) do begin
CdsUsers.Edit;
Str := cdsUsersPasswd.AsString;
edPasswd.Text := xUncStr(str, sDefaultKey);
edUserID.ReadOnly:=True;
cbDBScanRange.ItemIndex := cdsUsersDBScanRange.AsInteger;
cbDBModiRange.ItemIndex := cdsUsersDBModiRange.AsInteger;
edPasswd2.Text := edPasswd.Text;
If ShowModal=mrOk then Begin
CdsUsers.ApplyUpdates(0);
CdsUsers.RefreshRecord;
End Else
CdsUsers.CancelUpdates;
Free;
end;
end;
procedure TFmPrivilege.RActNewUserExecute(Sender: TObject);
begin
with TFmUserEd.Create(self) do begin
CdsUsers.Append;
If ShowModal=mrOk then Begin
CdsUsers.ApplyUpdates(0);
CdsUsers.RefreshRecord;
End Else
CdsUsers.CancelUpdates;
Free;
end;
end;
procedure TFmPrivilege.RActDelUserExecute(Sender: TObject);
begin
if CdsUsers.IsEmpty Then Exit;
if Application.MessageBox('确定删除当前用户资料吗?', '消息', MB_YESNO+MB_ICONQUESTION)=IDNO then
Exit;
CdsUsers.Delete;
CdsUsers.ApplyUpdates(0);
end;
procedure TFmPrivilege.BtnCheckAllClick(Sender: TObject);
var aNode: PVirtualNode;
begin
aNode := vTreePriv.GetFirst;
while aNode<>nil do begin
if aNode.CheckState in [csUncheckedNormal, csMixedNormal] then
aNode.CheckState := csCheckedNormal;
SetChildNodeCheckState(aNode, csCheckedNormal);
aNode := vTreePriv.GetNextSibling(aNode);
end;
vTreePriv.Refresh;
end;
procedure TFmPrivilege.ActRoleRefreshExecute(Sender: TObject);
begin
InitPrivRoles;
end;
initialization
RegisterClass(TFmPrivilege);
finalization
UnRegisterClass(TFmPrivilege);
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -