⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 privilegefrm.pas

📁 群星医药系统源码
💻 PAS
📖 第 1 页 / 共 3 页
字号:
    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 + -